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_core.c 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Content: aac encoder core functions 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong*******************************************************************************/ 22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 23956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "typedef.h" 24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aacenc_core.h" 25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "bitenc.h" 26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_configuration.h" 28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_main.h" 29956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "qc_main.h" 30956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "psy_main.h" 31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "channel_map.h" 32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong#include "aac_rom.h" 33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 34956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************** 35956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: AacInitDefaultConfig 37956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: gives reasonable default configuration 38956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid AacInitDefaultConfig(AACENC_CONFIG *config) 41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* default configurations */ 43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong config->adtsUsed = 1; 44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong config->nChannelsIn = 2; 45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong config->nChannelsOut = 2; 46b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard config->bitRate = 128000; 47b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard config->bandWidth = 0; 48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 49956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************** 51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: AacEncOpen 53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: allocate and initialize a new encoder instance 54956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns: 0 if success 55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 57956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder handle, initialized on return */ 58956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const AACENC_CONFIG config /* pre-initialized config struct */ 59956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ) 60956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word32 error = 0; 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 profile = 1; 63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ELEMENT_INFO *elInfo = NULL; 65b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (hAacEnc==0) { 67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard error=1; 68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 69b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong hAacEnc->config = config; 72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = InitElementInfo (config.nChannelsOut, 76956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &hAacEnc->elInfo); 77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong elInfo = &hAacEnc->elInfo; 81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 83956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* use or not tns tool for long and short block */ 85b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word16 tnsMask=3; 86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init encoder psychoacoustic */ 88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = psyMainInit(&hAacEnc->psyKernel, 89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong config.sampleRate, 90956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong config.bitRate, 91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong elInfo->nChannelsInEl, 92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong tnsMask, 93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong hAacEnc->config.bandWidth); 94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* use or not adts header */ 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(!error) { 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed; 99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init encoder quantization */ 102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong struct QC_INIT qcInit; 104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /*qcInit.channelMapping = &hAacEnc->channelMapping;*/ 106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong qcInit.elInfo = &hAacEnc->elInfo; 107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl); 109b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard qcInit.bitRes = qcInit.maxBits; 110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate); 111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 112b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard qcInit.padding.paddingRest = config.sampleRate; 113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) / 115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong (config.sampleRate>>1)); 116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/ 118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong (qcInit.averageBits?qcInit.averageBits:1)); 119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 120b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard qcInit.bitrate = config.bitRate; 121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong error = QCInit(&hAacEnc->qcKernel, &qcInit); 123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init bitstream encoder */ 126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if (!error) { 127b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl; 128b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->bseInit.bitrate = config.bitRate; 129b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->bseInit.sampleRate = config.sampleRate; 130b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard hAacEnc->bseInit.profile = profile; 131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 132956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 133956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong return error; 134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************** 137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name: AacEncEncode 139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: encode pcm to aac data core function 140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* returns: 0 if success 141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongWord16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ 144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *timeSignal, /*!< BLOCKSIZE*nChannels audio samples, interleaved */ 145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */ 146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 *numAncBytes, /*!< number of ancillary Data Bytes */ 147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong UWord8 *outBytes, /*!< pointer to output buffer (must be large MINBITS_COEF/8*MAX_CHANNELS bytes) */ 148cf8b805a0c0695097211ca18237c27f45b0df85cMartin Storsjo VO_U32 *numOutBytes /*!< number of bytes in output buffer after processing */ 149956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ) 150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ELEMENT_INFO *elInfo = &aacEnc->elInfo; 152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 globUsedBits; 153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong Word16 ancDataBytes, ancDataBytesLeft; 154b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 155b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ancDataBytes = ancDataBytesLeft = *numAncBytes; 156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 157956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* init output aac data buffer and length */ 158956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes); 159956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 160956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* psychoacoustic process */ 161b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard psyMain(aacEnc->config.nChannelsOut, 162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong elInfo, 163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong timeSignal, 164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]], 165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyKernel.tnsData[elInfo->ChannelIndex[0]], 166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyKernel.psyConfLong, 167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyKernel.psyConfShort, 168956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], 169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyOut.psyOutElement, 170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->psyKernel.pScratchTns, 171956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->config.sampleRate); 172956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 173956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* adjust bitrate and frame length */ 174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong AdjustBitrate(&aacEnc->qcKernel, 175956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->config.bitRate, 176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->config.sampleRate); 177b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* quantization and coding process */ 179b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard QCMain(&aacEnc->qcKernel, 180956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcKernel.elementBits, 181956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcKernel.adjThr.adjThrStateElem, 182956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], 183956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyOut.psyOutElement, 184956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcOut.qcChannel[elInfo->ChannelIndex[0]], 185956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcOut.qcElement, 186956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong elInfo->nChannelsInEl, 187956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong min(ancDataBytesLeft,ancDataBytes)); 188956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 189956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong ancDataBytesLeft = ancDataBytesLeft - ancDataBytes; 190956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 191956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong globUsedBits = FinalizeBitConsumption(&aacEnc->qcKernel, 192956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcOut); 193956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 194956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* write bitstream process */ 195b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard WriteBitstream(aacEnc->hBitStream, 196956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong *elInfo, 197956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcOut, 198956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->psyOut, 199b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard &globUsedBits, 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ancBytes, 201956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong aacEnc->psyKernel.sampleRateIdx); 202956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 203956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong updateBitres(&aacEnc->qcKernel, 204956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong &aacEnc->qcOut); 205956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 206956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong /* write out the bitstream */ 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3; 208956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 209956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong return 0; 210956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 211956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 212956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 213956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong/******************************************************************************** 214956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 215956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* function name:AacEncClose 216956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* description: deallocate an encoder instance 217956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong* 218956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong**********************************************************************************/ 219956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dongvoid AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP) 220956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong{ 221b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard if (hAacEnc) { 222956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong QCDelete(&hAacEnc->qcKernel, pMemOP); 223956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 224956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong QCOutDelete(&hAacEnc->qcOut, pMemOP); 225956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 226956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PsyDelete(&hAacEnc->psyKernel, pMemOP); 227956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 228956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong PsyOutDelete(&hAacEnc->psyOut, pMemOP); 229956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 230956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong DeleteBitBuffer(&hAacEnc->hBitStream); 231956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong 232956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong if(hAacEnc->intbuf) 233956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong { 234956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong mem_free(pMemOP, hAacEnc->intbuf, VO_INDEX_ENC_AAC); 235956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong hAacEnc->intbuf = NULL; 236956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 237956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong } 238956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong} 239