1d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi/*
2d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
3d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi *
4d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * you may not use this file except in compliance with the License.
6d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * You may obtain a copy of the License at
7d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi *
8d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi *
10d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * See the License for the specific language governing permissions and
14d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi * limitations under the License.
15d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi */
16d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#include "DrcPresModeWrap.h"
17d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
18d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#include <assert.h>
19d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
20d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#define LOG_TAG "SoftAAC2_DrcWrapper"
21d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi//#define LOG_NDEBUG 0
22d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#include <utils/Log.h>
23d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
24d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi//#define DRC_PRES_MODE_WRAP_DEBUG
25d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
26d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#define GPM_ENCODER_TARGET_LEVEL 64
27d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#define MAX_TARGET_LEVEL 64
28d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
29d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::CDrcPresModeWrapper()
30d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
31d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDataUpdate = true;
32d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
33d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Data from streamInfo. */
34d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Initialized to the same values as in the aac decoder */
35d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mStreamPRL = -1;
36d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mStreamDRCPresMode = -1;
37d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mStreamNrAACChan = 0;
38d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mStreamNrOutChan = 0;
39d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
40d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Desired values (set by user). */
41d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Initialized to the same values as in the aac decoder */
42d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDesTarget = -1;
43d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDesAttFactor = 0;
44d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDesBoostFactor = 0;
45d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDesHeavy = 0;
46d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
47d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mEncoderTarget = -1;
48d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
49d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Values from last time. */
50d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    /* Initialized to the same values as the desired values */
51d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mLastTarget = -1;
52d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mLastAttFactor = 0;
53d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mLastBoostFactor = 0;
54d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mLastHeavy = 0;
55d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
56d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
57d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::~CDrcPresModeWrapper()
58d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
59d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
60d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
61d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivivoid
62d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::setDecoderHandle(const HANDLE_AACDECODER handle)
63d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
64d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mHandleDecoder = handle;
65d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
66d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
67d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivivoid
68d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::submitStreamData(CStreamInfo* pStreamInfo)
69d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
70d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    assert(pStreamInfo);
71d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
72d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mStreamPRL != pStreamInfo->drcProgRefLev) {
73d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mStreamPRL = pStreamInfo->drcProgRefLev;
74d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDataUpdate = true;
75d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
76d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        ALOGV("DRC presentation mode wrapper: drcProgRefLev is %d\n", mStreamPRL);
77d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
78d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
79d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
80d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mStreamDRCPresMode != pStreamInfo->drcPresMode) {
81d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mStreamDRCPresMode = pStreamInfo->drcPresMode;
82d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDataUpdate = true;
83d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
84d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        ALOGV("DRC presentation mode wrapper: drcPresMode is %d\n", mStreamDRCPresMode);
85d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
86d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
87d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
88d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mStreamNrAACChan != pStreamInfo->aacNumChannels) {
89d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mStreamNrAACChan = pStreamInfo->aacNumChannels;
90d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDataUpdate = true;
91d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
92d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        ALOGV("DRC presentation mode wrapper: aacNumChannels is %d\n", mStreamNrAACChan);
93d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
94d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
95d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
96d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mStreamNrOutChan != pStreamInfo->numChannels) {
97d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mStreamNrOutChan = pStreamInfo->numChannels;
98d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDataUpdate = true;
99d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
100d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        ALOGV("DRC presentation mode wrapper: numChannels is %d\n", mStreamNrOutChan);
101d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
102d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
103d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
104d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
105d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
106d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mStreamNrOutChan<mStreamNrAACChan) {
107d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsDownmix = true;
108d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    } else {
109d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsDownmix = false;
110d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
111d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
112d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mIsDownmix && (mStreamNrOutChan == 1)) {
113d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsMonoDownmix = true;
114d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    } else {
115d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsMonoDownmix = false;
116d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
117d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
118d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mIsDownmix && mStreamNrOutChan == 2){
119d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsStereoDownmix = true;
120d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    } else {
121d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mIsStereoDownmix = false;
122d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
123d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
124d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
125d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
126d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivivoid
127d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::setParam(const DRC_PRES_MODE_WRAP_PARAM param, const int value)
128d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
129d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    switch (param) {
130d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    case DRC_PRES_MODE_WRAP_DESIRED_TARGET:
131d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDesTarget = value;
132d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
133d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    case DRC_PRES_MODE_WRAP_DESIRED_ATT_FACTOR:
134d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDesAttFactor = value;
135d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
136d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    case DRC_PRES_MODE_WRAP_DESIRED_BOOST_FACTOR:
137d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDesBoostFactor = value;
138d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
139d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    case DRC_PRES_MODE_WRAP_DESIRED_HEAVY:
140d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDesHeavy = value;
141d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
142d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    case DRC_PRES_MODE_WRAP_ENCODER_TARGET:
143d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mEncoderTarget = value;
144d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
145d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    default:
146d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        break;
147d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    }
148d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    mDataUpdate = true;
149d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
150d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
151d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivivoid
152d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel TriviCDrcPresModeWrapper::update()
153d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi{
154d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    // Get Data from Decoder
155d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int progRefLevel = mStreamPRL;
156d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int drcPresMode = mStreamDRCPresMode;
157d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
158d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    // by default, do as desired
159d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int newTarget         = mDesTarget;
160d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int newAttFactor      = mDesAttFactor;
161d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int newBoostFactor    = mDesBoostFactor;
162d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    int newHeavy          = mDesHeavy;
163d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
164d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    if (mDataUpdate) {
165d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        // sanity check
166d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (mDesTarget < MAX_TARGET_LEVEL){
167d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            mDesTarget = MAX_TARGET_LEVEL;  // limit target level to -16 dB or below
168d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            newTarget = MAX_TARGET_LEVEL;
169d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
170d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
171d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (mEncoderTarget != -1) {
172d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (mDesTarget<124) { // if target level > -31 dB
173d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                if ((mIsStereoDownmix == false) && (mIsMonoDownmix == false)) {
174d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // no stereo or mono downmixing, calculated scaling of light DRC
175d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    /* use as little compression as possible */
176d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    newAttFactor = 0;
177d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    newBoostFactor = 0;
178d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if (mDesTarget<progRefLevel) { // if target level > PRL
179d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        if (mEncoderTarget < mDesTarget) { // if mEncoderTarget > target level
180d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // mEncoderTarget > target level > PRL
181d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            int calcFactor;
182d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            float calcFactor_norm;
183d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // 0.0f < calcFactor_norm < 1.0f
184d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            calcFactor_norm = (float)(mDesTarget - progRefLevel) /
185d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                                    (float)(mEncoderTarget - progRefLevel);
186d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            calcFactor = (int)(calcFactor_norm*127.0f); // 0 <= calcFactor < 127
187d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // calcFactor is the lower limit
188d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newAttFactor = (calcFactor>newAttFactor) ? calcFactor : newAttFactor;
189d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // new AttFactor will be always = calcFactor, as it is set to 0 before.
190d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newBoostFactor = newAttFactor;
191d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        } else {
192d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            /* target level > mEncoderTarget > PRL */
193d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // newTDLimiterEnable = 1;
194d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // the time domain limiter must always be active in this case.
195d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            //     It is assumed that the framework activates it by default
196d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newAttFactor = 127;
197d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newBoostFactor = 127;
198d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        }
199d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    } else { // target level <= PRL
200d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // no restrictions required
201d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // newAttFactor = newAttFactor;
202d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
203d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                } else { // downmixing
204d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // if target level > -23 dB or mono downmix
205d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if ( (mDesTarget<92) || mIsMonoDownmix ) {
206d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newHeavy = 1;
207d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    } else {
208d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // we perform a downmix, so, we need at least full light DRC
209d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newAttFactor = 127;
210d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
211d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                }
212d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            } else { // target level <= -31 dB
213d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                // playback -31 dB: light DRC only needed if we perform downmixing
214d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                if (mIsDownmix) {   // we do downmixing
215d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    newAttFactor = 127;
216d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                }
217d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            }
218d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
219d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        else { // handle other used encoder target levels
220d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
221d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // Sanity check: DRC presentation mode is only specified for max. 5.1 channels
222d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (mStreamNrAACChan > 6) {
223d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                drcPresMode = 0;
224d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            }
225d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
226d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            switch (drcPresMode) {
227d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            case 0:
228d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            default: // presentation mode not indicated
229d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            {
230d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
231d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                if (mDesTarget<124) { // if target level > -31 dB
232d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // no stereo or mono downmixing
233d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if ((mIsStereoDownmix == false) && (mIsMonoDownmix == false)) {
234d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        if (mDesTarget<progRefLevel) { // if target level > PRL
235d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // newTDLimiterEnable = 1;
236d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // the time domain limiter must always be active in this case.
237d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            //    It is assumed that the framework activates it by default
238d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newAttFactor = 127; // at least, use light compression
239d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        } else { // target level <= PRL
240d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // no restrictions required
241d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // newAttFactor = newAttFactor;
242d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        }
243d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    } else { // downmixing
244d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // newTDLimiterEnable = 1;
245d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // the time domain limiter must always be active in this case.
246d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        //    It is assumed that the framework activates it by default
247d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
248d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // if target level > -23 dB or mono downmix
249d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        if ( (mDesTarget < 92) || mIsMonoDownmix ) {
250d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newHeavy = 1;
251d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        } else{
252d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            // we perform a downmix, so, we need at least full light DRC
253d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                            newAttFactor = 127;
254d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        }
255d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
256d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                } else { // target level <= -31 dB
257d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if (mIsDownmix) {   // we do downmixing.
258d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // newTDLimiterEnable = 1;
259d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        // the time domain limiter must always be active in this case.
260d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        //    It is assumed that the framework activates it by default
261d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newAttFactor = 127;
262d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
263d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                }
264d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            }
265d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            break;
266d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
267d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // Presentation mode 1 and 2 according to ETSI TS 101 154:
268d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // Digital Video Broadcasting (DVB); Specification for the use of Video and Audio Coding
269d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // in Broadcasting Applications based on the MPEG-2 Transport Stream,
270d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // section C.5.4., "Decoding", and Table C.33
271d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // ISO DRC            -> newHeavy = 0  (Use light compression, MPEG-style)
272d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // Compression_value  -> newHeavy = 1  (Use heavy compression, DVB-style)
273d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            // scaling restricted -> newAttFactor = 127
274d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
275d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            case 1: // presentation mode 1, Light:-31/Heavy:-23
276d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            {
277d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                if (mDesTarget < 124) { // if target level > -31 dB
278d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // playback up to -23 dB
279d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    newHeavy = 1;
280d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                } else { // target level <= -31 dB
281d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // playback -31 dB
282d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if (mIsDownmix) {   // we do downmixing.
283d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newAttFactor = 127;
284d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
285d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                }
286d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            }
287d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            break;
288d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
289d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            case 2: // presentation mode 2, Light:-23/Heavy:-23
290d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            {
291d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                if (mDesTarget < 124) { // if target level > -31 dB
292d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // playback up to -23 dB
293d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if (mIsMonoDownmix) { // if mono downmix
294d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newHeavy = 1;
295d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    } else {
296d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newHeavy = 0;
297d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newAttFactor = 127;
298d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
299d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                } else { // target level <= -31 dB
300d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    // playback -31 dB
301d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    newHeavy = 0;
302d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    if (mIsDownmix) {   // we do downmixing.
303d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newAttFactor = 127;
304d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                    }
305d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                }
306d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            }
307d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            break;
308d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
309d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            } // switch()
310d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        } // if (mEncoderTarget  == GPM_ENCODER_TARGET_LEVEL)
311d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
312d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        // sanity again
313d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (newHeavy == 1) {
314d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            newBoostFactor=127; // not really needed as the same would be done by the decoder anyway
315d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            newAttFactor = 127;
316d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
317d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
318d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        // update the decoder
319d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (newTarget != mLastTarget) {
320d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            aacDecoder_SetParam(mHandleDecoder, AAC_DRC_REFERENCE_LEVEL, newTarget);
321d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            mLastTarget = newTarget;
322d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
323d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (newTarget != mDesTarget)
324d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: forced target level to %d (from %d)\n", newTarget, mDesTarget);
325d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            else
326d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: set target level to %d\n", newTarget);
327d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
328d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
329d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
330d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (newAttFactor != mLastAttFactor) {
331d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            aacDecoder_SetParam(mHandleDecoder, AAC_DRC_ATTENUATION_FACTOR, newAttFactor);
332d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            mLastAttFactor = newAttFactor;
333d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
334d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (newAttFactor != mDesAttFactor)
335d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: forced attenuation factor to %d (from %d)\n", newAttFactor, mDesAttFactor);
336d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            else
337d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: set attenuation factor to %d\n", newAttFactor);
338d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
339d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
340d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
341d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (newBoostFactor != mLastBoostFactor) {
342d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            aacDecoder_SetParam(mHandleDecoder, AAC_DRC_BOOST_FACTOR, newBoostFactor);
343d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            mLastBoostFactor = newBoostFactor;
344d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
345d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (newBoostFactor != mDesBoostFactor)
346d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: forced boost factor to %d (from %d)\n",
347d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newBoostFactor, mDesBoostFactor);
348d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            else
349d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: set boost factor to %d\n", newBoostFactor);
350d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
351d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
352d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
353d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        if (newHeavy != mLastHeavy) {
354d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            aacDecoder_SetParam(mHandleDecoder, AAC_DRC_HEAVY_COMPRESSION, newHeavy);
355d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            mLastHeavy = newHeavy;
356d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
357d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            if (newHeavy != mDesHeavy)
358d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: forced heavy compression to %d (from %d)\n",
359d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                        newHeavy, mDesHeavy);
360d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi            else
361d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                ALOGV("DRC presentation mode wrapper: set heavy compression to %d\n", newHeavy);
362d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
363d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        }
364d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
365d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#ifdef DRC_PRES_MODE_WRAP_DEBUG
366d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        ALOGV("DRC config: tgt_lev: %3d, cut: %3d, boost: %3d, heavy: %d\n", newTarget,
367d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi                newAttFactor, newBoostFactor, newHeavy);
368d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi#endif
369d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi        mDataUpdate = false;
370d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi
371d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi    } // if (mDataUpdate)
372d4838ed14a169f5981c0adc2edcb24559a913fe6Jean-Michel Trivi}
373