OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / amrwbenc / SampleCode / AMRWB_E_SAMPLE.c
1 /*\r
2  ** Copyright 2003-2010, VisualOn, Inc.\r
3  **\r
4  ** Licensed under the Apache License, Version 2.0 (the "License");\r
5  ** you may not use this file except in compliance with the License.\r
6  ** You may obtain a copy of the License at\r
7  **\r
8  **     http://www.apache.org/licenses/LICENSE-2.0\r
9  **\r
10  ** Unless required by applicable law or agreed to in writing, software\r
11  ** distributed under the License is distributed on an "AS IS" BASIS,\r
12  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  ** See the License for the specific language governing permissions and\r
14  ** limitations under the License.\r
15  */\r
16 \r
17 \r
18 #ifdef LINUX\r
19 #include <dlfcn.h>\r
20 #endif\r
21 \r
22 #include      <stdio.h>\r
23 #include      <stdlib.h>\r
24 #include      <time.h>\r
25 #include      "voAMRWB.h"\r
26 #include      "cmnMemory.h"\r
27 \r
28 #define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"\r
29 \r
30 #define  INPUT_SIZE   640\r
31 #define  OUTPUT_SIZE  1024\r
32 unsigned char  InputBuf[INPUT_SIZE];\r
33 unsigned char  OutputBuf[OUTPUT_SIZE];\r
34 \r
35 void usage (void) {\r
36         printf ("AMR_WB Encoder HELP   Displays this text\n");\r
37         printf ("\n");\r
38         printf ("Usage:\n");\r
39         printf ("AMRWBEnc [options] Input_file output_file \n");\r
40         printf ("\n");\r
41         printf ("Options +M* +F* +DTX \n");\r
42         printf ("Support \n");\r
43         printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n");\r
44         printf (" +M0 = 6.6kbps \n");\r
45         printf (" +M1 = 8.85kbps \n");\r
46         printf (" +M2 = 12.65kbps \n");\r
47         printf (" +M3 = 14.25kbps \n");\r
48         printf (" +M4 = 15.58kbps \n");\r
49         printf (" +M5 = 18.25kbps \n");\r
50         printf (" +M6 = 19.85kbps \n");\r
51         printf (" +M7 = 23.05kbps \n");\r
52         printf (" +M8 = 23.85kbps \n");\r
53         printf ("\n");\r
54         printf ("Options +F* for setting output frame Type, default is RFC3267 \n");\r
55         printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n");\r
56         printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n");\r
57         printf ("+F2 for RFC3267\n ");\r
58         printf ("\n");\r
59         printf ("Options +DTX enable DTX mode, default is disable.\n");\r
60         printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n");\r
61         printf ("\n");\r
62 }\r
63 \r
64 int  GetNextBuf(FILE* inFile,unsigned char* dst,int size)\r
65 {\r
66         int size2 = (int)fread(dst, sizeof(signed char), size,inFile);\r
67         return size2;\r
68 }\r
69 \r
70 typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);\r
71 \r
72 int encode(\r
73                    int mode, \r
74                    short   allow_dtx,\r
75                    VOAMRWBFRAMETYPE frameType,\r
76                    const char* srcfile, \r
77                    const char* dstfile\r
78                    )\r
79 {\r
80         int                     ret = 0;\r
81         int         returnCode;\r
82         FILE            *fsrc = NULL;\r
83         FILE            *fdst = NULL;\r
84         int         framenum = 0;\r
85         int         eofFile = 0;\r
86         int         size1 = 0;\r
87         int         Relens;\r
88 \r
89         VO_AUDIO_CODECAPI       AudioAPI;\r
90         VO_MEM_OPERATOR         moper;\r
91         VO_CODEC_INIT_USERDATA  useData;\r
92         VO_HANDLE               hCodec;\r
93         VO_CODECBUFFER          inData;\r
94         VO_CODECBUFFER          outData;\r
95         VO_AUDIO_OUTPUTINFO     outFormat;\r
96 \r
97         unsigned char *inBuf = InputBuf;\r
98         unsigned char *outBuf = OutputBuf;\r
99 \r
100 \r
101 #ifdef LINUX\r
102         void  *handle = NULL;\r
103         void  *pfunc;\r
104         VOGETAUDIOENCAPI pGetAPI;\r
105 #endif\r
106 \r
107         clock_t   start, finish;\r
108         double    duration = 0.0;\r
109 \r
110         if ((fsrc = fopen (srcfile, "rb")) == NULL)\r
111         {\r
112                 ret = -1;\r
113                 goto safe_exit;\r
114         }\r
115 \r
116         if ((fdst = fopen (dstfile, "wb")) == NULL)\r
117         {\r
118                 ret = -1;\r
119                 goto safe_exit;\r
120         }\r
121 \r
122         moper.Alloc = cmnMemAlloc;\r
123         moper.Copy = cmnMemCopy;\r
124         moper.Free = cmnMemFree;\r
125         moper.Set = cmnMemSet;\r
126         moper.Check = cmnMemCheck;\r
127 \r
128         useData.memflag = VO_IMF_USERMEMOPERATOR;\r
129         useData.memData = (VO_PTR)(&moper);\r
130 \r
131 #ifdef LINUX\r
132         handle = dlopen("/data/local/tmp/voAMRWBEnc.so", RTLD_NOW);\r
133         if(handle == 0)\r
134         {\r
135                 printf("open dll error......");\r
136                 return -1;\r
137         }\r
138 \r
139         pfunc = dlsym(handle, "voGetAMRWBEncAPI");      \r
140         if(pfunc == 0)\r
141         {\r
142                 printf("open function error......");\r
143                 return -1;\r
144         }\r
145 \r
146         pGetAPI = (VOGETAUDIOENCAPI)pfunc;\r
147 \r
148         returnCode  = pGetAPI(&AudioAPI);\r
149         if(returnCode)\r
150         {\r
151                 printf("get APIs error......");\r
152                 return -1;\r
153         }\r
154 #else\r
155         ret = voGetAMRWBEncAPI(&AudioAPI);\r
156         if(ret)\r
157         {\r
158                 ret = -1;\r
159                 printf("get APIs error......");\r
160                 goto safe_exit;\r
161         }\r
162 #endif \r
163 \r
164         //#######################################   Init Encoding Section   #########################################\r
165         ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);\r
166 \r
167         if(ret)\r
168         {\r
169                 ret = -1;\r
170                 printf("APIs init error......");\r
171                 goto safe_exit;\r
172         }\r
173 \r
174         Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);\r
175         if(Relens!=INPUT_SIZE && !feof(fsrc))\r
176         {\r
177                 ret = -1; //Invalid magic number\r
178                 printf("get next buffer error......");\r
179                 goto safe_exit;\r
180         }\r
181 \r
182         //###################################### set encode Mode ##################################################\r
183         ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType);\r
184         ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode);\r
185         ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx);\r
186 \r
187         if(frameType == VOAMRWB_RFC3267)\r
188         {\r
189                 /* write RFC3267 Header info to indicate single channel AMR file storage format */\r
190                 size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO);\r
191                 memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1);\r
192                 outBuf += size1;\r
193         }\r
194 \r
195         //#######################################   Encoding Section   #########################################\r
196         printf(" \n ---------------- Running -------------------------\n ");\r
197 \r
198         do{\r
199                 inData.Buffer = (unsigned char *)inBuf;\r
200                 inData.Length = Relens;\r
201                 outData.Buffer = outBuf;\r
202 \r
203                 start = clock();\r
204 \r
205                 /* decode one amr block */\r
206                 returnCode = AudioAPI.SetInputData(hCodec,&inData);\r
207 \r
208                 do {\r
209                         returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);\r
210                         if(returnCode == 0)\r
211                         {\r
212                                 framenum++;\r
213                                 printf(" Frames processed: %hd\r", framenum);\r
214                                 if(framenum == 1)\r
215                                 {\r
216                                         fwrite(OutputBuf, 1, outData.Length + size1, fdst);\r
217                                         fflush(fdst);   \r
218                                 }\r
219                                 else\r
220                                 {\r
221                                         fwrite(outData.Buffer, 1, outData.Length, fdst);\r
222                                         fflush(fdst);\r
223                                 }\r
224                         }\r
225                         else if(returnCode == VO_ERR_LICENSE_ERROR)\r
226                         {\r
227                         printf("Encoder time reach upper limit......");\r
228                         goto safe_exit;\r
229                         }\r
230                 } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL);\r
231 \r
232                 finish = clock();\r
233                 duration += finish - start;\r
234 \r
235                 if (!eofFile) {\r
236                         Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);\r
237                         inBuf = InputBuf;\r
238                         if (feof(fsrc) && Relens == 0)\r
239                                 eofFile = 1;\r
240                 }\r
241         } while (!eofFile && returnCode);\r
242         //#######################################   End Encoding Section   #########################################\r
243 \r
244 safe_exit:\r
245         returnCode = AudioAPI.Uninit(hCodec);\r
246 \r
247         printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);\r
248 \r
249         if (fsrc)\r
250                 fclose(fsrc);\r
251         if (fdst)\r
252                 fclose(fdst);\r
253 \r
254 #ifdef LINUX\r
255         dlclose(handle);\r
256 #endif\r
257 \r
258         return ret;\r
259 }\r
260 \r
261 int main(int argc, char **argv)  // for gcc compiler;\r
262 {\r
263         int     mode, r;\r
264         int     arg, filename=0;\r
265         char    *inFileName = NULL;\r
266         char    *outFileName = NULL;\r
267         short   allow_dtx;\r
268         VOAMRWBFRAMETYPE frameType;\r
269 \r
270         printf("\n");\r
271         printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n");\r
272         printf("***********************************DEFINITIONS:*******************************************************\n");\r
273         printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n");\r
274         printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n");\r
275         printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n");\r
276         printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n");\r
277         printf("\n");\r
278 \r
279         /*Encoder Default setting */\r
280         mode = VOAMRWB_MD2385;\r
281         allow_dtx = 0;\r
282         frameType = VOAMRWB_RFC3267;\r
283 \r
284         if(argc < 3){\r
285                 usage();\r
286                 return 0;\r
287         }else{\r
288                 for (arg = 1; arg < argc; arg++) {\r
289                         if (argv [arg] [0] == '+') {\r
290                                 if(argv[arg][1] == 'M')\r
291                                 {\r
292                                         switch(argv[arg][2])\r
293                                         {\r
294                                         case '0': mode = VOAMRWB_MD66;\r
295                                                 break;\r
296                                         case '1': mode = VOAMRWB_MD885;\r
297                                                 break;\r
298                                         case '2': mode = VOAMRWB_MD1265;\r
299                                                 break;\r
300                                         case '3': mode = VOAMRWB_MD1425;\r
301                                                 break;\r
302                                         case '4': mode = VOAMRWB_MD1585;\r
303                                                 break;\r
304                                         case '5': mode = VOAMRWB_MD1825;\r
305                                                 break;\r
306                                         case '6': mode = VOAMRWB_MD1985;\r
307                                                 break;\r
308                                         case '7': mode = VOAMRWB_MD2305;\r
309                                                 break;\r
310                                         case '8': mode = VOAMRWB_MD2385;\r
311                                                 break;\r
312                                         default:\r
313                                                 usage();\r
314                                                 printf ("Invalid parameter '%s'.\n", argv [arg]);\r
315                                                 break;\r
316                                         }\r
317                                 }else if(argv[arg][1] == 'F')\r
318                                 {\r
319                                         switch(argv[arg][2])\r
320                                         {\r
321                                         case '0': frameType = VOAMRWB_DEFAULT;\r
322                                                 break;\r
323                                         case '1': frameType = VOAMRWB_ITU;\r
324                                                 break;\r
325                                         case '2': frameType = VOAMRWB_RFC3267 ;\r
326                                                 break; \r
327                                         default:\r
328                                                 usage();\r
329                                                 printf ("Invalid parameter '%s'.\n", argv [arg]);\r
330                                                 break;\r
331 \r
332 \r
333                                         }\r
334                                 }else if(strcmp (argv[arg], "+DTX") == 0)\r
335                                 {\r
336                                         allow_dtx = 1;\r
337                                 }\r
338 \r
339                         } else {\r
340                                 switch (filename) {\r
341                                                 case 0: \r
342                                                         inFileName  = argv[arg];\r
343                                                         break;\r
344                                                 case 1: \r
345                                                         outFileName = argv[arg]; \r
346                                                         break;\r
347                                                 default:\r
348                                                         usage ();\r
349                                                         fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);\r
350                                                         return 0;\r
351                                 }\r
352                                 filename++;\r
353                         }\r
354                 }\r
355         }\r
356 \r
357         r = encode(mode, allow_dtx, frameType, inFileName, outFileName);\r
358         if(r)\r
359         {\r
360                 fprintf(stderr, "error: %d\n", r);\r
361         }\r
362         return r;\r
363 }\r
364 \r