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