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