aacenc.c revision 891abc0ee089f2ba5b92dcc014e5efc2ef07f01e
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
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Init the audio codec module and return codec handle
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param phCodec [OUT] Return the video codec handle
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param vType	[IN] The codec type if the module support multi codec.
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pUserData	[IN] The init param. It is memory operator or alloced memory
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded.
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
37e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AAC_ENCODER*hAacEnc;
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AACENC_CONFIG config;
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int error;
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR voMemoprator;
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_MEM_OPERATOR *pMemOP;
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int interMem;
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	interMem = 0;
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	error = 0;
51b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* init the memory operator */
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Alloc = cmnMemAlloc;
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Copy = cmnMemCopy;
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Free = cmnMemFree;
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Set = cmnMemSet;
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		voMemoprator.Check = cmnMemCheck;
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		interMem = 1;
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = &voMemoprator;
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*phCodec = NULL;
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	else
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* init the aac encoder handle */
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC);
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == hAacEnc)
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		error = 1;
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(!error)
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* init the aac encoder intra memory */
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC);
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(NULL == hAacEnc->intbuf)
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			error = 1;
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if (!error) {
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* init the aac encoder psychoacoustic */
94956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) ||
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			PsyOutNew(&hAacEnc->psyOut, pMemOP));
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if (!error) {
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* init the aac encoder quantization elements */
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP);
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
103956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if (!error) {
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		/* init the aac encoder quantization state */
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		error = QCNew(&hAacEnc->qcKernel, pMemOP);
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	}
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	/* uninit the aac encoder if error is nozero */
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	if(error)
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	{
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		AacEncClose(hAacEnc, pMemOP);
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		if(hAacEnc)
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		{
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong			hAacEnc = NULL;
116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		}
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		*phCodec = NULL;
118956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong		return VO_ERR_OUTOF_MEMORY;
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* init the aac encoder memory operator  */
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef USE_DEAULT_MEM
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(interMem)
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->voMemoprator.Alloc = cmnMemAlloc;
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->voMemoprator.Copy = cmnMemCopy;
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->voMemoprator.Free = cmnMemFree;
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->voMemoprator.Set = cmnMemSet;
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->voMemoprator.Check = cmnMemCheck;
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pMemOP = &hAacEnc->voMemoprator;
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* init the aac encoder default parameter  */
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(hAacEnc->initOK == 0)
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 AACENC_CONFIG config;
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.adtsUsed = 1;
139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.bitRate = 128000;
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.nChannelsIn = 2;
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.nChannelsOut = 2;
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.sampleRate = 44100;
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 config.bandWidth = 20000;
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 AacEncOpen(hAacEnc, config);
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->voMemop = pMemOP;
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	*phCodec = hAacEnc;
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Set input audio data.
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function.
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pInput [IN] The input buffer param.
159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutBuffer [OUT] The output buffer info.
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded.
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
162e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AAC_ENCODER *hAacEnc;
165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int  length;
166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer)
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc = (AAC_ENCODER *)hCodec;
173b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* init input pcm buffer and length*/
175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->inbuf = (short *)pInput->Buffer;
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->inlen = pInput->Length / sizeof(short);
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->uselength = 0;
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->encbuf = hAacEnc->inbuf;
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	hAacEnc->enclen = hAacEnc->inlen;
181b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* rebuild intra pcm buffer and length*/
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(hAacEnc->intlen)
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
186b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			hAacEnc->inbuf, length*sizeof(short));
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->encbuf = hAacEnc->intbuf;
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->enclen = hAacEnc->intlen + length;
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->inbuf += length;
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->inlen -= length;
194e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
195b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Get the outut audio data
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function.
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutBuffer [OUT] The output audio data
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pOutInfo [OUT] The dec module filled audio format and used the input size.
204e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*						 pOutInfo->InputUsed is total used the input size.
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval  VO_ERR_NONE Succeeded.
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*			VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought.
207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
208e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo)
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 numAncDataBytes=0;
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32  inbuflen;
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int ret, length;
214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == hAacEnc)
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn;
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 /* check the input pcm buffer and length*/
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 {
222b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		length = hAacEnc->enclen;
223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(hAacEnc->intlen == 0)
224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		{
225b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
226b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				hAacEnc->encbuf, length*sizeof(short));
227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			hAacEnc->uselength += length*sizeof(short);
228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else
230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short);
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->intlen = length;
235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pOutput->Length = 0;
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(pOutInfo)
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pOutInfo->InputUsed = hAacEnc->uselength;
239b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		return VO_ERR_INPUT_BUFFER_SMALL;
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 }
241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 /* check the output aac buffer and length*/
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32)))
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 return VO_ERR_OUTPUT_BUFFER_SMALL;
245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 /* aac encoder core function */
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 AacEncEncode( hAacEnc,
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			(Word16*)hAacEnc->encbuf,
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			NULL,
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			&numAncDataBytes,
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			pOutput->Buffer,
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			&pOutput->Length);
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
254e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 /* update the input pcm buffer and length*/
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 if(hAacEnc->intlen)
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 {
257b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		length = inbuflen - hAacEnc->intlen;
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->encbuf = hAacEnc->inbuf;
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->enclen = hAacEnc->inlen;
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->uselength += length*sizeof(short);
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc->intlen = 0;
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 }
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 else
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 {
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 hAacEnc->enclen = hAacEnc->enclen - inbuflen;
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		 hAacEnc->uselength += inbuflen*sizeof(short);
268b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	 }
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 /* update the output aac information */
271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pOutInfo)
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut;
274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate;
275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pOutInfo->Format.SampleBits = 16;
276e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pOutInfo->InputUsed = hAacEnc->uselength;
277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 return VO_ERR_NONE;
280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Uninit the Codec.
284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function.
285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded.
286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
287e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
290b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL != hAacEnc)
292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* close the aac encoder */
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		AacEncClose(hAacEnc, hAacEnc->voMemop);
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* free the aac encoder handle*/
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		hAacEnc = NULL;
299b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	}
300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
303e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Set the param for special target.
306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function.
307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param uParamID [IN] The param ID.
308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pData [IN] The param value depend on the ID>
309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded.
310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
311e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AACENC_CONFIG config;
314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AACENC_PARAM* pAAC_param;
315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	VO_AUDIO_FORMAT *pWAV_Format;
316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int ret, i, bitrate, tmp;
318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	int SampleRateIdx;
319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(NULL == hAacEnc)
321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
322b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	switch(uParamID)
324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	case VO_PID_AAC_ENCPARAM:  /* init aac encoder parameter*/
326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		AacInitDefaultConfig(&config);
327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(pData == NULL)
328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_INVALID_ARG;
329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pAAC_param = (AACENC_PARAM*)pData;
330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.adtsUsed = pAAC_param->adtsUsed;
331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.bitRate = pAAC_param->bitRate;
332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.nChannelsIn = pAAC_param->nChannels;
333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.nChannelsOut = pAAC_param->nChannels;
334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.sampleRate = pAAC_param->sampleRate;
335e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the channel */
337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||
338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
339e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 return VO_ERR_AUDIO_UNSCHANNEL;
340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the samplerate */
342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for(i = 0; i < NUM_SAMPLE_RATES; i++)
344e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(config.sampleRate == sampRateTab[i])
346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				ret = 0;
348e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(ret < 0)
352e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_AUDIO_UNSSAMPLERATE;
353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		SampleRateIdx = i;
355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = 441;
357b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		if(config.sampleRate%8000 == 0)
358e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			tmp =480;
359e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the bitrate */
360e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
361b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard           (config.bitRate/config.nChannelsOut > 160000) ||
362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		   (config.bitRate > config.sampleRate*6*config.nChannelsOut))
363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(config.bitRate/config.nChannelsOut < 4000)
367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				config.bitRate = 4000 * config.nChannelsOut;
368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				config.bitRate = config.sampleRate*6*config.nChannelsOut;
370e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			else if(config.bitRate/config.nChannelsOut > 160000)
371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				config.bitRate = config.nChannelsOut*160000;
372e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the bandwidth */
375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bitrate = config.bitRate / config.nChannelsOut;
376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bitrate = bitrate * tmp / config.sampleRate;
377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; rates[i]; i++)
379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (rates[i] >= bitrate)
381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
384e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* init aac encoder core */
387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = AacEncOpen(hAacEnc, config);
388b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		if(ret)
389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_AUDIO_UNSFEATURE;
390e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		break;
391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	case VO_PID_AUDIO_FORMAT:	/* init pcm channel and samplerate*/
392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		AacInitDefaultConfig(&config);
393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(pData == NULL)
394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_INVALID_ARG;
395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pWAV_Format = (VO_AUDIO_FORMAT*)pData;
396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.adtsUsed = 1;
397e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.nChannelsIn = pWAV_Format->Channels;
398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.nChannelsOut = pWAV_Format->Channels;
399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.sampleRate = pWAV_Format->SampleRate;
400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the channel */
402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(config.nChannelsIn< 1  || config.nChannelsIn > MAX_CHANNELS  ||
403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard             config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			 return VO_ERR_AUDIO_UNSCHANNEL;
405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the samplebits */
407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(pWAV_Format->SampleBits != 16)
408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_AUDIO_UNSFEATURE;
410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the samplerate */
413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = -1;
414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for(i = 0; i < NUM_SAMPLE_RATES; i++)
415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if(config.sampleRate == sampRateTab[i])
417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				ret = 0;
419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(ret < 0)
423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_AUDIO_UNSSAMPLERATE;
424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		SampleRateIdx = i;
426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
427e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* update the bitrates */
428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		tmp = 441;
429b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		if(config.sampleRate%8000 == 0)
430e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			tmp =480;
431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if(config.bitRate/config.nChannelsOut < 4000)
435e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			config.bitRate = 4000 * config.nChannelsOut;
436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			config.bitRate = config.sampleRate*6*config.nChannelsOut;
438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		else if(config.bitRate/config.nChannelsOut > 160000)
439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			config.bitRate = config.nChannelsOut*160000;
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* check the bandwidth */
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bitrate = config.bitRate / config.nChannelsOut;
443e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		bitrate = bitrate * tmp / config.sampleRate;
444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = 0; rates[i]; i++)
446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (rates[i] >= bitrate)
448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard				break;
449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
452b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		/* init aac encoder core */
454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ret = AacEncOpen(hAacEnc, config);
455b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		if(ret)
456e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			return VO_ERR_AUDIO_UNSFEATURE;
457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		break;
458e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	default:
459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_WRONG_PARAM_ID;
460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
461e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Get the param for special target.
467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param hCodec [IN]] The Codec Handle which was created by Init function.
468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param uParamID [IN] The param ID.
469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \param pData [IN] The param value depend on the ID>
470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* \retval VO_ERR_NONE Succeeded.
471e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*/
472e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
476e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/**
478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Get audio codec API interface
479e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * \param pEncHandle [out] Return the AAC Encoder handle.
480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * \retval VO_ERR_OK Succeeded.
481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
482e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardVO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if(pDecHandle == NULL)
485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return VO_ERR_INVALID_ARG;
486b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->Init = voAACEncInit;
488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->SetInputData = voAACEncSetInputData;
489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->GetOutputData = voAACEncGetOutputData;
490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->SetParam = voAACEncSetParam;
491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->GetParam = voAACEncGetParam;
492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	pDecHandle->Uninit = voAACEncUninit;
493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return VO_ERR_NONE;
495891abc0ee089f2ba5b92dcc014e5efc2ef07f01eMartin Storsjo}
496