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