AAC_E_SAMPLES.c revision e2e838afcf03e603a41a0455846eaf9614537c16
1/*
2 ** Copyright 2003-2010, VisualOn, Inc.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 **     http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16/*******************************************************************************
17	File:		AAC_E_SAMPLES.h
18
19	Content:	sample code for AAC encoder
20
21*******************************************************************************/
22
23#include		<dlfcn.h>
24#include		<stdio.h>
25#include		<stdlib.h>
26#include		<string.h>
27#include		<time.h>
28#include		"voAAC.h"
29#include		"cmnMemory.h"
30
31#define  VO_AAC_E_OUTPUT	  1
32#define READ_SIZE	(1024*8)
33unsigned char outBuf[1024*8];
34unsigned char inBuf[READ_SIZE];
35
36const char* HelpString =
37"VisualOn AAC encoder Usage:\n"
38"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
39"-if input file name \n"
40"-of output file name \n"
41"-sr input pcm samplerate, default 44100 \n"
42"-ch input pcm channel, default 2 channel \n"
43"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"
44"-adts add or no adts header, default add adts header\n"
45"For example: \n"
46"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";
47
48static int parsecmdline(int argc, char **argv,char  **input_filename, char  **output_filename, AACENC_PARAM *param)
49{
50	// notice that:
51	// bitRate/nChannels > 8000
52	// bitRate/nChannels < 160000
53	// bitRate/nChannels < sampleRate*6
54	param->adtsUsed = 1;
55	param->bitRate = 0;
56	param->nChannels = 2;
57	param->sampleRate = 44100;
58
59	if(argc < 5 || argc > 13)
60	{
61		return -1;
62	}
63
64	argc--;
65	argv++;
66	while (argc > 0)
67	{
68		if (!strcmp(*argv, "-if"))
69		{
70			argv++;
71			argc--;
72			*input_filename = *argv;
73		}
74		else if (!strcmp(*argv, "-of"))
75		{
76			argv++;
77			argc--;
78			*output_filename = *argv;
79		}
80		else if (!strcmp(*argv, "-sr"))
81		{
82			argv++;
83			argc--;
84			param->sampleRate = atoi(*argv);
85		}
86		else if (!strcmp(*argv, "-ch"))
87		{
88			argv++;
89			argc--;
90			param->nChannels = atoi(*argv);
91		}
92		else if (!strcmp(*argv, "-br"))
93		{
94			argv++;
95			argc--;
96			param->bitRate = atoi(*argv);
97		}
98		else if(!strcmp(*argv, "-adts"))
99		{
100			argv++;
101			argc--;
102			param->adtsUsed = atoi(*argv);
103		}
104		else
105		{
106			return -1;
107		}
108
109		argv++;
110		argc--;
111	}
112
113	if(param->bitRate == 0)
114	{
115		int scale = 441;
116		if(param->sampleRate%8000 == 0)
117			scale = 480;
118		param->bitRate = 640*param->nChannels*param->sampleRate/scale;
119	}
120
121	return 0;
122}
123
124int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)
125{
126	int readBytes = 0;
127	readBytes = fread(dest, 1, readSize, infile);
128	return readBytes;
129}
130
131typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);
132
133int main(int argc, char **argv)
134{
135	FILE						*infile, *outfile;
136	int							t1, t2;
137	VO_AUDIO_CODECAPI			AudioAPI;
138	VO_MEM_OPERATOR				moper;
139	VO_CODEC_INIT_USERDATA		useData;
140	VO_HANDLE					hCodec;
141	VO_CODECBUFFER				inData;
142	VO_CODECBUFFER				outData;
143	VO_AUDIO_OUTPUTINFO			outInfo;
144    int							firstWrite = 1;
145	int							eofFile = 0;
146	int							*info=(int*)inBuf;
147	int							bytesLeft, nRead;
148	int							EncoderdFrame = 0;
149	int							total = 0;
150	int							isOutput = 1;
151	int							returnCode;
152	AACENC_PARAM				aacpara;
153	void						*handle;
154	void						*pfunc;
155	VOGETAUDIODECAPI			pGetAPI;
156	const char					*infileName = NULL;
157    const char					*outfileName = NULL;
158
159	returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);
160	if(returnCode)
161	{
162		printf("%s", HelpString);
163		return 0;
164	}
165
166	/* open input file */
167	infile = fopen(infileName, "rb");
168	if (!infile) {
169		printf("Open input file fail...");
170		return -1;
171	}
172
173	/* open output file */
174	if(isOutput)
175	{
176		outfile = fopen(outfileName, "wb");
177		if (!outfile) {
178			printf("Open output file fail...");
179			return -1;
180		}
181	}
182	// set memory operators;
183	moper.Alloc = cmnMemAlloc;
184	moper.Copy = cmnMemCopy;
185	moper.Free = cmnMemFree;
186	moper.Set = cmnMemSet;
187	moper.Check = cmnMemCheck;
188	useData.memflag = VO_IMF_USERMEMOPERATOR;
189	useData.memData = (VO_PTR)(&moper);
190	// open encoder dll;
191	handle = dlopen("libstagefright.so", RTLD_NOW);
192	if(handle == 0)
193	{
194		printf("open dll error......");
195		return -1;
196	}
197	// Get API;
198	pfunc = dlsym(handle, "voGetAACEncAPI");
199	if(pfunc == 0)
200	{
201		printf("open function error......");
202		return -1;
203	}
204	pGetAPI = (VOGETAUDIODECAPI)pfunc;
205	returnCode  = pGetAPI(&AudioAPI);
206	if(returnCode)
207		return -1;
208
209
210//#######################################   Init Encoding Section   #########################################
211	returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);
212	if(returnCode < 0)
213	{
214		printf("#### VOI_Error2:fail to initialize the Encoderr###\n");
215		return -1;
216	}
217
218	returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
219
220	inData.Buffer = inBuf;
221	bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
222
223//#######################################    Encoding Section   #########################################
224
225	do {
226
227		inData.Length    = bytesLeft;
228		outData.Buffer   = outBuf;
229		outData.Length = 1024*8;
230
231		t1 = clock();
232
233		returnCode = AudioAPI.SetInputData(hCodec,&inData);
234
235		do {
236			outData.Buffer   = outBuf;
237			outData.Length = 1024*8;
238
239			returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);
240
241			if(returnCode == 0)
242				EncoderdFrame++;
243			if(returnCode == VO_ERR_LICENSE_ERROR)
244				break;
245
246#if VO_AAC_E_OUTPUT
247			if (isOutput && returnCode == 0)
248			{
249				fwrite(outData.Buffer, 1, outData.Length, outfile);
250			}
251#endif
252		} while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));
253
254		if(returnCode == VO_ERR_LICENSE_ERROR)
255			break;
256
257		t2 = clock();
258		total += t2 - t1;
259
260		if (!eofFile) {
261			nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);
262			bytesLeft = nRead;
263			inData.Buffer = inBuf;
264			if (feof(infile))
265				eofFile = 1;
266		}
267
268	} while (!eofFile && returnCode);
269
270
271//################################################  End Encoding Section  #######################################################
272	returnCode = AudioAPI.Uninit(hCodec);
273
274	fclose(infile);
275	if (outfile)
276    {
277        fclose(outfile);
278    }
279	dlclose(handle);
280	return 0;
281}
282
283
284