• 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  * testG722.cpp : Defines the entry point for the console application.
13  */
14 
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include "webrtc/typedefs.h"
19 
20 /* include API */
21 #include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
22 
23 /* Runtime statistics */
24 #include <time.h>
25 #define CLOCKS_PER_SEC_G722  100000
26 
27 // Forward declaration
28 typedef struct WebRtcG722EncInst    G722EncInst;
29 typedef struct WebRtcG722DecInst    G722DecInst;
30 
31 /* function for reading audio data from PCM file */
readframe(int16_t * data,FILE * inp,size_t length)32 bool readframe(int16_t *data, FILE *inp, size_t length)
33 {
34     size_t rlen = fread(data, sizeof(int16_t), length, inp);
35     if (rlen >= length)
36       return false;
37     memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
38     return true;
39 }
40 
main(int argc,char * argv[])41 int main(int argc, char* argv[])
42 {
43     char inname[60], outbit[40], outname[40];
44     FILE *inp, *outbitp, *outp;
45 
46     int framecnt;
47     bool endfile;
48     size_t framelength = 160;
49     G722EncInst *G722enc_inst;
50     G722DecInst *G722dec_inst;
51 
52     /* Runtime statistics */
53     double starttime;
54     double runtime = 0;
55     double length_file;
56 
57     size_t stream_len = 0;
58     int16_t shortdata[960];
59     int16_t decoded[960];
60     uint8_t streamdata[80 * 6];
61     int16_t speechType[1];
62 
63     /* handling wrong input arguments in the command line */
64     if (argc!=5)  {
65         printf("\n\nWrong number of arguments or flag values.\n\n");
66 
67         printf("\n");
68         printf("Usage:\n\n");
69         printf("./testG722.exe framelength infile outbitfile outspeechfile \n\n");
70         printf("with:\n");
71         printf("framelength  :    Framelength in samples.\n\n");
72         printf("infile       :    Normal speech input file\n\n");
73         printf("outbitfile   :    Bitstream output file\n\n");
74         printf("outspeechfile:    Speech output file\n\n");
75         exit(0);
76 
77     }
78 
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 Input and Output files */
88     sscanf(argv[2], "%s", inname);
89     sscanf(argv[3], "%s", outbit);
90     sscanf(argv[4], "%s", outname);
91 
92     if ((inp = fopen(inname,"rb")) == NULL) {
93         printf("  G.722: Cannot read file %s.\n", inname);
94         exit(1);
95     }
96     if ((outbitp = fopen(outbit,"wb")) == NULL) {
97         printf("  G.722: Cannot write file %s.\n", outbit);
98         exit(1);
99     }
100     if ((outp = fopen(outname,"wb")) == NULL) {
101         printf("  G.722: Cannot write file %s.\n", outname);
102         exit(1);
103     }
104     printf("\nInput:%s\nOutput bitstream:%s\nOutput:%s\n", inname, outbit, outname);
105 
106     /* Create and init */
107     WebRtcG722_CreateEncoder((G722EncInst **)&G722enc_inst);
108     WebRtcG722_CreateDecoder((G722DecInst **)&G722dec_inst);
109     WebRtcG722_EncoderInit((G722EncInst *)G722enc_inst);
110     WebRtcG722_DecoderInit((G722DecInst *)G722dec_inst);
111 
112 
113     /* Initialize encoder and decoder */
114     framecnt = 0;
115     endfile = false;
116     while (!endfile) {
117         framecnt++;
118 
119         /* Read speech block */
120         endfile = readframe(shortdata, inp, framelength);
121 
122         /* Start clock before call to encoder and decoder */
123         starttime = clock()/(double)CLOCKS_PER_SEC_G722;
124 
125         /* G.722 encoding + decoding */
126         stream_len = WebRtcG722_Encode((G722EncInst *)G722enc_inst, shortdata, framelength, streamdata);
127         WebRtcG722_Decode(G722dec_inst, streamdata, stream_len, decoded,
128                           speechType);
129 
130         /* Stop clock after call to encoder and decoder */
131         runtime += (double)((clock()/(double)CLOCKS_PER_SEC_G722)-starttime);
132 
133         /* Write coded bits to file */
134         if (fwrite(streamdata, sizeof(short), stream_len / 2, outbitp) !=
135             stream_len / 2) {
136           return -1;
137         }
138         /* Write coded speech to file */
139         if (fwrite(decoded, sizeof(short), framelength, outp) !=
140             framelength) {
141           return -1;
142         }
143     }
144 
145     WebRtcG722_FreeEncoder((G722EncInst *)G722enc_inst);
146     WebRtcG722_FreeDecoder((G722DecInst *)G722dec_inst);
147 
148     length_file = ((double)framecnt*(double)framelength/16000);
149     printf("\n\nLength of speech file: %.1f s\n", length_file);
150     printf("Time to run G.722:      %.2f s (%.2f %% of realtime)\n\n", runtime, (100*runtime/length_file));
151     printf("---------------------END----------------------\n");
152 
153     fclose(inp);
154     fclose(outbitp);
155     fclose(outp);
156 
157     return 0;
158 }
159