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