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

Commit 74d4b708 authored by Ray Essick's avatar Ray Essick
Browse files

OMX Opus decoder omits sample rate / channel count

The OMX Opus decoder doesn't signal back the channel/samplerate info to
the framework, leading to a CTS failure when checking required values.

Based on an AOSP patch provided by denis.hsu@mediatek.com

Bug: 166695414
Test: CtsMediaTestCases android.media.cts.DecoderTest#testDecodeOpusChannelsAndRates
Change-Id: If710405caea4be6336b4aec3aa0c051ad3c0fe95
parent b1dd3d1d
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -2237,6 +2237,12 @@ status_t ACodec::configureCodec(
            }
            err = setupG711Codec(encoder, sampleRate, numChannels);
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_OPUS)) {
        int32_t numChannels = 1, sampleRate = 48000;
        if (msg->findInt32("channel-count", &numChannels) &&
            msg->findInt32("sample-rate", &sampleRate)) {
            err = setupOpusCodec(encoder, sampleRate, numChannels);
        }
    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) {
        // numChannels needs to be set to properly communicate PCM values.
        int32_t numChannels = 2, sampleRate = 44100, compressionLevel = -1;
@@ -3110,6 +3116,26 @@ status_t ACodec::setupG711Codec(bool encoder, int32_t sampleRate, int32_t numCha
            kPortIndexInput, sampleRate, numChannels);
}

status_t ACodec::setupOpusCodec(bool encoder, int32_t sampleRate, int32_t numChannels) {
    if (encoder) {
        return INVALID_OPERATION;
    }
    OMX_AUDIO_PARAM_ANDROID_OPUSTYPE def;
    InitOMXParams(&def);
    def.nPortIndex = kPortIndexInput;
    status_t err = mOMXNode->getParameter(
            (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, &def, sizeof(def));
    if (err != OK) {
        ALOGE("setupOpusCodec(): Error %d getting OMX_IndexParamAudioAndroidOpus parameter", err);
        return err;
    }
    def.nSampleRate = sampleRate;
    def.nChannels = numChannels;
    err = mOMXNode->setParameter(
           (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, &def, sizeof(def));
    return err;
}

status_t ACodec::setupFlacCodec(
        bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel,
        AudioEncoding encoding) {
+8 −3
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ SoftOpus::SoftOpus(
      mInputBufferCount(0),
      mDecoder(NULL),
      mHeader(NULL),
      mNumChannels(1),
      mSamplingRate(kRate),
      mCodecDelay(0),
      mSeekPreRoll(0),
      mAnchorTimeUs(0),
@@ -169,11 +171,11 @@ OMX_ERRORTYPE SoftOpus::internalGetParameter(
            }

            opusParams->nAudioBandWidth = 0;
            opusParams->nSampleRate = kRate;
            opusParams->nSampleRate = mSamplingRate;
            opusParams->nBitRate = 0;

            if (!isConfigured()) {
                opusParams->nChannels = 1;
                opusParams->nChannels = mNumChannels;
            } else {
                opusParams->nChannels = mHeader->channels;
            }
@@ -274,7 +276,8 @@ OMX_ERRORTYPE SoftOpus::internalSetParameter(
            if (opusParams->nPortIndex != 0) {
                return OMX_ErrorUndefined;
            }

            mNumChannels = opusParams->nChannels;
            mSamplingRate = opusParams->nSampleRate;
            return OMX_ErrorNone;
        }

@@ -496,6 +499,8 @@ void SoftOpus::onQueueFilled(OMX_U32 /* portIndex */) {
                                   *(reinterpret_cast<int64_t*>(inHeader->pBuffer +
                                                                inHeader->nOffset)),
                                   kRate);
                mSamplingRate = kRate;
                mNumChannels = mHeader->channels;
                notify(OMX_EventPortSettingsChanged, 1, 0, NULL);
                mOutputPortSettingsChange = AWAITING_DISABLED;
            }
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ private:
    OpusMSDecoder *mDecoder;
    OpusHeader *mHeader;

    int32_t mNumChannels;
    int32_t mSamplingRate;
    int64_t mCodecDelay;
    int64_t mSeekPreRoll;
    int64_t mSamplesToDiscard;
+1 −0
Original line number Diff line number Diff line
@@ -499,6 +499,7 @@ private:
    status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate);
    status_t setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels);

    status_t setupOpusCodec(bool encoder, int32_t sampleRate, int32_t numChannels);
    status_t setupFlacCodec(
            bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel,
            AudioEncoding encoding);