SoftAAC2.cpp revision e672a0eea2cdc2ed43e002f0583902f20705de57
1b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke/* 2b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * Copyright (C) 2012 The Android Open Source Project 3b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * 4b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * Licensed under the Apache License, Version 2.0 (the "License"); 5b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * you may not use this file except in compliance with the License. 6b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * You may obtain a copy of the License at 7b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * 8b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * http://www.apache.org/licenses/LICENSE-2.0 9b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * 10b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * Unless required by applicable law or agreed to in writing, software 11b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * distributed under the License is distributed on an "AS IS" BASIS, 12b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * See the License for the specific language governing permissions and 14b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * limitations under the License. 15b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke */ 16b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 17b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#define LOG_TAG "SoftAAC2" 18b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#include <utils/Log.h> 19b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 20b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#include "SoftAAC2.h" 21b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 22b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#include <media/stagefright/foundation/ADebug.h> 23b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#include <media/stagefright/foundation/hexdump.h> 24b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 25b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#define FILEREAD_MAX_LAYERS 2 26b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 27b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkenamespace android { 28b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 29b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burketemplate<class T> 30b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkestatic void InitOMXParams(T *params) { 31b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nSize = sizeof(T); 32b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nVersionMajor = 1; 33b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nVersionMinor = 0; 34b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nRevision = 0; 35b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nStep = 0; 36b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 37b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 38b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeSoftAAC2::SoftAAC2( 39b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const char *name, 40b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_CALLBACKTYPE *callbacks, 41b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PTR appData, 42b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_COMPONENTTYPE **component) 43b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke : SimpleSoftOMXComponent(name, callbacks, appData, component), 44b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAACDecoder(NULL), 45b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo(NULL), 46b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS(false), 47b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mInputBufferCount(0), 48b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mSignalledError(false), 49095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke mInputDiscontinuity(false), 50b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs(0), 51b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput(0), 52b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange(NONE) { 53b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke initPorts(); 54b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_EQ(initDecoder(), (status_t)OK); 55b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 56b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 57b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeSoftAAC2::~SoftAAC2() { 58b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacDecoder_Close(mAACDecoder); 59b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 60b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 61b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::initPorts() { 62b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PARAM_PORTDEFINITIONTYPE def; 63b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke InitOMXParams(&def); 64b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 65b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nPortIndex = 0; 66b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDir = OMX_DirInput; 67eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber def.nBufferCountMin = kNumInputBuffers; 68b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferCountActual = def.nBufferCountMin; 69b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferSize = 8192; 70b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bEnabled = OMX_TRUE; 71b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bPopulated = OMX_FALSE; 72b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDomain = OMX_PortDomainAudio; 73b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bBuffersContiguous = OMX_FALSE; 74b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferAlignment = 1; 75b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 76b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.cMIMEType = const_cast<char *>("audio/aac"); 77b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.pNativeRender = NULL; 78b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.bFlagErrorConcealment = OMX_FALSE; 79b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 80b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 81b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke addPort(def); 82b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 83b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nPortIndex = 1; 84b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDir = OMX_DirOutput; 85eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber def.nBufferCountMin = kNumOutputBuffers; 86b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferCountActual = def.nBufferCountMin; 87095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke def.nBufferSize = 8192 * 2; 88b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bEnabled = OMX_TRUE; 89b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bPopulated = OMX_FALSE; 90b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDomain = OMX_PortDomainAudio; 91b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bBuffersContiguous = OMX_FALSE; 92b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferAlignment = 2; 93b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 94b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.cMIMEType = const_cast<char *>("audio/raw"); 95b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.pNativeRender = NULL; 96b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.bFlagErrorConcealment = OMX_FALSE; 97b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 98b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 99b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke addPort(def); 100b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 101b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 102b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkestatus_t SoftAAC2::initDecoder() { 103b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke status_t status = UNKNOWN_ERROR; 104e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber mAACDecoder = aacDecoder_Open(TT_MP4_ADIF, /* num layers */ 1); 105b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mAACDecoder != NULL) { 106b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo = aacDecoder_GetStreamInfo(mAACDecoder); 107b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mStreamInfo != NULL) { 108b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke status = OK; 109b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 110b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 11141914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = true; 112b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return status; 113b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 114b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 115b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeOMX_ERRORTYPE SoftAAC2::internalGetParameter( 116b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_INDEXTYPE index, OMX_PTR params) { 117b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (index) { 118b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioAac: 119b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 120b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams = 121b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_AACPROFILETYPE *)params; 122b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 123b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->nPortIndex != 0) { 124b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 125b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 126b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 127b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nBitRate = 0; 128b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAudioBandWidth = 0; 129b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAACtools = 0; 130b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAACERtools = 0; 131b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eAACProfile = OMX_AUDIO_AACObjectMain; 132b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 133b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eAACStreamFormat = 134b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS 135b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ? OMX_AUDIO_AACStreamFormatMP4ADTS 136b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke : OMX_AUDIO_AACStreamFormatMP4FF; 137b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 138b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eChannelMode = OMX_AUDIO_ChannelModeStereo; 139b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 140b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (!isConfigured()) { 141b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nChannels = 1; 142b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nSampleRate = 44100; 143b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nFrameLength = 0; 144b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 145f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nChannels = mStreamInfo->numChannels; 146f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nSampleRate = mStreamInfo->sampleRate; 147f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nFrameLength = mStreamInfo->frameSize; 148b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 149b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 150b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 151b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 152b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 153b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioPcm: 154b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 155b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 156b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 157b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 158b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (pcmParams->nPortIndex != 1) { 159b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 160b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 161b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 162b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eNumData = OMX_NumericalDataSigned; 163b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eEndian = OMX_EndianBig; 164b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->bInterleaved = OMX_TRUE; 165b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nBitPerSample = 16; 166b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->ePCMMode = OMX_AUDIO_PCMModeLinear; 167b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eChannelMapping[0] = OMX_AUDIO_ChannelLF; 168b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF; 169095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[2] = OMX_AUDIO_ChannelCF; 170095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[3] = OMX_AUDIO_ChannelLFE; 171095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[4] = OMX_AUDIO_ChannelLS; 172095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[5] = OMX_AUDIO_ChannelRS; 173b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 174b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (!isConfigured()) { 175b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nChannels = 1; 176b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nSamplingRate = 44100; 177b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 178f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke pcmParams->nChannels = mStreamInfo->numChannels; 179b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nSamplingRate = mStreamInfo->sampleRate; 180e893150187191299002626c75232f8985189cb0dDave Burke ALOGI("Sampling rate: %lu, channels: %lu", 181e893150187191299002626c75232f8985189cb0dDave Burke pcmParams->nSamplingRate, 182e893150187191299002626c75232f8985189cb0dDave Burke pcmParams->nChannels); 183b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 184b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 185b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 186b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 187b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 188b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 189b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalGetParameter(index, params); 190b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 191f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 192b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 193b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 194b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeOMX_ERRORTYPE SoftAAC2::internalSetParameter( 195b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_INDEXTYPE index, const OMX_PTR params) { 196b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (index) { 197b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamStandardComponentRole: 198b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 199b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_PARAM_COMPONENTROLETYPE *roleParams = 200b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_PARAM_COMPONENTROLETYPE *)params; 201b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 202b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (strncmp((const char *)roleParams->cRole, 203b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke "audio_decoder.aac", 204b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_MAX_STRINGNAME_SIZE - 1)) { 205b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 206b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 207b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 208b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 209b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 210b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 211b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioAac: 212b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 213b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams = 214b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_AUDIO_PARAM_AACPROFILETYPE *)params; 215b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 216b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->nPortIndex != 0) { 217b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 218b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 219b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 220b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->eAACStreamFormat == OMX_AUDIO_AACStreamFormatMP4FF) { 221b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = false; 222b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else if (aacParams->eAACStreamFormat 223b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke == OMX_AUDIO_AACStreamFormatMP4ADTS) { 224b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = true; 225b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 226b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 227b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 228b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 229b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 230b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 231b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 232b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioPcm: 233b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 234b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 235b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 236b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 237b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (pcmParams->nPortIndex != 1) { 238b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 239b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 240b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 241b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 242b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 243b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 244b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 245b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalSetParameter(index, params); 246b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 247b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 248b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 249b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkebool SoftAAC2::isConfigured() const { 250b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return mInputBufferCount > 0; 251b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 252b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 253b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onQueueFilled(OMX_U32 portIndex) { 254b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mSignalledError || mOutputPortSettingsChange != NONE) { 255b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 256b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 257b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 258b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UCHAR* inBuffer[FILEREAD_MAX_LAYERS]; 259b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferLength[FILEREAD_MAX_LAYERS] = {0}; 260b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT bytesValid[FILEREAD_MAX_LAYERS] = {0}; 261b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 262b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &inQueue = getPortQueue(0); 263b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &outQueue = getPortQueue(1); 264b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 265b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0 && mInputBufferCount == 0) { 266b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 267b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *info = *inQueue.begin(); 268b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *header = info->mHeader; 269b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 270b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = header->pBuffer + header->nOffset; 271b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = header->nFilledLen; 272b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 273b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke AAC_DECODER_ERROR decoderErr = 274b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacDecoder_ConfigRaw(mAACDecoder, 275b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer, 276b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength); 277b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 278b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr != AAC_DEC_OK) { 279b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mSignalledError = true; 280b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 281b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 282b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 283b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 284b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke info->mOwnedByUs = false; 285b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(header); 286b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 287b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventPortSettingsChanged, 1, 0, NULL); 288b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_DISABLED; 289b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 290b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 291b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 292b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke while (!inQueue.empty() && !outQueue.empty()) { 293b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *inInfo = *inQueue.begin(); 294b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader; 295b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 296b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *outInfo = *outQueue.begin(); 297b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader; 298b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 299b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) { 300b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 301b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo->mOwnedByUs = false; 302b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(inHeader); 303b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 30441914becfd019c619783d875c61ef71db0e67400Marco Nelissen // flush out the decoder's delayed data by calling DecodeFrame one more time, with 30541914becfd019c619783d875c61ef71db0e67400Marco Nelissen // the AACDEC_FLUSH flag set 30641914becfd019c619783d875c61ef71db0e67400Marco Nelissen INT_PCM *outBuffer = 30741914becfd019c619783d875c61ef71db0e67400Marco Nelissen reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); 308f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AAC_DECODER_ERROR decoderErr = aacDecoder_DecodeFrame(mAACDecoder, 309f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outBuffer, 310f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outHeader->nAllocLen, 311f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AACDEC_FLUSH); 312f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke if (decoderErr != AAC_DEC_OK) { 313f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke mSignalledError = true; 314f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 315f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke return; 316f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke } 317f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 31841914becfd019c619783d875c61ef71db0e67400Marco Nelissen outHeader->nFilledLen = 31941914becfd019c619783d875c61ef71db0e67400Marco Nelissen mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; 320b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFlags = OMX_BUFFERFLAG_EOS; 321b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 322b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outQueue.erase(outQueue.begin()); 323b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo->mOwnedByUs = false; 324b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyFillBufferDone(outHeader); 325b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 326b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 327b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 328b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nOffset == 0) { 329b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs = inHeader->nTimeStamp; 330b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput = 0; 331b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 332b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3336b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber size_t adtsHeaderSize = 0; 334b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mIsADTS) { 335b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // skip 30 bits, aac_frame_length follows. 336b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // ssssssss ssssiiip ppffffPc ccohCCll llllllll lll????? 337b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 338b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const uint8_t *adtsHeader = inHeader->pBuffer + inHeader->nOffset; 339b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 340b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_GE(inHeader->nFilledLen, 7); 341b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 342b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke bool protectionAbsent = (adtsHeader[1] & 1); 343b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 344b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke unsigned aac_frame_length = 345b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ((adtsHeader[3] & 3) << 11) 346b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke | (adtsHeader[4] << 3) 347b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke | (adtsHeader[5] >> 5); 348b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 349b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_GE(inHeader->nFilledLen, aac_frame_length); 350b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3516b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber adtsHeaderSize = (protectionAbsent ? 7 : 9); 352b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3536b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inBuffer[0] = (UCHAR *)adtsHeader + adtsHeaderSize; 3546b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inBufferLength[0] = aac_frame_length - adtsHeaderSize; 355b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3566b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nOffset += adtsHeaderSize; 3576b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nFilledLen -= adtsHeaderSize; 358b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 359b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = inHeader->pBuffer + inHeader->nOffset; 360b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = inHeader->nFilledLen; 361b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 362b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 363b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Fill and decode 364b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); 365b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke bytesValid[0] = inBufferLength[0]; 366b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 367095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke int flags = mInputDiscontinuity ? AACDEC_INTR : 0; 368b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke int prevSampleRate = mStreamInfo->sampleRate; 369f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke int prevNumChannels = mStreamInfo->numChannels; 3706b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 371f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AAC_DECODER_ERROR decoderErr = AAC_DEC_NOT_ENOUGH_BITS; 372f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke while (bytesValid[0] > 0 && decoderErr == AAC_DEC_NOT_ENOUGH_BITS) { 373f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacDecoder_Fill(mAACDecoder, 374f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBuffer, 375f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBufferLength, 376f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke bytesValid); 3776b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 378f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke decoderErr = aacDecoder_DecodeFrame(mAACDecoder, 379f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outBuffer, 380f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outHeader->nAllocLen, 381f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke flags); 382f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 383f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke } 384095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke mInputDiscontinuity = false; 385b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 386b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke /* 387b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * AAC+/eAAC+ streams can be signalled in two ways: either explicitly 388b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * or implicitly, according to MPEG4 spec. AAC+/eAAC+ is a dual 389b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * rate system and the sampling rate in the final output is actually 390b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * doubled compared with the core AAC decoder sampling rate. 391b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * 392b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * Explicit signalling is done by explicitly defining SBR audio object 393b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * type in the bitstream. Implicit signalling is done by embedding 394b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * SBR content in AAC extension payload specific to SBR, and hence 395b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * requires an AAC decoder to perform pre-checks on actual audio frames. 396b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * 397b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * Thus, we could not say for sure whether a stream is 398b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke * AAC+/eAAC+ until the first data frame is decoded. 399b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke */ 400940335776b6d4eb91b13c4e56bc20bed3ac0011bDave Burke if (mInputBufferCount <= 2) { 401f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke if (mStreamInfo->sampleRate != prevSampleRate || 402f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke mStreamInfo->numChannels != prevNumChannels) { 4036b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber // We're going to want to revisit this input buffer, but 4046b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber // may have already advanced the offset. Undo that if 4056b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber // necessary. 4066b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nOffset -= adtsHeaderSize; 4076b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nFilledLen += adtsHeaderSize; 4086b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 409b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventPortSettingsChanged, 1, 0, NULL); 410b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_DISABLED; 411b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 412b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 413b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 414b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 415b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke size_t numOutBytes = 416b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; 417b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 418b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 419b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferUsedLength = inBufferLength[0] - bytesValid[0]; 420b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen -= inBufferUsedLength; 421b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nOffset += inBufferUsedLength; 422b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 423b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ALOGW("AAC decoder returned error %d, substituting silence", 424b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke decoderErr); 425b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 426b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke memset(outHeader->pBuffer + outHeader->nOffset, 0, numOutBytes); 427b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 428b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Discard input buffer. 429b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen = 0; 430b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 431e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1); 432e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber 433b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // fall through 434b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 435b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 436b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK || mNumSamplesOutput > 0) { 437b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // We'll only output data if we successfully decoded it or 438b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // we've previously decoded valid data, in the latter case 439b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // (decode failed) we'll output a silent frame. 44041914becfd019c619783d875c61ef71db0e67400Marco Nelissen if (mIsFirst) { 44141914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = false; 44241914becfd019c619783d875c61ef71db0e67400Marco Nelissen // the first decoded frame should be discarded to account for decoder delay 44341914becfd019c619783d875c61ef71db0e67400Marco Nelissen numOutBytes = 0; 44441914becfd019c619783d875c61ef71db0e67400Marco Nelissen } 44541914becfd019c619783d875c61ef71db0e67400Marco Nelissen 446b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFilledLen = numOutBytes; 447b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFlags = 0; 448b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 449b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nTimeStamp = 450b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs 451b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke + (mNumSamplesOutput * 1000000ll) / mStreamInfo->sampleRate; 452b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 453b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput += mStreamInfo->frameSize; 454b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 455b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo->mOwnedByUs = false; 456b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outQueue.erase(outQueue.begin()); 457b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo = NULL; 458b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyFillBufferDone(outHeader); 459b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader = NULL; 460b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 461b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 462b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nFilledLen == 0) { 463b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo->mOwnedByUs = false; 464b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 465b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo = NULL; 466b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(inHeader); 467b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader = NULL; 468b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 469b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 470b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 471b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 472b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 473b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 474b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 475b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 476b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortFlushCompleted(OMX_U32 portIndex) { 477b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0) { 478b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Make sure that the next buffer output does not still 479b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // depend on fragments from the last one decoded. 480095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke mInputDiscontinuity = true; 48141914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = true; 482b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 483b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 484b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 485b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { 486b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex != 1) { 487b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 488b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 489b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 490b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (mOutputPortSettingsChange) { 491b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case NONE: 492b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 493b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 494b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case AWAITING_DISABLED: 495b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 496b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(!enabled); 497b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_ENABLED; 498b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 499b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 500b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 501b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 502b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 503b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_EQ((int)mOutputPortSettingsChange, (int)AWAITING_ENABLED); 504b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(enabled); 505b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = NONE; 506b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 507b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 508b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 509b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 510b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 511b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} // namespace android 512b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 513b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkeandroid::SoftOMXComponent *createSoftOMXComponent( 514b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const char *name, const OMX_CALLBACKTYPE *callbacks, 515b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PTR appData, OMX_COMPONENTTYPE **component) { 516b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return new android::SoftAAC2(name, callbacks, appData, component); 517b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 518