SoftAAC2.cpp revision e35ac2860e99d809a2ccca59bd4eb2f8c02d15ad
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> 248370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber#include <media/stagefright/MediaErrors.h> 25b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 26b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke#define FILEREAD_MAX_LAYERS 2 27b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 28b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkenamespace android { 29b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 30b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burketemplate<class T> 31b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkestatic void InitOMXParams(T *params) { 32b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nSize = sizeof(T); 33b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nVersionMajor = 1; 34b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nVersionMinor = 0; 35b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nRevision = 0; 36b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke params->nVersion.s.nStep = 0; 37b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 38b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 39b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeSoftAAC2::SoftAAC2( 40b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const char *name, 41b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_CALLBACKTYPE *callbacks, 42b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PTR appData, 43b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_COMPONENTTYPE **component) 44b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke : SimpleSoftOMXComponent(name, callbacks, appData, component), 45b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAACDecoder(NULL), 46b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo(NULL), 47b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS(false), 48b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mInputBufferCount(0), 49b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mSignalledError(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 140bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave 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 174bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave 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; 180b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 181b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 182b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 183b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 184b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 185b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 186b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalGetParameter(index, params); 187b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 188f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 189b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 190b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 191b7ddcc9460f488f0b032aeb27b52a423318a97eaDave BurkeOMX_ERRORTYPE SoftAAC2::internalSetParameter( 192b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_INDEXTYPE index, const OMX_PTR params) { 193b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (index) { 194b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamStandardComponentRole: 195b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 196b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_PARAM_COMPONENTROLETYPE *roleParams = 197b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_PARAM_COMPONENTROLETYPE *)params; 198b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 199b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (strncmp((const char *)roleParams->cRole, 200b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke "audio_decoder.aac", 201b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_MAX_STRINGNAME_SIZE - 1)) { 202b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 203b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 204b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 205b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 206b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 207b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 208b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioAac: 209b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 210b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams = 211b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (const OMX_AUDIO_PARAM_AACPROFILETYPE *)params; 212b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 213b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->nPortIndex != 0) { 214b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 215b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 216b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 217b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (aacParams->eAACStreamFormat == OMX_AUDIO_AACStreamFormatMP4FF) { 218b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = false; 219b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else if (aacParams->eAACStreamFormat 220b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke == OMX_AUDIO_AACStreamFormatMP4ADTS) { 221b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mIsADTS = true; 222b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 223b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 224b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 225b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 226b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 227b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 228b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 229b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case OMX_IndexParamAudioPcm: 230b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 231b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams = 232b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke (OMX_AUDIO_PARAM_PCMMODETYPE *)params; 233b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 234b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (pcmParams->nPortIndex != 1) { 235b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorUndefined; 236b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 237b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 238b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return OMX_ErrorNone; 239b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 240b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 241b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 242b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return SimpleSoftOMXComponent::internalSetParameter(index, params); 243b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 244b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 245b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 246b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkebool SoftAAC2::isConfigured() const { 247b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return mInputBufferCount > 0; 248b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 249b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 250b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onQueueFilled(OMX_U32 portIndex) { 251b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (mSignalledError || mOutputPortSettingsChange != NONE) { 252b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 253b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 254b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 255b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UCHAR* inBuffer[FILEREAD_MAX_LAYERS]; 256b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferLength[FILEREAD_MAX_LAYERS] = {0}; 257b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT bytesValid[FILEREAD_MAX_LAYERS] = {0}; 258b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 259b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &inQueue = getPortQueue(0); 260b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke List<BufferInfo *> &outQueue = getPortQueue(1); 261b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 262b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0 && mInputBufferCount == 0) { 263b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 264b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke BufferInfo *info = *inQueue.begin(); 265b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_BUFFERHEADERTYPE *header = info->mHeader; 266b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 267b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = header->pBuffer + header->nOffset; 268b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = header->nFilledLen; 269b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 270b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke AAC_DECODER_ERROR decoderErr = 271b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke aacDecoder_ConfigRaw(mAACDecoder, 272b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer, 273b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength); 274b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 275b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr != AAC_DEC_OK) { 276b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mSignalledError = true; 277b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 278b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 279b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 280b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 281b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke info->mOwnedByUs = false; 282b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(header); 283b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 284bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke ALOGI("Configuring decoder: %d Hz, %d channels", 285bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mStreamInfo->sampleRate, 286bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mStreamInfo->numChannels); 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 3408370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber bool signalError = false; 3418370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber if (inHeader->nFilledLen < 7) { 3428370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber ALOGE("Audio data too short to contain even the ADTS header. " 3438370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber "Got %ld bytes.", inHeader->nFilledLen); 3448370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber hexdump(adtsHeader, inHeader->nFilledLen); 3458370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber signalError = true; 3468370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber } else { 3478370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber bool protectionAbsent = (adtsHeader[1] & 1); 3488370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 3498370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber unsigned aac_frame_length = 3508370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber ((adtsHeader[3] & 3) << 11) 3518370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber | (adtsHeader[4] << 3) 3528370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber | (adtsHeader[5] >> 5); 3538370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 3548370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber if (inHeader->nFilledLen < aac_frame_length) { 3558370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber ALOGE("Not enough audio data for the complete frame. " 3568370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber "Got %ld bytes, frame size according to the ADTS " 3578370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber "header is %u bytes.", 3588370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber inHeader->nFilledLen, aac_frame_length); 3598370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber hexdump(adtsHeader, inHeader->nFilledLen); 3608370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber signalError = true; 3618370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber } else { 3628370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber adtsHeaderSize = (protectionAbsent ? 7 : 9); 3638370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 3648370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber inBuffer[0] = (UCHAR *)adtsHeader + adtsHeaderSize; 3658370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber inBufferLength[0] = aac_frame_length - adtsHeaderSize; 3668370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 3678370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber inHeader->nOffset += adtsHeaderSize; 3688370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber inHeader->nFilledLen -= adtsHeaderSize; 3698370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber } 370e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber } 3718370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 372e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber if (signalError) { 373e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber mSignalledError = true; 3748370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 375e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber notify(OMX_EventError, 376e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber OMX_ErrorStreamCorrupt, 377e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber ERROR_MALFORMED, 378e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber NULL); 3798370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber 380e35ac2860e99d809a2ccca59bd4eb2f8c02d15adAndreas Huber return; 3818370c7ad4136ad7e0787d5a91ccfa3d63cfbe5ccAndreas Huber } 382b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 383b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBuffer[0] = inHeader->pBuffer + inHeader->nOffset; 384b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inBufferLength[0] = inHeader->nFilledLen; 385b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 386b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 387b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Fill and decode 388b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); 389b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke bytesValid[0] = inBufferLength[0]; 390b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 391b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke int prevSampleRate = mStreamInfo->sampleRate; 392f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke int prevNumChannels = mStreamInfo->numChannels; 3936b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 394f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke AAC_DECODER_ERROR decoderErr = AAC_DEC_NOT_ENOUGH_BITS; 395f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke while (bytesValid[0] > 0 && decoderErr == AAC_DEC_NOT_ENOUGH_BITS) { 396f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke aacDecoder_Fill(mAACDecoder, 397f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBuffer, 398f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke inBufferLength, 399f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke bytesValid); 4006b7b8227cc8753fde4094ca8af2d381c2740826fAndreas Huber 401f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke decoderErr = aacDecoder_DecodeFrame(mAACDecoder, 402f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outBuffer, 403f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke outHeader->nAllocLen, 4043748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke 0 /* flags */); 405f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke 406f60c660f048d5f5e2458cff243c20400d73757a7Dave Burke } 4073748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke 408bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke /* 409bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * AAC+/eAAC+ streams can be signalled in two ways: either explicitly 410bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * or implicitly, according to MPEG4 spec. AAC+/eAAC+ is a dual 411bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * rate system and the sampling rate in the final output is actually 412bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * doubled compared with the core AAC decoder sampling rate. 413bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * 414bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * Explicit signalling is done by explicitly defining SBR audio object 415bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * type in the bitstream. Implicit signalling is done by embedding 416bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * SBR content in AAC extension payload specific to SBR, and hence 417bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * requires an AAC decoder to perform pre-checks on actual audio frames. 418bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * 419bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * Thus, we could not say for sure whether a stream is 420bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke * AAC+/eAAC+ until the first data frame is decoded. 421bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke */ 422bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke if (mInputBufferCount <= 2) { 423bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke if (mStreamInfo->sampleRate != prevSampleRate || 424bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mStreamInfo->numChannels != prevNumChannels) { 425bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke ALOGI("Reconfiguring decoder: %d Hz, %d channels", 426bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mStreamInfo->sampleRate, 427bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mStreamInfo->numChannels); 428bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke 429bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke // We're going to want to revisit this input buffer, but 430bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke // may have already advanced the offset. Undo that if 431bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke // necessary. 432bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke inHeader->nOffset -= adtsHeaderSize; 433bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke inHeader->nFilledLen += adtsHeaderSize; 434bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke 435bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke notify(OMX_EventPortSettingsChanged, 1, 0, NULL); 436bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mOutputPortSettingsChange = AWAITING_DISABLED; 437bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke return; 438bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke } 439bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke } else if (!mStreamInfo->sampleRate || !mStreamInfo->numChannels) { 440bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke ALOGW("Invalid AAC stream"); 441bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke mSignalledError = true; 442bf2461ecc71c0aacf8c03fcdaf0dc46bc8285c7fDave Burke notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); 4433748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke return; 444b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 445b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 446b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke size_t numOutBytes = 447b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; 448b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 449b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 450b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke UINT inBufferUsedLength = inBufferLength[0] - bytesValid[0]; 451b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen -= inBufferUsedLength; 452b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nOffset += inBufferUsedLength; 453b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } else { 454b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ALOGW("AAC decoder returned error %d, substituting silence", 455b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke decoderErr); 456b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 457b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke memset(outHeader->pBuffer + outHeader->nOffset, 0, numOutBytes); 458b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 459b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Discard input buffer. 460b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader->nFilledLen = 0; 461b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 462e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1); 463e672a0eea2cdc2ed43e002f0583902f20705de57Andreas Huber 464b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // fall through 465b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 466b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 467b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK || mNumSamplesOutput > 0) { 468b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // We'll only output data if we successfully decoded it or 469b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // we've previously decoded valid data, in the latter case 470b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // (decode failed) we'll output a silent frame. 47141914becfd019c619783d875c61ef71db0e67400Marco Nelissen if (mIsFirst) { 47241914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = false; 47341914becfd019c619783d875c61ef71db0e67400Marco Nelissen // the first decoded frame should be discarded to account for decoder delay 47441914becfd019c619783d875c61ef71db0e67400Marco Nelissen numOutBytes = 0; 47541914becfd019c619783d875c61ef71db0e67400Marco Nelissen } 47641914becfd019c619783d875c61ef71db0e67400Marco Nelissen 477b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFilledLen = numOutBytes; 478b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nFlags = 0; 479b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 480b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader->nTimeStamp = 481b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mAnchorTimeUs 482b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke + (mNumSamplesOutput * 1000000ll) / mStreamInfo->sampleRate; 483b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 484b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mNumSamplesOutput += mStreamInfo->frameSize; 485b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 486b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo->mOwnedByUs = false; 487b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outQueue.erase(outQueue.begin()); 488b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outInfo = NULL; 489b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyFillBufferDone(outHeader); 490b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke outHeader = NULL; 491b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 492b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 493b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (inHeader->nFilledLen == 0) { 494b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo->mOwnedByUs = false; 495b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inQueue.erase(inQueue.begin()); 496b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inInfo = NULL; 497b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke notifyEmptyBufferDone(inHeader); 498b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke inHeader = NULL; 499b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 500b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 501b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (decoderErr == AAC_DEC_OK) { 502b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke ++mInputBufferCount; 503b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 504b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 505b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 506b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 507b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortFlushCompleted(OMX_U32 portIndex) { 508b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex == 0) { 509b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // Make sure that the next buffer output does not still 510b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke // depend on fragments from the last one decoded. 5113748b71a7fe73b0365a93f1fd28ced14219f85e5Dave Burke aacDecoder_SetParam(mAACDecoder, AAC_TPDEC_CLEAR_BUFFER, 1); 51241914becfd019c619783d875c61ef71db0e67400Marco Nelissen mIsFirst = true; 513b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 514b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 515b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 516b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkevoid SoftAAC2::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { 517b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke if (portIndex != 1) { 518b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return; 519b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 520b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 521b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke switch (mOutputPortSettingsChange) { 522b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case NONE: 523b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 524b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 525b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke case AWAITING_DISABLED: 526b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 527b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(!enabled); 528b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = AWAITING_ENABLED; 529b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 530b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 531b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 532b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke default: 533b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke { 534b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK_EQ((int)mOutputPortSettingsChange, (int)AWAITING_ENABLED); 535b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke CHECK(enabled); 536b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke mOutputPortSettingsChange = NONE; 537b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke break; 538b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 539b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke } 540b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 541b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 542b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} // namespace android 543b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke 544b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burkeandroid::SoftOMXComponent *createSoftOMXComponent( 545b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke const char *name, const OMX_CALLBACKTYPE *callbacks, 546b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke OMX_PTR appData, OMX_COMPONENTTYPE **component) { 547b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke return new android::SoftAAC2(name, callbacks, appData, component); 548b7ddcc9460f488f0b032aeb27b52a423318a97eaDave Burke} 549