aacenc.c revision b676a05348e4c516fa8b57e33b10548e6142c3f8
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/******************************************************************************* 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard File: aacenc.c 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Content: aac encoder interface functions 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*******************************************************************************/ 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "voAAC.h" 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "aacenc_core.h" 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "aac_rom.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cmnMemory.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "memalign.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Init the audio codec module and return codec handle 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param phCodec [OUT] Return the video codec handle 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param vType [IN] The codec type if the module support multi codec. 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pUserData [IN] The init param. It is memory operator or alloced memory 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 37e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData) 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AAC_ENCODER*hAacEnc; 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AACENC_CONFIG config; 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int error; 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VO_MEM_OPERATOR voMemoprator; 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VO_MEM_OPERATOR *pMemOP; 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int interMem; 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard interMem = 0; 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard error = 0; 51b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init the memory operator */ 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard voMemoprator.Alloc = cmnMemAlloc; 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard voMemoprator.Copy = cmnMemCopy; 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard voMemoprator.Free = cmnMemFree; 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard voMemoprator.Set = cmnMemSet; 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard voMemoprator.Check = cmnMemCheck; 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard interMem = 1; 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pMemOP = &voMemoprator; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *phCodec = NULL; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init the aac encoder handle */ 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC); 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hAacEnc) 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard error = 1; 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(!error) 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init the aac encoder intra memory */ 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC); 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hAacEnc->intbuf) 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard error = 1; 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init the aac encoder psychoacoustic */ 94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) || 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PsyOutNew(&hAacEnc->psyOut, pMemOP)); 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init the aac encoder quantization elements */ 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP); 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init the aac encoder quantization state */ 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = QCNew(&hAacEnc->qcKernel, pMemOP); 106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* uninit the aac encoder if error is nozero */ 109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if(error) 110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong AacEncClose(hAacEnc, pMemOP); 112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if(hAacEnc) 113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC); 115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong hAacEnc = NULL; 116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard } 117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *phCodec = NULL; 118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong return VO_ERR_OUTOF_MEMORY; 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init the aac encoder memory operator */ 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(interMem) 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemoprator.Alloc = cmnMemAlloc; 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemoprator.Copy = cmnMemCopy; 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemoprator.Free = cmnMemFree; 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemoprator.Set = cmnMemSet; 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemoprator.Check = cmnMemCheck; 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pMemOP = &hAacEnc->voMemoprator; 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init the aac encoder default parameter */ 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(hAacEnc->initOK == 0) 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AACENC_CONFIG config; 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.adtsUsed = 1; 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = 128000; 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsIn = 2; 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsOut = 2; 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.sampleRate = 44100; 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bandWidth = 20000; 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AacEncOpen(hAacEnc, config); 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->voMemop = pMemOP; 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *phCodec = hAacEnc; 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Set input audio data. 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function. 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pInput [IN] The input buffer param. 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutBuffer [OUT] The output buffer info. 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 162e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AAC_ENCODER *hAacEnc; 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int length; 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer) 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc = (AAC_ENCODER *)hCodec; 173b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init input pcm buffer and length*/ 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->inbuf = (short *)pInput->Buffer; 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->inlen = pInput->Length / sizeof(short); 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->uselength = 0; 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->encbuf = hAacEnc->inbuf; 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->enclen = hAacEnc->inlen; 181b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* rebuild intra pcm buffer and length*/ 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(hAacEnc->intlen) 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen); 186b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen, 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->inbuf, length*sizeof(short)); 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->encbuf = hAacEnc->intbuf; 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->enclen = hAacEnc->intlen + length; 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->inbuf += length; 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->inlen -= length; 194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 195b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Get the outut audio data 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function. 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutBuffer [OUT] The output audio data 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutInfo [OUT] The dec module filled audio format and used the input size. 204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* pOutInfo->InputUsed is total used the input size. 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 208e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo) 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 numAncDataBytes=0; 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 inbuflen; 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int ret, length; 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hAacEnc) 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn; 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the input pcm buffer and length*/ 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen) 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 222b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard length = hAacEnc->enclen; 223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(hAacEnc->intlen == 0) 224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard { 225b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, 226b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->encbuf, length*sizeof(short)); 227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->uselength += length*sizeof(short); 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short); 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->intlen = length; 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutput->Length = 0; 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pOutInfo) 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutInfo->InputUsed = hAacEnc->uselength; 239b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard return VO_ERR_INPUT_BUFFER_SMALL; 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the output aac buffer and length*/ 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32))) 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_OUTPUT_BUFFER_SMALL; 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* aac encoder core function */ 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AacEncEncode( hAacEnc, 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard (Word16*)hAacEnc->encbuf, 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard NULL, 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard &numAncDataBytes, 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutput->Buffer, 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard &pOutput->Length); 253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* update the input pcm buffer and length*/ 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(hAacEnc->intlen) 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 257b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard length = inbuflen - hAacEnc->intlen; 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->encbuf = hAacEnc->inbuf; 259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->enclen = hAacEnc->inlen; 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->uselength += length*sizeof(short); 261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->intlen = 0; 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->encbuf = hAacEnc->encbuf + inbuflen; 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->enclen = hAacEnc->enclen - inbuflen; 267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->uselength += inbuflen*sizeof(short); 268b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard } 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* update the output aac information */ 271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pOutInfo) 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut; 274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate; 275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutInfo->Format.SampleBits = 16; 276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pOutInfo->InputUsed = hAacEnc->uselength; 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Uninit the Codec. 284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function. 285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 287e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) 288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; 290b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL != hAacEnc) 292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* close the aac encoder */ 294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AacEncClose(hAacEnc, hAacEnc->voMemop); 295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* free the aac encoder handle*/ 297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC); 298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc = NULL; 299b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard } 300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Set the param for special target. 306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function. 307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param uParamID [IN] The param ID. 308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pData [IN] The param value depend on the ID> 309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 311e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) 312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AACENC_CONFIG config; 314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AACENC_PARAM* pAAC_param; 315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VO_AUDIO_FORMAT *pWAV_Format; 316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; 317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int ret, i, bitrate, tmp; 318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int SampleRateIdx; 319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(NULL == hAacEnc) 321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 322b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard switch(uParamID) 324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/ 326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AacInitDefaultConfig(&config); 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pData == NULL) 328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pAAC_param = (AACENC_PARAM*)pData; 330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.adtsUsed = pAAC_param->adtsUsed; 331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = pAAC_param->bitRate; 332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsIn = pAAC_param->nChannels; 333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsOut = pAAC_param->nChannels; 334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.sampleRate = pAAC_param->sampleRate; 335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the channel */ 337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || 338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) 339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSCHANNEL; 340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the samplerate */ 342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = -1; 343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for(i = 0; i < NUM_SAMPLE_RATES; i++) 344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.sampleRate == sampRateTab[i]) 346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = 0; 348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(ret < 0) 352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSSAMPLERATE; 353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SampleRateIdx = i; 355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = 441; 357b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if(config.sampleRate%8000 == 0) 358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp =480; 359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the bitrate */ 360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) || 361b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard (config.bitRate/config.nChannelsOut > 160000) || 362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard (config.bitRate > config.sampleRate*6*config.nChannelsOut)) 363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; 365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.bitRate/config.nChannelsOut < 4000) 367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = 4000 * config.nChannelsOut; 368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) 369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = config.sampleRate*6*config.nChannelsOut; 370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else if(config.bitRate/config.nChannelsOut > 160000) 371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = config.nChannelsOut*160000; 372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the bandwidth */ 375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard bitrate = config.bitRate / config.nChannelsOut; 376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard bitrate = bitrate * tmp / config.sampleRate; 377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; rates[i]; i++) 379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (rates[i] >= bitrate) 381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; 385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init aac encoder core */ 387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = AacEncOpen(hAacEnc, config); 388b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if(ret) 389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSFEATURE; 390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/ 392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard AacInitDefaultConfig(&config); 393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pData == NULL) 394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pWAV_Format = (VO_AUDIO_FORMAT*)pData; 396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.adtsUsed = 1; 397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsIn = pWAV_Format->Channels; 398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsOut = pWAV_Format->Channels; 399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.sampleRate = pWAV_Format->SampleRate; 400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the channel */ 402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || 403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) 404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSCHANNEL; 405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the samplebits */ 407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pWAV_Format->SampleBits != 16) 408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSFEATURE; 410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the samplerate */ 413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = -1; 414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for(i = 0; i < NUM_SAMPLE_RATES; i++) 415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.sampleRate == sampRateTab[i]) 417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = 0; 419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(ret < 0) 423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSSAMPLERATE; 424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard SampleRateIdx = i; 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* update the bitrates */ 428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = 441; 429b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if(config.sampleRate%8000 == 0) 430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp =480; 431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; 433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(config.bitRate/config.nChannelsOut < 4000) 435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = 4000 * config.nChannelsOut; 436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) 437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = config.sampleRate*6*config.nChannelsOut; 438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else if(config.bitRate/config.nChannelsOut > 160000) 439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bitRate = config.nChannelsOut*160000; 440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* check the bandwidth */ 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard bitrate = config.bitRate / config.nChannelsOut; 443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard bitrate = bitrate * tmp / config.sampleRate; 444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; rates[i]; i++) 446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (rates[i] >= bitrate) 448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; 452b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* init aac encoder core */ 454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ret = AacEncOpen(hAacEnc, config); 455b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if(ret) 456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_AUDIO_UNSFEATURE; 457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard default: 459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_WRONG_PARAM_ID; 460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Get the param for special target. 467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function. 468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param uParamID [IN] The param ID. 469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pData [IN] The param value depend on the ID> 470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded. 471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/ 472e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) 473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/** 478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Get audio codec API interface 479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * \param pEncHandle [out] Return the AAC Encoder handle. 480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * \retval VO_ERR_OK Succeeded. 481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 482e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle) 483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(pDecHandle == NULL) 485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_INVALID_ARG; 486b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->Init = voAACEncInit; 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->SetInputData = voAACEncSetInputData; 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->GetOutputData = voAACEncGetOutputData; 490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->SetParam = voAACEncSetParam; 491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->GetParam = voAACEncGetParam; 492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pDecHandle->Uninit = voAACEncUninit; 493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return VO_ERR_NONE; 495956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong}