SoftAAC2.cpp revision 3748b71a7fe73b0365a93f1fd28ced14219f85e5
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), 49b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs(0), 50b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput(0), 51b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange(NONE) { 52b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke initPorts(); 53b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_EQ(initDecoder(), (status_t)OK); 54b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 55b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 56b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeSoftAAC2::~SoftAAC2() { 57b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacDecoder_Close(mAACDecoder); 58b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 59b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 60b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::initPorts() { 61b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PARAM_PORTDEFINITIONTYPE def; 62b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke InitOMXParams(&def); 63b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 64b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nPortIndex = 0; 65b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDir = OMX_DirInput; 66eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber def.nBufferCountMin = kNumInputBuffers; 67b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferCountActual = def.nBufferCountMin; 68b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferSize = 8192; 69b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bEnabled = OMX_TRUE; 70b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bPopulated = OMX_FALSE; 71b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDomain = OMX_PortDomainAudio; 72b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bBuffersContiguous = OMX_FALSE; 73b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferAlignment = 1; 74b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 75b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.cMIMEType = const_cast<char *>("audio/aac"); 76b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.pNativeRender = NULL; 77b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.bFlagErrorConcealment = OMX_FALSE; 78b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 79b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 80b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke addPort(def); 81b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 82b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nPortIndex = 1; 83b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDir = OMX_DirOutput; 84eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber def.nBufferCountMin = kNumOutputBuffers; 85b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferCountActual = def.nBufferCountMin; 86095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke def.nBufferSize = 8192 * 2; 87b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bEnabled = OMX_TRUE; 88b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bPopulated = OMX_FALSE; 89b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.eDomain = OMX_PortDomainAudio; 90b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.bBuffersContiguous = OMX_FALSE; 91b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.nBufferAlignment = 2; 92b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 93b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.cMIMEType = const_cast<char *>("audio/raw"); 94b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.pNativeRender = NULL; 95b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.bFlagErrorConcealment = OMX_FALSE; 96b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 97b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 98b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke addPort(def); 99b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 100b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 101b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkestatus_t SoftAAC2::initDecoder() { 102b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke status_t status = UNKNOWN_ERROR; 103e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber mAACDecoder = aacDecoder_Open(TT_MP4_ADIF, /* num layers */ 1); 104b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mAACDecoder != NULL) { 105b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo = aacDecoder_GetStreamInfo(mAACDecoder); 106b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mStreamInfo != NULL) { 107b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke status = OK; 108b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 109b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 11041914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = true; 111b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return status; 112b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 113b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 114b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeOMX_ERRORTYPE SoftAAC2::internalGetParameter( 115b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_INDEXTYPE index, OMX_PTR params) { 116b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (index) { 117b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioAac: 118b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 119b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams = 120b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_AACPROFILETYPE *)params; 121b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 122b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->nPortIndex != 0) { 123b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 124b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 125b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 126b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nBitRate = 0; 127b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAudioBandWidth = 0; 128b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAACtools = 0; 129b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nAACERtools = 0; 130b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eAACProfile = OMX_AUDIO_AACObjectMain; 131b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 132b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eAACStreamFormat = 133b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS 134b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ? OMX_AUDIO_AACStreamFormatMP4ADTS 135b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke : OMX_AUDIO_AACStreamFormatMP4FF; 136b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 137b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->eChannelMode = OMX_AUDIO_ChannelModeStereo; 138b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 139b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (!isConfigured()) { 140b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nChannels = 1; 141b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nSampleRate = 44100; 142b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacParams->nFrameLength = 0; 143b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 144f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nChannels = mStreamInfo->numChannels; 145f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nSampleRate = mStreamInfo->sampleRate; 146f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacParams->nFrameLength = mStreamInfo->frameSize; 147b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 148b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 149b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 150b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 151b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 152b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioPcm: 153b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 154b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 155b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 156b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 157b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (pcmParams->nPortIndex != 1) { 158b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 159b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 160b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 161b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eNumData = OMX_NumericalDataSigned; 162b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eEndian = OMX_EndianBig; 163b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->bInterleaved = OMX_TRUE; 164b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nBitPerSample = 16; 165b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->ePCMMode = OMX_AUDIO_PCMModeLinear; 166b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eChannelMapping[0] = OMX_AUDIO_ChannelLF; 167b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF; 168095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[2] = OMX_AUDIO_ChannelCF; 169095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[3] = OMX_AUDIO_ChannelLFE; 170095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[4] = OMX_AUDIO_ChannelLS; 171095c2da8d6c2058b02142c940f6e6346d6581780Dave Burke pcmParams->eChannelMapping[5] = OMX_AUDIO_ChannelRS; 172b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 173b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (!isConfigured()) { 174b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nChannels = 1; 175b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nSamplingRate = 44100; 176b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 177f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke pcmParams->nChannels = mStreamInfo->numChannels; 178b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke pcmParams->nSamplingRate = mStreamInfo->sampleRate; 179e893150187191299002626c75232f8985189cb0dDave Burke ALOGI("Sampling rate: %lu, channels: %lu", 180e893150187191299002626c75232f8985189cb0dDave Burke pcmParams->nSamplingRate, 181e893150187191299002626c75232f8985189cb0dDave Burke pcmParams->nChannels); 182b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 183b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 184b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 185b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 186b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 187b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 188b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalGetParameter(index, params); 189b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 190f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 191b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 192b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 193b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeOMX_ERRORTYPE SoftAAC2::internalSetParameter( 194b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_INDEXTYPE index, const OMX_PTR params) { 195b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (index) { 196b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamStandardComponentRole: 197b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 198b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_PARAM_COMPONENTROLETYPE *roleParams = 199b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_PARAM_COMPONENTROLETYPE *)params; 200b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 201b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (strncmp((const char *)roleParams->cRole, 202b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke "audio_decoder.aac", 203b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_MAX_STRINGNAME_SIZE - 1)) { 204b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 205b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 206b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 207b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 208b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 209b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 210b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioAac: 211b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 212b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams = 213b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_AUDIO_PARAM_AACPROFILETYPE *)params; 214b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 215b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->nPortIndex != 0) { 216b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 217b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 218b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 219b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->eAACStreamFormat == OMX_AUDIO_AACStreamFormatMP4FF) { 220b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = false; 221b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else if (aacParams->eAACStreamFormat 222b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke == OMX_AUDIO_AACStreamFormatMP4ADTS) { 223b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = true; 224b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 225b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 226b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 227b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 228b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 229b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 230b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 231b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioPcm: 232b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 233b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 234b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 235b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 236b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (pcmParams->nPortIndex != 1) { 237b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 238b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 239b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 240b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 241b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 242b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 243b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 244b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalSetParameter(index, params); 245b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 246b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 247b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 248b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkebool SoftAAC2::isConfigured() const { 249b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return mInputBufferCount > 0; 250b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 251b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 252b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onQueueFilled(OMX_U32 portIndex) { 253b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mSignalledError || mOutputPortSettingsChange != NONE) { 254b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 255b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 256b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 257b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UCHAR* inBuffer[FILEREAD_MAX_LAYERS]; 258b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferLength[FILEREAD_MAX_LAYERS] = {0}; 259b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT bytesValid[FILEREAD_MAX_LAYERS] = {0}; 260b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 261b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &inQueue = getPortQueue(0); 262b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &outQueue = getPortQueue(1); 263b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 264b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0 && mInputBufferCount == 0) { 265b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 266b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *info = *inQueue.begin(); 267b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *header = info->mHeader; 268b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 269b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = header->pBuffer + header->nOffset; 270b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = header->nFilledLen; 271b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 272b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke AAC_DECODER_ERROR decoderErr = 273b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacDecoder_ConfigRaw(mAACDecoder, 274b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer, 275b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength); 276b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 277b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr != AAC_DEC_OK) { 278b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mSignalledError = true; 279b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 280b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 281b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 282b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 283b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke info->mOwnedByUs = false; 284b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(header); 285b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 286b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventPortSettingsChanged, 1, 0, NULL); 287b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_DISABLED; 288b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 289b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 290b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 291b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke while (!inQueue.empty() && !outQueue.empty()) { 292b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *inInfo = *inQueue.begin(); 293b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader; 294b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 295b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *outInfo = *outQueue.begin(); 296b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader; 297b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 298b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) { 299b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 300b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo->mOwnedByUs = false; 301b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(inHeader); 302b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 30341914becfd019c619783d875c61ef71db0e67400Marco Nelissen // flush out the decoder's delayed data by calling DecodeFrame one more time, with 30441914becfd019c619783d875c61ef71db0e67400Marco Nelissen // the AACDEC_FLUSH flag set 30541914becfd019c619783d875c61ef71db0e67400Marco Nelissen INT_PCM *outBuffer = 30641914becfd019c619783d875c61ef71db0e67400Marco Nelissen reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); 307f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AAC_DECODER_ERROR decoderErr = aacDecoder_DecodeFrame(mAACDecoder, 308f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outBuffer, 309f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outHeader->nAllocLen, 310f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AACDEC_FLUSH); 311f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke if (decoderErr != AAC_DEC_OK) { 312f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke mSignalledError = true; 313f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 314f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke return; 315f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke } 316f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 31741914becfd019c619783d875c61ef71db0e67400Marco Nelissen outHeader->nFilledLen = 31841914becfd019c619783d875c61ef71db0e67400Marco Nelissen mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; 319b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFlags = OMX_BUFFERFLAG_EOS; 320b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 321b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outQueue.erase(outQueue.begin()); 322b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo->mOwnedByUs = false; 323b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyFillBufferDone(outHeader); 324b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 325b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 326b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 327b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nOffset == 0) { 328b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs = inHeader->nTimeStamp; 329b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput = 0; 330b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 331b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3326b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber size_t adtsHeaderSize = 0; 333b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mIsADTS) { 334b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // skip 30 bits, aac_frame_length follows. 335b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // ssssssss ssssiiip ppffffPc ccohCCll llllllll lll????? 336b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 337b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const uint8_t *adtsHeader = inHeader->pBuffer + inHeader->nOffset; 338b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 339b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_GE(inHeader->nFilledLen, 7); 340b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 341b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke bool protectionAbsent = (adtsHeader[1] & 1); 342b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 343b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke unsigned aac_frame_length = 344b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ((adtsHeader[3] & 3) << 11) 345b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke | (adtsHeader[4] << 3) 346b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke | (adtsHeader[5] >> 5); 347b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 348b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_GE(inHeader->nFilledLen, aac_frame_length); 349b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3506b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber adtsHeaderSize = (protectionAbsent ? 7 : 9); 351b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3526b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inBuffer[0] = (UCHAR *)adtsHeader + adtsHeaderSize; 3536b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inBufferLength[0] = aac_frame_length - adtsHeaderSize; 354b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 3556b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nOffset += adtsHeaderSize; 3566b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber inHeader->nFilledLen -= adtsHeaderSize; 357b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 358b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = inHeader->pBuffer + inHeader->nOffset; 359b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = inHeader->nFilledLen; 360b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 361b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 362b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Fill and decode 363b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); 364b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke bytesValid[0] = inBufferLength[0]; 365b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 366b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke int prevSampleRate = mStreamInfo->sampleRate; 367f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke int prevNumChannels = mStreamInfo->numChannels; 3686b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 369f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AAC_DECODER_ERROR decoderErr = AAC_DEC_NOT_ENOUGH_BITS; 370f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke while (bytesValid[0] > 0 && decoderErr == AAC_DEC_NOT_ENOUGH_BITS) { 371f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacDecoder_Fill(mAACDecoder, 372f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBuffer, 373f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBufferLength, 374f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke bytesValid); 3756b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 376f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke decoderErr = aacDecoder_DecodeFrame(mAACDecoder, 377f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outBuffer, 378f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outHeader->nAllocLen, 3793748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke 0 /* flags */); 380f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 381f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke } 3823748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke 3833748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke // Check if stream info has changed 3843748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke if (mStreamInfo->sampleRate != prevSampleRate || 3853748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke mStreamInfo->numChannels != prevNumChannels) { 3863748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke // We're going to want to revisit this input buffer, but 3873748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke // may have already advanced the offset. Undo that if 3883748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke // necessary. 3893748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke inHeader->nOffset -= adtsHeaderSize; 3903748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke inHeader->nFilledLen += adtsHeaderSize; 3913748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke 3923748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke notify(OMX_EventPortSettingsChanged, 1, 0, NULL); 3933748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke mOutputPortSettingsChange = AWAITING_DISABLED; 3943748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke return; 395b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 396b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 397b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke size_t numOutBytes = 398b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; 399b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 400b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 401b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferUsedLength = inBufferLength[0] - bytesValid[0]; 402b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen -= inBufferUsedLength; 403b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nOffset += inBufferUsedLength; 404b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 405b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ALOGW("AAC decoder returned error %d, substituting silence", 406b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke decoderErr); 407b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 408b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke memset(outHeader->pBuffer + outHeader->nOffset, 0, numOutBytes); 409b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 410b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Discard input buffer. 411b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen = 0; 412b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 413e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1); 414e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber 415b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // fall through 416b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 417b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 418b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK || mNumSamplesOutput > 0) { 419b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // We'll only output data if we successfully decoded it or 420b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // we've previously decoded valid data, in the latter case 421b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // (decode failed) we'll output a silent frame. 42241914becfd019c619783d875c61ef71db0e67400Marco Nelissen if (mIsFirst) { 42341914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = false; 42441914becfd019c619783d875c61ef71db0e67400Marco Nelissen // the first decoded frame should be discarded to account for decoder delay 42541914becfd019c619783d875c61ef71db0e67400Marco Nelissen numOutBytes = 0; 42641914becfd019c619783d875c61ef71db0e67400Marco Nelissen } 42741914becfd019c619783d875c61ef71db0e67400Marco Nelissen 428b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFilledLen = numOutBytes; 429b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFlags = 0; 430b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 431b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nTimeStamp = 432b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs 433b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke + (mNumSamplesOutput * 1000000ll) / mStreamInfo->sampleRate; 434b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 435b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput += mStreamInfo->frameSize; 436b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 437b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo->mOwnedByUs = false; 438b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outQueue.erase(outQueue.begin()); 439b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo = NULL; 440b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyFillBufferDone(outHeader); 441b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader = NULL; 442b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 443b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 444b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nFilledLen == 0) { 445b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo->mOwnedByUs = false; 446b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 447b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo = NULL; 448b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(inHeader); 449b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader = NULL; 450b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 451b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 452b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 453b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 454b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 455b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 456b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 457b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 458b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortFlushCompleted(OMX_U32 portIndex) { 459b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0) { 460b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Make sure that the next buffer output does not still 461b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // depend on fragments from the last one decoded. 4623748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1); 46341914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = true; 464b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 465b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 466b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 467b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { 468b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex != 1) { 469b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 470b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 471b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 472b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (mOutputPortSettingsChange) { 473b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case NONE: 474b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 475b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 476b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case AWAITING_DISABLED: 477b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 478b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(!enabled); 479b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_ENABLED; 480b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 481b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 482b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 483b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 484b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 485b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_EQ((int)mOutputPortSettingsChange, (int)AWAITING_ENABLED); 486b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(enabled); 487b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = NONE; 488b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 489b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 490b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 491b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 492b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 493b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} // namespace android 494b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 495b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkeandroid::SoftOMXComponent *createSoftOMXComponent( 496b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const char *name, const OMX_CALLBACKTYPE *callbacks, 497b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PTR appData, OMX_COMPONENTTYPE **component) { 498b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return new android::SoftAAC2(name, callbacks, appData, component); 499b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 500