• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "modules/audio_coding/codecs/g711/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 */
readframe(int16_t * data,FILE * inp,size_t length)27 bool readframe(int16_t* data, FILE* inp, size_t length) {
28   size_t rlen = fread(data, sizeof(int16_t), length, inp);
29   if (rlen >= length)
30     return false;
31   memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
32   return true;
33 }
34 
main(int argc,char * argv[])35 int main(int argc, char* argv[]) {
36   char inname[80], outname[40], bitname[40];
37   FILE* inp;
38   FILE* outp;
39   FILE* bitp = NULL;
40   int framecnt;
41   bool endfile;
42 
43   size_t framelength = 80;
44 
45   /* Runtime statistics */
46   double starttime;
47   double runtime;
48   double length_file;
49 
50   size_t stream_len = 0;
51   int16_t shortdata[480];
52   int16_t decoded[480];
53   uint8_t streamdata[1000];
54   int16_t speechType[1];
55   char law[2];
56   char versionNumber[40];
57 
58   /* handling wrong input arguments in the command line */
59   if ((argc != 5) && (argc != 6)) {
60     printf("\n\nWrong number of arguments or flag values.\n\n");
61 
62     printf("\n");
63     printf("\nG.711 test application\n\n");
64     printf("Usage:\n\n");
65     printf("./testG711.exe framelength law infile outfile \n\n");
66     printf("framelength: Framelength in samples.\n");
67     printf("law        : Coding law, A och u.\n");
68     printf("infile     : Normal speech input file\n");
69     printf("outfile    : Speech output file\n\n");
70     printf("outbits    : Output bitstream file [optional]\n\n");
71     exit(0);
72   }
73 
74   /* Get version and print */
75   WebRtcG711_Version(versionNumber, 40);
76 
77   printf("-----------------------------------\n");
78   printf("G.711 version: %s\n\n", versionNumber);
79   /* Get frame length */
80   int framelength_int = atoi(argv[1]);
81   if (framelength_int < 0) {
82     printf("  G.722: Invalid framelength %d.\n", framelength_int);
83     exit(1);
84   }
85   framelength = static_cast<size_t>(framelength_int);
86 
87   /* Get compression law */
88   strcpy(law, argv[2]);
89 
90   /* Get Input and Output files */
91   sscanf(argv[3], "%s", inname);
92   sscanf(argv[4], "%s", outname);
93   if (argc == 6) {
94     sscanf(argv[5], "%s", bitname);
95     if ((bitp = fopen(bitname, "wb")) == NULL) {
96       printf("  G.711: Cannot read file %s.\n", bitname);
97       exit(1);
98     }
99   }
100 
101   if ((inp = fopen(inname, "rb")) == NULL) {
102     printf("  G.711: Cannot read file %s.\n", inname);
103     exit(1);
104   }
105   if ((outp = fopen(outname, "wb")) == NULL) {
106     printf("  G.711: Cannot write file %s.\n", outname);
107     exit(1);
108   }
109   printf("\nInput:  %s\nOutput: %s\n", inname, outname);
110   if (argc == 6) {
111     printf("\nBitfile:  %s\n", bitname);
112   }
113 
114   starttime = clock() / (double)CLOCKS_PER_SEC_G711; /* Runtime statistics */
115 
116   /* Initialize encoder and decoder */
117   framecnt = 0;
118   endfile = false;
119   while (!endfile) {
120     framecnt++;
121     /* Read speech block */
122     endfile = readframe(shortdata, inp, framelength);
123 
124     /* G.711 encoding */
125     if (!strcmp(law, "A")) {
126       /* A-law encoding */
127       stream_len = WebRtcG711_EncodeA(shortdata, framelength, streamdata);
128       if (argc == 6) {
129         /* Write bits to file */
130         if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
131             stream_len) {
132           return -1;
133         }
134       }
135       WebRtcG711_DecodeA(streamdata, stream_len, decoded, speechType);
136     } else if (!strcmp(law, "u")) {
137       /* u-law encoding */
138       stream_len = WebRtcG711_EncodeU(shortdata, framelength, streamdata);
139       if (argc == 6) {
140         /* Write bits to file */
141         if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
142             stream_len) {
143           return -1;
144         }
145       }
146       WebRtcG711_DecodeU(streamdata, stream_len, decoded, speechType);
147     } else {
148       printf("Wrong law mode\n");
149       exit(1);
150     }
151     /* Write coded speech to file */
152     if (fwrite(decoded, sizeof(short), framelength, outp) != framelength) {
153       return -1;
154     }
155   }
156 
157   runtime = (double)(clock() / (double)CLOCKS_PER_SEC_G711 - starttime);
158   length_file = ((double)framecnt * (double)framelength / 8000);
159   printf("\n\nLength of speech file: %.1f s\n", length_file);
160   printf("Time to run G.711:      %.2f s (%.2f %% of realtime)\n\n", runtime,
161          (100 * runtime / length_file));
162   printf("---------------------END----------------------\n");
163 
164   fclose(inp);
165   fclose(outp);
166 
167   return 0;
168 }
169