2 ** Copyright 2003-2010, VisualOn, Inc.
\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
8 ** http://www.apache.org/licenses/LICENSE-2.0
\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
25 #include "voAMRWB.h"
\r
26 #include "cmnMemory.h"
\r
28 #define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n"
\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
36 printf ("AMR_WB Encoder HELP Displays this text\n");
\r
38 printf ("Usage:\n");
\r
39 printf ("AMRWBEnc [options] Input_file output_file \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
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
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
64 int GetNextBuf(FILE* inFile,unsigned char* dst,int size)
\r
66 int size2 = (int)fread(dst, sizeof(signed char), size,inFile);
\r
70 typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
\r
75 VOAMRWBFRAMETYPE frameType,
\r
76 const char* srcfile,
\r
89 VO_AUDIO_CODECAPI AudioAPI;
\r
90 VO_MEM_OPERATOR moper;
\r
91 VO_CODEC_INIT_USERDATA useData;
\r
93 VO_CODECBUFFER inData;
\r
94 VO_CODECBUFFER outData;
\r
95 VO_AUDIO_OUTPUTINFO outFormat;
\r
97 unsigned char *inBuf = InputBuf;
\r
98 unsigned char *outBuf = OutputBuf;
\r
102 void *handle = NULL;
\r
104 VOGETAUDIOENCAPI pGetAPI;
\r
107 clock_t start, finish;
\r
108 double duration = 0.0;
\r
110 if ((fsrc = fopen (srcfile, "rb")) == NULL)
\r
116 if ((fdst = fopen (dstfile, "wb")) == NULL)
\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
128 useData.memflag = VO_IMF_USERMEMOPERATOR;
\r
129 useData.memData = (VO_PTR)(&moper);
\r
132 handle = dlopen("/data/local/tmp/voAMRWBEnc.so", RTLD_NOW);
\r
135 printf("open dll error......");
\r
139 pfunc = dlsym(handle, "voGetAMRWBEncAPI");
\r
142 printf("open function error......");
\r
146 pGetAPI = (VOGETAUDIOENCAPI)pfunc;
\r
148 returnCode = pGetAPI(&AudioAPI);
\r
151 printf("get APIs error......");
\r
155 ret = voGetAMRWBEncAPI(&AudioAPI);
\r
159 printf("get APIs error......");
\r
164 //####################################### Init Encoding Section #########################################
\r
165 ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
\r
170 printf("APIs init error......");
\r
174 Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE);
\r
175 if(Relens!=INPUT_SIZE && !feof(fsrc))
\r
177 ret = -1; //Invalid magic number
\r
178 printf("get next buffer error......");
\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
187 if(frameType == VOAMRWB_RFC3267)
\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
195 //####################################### Encoding Section #########################################
\r
196 printf(" \n ---------------- Running -------------------------\n ");
\r
199 inData.Buffer = (unsigned char *)inBuf;
\r
200 inData.Length = Relens;
\r
201 outData.Buffer = outBuf;
\r
205 /* decode one amr block */
\r
206 returnCode = AudioAPI.SetInputData(hCodec,&inData);
\r
209 returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat);
\r
210 if(returnCode == 0)
\r
213 printf(" Frames processed: %hd\r", framenum);
\r
216 fwrite(OutputBuf, 1, outData.Length + size1, fdst);
\r
221 fwrite(outData.Buffer, 1, outData.Length, fdst);
\r
225 else if(returnCode == VO_ERR_LICENSE_ERROR)
\r
227 printf("Encoder time reach upper limit......");
\r
230 } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL);
\r
233 duration += finish - start;
\r
236 Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE);
\r
238 if (feof(fsrc) && Relens == 0)
\r
241 } while (!eofFile && returnCode);
\r
242 //####################################### End Encoding Section #########################################
\r
245 returnCode = AudioAPI.Uninit(hCodec);
\r
247 printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC);
\r
261 int main(int argc, char **argv) // for gcc compiler;
\r
264 int arg, filename=0;
\r
265 char *inFileName = NULL;
\r
266 char *outFileName = NULL;
\r
268 VOAMRWBFRAMETYPE frameType;
\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
279 /*Encoder Default setting */
\r
280 mode = VOAMRWB_MD2385;
\r
282 frameType = VOAMRWB_RFC3267;
\r
288 for (arg = 1; arg < argc; arg++) {
\r
289 if (argv [arg] [0] == '+') {
\r
290 if(argv[arg][1] == 'M')
\r
292 switch(argv[arg][2])
\r
294 case '0': mode = VOAMRWB_MD66;
\r
296 case '1': mode = VOAMRWB_MD885;
\r
298 case '2': mode = VOAMRWB_MD1265;
\r
300 case '3': mode = VOAMRWB_MD1425;
\r
302 case '4': mode = VOAMRWB_MD1585;
\r
304 case '5': mode = VOAMRWB_MD1825;
\r
306 case '6': mode = VOAMRWB_MD1985;
\r
308 case '7': mode = VOAMRWB_MD2305;
\r
310 case '8': mode = VOAMRWB_MD2385;
\r
314 printf ("Invalid parameter '%s'.\n", argv [arg]);
\r
317 }else if(argv[arg][1] == 'F')
\r
319 switch(argv[arg][2])
\r
321 case '0': frameType = VOAMRWB_DEFAULT;
\r
323 case '1': frameType = VOAMRWB_ITU;
\r
325 case '2': frameType = VOAMRWB_RFC3267 ;
\r
329 printf ("Invalid parameter '%s'.\n", argv [arg]);
\r
334 }else if(strcmp (argv[arg], "+DTX") == 0)
\r
340 switch (filename) {
\r
342 inFileName = argv[arg];
\r
345 outFileName = argv[arg];
\r
349 fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]);
\r
357 r = encode(mode, allow_dtx, frameType, inFileName, outFileName);
\r
360 fprintf(stderr, "error: %d\n", r);
\r