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

Commit 777a180b authored by Arun Johnson's avatar Arun Johnson
Browse files

MultiAccessunitHelper: samplerate and channelCount

The sample rates and channel count should be quieried at the output
rather than at the input. This will make sure that the codec
reports values in the current stream.

Test: atest android.mediav2.cts.CodecDecoderMultiAccessUnitTest
Test: atest android.mediav2.cts.CodecDecoderBlockModelMultiAccessUnitTest
Bug: 325512893
Change-Id: I88c2b778998ed91faca9d3664400e1e9c2ac2fa5
parent 3292333f
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;