Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 886f4abc authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "MultiAccessunitHelper: samplerate and channelCount" into main

parents 20024657 777a180b
Loading
Loading
Loading
Loading
+29 −34
Original line number Diff line number Diff line
@@ -96,18 +96,23 @@ C2Component::kind_t MultiAccessUnitInterface::kind() const {
    return (C2Component::kind_t)(mKind.value);
}

void MultiAccessUnitInterface::getDecoderSampleRateAndChannelCount(
        uint32_t &sampleRate_, uint32_t &channelCount_) const {
bool MultiAccessUnitInterface::getDecoderSampleRateAndChannelCount(
        uint32_t * const sampleRate_, uint32_t * const channelCount_) const {
    if (sampleRate_ == nullptr || sampleRate_ == nullptr) {
        return false;
    }
    if (mC2ComponentIntf) {
        C2StreamSampleRateInfo::output sampleRate;
        C2StreamChannelCountInfo::output channelCount;
        c2_status_t res = mC2ComponentIntf->query_vb(
                {&sampleRate, &channelCount}, {}, C2_MAY_BLOCK, nullptr);
        if (res == C2_OK) {
            sampleRate_ = sampleRate.value;
            channelCount_ = channelCount.value;
        if (res == C2_OK && sampleRate.value > 0 && channelCount.value > 0) {
            *sampleRate_ = sampleRate.value;
            *channelCount_ = channelCount.value;
            return true;
        }
    }
    return false;
}

//C2MultiAccessUnitBuffer
@@ -320,28 +325,12 @@ c2_status_t MultiAccessUnitHelper::scatter(
            }
        }
        if (!processedWork->empty()) {
            {
            C2LargeFrame::output multiAccessParams = mInterface->getLargeFrameParam();
                if (mInterface->kind() == C2Component::KIND_DECODER) {
                    uint32_t sampleRate = 0;
                    uint32_t channelCount = 0;
                    uint32_t frameSize = 0;
                    mInterface->getDecoderSampleRateAndChannelCount(
                            sampleRate, channelCount);
                    if (sampleRate > 0 && channelCount > 0) {
                        frameSize = channelCount * 2;
                        multiAccessParams.maxSize =
                                (multiAccessParams.maxSize / frameSize) * frameSize;
                        multiAccessParams.thresholdSize =
                                (multiAccessParams.thresholdSize / frameSize) * frameSize;
                    }
                }
            frameInfo.mLargeFrameTuning = multiAccessParams;
            std::lock_guard<std::mutex> l(mLock);
            mFrameHolder.push_back(std::move(frameInfo));
        }
    }
    }
    return C2_OK;
}

@@ -506,6 +495,20 @@ c2_status_t MultiAccessUnitHelper::processWorklets(MultiAccessUnitInfo &frame,
            frame.reset();
            return C2_OK;
        }
        int64_t sampleTimeUs = 0;
        uint32_t frameSize = 0;
        uint32_t sampleRate = 0;
        uint32_t channelCount = 0;
        if (mInterface->getDecoderSampleRateAndChannelCount(&sampleRate, &channelCount)) {
            sampleTimeUs = (1000000u) / (sampleRate * channelCount * 2);
            frameSize = channelCount * 2;
            if (mInterface->kind() == C2Component::KIND_DECODER) {
                frame.mLargeFrameTuning.maxSize =
                        (frame.mLargeFrameTuning.maxSize / frameSize) * frameSize;
                frame.mLargeFrameTuning.thresholdSize =
                        (frame.mLargeFrameTuning.thresholdSize / frameSize) * frameSize;
            }
        }
        c2_status_t c2ret = allocateWork(frame, true);
        if (c2ret != C2_OK) {
            return c2ret;
@@ -520,15 +523,7 @@ c2_status_t MultiAccessUnitHelper::processWorklets(MultiAccessUnitInfo &frame,
        outputFramedata.infoBuffers.insert(outputFramedata.infoBuffers.begin(),
                (*worklet)->output.infoBuffers.begin(),
                (*worklet)->output.infoBuffers.end());
        int64_t sampleTimeUs = 0;
        uint32_t frameSize = 0;
        uint32_t sampleRate = 0;
        uint32_t channelCount = 0;
        mInterface->getDecoderSampleRateAndChannelCount(sampleRate, channelCount);
        if (sampleRate > 0 && channelCount > 0) {
            sampleTimeUs = (1000000u) / (sampleRate * channelCount * 2);
            frameSize = channelCount * 2;
        }

        LOG(DEBUG) << "maxOutSize " << frame.mLargeFrameTuning.maxSize
                << " threshold " << frame.mLargeFrameTuning.thresholdSize;
        if ((*worklet)->output.buffers.size() > 0) {
+2 −2
Original line number Diff line number Diff line
@@ -44,8 +44,8 @@ struct MultiAccessUnitInterface : public C2InterfaceHelper {
    bool isValidField(const C2ParamField &field) const;

protected:
    void getDecoderSampleRateAndChannelCount(
            uint32_t &sampleRate_, uint32_t &channelCount_) const;
    bool getDecoderSampleRateAndChannelCount(
            uint32_t * const sampleRate_, uint32_t * const channelCount_) const;
    const std::shared_ptr<C2ComponentInterface> mC2ComponentIntf;
    std::shared_ptr<C2LargeFrame::output> mLargeFrameParams;
    C2ComponentKindSetting mKind;