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

Commit b4f4f2f6 authored by Chuangjie Xia's avatar Chuangjie Xia Committed by Ray Essick
Browse files

OMX AAC decode don't support getting DRC parameters

Test: android.media.cts.DecoderTestAacDrc#testDecodeAacDrclevelM4a
Test: android.media.cts.DecoderTestAacDrc#testDecodeAacDrcHeavyM4a
Test: android.media.cts.DecoderTestAacDrc#testDecodeAacUsacLoudnessM4a
Test: android.media.cts.DecoderTestAacDrc#testDecodeAacDrcOutputLoudnessM4a
Test: android.media.cts.DecoderTestAacDrc#testDecodeAacDrcOffM4a
Test: android.media.cts.DecoderTestAacDrc#testDecodeAacDrcHalfM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacStreamSwithingM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacDrcBoostAndAttenuationM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacDrcAlbumModeM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacDrcOutputLoudnessM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacDrcLoudnessPreferenceM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacSamplingRatesM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacSyncSampleSeekingM4a
Test: android.media.cts.DecoderTestXheAac#testDecodeUsacDrcEffectTypeM4a

Bug: 167754316
Change-Id: I50fcc5ef35cb7e96592c2267652228b5fa074ba9
parent 0a1a5043
Loading
Loading
Loading
Loading
+80 −0
Original line number Diff line number Diff line
@@ -5320,6 +5320,34 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify) {
                    if (mChannelMaskPresent) {
                        notify->setInt32("channel-mask", mChannelMask);
                    }

                    if (!mIsEncoder && portIndex == kPortIndexOutput) {
                        AString mime;
                        if (mConfigFormat->findString("mime", &mime)
                                && !strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime.c_str())) {

                            OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE presentation;
                            InitOMXParams(&presentation);
                            err = mOMXNode->getParameter(
                                    (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacDrcPresentation,
                                    &presentation, sizeof(presentation));
                            if (err != OK) {
                                return err;
                            }
                            notify->setInt32("aac-encoded-target-level",
                                             presentation.nEncodedTargetLevel);
                            notify->setInt32("aac-drc-cut-level", presentation.nDrcCut);
                            notify->setInt32("aac-drc-boost-level", presentation.nDrcBoost);
                            notify->setInt32("aac-drc-heavy-compression",
                                             presentation.nHeavyCompression);
                            notify->setInt32("aac-target-ref-level",
                                             presentation.nTargetReferenceLevel);
                            notify->setInt32("aac-drc-effect-type", presentation.nDrcEffectType);
                            notify->setInt32("aac-drc-album-mode", presentation.nDrcAlbumMode);
                            notify->setInt32("aac-drc-output-loudness",
                                             presentation.nDrcOutputLoudness);
                        }
                    }
                    break;
                }

