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