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

Commit ffe033da authored by Harish Mahendrakar's avatar Harish Mahendrakar Committed by Wonsik Kim
Browse files

C2SoftAacDec: Compute output port delay from stream info

Instead of hard-coding output port delay to 2, compute it
from stream info

Bug: 180567076
Test: poc in bug
Test: atest VtsHalMediaC2V1_0TargetAudioDecTest
Test: atest CtsMediaV2TestCases:CodecDecoderTest
Test: atest CtsMediaTestCases:DecoderTest
Test: atest CtsMediaTestCases:DecoderTestAacDrc
Test: atest CtsMediaTestCases:DecoderTestXheAac
Test: atest CtsMediaTestCases:DecoderTestAacFormat

Change-Id: I37d1a1f2ce0221f8b82ce4d61f8c8a09c4c55954
parent a2c1f6a1
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@
namespace android {

constexpr char COMPONENT_NAME[] = "c2.android.aac.decoder";
constexpr size_t kDefaultOutputPortDelay = 2;
constexpr size_t kMaxOutputPortDelay = 16;

class C2SoftAacDec::IntfImpl : public SimpleInterface<void>::BaseParams {
public:
@@ -73,7 +75,9 @@ public:

        addParameter(
                DefineParam(mActualOutputDelay, C2_PARAMKEY_OUTPUT_DELAY)
                .withConstValue(new C2PortActualDelayTuning::output(2u))
                .withDefault(new C2PortActualDelayTuning::output(kDefaultOutputPortDelay))
                .withFields({C2F(mActualOutputDelay, value).inRange(0, kMaxOutputPortDelay)})
                .withSetter(Setter<decltype(*mActualOutputDelay)>::StrictValueWithNoDeps)
                .build());

        addParameter(
@@ -263,6 +267,7 @@ C2SoftAacDec::C2SoftAacDec(
      mAACDecoder(nullptr),
      mStreamInfo(nullptr),
      mSignalledError(false),
      mOutputPortDelay(kDefaultOutputPortDelay),
      mOutputDelayRingBuffer(nullptr) {
}

@@ -911,6 +916,29 @@ void C2SoftAacDec::process(

    int32_t outputDelay = mStreamInfo->outputDelay * mStreamInfo->numChannels;

    size_t numSamplesInOutput = mStreamInfo->frameSize * mStreamInfo->numChannels;
    if (numSamplesInOutput > 0) {
        size_t actualOutputPortDelay = (outputDelay + numSamplesInOutput - 1) / numSamplesInOutput;
        if (actualOutputPortDelay > mOutputPortDelay) {
            mOutputPortDelay = actualOutputPortDelay;
            ALOGV("New Output port delay %zu ", mOutputPortDelay);

            C2PortActualDelayTuning::output outputPortDelay(mOutputPortDelay);
            std::vector<std::unique_ptr<C2SettingResult>> failures;
            c2_status_t err =
                mIntf->config({&outputPortDelay}, C2_MAY_BLOCK, &failures);
            if (err == OK) {
                work->worklets.front()->output.configUpdate.push_back(
                    C2Param::Copy(outputPortDelay));
            } else {
                ALOGE("Cannot set output delay");
                mSignalledError = true;
                work->workletsProcessed = 1u;
                work->result = C2_CORRUPTED;
                return;
            }
        }
    }
    mBuffersInfo.push_back(std::move(inInfo));
    work->workletsProcessed = 0u;
    if (!eos && mOutputDelayCompensated < outputDelay) {
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ private:
    size_t mInputBufferCount;
    size_t mOutputBufferCount;
    bool mSignalledError;
    size_t mOutputPortDelay;
    struct Info {
        uint64_t frameIndex;
        size_t bufferSize;