blob: 64d012ddd0a354624ca5c5ce585b7ee2f108a58b [file] [log] [blame]
James Dong17299ab2010-05-14 15:45:22 -07001/*
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("/data/local/tmp/libvoAACEncv7.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