@@ -7767,6 +7795,58 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
    // Ignore errors as failure is expected for codecs that aren't video encoders.
    (void)configureTemporalLayers(params, false /* inConfigure */, mOutputFormat);

    AString mime;
    if (!mIsEncoder
            && (mConfigFormat->findString("mime", &mime))
            && !strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime.c_str())) {
        OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE presentation;
        InitOMXParams(&presentation);
        mOMXNode->getParameter(
                    (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacDrcPresentation,
                    &presentation, sizeof(presentation));
        int32_t value32 = 0;
        bool updated = false;
        if (params->findInt32("aac-pcm-limiter-enable", &value32)) {
            presentation.nPCMLimiterEnable = value32;
            updated = true;
        }
        if (params->findInt32("aac-encoded-target-level", &value32)) {
            presentation.nEncodedTargetLevel = value32;
            updated = true;
        }
        if (params->findInt32("aac-drc-cut-level", &value32)) {
            presentation.nDrcCut = value32;
            updated = true;
        }
        if (params->findInt32("aac-drc-boost-level", &value32)) {
            presentation.nDrcBoost = value32;
            updated = true;
        }
        if (params->findInt32("aac-drc-heavy-compression", &value32)) {
            presentation.nHeavyCompression = value32;
            updated = true;
        }
        if (params->findInt32("aac-target-ref-level", &value32)) {
            presentation.nTargetReferenceLevel = value32;
            updated = true;
        }
        if (params->findInt32("aac-drc-effect-type", &value32)) {
            presentation.nDrcEffectType = value32;
            updated = true;
        }
        if (params->findInt32("aac-drc-album-mode", &value32)) {
            presentation.nDrcAlbumMode = value32;
            updated = true;
        }
        if (!params->findInt32("aac-drc-output-loudness", &value32)) {
            presentation.nDrcOutputLoudness = value32;
            updated = true;
        }
        if (updated) {
            mOMXNode->setParameter((OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacDrcPresentation,
                &presentation, sizeof(presentation));
        }
    }
    return setVendorParameters(params);
}

+46 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#define DRC_DEFAULT_MOBILE_DRC_HEAVY 1   /* switch for heavy compression for mobile conf */
#define DRC_DEFAULT_MOBILE_DRC_EFFECT 3  /* MPEG-D DRC effect type; 3 => Limited playback range */
#define DRC_DEFAULT_MOBILE_DRC_ALBUM 0  /* MPEG-D DRC album mode; 0 => album mode is disabled, 1 => album mode is enabled */
#define DRC_DEFAULT_MOBILE_OUTPUT_LOUDNESS -1 /* decoder output loudness; -1 => the value is unknown, otherwise dB step value (e.g. 64 for -16 dB) */
#define DRC_DEFAULT_MOBILE_ENC_LEVEL (-1) /* encoder target level; -1 => the value is unknown, otherwise dB step value (e.g. 64 for -16 dB) */
#define MAX_CHANNEL_COUNT            8  /* maximum number of audio channels that can be decoded */
// names of properties that can be used to override the default DRC settings
@@ -230,6 +231,15 @@ status_t SoftAAC2::initDecoder() {
    // For seven and eight channel input streams, enable 6.1 and 7.1 channel output
    aacDecoder_SetParam(mAACDecoder, AAC_PCM_MAX_OUTPUT_CHANNELS, -1);

    mDrcCompressMode = DRC_DEFAULT_MOBILE_DRC_HEAVY;
    mDrcTargetRefLevel = DRC_DEFAULT_MOBILE_REF_LEVEL;
    mDrcEncTargetLevel = DRC_DEFAULT_MOBILE_ENC_LEVEL;
    mDrcBoostFactor = DRC_DEFAULT_MOBILE_DRC_BOOST;
    mDrcAttenuationFactor = DRC_DEFAULT_MOBILE_DRC_CUT;
    mDrcEffectType = DRC_DEFAULT_MOBILE_DRC_EFFECT;
    mDrcAlbumMode = DRC_DEFAULT_MOBILE_DRC_ALBUM;
    mDrcOutputLoudness = DRC_DEFAULT_MOBILE_OUTPUT_LOUDNESS;

    return status;
}

@@ -358,6 +368,27 @@ OMX_ERRORTYPE SoftAAC2::internalGetParameter(
            return OMX_ErrorNone;
        }

        case OMX_IndexParamAudioAndroidAacDrcPresentation:
        {
             OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE *aacPresParams =
                    (OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE *)params;

            ALOGD("get OMX_IndexParamAudioAndroidAacDrcPresentation");

            if (!isValidOMXParam(aacPresParams)) {
                return OMX_ErrorBadParameter;
            }
            aacPresParams->nDrcEffectType = mDrcEffectType;
            aacPresParams->nDrcAlbumMode = mDrcAlbumMode;
            aacPresParams->nDrcBoost =  mDrcBoostFactor;
            aacPresParams->nDrcCut = mDrcAttenuationFactor;
            aacPresParams->nHeavyCompression = mDrcCompressMode;
            aacPresParams->nTargetReferenceLevel = mDrcTargetRefLevel;
            aacPresParams->nEncodedTargetLevel = mDrcEncTargetLevel;
            aacPresParams ->nDrcOutputLoudness = mDrcOutputLoudness;
            return OMX_ErrorNone;
        }

        default:
            return SimpleSoftOMXComponent::internalGetParameter(index, params);
    }
