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
13 iLBC Speech Coder ANSI-C Source Code
14
15 iLBC_test.c
16
17 ******************************************************************/
18
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include "modules/audio_coding/codecs/ilbc/ilbc.h"
23
24 /*---------------------------------------------------------------*
25 * Main program to test iLBC encoding and decoding
26 *
27 * Usage:
28 * exefile_name.exe <infile> <bytefile> <outfile> <channel>
29 *
30 * <infile> : Input file, speech for encoder (16-bit pcm file)
31 * <bytefile> : Bit stream output from the encoder
32 * <outfile> : Output file, decoded speech (16-bit pcm file)
33 * <channel> : Bit error file, optional (16-bit)
34 * 1 - Packet received correctly
35 * 0 - Packet Lost
36 *
37 *--------------------------------------------------------------*/
38
39 #define BLOCKL_MAX 240
40 #define ILBCNOOFWORDS_MAX 25
41
42
main(int argc,char * argv[])43 int main(int argc, char* argv[])
44 {
45
46 FILE *ifileid,*efileid,*ofileid, *cfileid;
47 int16_t data[BLOCKL_MAX];
48 uint8_t encoded_data[2 * ILBCNOOFWORDS_MAX];
49 int16_t decoded_data[BLOCKL_MAX];
50 int len_int, mode;
51 short pli;
52 int blockcount = 0;
53 int packetlosscount = 0;
54 size_t frameLen, len, len_i16s;
55 int16_t speechType;
56 IlbcEncoderInstance *Enc_Inst;
57 IlbcDecoderInstance *Dec_Inst;
58
59 #ifdef __ILBC_WITH_40BITACC
60 /* Doublecheck that long long exists */
61 if (sizeof(long)>=sizeof(long long)) {
62 fprintf(stderr, "40-bit simulation is not be supported on this platform\n");
63 exit(0);
64 }
65 #endif
66
67 /* get arguments and open files */
68
69 if ((argc!=5) && (argc!=6)) {
70 fprintf(stderr,
71 "\n*-----------------------------------------------*\n");
72 fprintf(stderr,
73 " %s <20,30> input encoded decoded (channel)\n\n",
74 argv[0]);
75 fprintf(stderr,
76 " mode : Frame size for the encoding/decoding\n");
77 fprintf(stderr,
78 " 20 - 20 ms\n");
79 fprintf(stderr,
80 " 30 - 30 ms\n");
81 fprintf(stderr,
82 " input : Speech for encoder (16-bit pcm file)\n");
83 fprintf(stderr,
84 " encoded : Encoded bit stream\n");
85 fprintf(stderr,
86 " decoded : Decoded speech (16-bit pcm file)\n");
87 fprintf(stderr,
88 " channel : Packet loss pattern, optional (16-bit)\n");
89 fprintf(stderr,
90 " 1 - Packet received correctly\n");
91 fprintf(stderr,
92 " 0 - Packet Lost\n");
93 fprintf(stderr,
94 "*-----------------------------------------------*\n\n");
95 exit(1);
96 }
97 mode=atoi(argv[1]);
98 if (mode != 20 && mode != 30) {
99 fprintf(stderr,"Wrong mode %s, must be 20, or 30\n",
100 argv[1]);
101 exit(2);
102 }
103 if ( (ifileid=fopen(argv[2],"rb")) == NULL) {
104 fprintf(stderr,"Cannot open input file %s\n", argv[2]);
105 exit(2);}
106 if ( (efileid=fopen(argv[3],"wb")) == NULL) {
107 fprintf(stderr, "Cannot open encoded file file %s\n",
108 argv[3]); exit(1);}
109 if ( (ofileid=fopen(argv[4],"wb")) == NULL) {
110 fprintf(stderr, "Cannot open decoded file %s\n",
111 argv[4]); exit(1);}
112 if (argc==6) {
113 if( (cfileid=fopen(argv[5],"rb")) == NULL) {
114 fprintf(stderr, "Cannot open channel file %s\n",
115 argv[5]);
116 exit(1);
117 }
118 } else {
119 cfileid=NULL;
120 }
121
122 /* print info */
123
124 fprintf(stderr, "\n");
125 fprintf(stderr,
126 "*---------------------------------------------------*\n");
127 fprintf(stderr,
128 "* *\n");
129 fprintf(stderr,
130 "* iLBC test program *\n");
131 fprintf(stderr,
132 "* *\n");
133 fprintf(stderr,
134 "* *\n");
135 fprintf(stderr,
136 "*---------------------------------------------------*\n");
137 fprintf(stderr,"\nMode : %2d ms\n", mode);
138 fprintf(stderr,"Input file : %s\n", argv[2]);
139 fprintf(stderr,"Encoded file : %s\n", argv[3]);
140 fprintf(stderr,"Output file : %s\n", argv[4]);
141 if (argc==6) {
142 fprintf(stderr,"Channel file : %s\n", argv[5]);
143 }
144 fprintf(stderr,"\n");
145
146 /* Create structs */
147 WebRtcIlbcfix_EncoderCreate(&Enc_Inst);
148 WebRtcIlbcfix_DecoderCreate(&Dec_Inst);
149
150
151 /* Initialization */
152
153 WebRtcIlbcfix_EncoderInit(Enc_Inst, mode);
154 WebRtcIlbcfix_DecoderInit(Dec_Inst, mode);
155 frameLen = (size_t)(mode*8);
156
157 /* loop over input blocks */
158
159 while (fread(data,sizeof(int16_t),frameLen,ifileid) == frameLen) {
160
161 blockcount++;
162
163 /* encoding */
164
165 fprintf(stderr, "--- Encoding block %i --- ",blockcount);
166 len_int = WebRtcIlbcfix_Encode(Enc_Inst, data, frameLen, encoded_data);
167 if (len_int < 0) {
168 fprintf(stderr, "Error encoding\n");
169 exit(0);
170 }
171 len = (size_t)len_int;
172 fprintf(stderr, "\r");
173
174 /* write byte file */
175
176 len_i16s = (len + 1) / sizeof(int16_t);
177 if (fwrite(encoded_data, sizeof(int16_t), len_i16s, efileid) != len_i16s) {
178 return -1;
179 }
180
181 /* get channel data if provided */
182 if (argc==6) {
183 if (fread(&pli, sizeof(int16_t), 1, cfileid)) {
184 if ((pli!=0)&&(pli!=1)) {
185 fprintf(stderr, "Error in channel file\n");
186 exit(0);
187 }
188 if (pli==0) {
189 /* Packet loss -> remove info from frame */
190 memset(encoded_data, 0,
191 sizeof(int16_t)*ILBCNOOFWORDS_MAX);
192 packetlosscount++;
193 }
194 } else {
195 fprintf(stderr, "Error. Channel file too short\n");
196 exit(0);
197 }
198 } else {
199 pli=1;
200 }
201
202 /* decoding */
203
204 fprintf(stderr, "--- Decoding block %i --- ",blockcount);
205 if (pli==1) {
206 len_int=WebRtcIlbcfix_Decode(Dec_Inst, encoded_data,
207 len, decoded_data,&speechType);
208 if (len_int < 0) {
209 fprintf(stderr, "Error decoding\n");
210 exit(0);
211 }
212 len = (size_t)len_int;
213 } else {
214 len=WebRtcIlbcfix_DecodePlc(Dec_Inst, decoded_data, 1);
215 }
216 fprintf(stderr, "\r");
217
218 /* write output file */
219
220 if (fwrite(decoded_data, sizeof(int16_t), len, ofileid) != len) {
221 return -1;
222 }
223 }
224
225 /* close files */
226
227 fclose(ifileid); fclose(efileid); fclose(ofileid);
228 if (argc==6) {
229 fclose(cfileid);
230 }
231
232 /* Free structs */
233 WebRtcIlbcfix_EncoderFree(Enc_Inst);
234 WebRtcIlbcfix_DecoderFree(Dec_Inst);
235
236
237 printf("\nDone with simulation\n\n");
238
239 return(0);
240 }
241