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 "webrtc/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
43int 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