1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* 2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License. 6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at 7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and 14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License. 15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */ 16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/******************************************************************************* 17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard File: aacenc_core.c 18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Content: aac encoder core functions 20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*******************************************************************************/ 2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "typedef.h" 2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "aacenc_core.h" 2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "bitenc.h" 2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "psy_configuration.h" 2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "psy_main.h" 2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "qc_main.h" 3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "psy_main.h" 3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "channel_map.h" 3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "aac_rom.h" 3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/******************************************************************************** 3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: AacInitDefaultConfig 3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: gives reasonable default configuration 3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid AacInitDefaultConfig(AACENC_CONFIG *config) 4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* default configurations */ 4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config->adtsUsed = 1; 4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config->nChannelsIn = 2; 4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config->nChannelsOut = 2; 4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config->bitRate = 128000; 4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config->bandWidth = 0; 4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/******************************************************************************** 5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: AacEncOpen 5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: allocate and initialize a new encoder instance 5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* returns: 0 if success 5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 5717299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder handle, initialized on return */ 5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong const AACENC_CONFIG config /* pre-initialized config struct */ 5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ) 6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i; 6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 error = 0; 63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 profile = 1; 6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ELEMENT_INFO *elInfo = NULL; 6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (hAacEnc==0) { 6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong error=1; 6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->config = config; 7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong error = InitElementInfo (config.nChannelsOut, 7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &hAacEnc->elInfo); 7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong elInfo = &hAacEnc->elInfo; 8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* use or not tns tool for long and short block */ 8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 tnsMask=3; 8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* init encoder psychoacoustic */ 8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong error = psyMainInit(&hAacEnc->psyKernel, 9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config.sampleRate, 9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong config.bitRate, 9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong elInfo->nChannelsInEl, 9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong tnsMask, 9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->config.bandWidth); 9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* use or not adts header */ 98219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(!error) { 99219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed; 10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* init encoder quantization */ 10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong struct QC_INIT qcInit; 10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /*qcInit.channelMapping = &hAacEnc->channelMapping;*/ 10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.elInfo = &hAacEnc->elInfo; 10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl); 11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.bitRes = qcInit.maxBits; 11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate); 11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.padding.paddingRest = config.sampleRate; 11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) / 11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong (config.sampleRate>>1)); 11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/ 11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong (qcInit.averageBits?qcInit.averageBits:1)); 12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong qcInit.bitrate = config.bitRate; 12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong error = QCInit(&hAacEnc->qcKernel, &qcInit); 12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* init bitstream encoder */ 12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (!error) { 12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl; 12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->bseInit.bitrate = config.bitRate; 13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->bseInit.sampleRate = config.sampleRate; 13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->bseInit.profile = profile; 13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return error; 13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/******************************************************************************** 13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name: AacEncEncode 14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: encode pcm to aac data core function 14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* returns: 0 if success 14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 14417299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ 14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 *timeSignal, /*!< BLOCKSIZE*nChannels audio samples, interleaved */ 14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */ 14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 *numAncBytes, /*!< number of ancillary Data Bytes */ 14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong UWord8 *outBytes, /*!< pointer to output buffer (must be large MINBITS_COEF/8*MAX_CHANNELS bytes) */ 14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word32 *numOutBytes /*!< number of bytes in output buffer after processing */ 15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ) 15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ELEMENT_INFO *elInfo = &aacEnc->elInfo; 15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 globUsedBits; 15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong Word16 ancDataBytes, ancDataBytesLeft; 15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ancDataBytes = ancDataBytesLeft = *numAncBytes; 15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 15817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* init output aac data buffer and length */ 15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes); 16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* psychoacoustic process */ 16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong psyMain(aacEnc->config.nChannelsOut, 16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong elInfo, 16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong timeSignal, 16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]], 16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyKernel.tnsData[elInfo->ChannelIndex[0]], 16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyKernel.psyConfLong, 16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyKernel.psyConfShort, 16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], 17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyOut.psyOutElement, 17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->psyKernel.pScratchTns, 17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->config.sampleRate); 17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* adjust bitrate and frame length */ 17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong AdjustBitrate(&aacEnc->qcKernel, 17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->config.bitRate, 17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->config.sampleRate); 17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* quantization and coding process */ 18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong QCMain(&aacEnc->qcKernel, 18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcKernel.elementBits, 18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcKernel.adjThr.adjThrStateElem, 18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], 18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyOut.psyOutElement, 18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcOut.qcChannel[elInfo->ChannelIndex[0]], 18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcOut.qcElement, 18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong elInfo->nChannelsInEl, 18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong min(ancDataBytesLeft,ancDataBytes)); 18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ancDataBytesLeft = ancDataBytesLeft - ancDataBytes; 19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong globUsedBits = FinalizeBitConsumption(&aacEnc->qcKernel, 19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcOut); 19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* write bitstream process */ 19617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong WriteBitstream(aacEnc->hBitStream, 19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong *elInfo, 19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcOut, 19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->psyOut, 20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &globUsedBits, 201219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ancBytes, 20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong aacEnc->psyKernel.sampleRateIdx); 20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong updateBitres(&aacEnc->qcKernel, 20517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong &aacEnc->qcOut); 20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong /* write out the bitstream */ 208219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3; 20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong return 0; 21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/******************************************************************************** 21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* function name:AacEncClose 21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* description: deallocate an encoder instance 21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong* 21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong**********************************************************************************/ 22017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP) 22117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{ 22217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if (hAacEnc) { 22317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong QCDelete(&hAacEnc->qcKernel, pMemOP); 22417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 22517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong QCOutDelete(&hAacEnc->qcOut, pMemOP); 22617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 22717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong PsyDelete(&hAacEnc->psyKernel, pMemOP); 22817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 22917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong PsyOutDelete(&hAacEnc->psyOut, pMemOP); 23017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 23117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong DeleteBitBuffer(&hAacEnc->hBitStream); 23217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong 23317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong if(hAacEnc->intbuf) 23417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong { 23517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong mem_free(pMemOP, hAacEnc->intbuf, VO_INDEX_ENC_AAC); 23617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong hAacEnc->intbuf = NULL; 23717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong } 23917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong} 240