@@ -464,11 +495,13 @@ OMX_ERRORTYPE SoftAAC2::internalSetParameter(
            if (aacPresParams->nDrcEffectType >= -1) {
                ALOGV("set nDrcEffectType=%d", aacPresParams->nDrcEffectType);
                aacDecoder_SetParam(mAACDecoder, AAC_UNIDRC_SET_EFFECT, aacPresParams->nDrcEffectType);
                mDrcEffectType = aacPresParams->nDrcEffectType;
            }
            if (aacPresParams->nDrcAlbumMode >= -1) {
                ALOGV("set nDrcAlbumMode=%d", aacPresParams->nDrcAlbumMode);
                aacDecoder_SetParam(mAACDecoder, AAC_UNIDRC_ALBUM_MODE,
                        aacPresParams->nDrcAlbumMode);
                mDrcAlbumMode = aacPresParams->nDrcAlbumMode;
            }
            bool updateDrcWrapper = false;
            if (aacPresParams->nDrcBoost >= 0) {
@@ -476,34 +509,42 @@ OMX_ERRORTYPE SoftAAC2::internalSetParameter(
                mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR,
                        aacPresParams->nDrcBoost);
                updateDrcWrapper = true;
                mDrcBoostFactor = aacPresParams->nDrcBoost;
            }
            if (aacPresParams->nDrcCut >= 0) {
                ALOGV("set nDrcCut=%d", aacPresParams->nDrcCut);
                mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR, aacPresParams->nDrcCut);
                updateDrcWrapper = true;
                mDrcAttenuationFactor = aacPresParams->nDrcCut;
            }
            if (aacPresParams->nHeavyCompression >= 0) {
                ALOGV("set nHeavyCompression=%d", aacPresParams->nHeavyCompression);
                mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_HEAVY,
                        aacPresParams->nHeavyCompression);
                updateDrcWrapper = true;
                mDrcCompressMode = aacPresParams->nHeavyCompression;
            }
            if (aacPresParams->nTargetReferenceLevel >= -1) {
                ALOGV("set nTargetReferenceLevel=%d", aacPresParams->nTargetReferenceLevel);
                mDrcWrap.setParam(DRC_PRES_MODE_WRAP_DESIRED_TARGET,
                        aacPresParams->nTargetReferenceLevel);
                updateDrcWrapper = true;
                mDrcTargetRefLevel = aacPresParams->nTargetReferenceLevel;
            }
            if (aacPresParams->nEncodedTargetLevel >= 0) {
                ALOGV("set nEncodedTargetLevel=%d", aacPresParams->nEncodedTargetLevel);
                mDrcWrap.setParam(DRC_PRES_MODE_WRAP_ENCODER_TARGET,
                        aacPresParams->nEncodedTargetLevel);
                updateDrcWrapper = true;
                mDrcEncTargetLevel = aacPresParams->nEncodedTargetLevel;
            }
            if (aacPresParams->nPCMLimiterEnable >= 0) {
                aacDecoder_SetParam(mAACDecoder, AAC_PCM_LIMITER_ENABLE,
                        (aacPresParams->nPCMLimiterEnable != 0));
            }
            if (aacPresParams ->nDrcOutputLoudness != DRC_DEFAULT_MOBILE_OUTPUT_LOUDNESS) {
                mDrcOutputLoudness = aacPresParams ->nDrcOutputLoudness;
            }
            if (updateDrcWrapper) {
                mDrcWrap.update();
            }
@@ -854,6 +895,11 @@ void SoftAAC2::onQueueFilled(OMX_U32 /* portIndex */) {
                    // fall through
                }

                if ( mDrcOutputLoudness != mStreamInfo->outputLoudness) {
                    ALOGD("update Loudness, before = %d, now = %d", mDrcOutputLoudness, mStreamInfo->outputLoudness);
                    mDrcOutputLoudness = mStreamInfo->outputLoudness;
                }

                /*
                 * AAC+/eAAC+ streams can be signalled in two ways: either explicitly
                 * or implicitly, according to MPEG4 spec. AAC+/eAAC+ is a dual
+11 −0
Original line number Diff line number Diff line
@@ -85,6 +85,17 @@ private:
    int32_t mOutputDelayRingBufferWritePos;
    int32_t mOutputDelayRingBufferReadPos;
    int32_t mOutputDelayRingBufferFilled;

    //drc
    int32_t mDrcCompressMode;
    int32_t mDrcTargetRefLevel;
    int32_t mDrcEncTargetLevel;
    int32_t mDrcBoostFactor;
    int32_t mDrcAttenuationFactor;
    int32_t mDrcEffectType;
    int32_t mDrcAlbumMode;
    int32_t mDrcOutputLoudness;

    bool outputDelayRingBufferPutSamples(INT_PCM *samples, int numSamples);
    int32_t outputDelayRingBufferGetSamples(INT_PCM *samples, int numSamples);
    int32_t outputDelayRingBufferSamplesAvailable();
+18 −1
Original line number Diff line number Diff line
@@ -17,6 +17,10 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "SimpleSoftOMXComponent"
#include <utils/Log.h>
#include <OMX_Core.h>
#include <OMX_Audio.h>
#include <OMX_IndexExt.h>
#include <OMX_AudioExt.h>

#include <media/stagefright/omx/SimpleSoftOMXComponent.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -74,7 +78,7 @@ bool SimpleSoftOMXComponent::isSetParameterAllowed(

    OMX_U32 portIndex;

    switch (index) {
    switch ((int)index) {
        case OMX_IndexParamPortDefinition:
        {
            const OMX_PARAM_PORTDEFINITIONTYPE *portDefs =
@@ -108,6 +112,19 @@ bool SimpleSoftOMXComponent::isSetParameterAllowed(
            break;
        }

         case OMX_IndexParamAudioAndroidAacDrcPresentation:
        {
            if (mState == OMX_StateInvalid) {
                return false;
            }
            const OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE *aacPresParams =
                            (const OMX_AUDIO_PARAM_ANDROID_AACDRCPRESENTATIONTYPE *)params;
            if (!isValidOMXParam(aacPresParams)) {
                return false;
            }
            return true;
         }

        default:
            return false;
    }