Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_coding / codecs / g711 / test / testG711.cc
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 /*
12  * testG711.cpp : Defines the entry point for the console application.
13  */
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18
19 /* include API */
20 #include "g711_interface.h"
21
22 /* Runtime statistics */
23 #include <time.h>
24 #define CLOCKS_PER_SEC_G711 1000
25
26 /* function for reading audio data from PCM file */
27 int readframe(int16_t* data, FILE* inp, int length) {
28
29   short k, rlen, status = 0;
30
31   rlen = (short) fread(data, sizeof(int16_t), length, inp);
32   if (rlen < length) {
33     for (k = rlen; k < length; k++)
34       data[k] = 0;
35     status = 1;
36   }
37
38   return status;
39 }
40
41 int main(int argc, char* argv[]) {
42   char inname[80], outname[40], bitname[40];
43   FILE* inp;
44   FILE* outp;
45   FILE* bitp = NULL;
46   int framecnt, endfile;
47
48   int16_t framelength = 80;
49
50   int err;
51
52   /* Runtime statistics */
53   double starttime;
54   double runtime;
55   double length_file;
56
57   int16_t stream_len = 0;
58   int16_t shortdata[480];
59   int16_t decoded[480];
60   int16_t streamdata[500];
61   int16_t speechType[1];
62   char law[2];
63   char versionNumber[40];
64
65   /* handling wrong input arguments in the command line */
66   if ((argc != 5) && (argc != 6)) {
67     printf("\n\nWrong number of arguments or flag values.\n\n");
68
69     printf("\n");
70     printf("\nG.711 test application\n\n");
71     printf("Usage:\n\n");
72     printf("./testG711.exe framelength law infile outfile \n\n");
73     printf("framelength: Framelength in samples.\n");
74     printf("law        : Coding law, A och u.\n");
75     printf("infile     : Normal speech input file\n");
76     printf("outfile    : Speech output file\n\n");
77     printf("outbits    : Output bitstream file [optional]\n\n");
78     exit(0);
79
80   }
81
82   /* Get version and print */
83   WebRtcG711_Version(versionNumber, 40);
84
85   printf("-----------------------------------\n");
86   printf("G.711 version: %s\n\n", versionNumber);
87   /* Get frame length */
88   framelength = atoi(argv[1]);
89
90   /* Get compression law */
91   strcpy(law, argv[2]);
92
93   /* Get Input and Output files */
94   sscanf(argv[3], "%s", inname);
95   sscanf(argv[4], "%s", outname);
96   if (argc == 6) {
97     sscanf(argv[5], "%s", bitname);
98     if ((bitp = fopen(bitname, "wb")) == NULL) {
99       printf("  G.711: Cannot read file %s.\n", bitname);
100       exit(1);
101     }
102   }
103
104   if ((inp = fopen(inname, "rb")) == NULL) {
105     printf("  G.711: Cannot read file %s.\n", inname);
106     exit(1);
107   }
108   if ((outp = fopen(outname, "wb")) == NULL) {
109     printf("  G.711: Cannot write file %s.\n", outname);
110     exit(1);
111   }
112   printf("\nInput:  %s\nOutput: %s\n", inname, outname);
113   if (argc == 6) {
114     printf("\nBitfile:  %s\n", bitname);
115   }
116
117   starttime = clock() / (double) CLOCKS_PER_SEC_G711; /* Runtime statistics */
118
119   /* Initialize encoder and decoder */
120   framecnt = 0;
121   endfile = 0;
122   while (endfile == 0) {
123     framecnt++;
124     /* Read speech block */
125     endfile = readframe(shortdata, inp, framelength);
126
127     /* G.711 encoding */
128     if (!strcmp(law, "A")) {
129       /* A-law encoding */
130       stream_len = WebRtcG711_EncodeA(shortdata, framelength, streamdata);
131       if (argc == 6) {
132         /* Write bits to file */
133         if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
134             static_cast<size_t>(stream_len)) {
135           return -1;
136         }
137       }
138       err = WebRtcG711_DecodeA(streamdata, stream_len, decoded,
139                                speechType);
140     } else if (!strcmp(law, "u")) {
141       /* u-law encoding */
142       stream_len = WebRtcG711_EncodeU(shortdata, framelength, streamdata);
143       if (argc == 6) {
144         /* Write bits to file */
145         if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
146             static_cast<size_t>(stream_len)) {
147           return -1;
148         }
149       }
150       err = WebRtcG711_DecodeU(streamdata, stream_len, decoded, speechType);
151     } else {
152       printf("Wrong law mode\n");
153       exit(1);
154     }
155     if (stream_len < 0 || err < 0) {
156       /* exit if returned with error */
157       printf("Error in encoder/decoder\n");
158     } else {
159       /* Write coded speech to file */
160       if (fwrite(decoded, sizeof(short), framelength, outp) !=
161           static_cast<size_t>(framelength)) {
162         return -1;
163       }
164     }
165   }
166
167   runtime = (double)(clock() / (double) CLOCKS_PER_SEC_G711 - starttime);
168   length_file = ((double) framecnt * (double) framelength / 8000);
169   printf("\n\nLength of speech file: %.1f s\n", length_file);
170   printf("Time to run G.711:      %.2f s (%.2f %% of realtime)\n\n",
171          runtime,
172          (100 * runtime / length_file));
173   printf("---------------------END----------------------\n");
174
175   fclose(inp);
176   fclose(outp);
177
178   return 0;
179 }