1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/*
2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *
4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  Use of this source code is governed by a BSD-style license
5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  that can be found in the LICENSE file in the root of the source
6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  tree. An additional intellectual property rights grant can be found
7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  in the file PATENTS.  All contributing project authors may
8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin *  be found in the AUTHORS file in the root of the source tree.
9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */
10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* kenny.c  - Main function for the iSAC coder */
12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <stdio.h>
14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <stdlib.h>
15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <string.h>
16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <time.h>
17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <ctype.h>
18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "isacfix.h"
20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Defines */
23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define SEED_FILE "randseed.txt"  /* Used when running decoder on garbage data */
24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define MAX_FRAMESAMPLES    960   /* max number of samples per frame (= 60 ms frame) */
25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define FRAMESAMPLES_10ms 160   /* number of samples per 10ms frame */
26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define FS           16000 /* sampling frequency (Hz) */
27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Function for reading audio data from PCM file */
29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint readframe(WebRtc_Word16 *data, FILE *inp, int length) {
30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  short k, rlen, status = 0;
32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  rlen = fread(data, sizeof(WebRtc_Word16), length, inp);
34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (rlen < length) {
35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    for (k = rlen; k < length; k++)
36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      data[k] = 0;
37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    status = 1;
38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  return status;
41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}
42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* Struct for bottleneck model */
44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef struct {
45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_UWord32 send_time;            /* samples */
46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_UWord32 arrival_time;         /* samples */
47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_UWord32 sample_count;         /* samples */
48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_UWord16 rtp_number;
49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} BottleNeckModel;
50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid get_arrival_time(int current_framesamples,   /* samples */
52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                      int packet_size,            /* bytes */
53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                      int bottleneck,             /* excluding headers; bits/s */
54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                      BottleNeckModel *BN_data)
55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{
56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  const int HeaderSize = 35;
57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int HeaderRate;
58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  HeaderRate = HeaderSize * 8 * FS / current_framesamples;     /* bits/s */
60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* everything in samples */
62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data->sample_count = BN_data->sample_count + current_framesamples;
63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data->arrival_time += ((packet_size + HeaderSize) * 8 * FS) / (bottleneck + HeaderRate);
65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data->send_time += current_framesamples;
66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (BN_data->arrival_time < BN_data->sample_count)
68a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    BN_data->arrival_time = BN_data->sample_count;
69a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
70a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data->rtp_number++;
71a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}
72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
73a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinvoid get_arrival_time2(int current_framesamples,
74a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                       int current_delay,
75a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                       BottleNeckModel *BN_data)
76a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{
77a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (current_delay == -1)
78a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    //dropped packet
79a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  {
80a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    BN_data->arrival_time += current_framesamples;
81a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
82a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  else if (current_delay != -2)
83a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  {
84a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    //
85a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    BN_data->arrival_time += (current_framesamples + ((FS/1000) * current_delay));
86a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
87a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  //else
88a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  //current packet has same timestamp as previous packet
89a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
90a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data->rtp_number++;
91a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}
92a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
93a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinint main(int argc, char* argv[])
94a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{
95a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
96a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  char inname[100], outname[100],  outbitsname[100], bottleneck_file[100];
97a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  FILE *inp, *outp, *f_bn, *outbits;
98a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int endfile;
99a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
100a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int i, errtype, h = 0, k, packetLossPercent = 0;
101a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 CodingMode;
102a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 bottleneck;
103a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 framesize = 30;           /* ms */
104a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int cur_framesmpls, err = 0, lostPackets = 0;
105a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
106a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Runtime statistics */
107a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  double starttime, runtime, length_file;
108a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
109a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 stream_len = 0;
110a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 framecnt, declen = 0;
111a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 shortdata[FRAMESAMPLES_10ms];
112a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 decoded[MAX_FRAMESAMPLES];
113a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_UWord16 streamdata[500];
114a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 speechType[1];
115a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 prevFrameSize = 1;
116a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 rateBPS = 0;
117a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 fixedFL = 0;
118a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 payloadSize = 0;
119a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word32 payloadRate = 0;
120a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int setControlBWE = 0;
121a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int readLoss;
122a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  FILE  *plFile = NULL;
123a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
124a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  char version_number[20];
125a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  char tmpBit[5] = ".bit";
126a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
127a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  double kbps;
128a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int totalbits =0;
129a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int totalsmpls =0;
130a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _DEBUG
131a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  FILE *fy;
132a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
133a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 testNum, testCE;
134a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
135a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  FILE *fp_gns = NULL;
136a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int gns = 0;
137a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int cur_delay = 0;
138a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  char gns_file[100];
139a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
140a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  int nbTest = 0;
141a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtc_Word16 lostFrame;
142a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  float scale = (float)0.7;
143a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* only one structure used for ISAC encoder */
144a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  ISACFIX_MainStruct *ISAC_main_inst;
145a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
146a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* For fault test 10, garbage data */
147a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  FILE *seedfile;
148a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  unsigned int random_seed = (unsigned int) time(NULL);//1196764538
149a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
150a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BottleNeckModel       BN_data;
151a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  f_bn  = NULL;
152a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
153a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _DEBUG
154a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fy = fopen("bit_rate.dat", "w");
155a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fclose(fy);
156a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fy = fopen("bytes_frames.dat", "w");
157a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fclose(fy);
158a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
159a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
160a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  readLoss = 0;
161a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  packetLossPercent = 0;
162a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
163a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Handling wrong input arguments in the command line */
164a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if ((argc<3) || (argc>21))  {
165a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("\n\nWrong number of arguments or flag values.\n\n");
166a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
167a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("\n");
168a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    WebRtcIsacfix_version(version_number);
169a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("iSAC version %s \n\n", version_number);
170a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
171a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("Usage:\n\n");
172a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("./kenny.exe [-F num][-I] bottleneck_value infile outfile \n\n");
173a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("with:\n");
174a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-I]             :if -I option is specified, the coder will use\n");
175a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  an instantaneous Bottleneck value. If not, it\n");
176a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  will be an adaptive Bottleneck value.\n\n");
177a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("bottleneck_value :the value of the bottleneck provided either\n");
178a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  as a fixed value (e.g. 25000) or\n");
179a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  read from a file (e.g. bottleneck.txt)\n\n");
180a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-INITRATE num]  :Set a new value for initial rate. Note! Only used"
181a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " in adaptive mode.\n\n");
182a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-FL num]        :Set (initial) frame length in msec. Valid length"
183a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " are 30 and 60 msec.\n\n");
184a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-FIXED_FL]      :Frame length will be fixed to initial value.\n\n");
185a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-MAX num]       :Set the limit for the payload size of iSAC"
186a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " in bytes. \n");
187a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  Minimum 100, maximum 400.\n\n");
188a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-MAXRATE num]   :Set the maxrate for iSAC in bits per second. \n");
189a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  Minimum 32000, maximum 53400.\n\n");
190a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-F num]         :if -F option is specified, the test function\n");
191a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  will run the iSAC API fault scenario specified"
192a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " by the\n");
193a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  supplied number.\n");
194a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 1 - Call encoder prior to init encoder call\n");
195a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 2 - Call decoder prior to init decoder call\n");
196a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 3 - Call decoder prior to encoder call\n");
197a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 4 - Call decoder with a too short coded"
198a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " sequence\n");
199a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 5 - Call decoder with a too long coded"
200a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " sequence\n");
201a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 6 - Call decoder with random bit stream\n");
202a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 7 - Call init encoder/decoder at random"
203a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " during a call\n");
204a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 8 - Call encoder/decoder without having"
205a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " allocated memory for \n");
206a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                        encoder/decoder instance\n");
207a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 9 - Call decodeB without calling decodeA\n");
208a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  F 10 - Call decodeB with garbage data\n");
209a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-PL num]       : if -PL option is specified 0<num<100 will "
210a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           "specify the\n");
211a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  percentage of packet loss\n\n");
212a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-G file]       : if -G option is specified the file given is"
213a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " a .gns file\n");
214a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  that represents a network profile\n\n");
215a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-NB num]       : if -NB option, use the narrowband interfaces\n");
216a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  num=1 => encode with narrowband encoder"
217a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " (infile is narrowband)\n");
218a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  num=2 => decode with narrowband decoder"
219a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " (outfile is narrowband)\n\n");
220a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-CE num]       : Test of APIs used by Conference Engine.\n");
221a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  CE 1 - createInternal, freeInternal,"
222a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " getNewBitstream \n");
223a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  CE 2 - transcode, getBWE \n");
224a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  CE 3 - getSendBWE, setSendBWE.  \n\n");
225a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("[-RTP_INIT num] : if -RTP_INIT option is specified num will be"
226a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin           " the initial\n");
227a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("                  value of the rtp sequence number.\n\n");
228a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("infile          : Normal speech input file\n\n");
229a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("outfile         : Speech output file\n\n");
230a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("Example usage   : \n\n");
231a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("./kenny.exe -I bottleneck.txt speechIn.pcm speechOut.pcm\n\n");
232a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    exit(0);
233a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
234a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
235a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
236a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Print version number */
237a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtcIsacfix_version(version_number);
238a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("iSAC version %s \n\n", version_number);
239a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
240a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Loop over all command line arguments */
241a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  CodingMode = 0;
242a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  testNum = 0;
243a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  testCE = 0;
244a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  for (i = 1; i < argc-2;i++) {
245a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Instantaneous mode */
246a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-I", argv[i])) {
247a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\nInstantaneous BottleNeck\n");
248a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      CodingMode = 1;
249a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
250a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
251a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
252a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Set (initial) bottleneck value */
253a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-INITRATE", argv[i])) {
254a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      rateBPS = atoi(argv[i + 1]);
255a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      setControlBWE = 1;
256a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if ((rateBPS < 10000) || (rateBPS > 32000)) {
257a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n%d is not a initial rate. "
258a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin               "Valid values are in the range 10000 to 32000.\n", rateBPS);
259a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        exit(0);
260a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
261a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\nNew initial rate: %d\n", rateBPS);
262a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
263a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
264a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
265a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Set (initial) framelength */
266a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-FL", argv[i])) {
267a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      framesize = atoi(argv[i + 1]);
268a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if ((framesize != 30) && (framesize != 60)) {
269a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n%d is not a valid frame length. "
270a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin               "Valid length are 30 and 60 msec.\n", framesize);
271a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        exit(0);
272a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
273a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\nFrame Length: %d\n", framesize);
274a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
275a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
276a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
277a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Fixed frame length */
278a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-FIXED_FL", argv[i])) {
279a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      fixedFL = 1;
280a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      setControlBWE = 1;
281a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
282a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
283a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Set maximum allowed payload size in bytes */
284a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-MAX", argv[i])) {
285a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      payloadSize = atoi(argv[i + 1]);
286a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("Maximum Payload Size: %d\n", payloadSize);
287a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
288a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
289a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
290a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Set maximum rate in bytes */
291a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-MAXRATE", argv[i])) {
292a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      payloadRate = atoi(argv[i + 1]);
293a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("Maximum Rate in kbps: %d\n", payloadRate);
294a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
295a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
296a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
297a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Test of fault scenarious */
298a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-F", argv[i])) {
299a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      testNum = atoi(argv[i + 1]);
300a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\nFault test: %d\n", testNum);
301a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (testNum < 1 || testNum > 10) {
302a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n%d is not a valid Fault Scenario number."
303a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin               " Valid Fault Scenarios are numbered 1-10.\n", testNum);
304a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        exit(0);
305a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
306a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
307a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
308a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
309a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Packet loss test */
310a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-PL", argv[i])) {
311a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if( isdigit( *argv[i+1] ) ) {
312a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        packetLossPercent = atoi( argv[i+1] );
313a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if( (packetLossPercent < 0) | (packetLossPercent > 100) ) {
314a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          printf( "\nInvalid packet loss perentage \n" );
315a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          exit( 0 );
316a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
317a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if( packetLossPercent > 0 ) {
318a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          printf( "\nSimulating %d %% of independent packet loss\n",
319a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                  packetLossPercent );
320a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        } else {
321a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          printf( "\nNo Packet Loss Is Simulated \n" );
322a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
323a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        readLoss = 0;
324a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
325a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        readLoss = 1;
326a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        plFile = fopen( argv[i+1], "rb" );
327a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if( plFile == NULL ) {
328a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          printf( "\n couldn't open the frameloss file: %s\n", argv[i+1] );
329a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          exit( 0 );
330a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
331a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf( "\nSimulating packet loss through the given "
332a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                "channel file: %s\n", argv[i+1] );
333a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
334a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
335a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
336a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
337a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Random packetlosses */
338a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-rnd", argv[i])) {
339a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      srand(time(NULL) );
340a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf( "\n Random pattern in lossed packets \n" );
341a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
342a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
343a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Use gns file */
344a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-G", argv[i])) {
345a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      sscanf(argv[i + 1], "%s", gns_file);
346a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      fp_gns = fopen(gns_file, "rb");
347a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (fp_gns  == NULL) {
348a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("Cannot read file %s.\n", gns_file);
349a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        exit(0);
350a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
351a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      gns = 1;
352a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
353a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
354a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
355a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Run Narrowband interfaces (either encoder or decoder) */
356a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-NB", argv[i])) {
357a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      nbTest = atoi(argv[i + 1]);
358a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
359a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
360a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
361a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Run Conference Engine APIs */
362a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-CE", argv[i])) {
363a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      testCE = atoi(argv[i + 1]);
364a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (testCE==1 || testCE==2) {
365a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        i++;
366dc5deb4b48d76c5abc8dcd6014dd5fa7c1e042f2Elliott Hughes        scale = (float)strtod( argv[i+1], NULL );
367a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else if (testCE < 1 || testCE > 3) {
368a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n%d is not a valid CE-test number, valid Fault "
369a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin               "Scenarios are numbered 1-3\n", testCE);
370a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        exit(0);
371a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
372a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
373a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
374a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
375a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Set initial RTP number */
376a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!strcmp ("-RTP_INIT", argv[i])) {
377a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      i++;
378a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
379a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
380a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
381a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Get Bottleneck value                                                   */
382a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Gns files and bottleneck should not and can not be used simultaneously */
383a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  bottleneck = atoi(argv[CodingMode+1]);
384a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (bottleneck == 0 && gns == 0) {
385a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    sscanf(argv[CodingMode+1], "%s", bottleneck_file);
386a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    f_bn = fopen(bottleneck_file, "rb");
387a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (f_bn  == NULL) {
388a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("No value provided for BottleNeck and cannot read file %s\n", bottleneck_file);
389a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      exit(0);
390a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    } else {
391a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      int aux_var;
392a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("reading bottleneck rates from file %s\n\n",bottleneck_file);
393a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (fscanf(f_bn, "%d", &aux_var) == EOF) {
394a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        /* Set pointer to beginning of file */
395a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        fseek(f_bn, 0L, SEEK_SET);
396a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (fscanf(f_bn, "%d", &aux_var) == EOF) {
397a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          exit(0);
398a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
399a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
400a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      bottleneck = (WebRtc_Word16)aux_var;
401a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Bottleneck is a cosine function
402a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin       * Matlab code for writing the bottleneck file:
403a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin       * BottleNeck_10ms = 20e3 + 10e3 * cos((0:5999)/5999*2*pi);
404a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin       * fid = fopen('bottleneck.txt', 'wb');
405a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin       * fprintf(fid, '%d\n', BottleNeck_10ms); fclose(fid);
406a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin       */
407a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
408a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  } else {
409a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    f_bn = NULL;
410a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("\nfixed bottleneck rate of %d bits/s\n\n", bottleneck);
411a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
412a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
413a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (CodingMode == 0) {
414a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("\nAdaptive BottleNeck\n");
415a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
416a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
417a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Get Input and Output files */
418a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  sscanf(argv[argc-2], "%s", inname);
419a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  sscanf(argv[argc-1], "%s", outname);
420a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
421a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Add '.bit' to output bitstream file */
422a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  while ((int)outname[h] != 0) {
423a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    outbitsname[h] = outname[h];
424a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    h++;
425a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
426a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  for (k=0; k<5; k++) {
427a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    outbitsname[h] = tmpBit[k];
428a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    h++;
429a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
430a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if ((inp = fopen(inname,"rb")) == NULL) {
431a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("  iSAC: Cannot read file %s\n", inname);
432a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    exit(1);
433a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
434a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if ((outp = fopen(outname,"wb")) == NULL) {
435a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("  iSAC: Cannot write file %s\n", outname);
436a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    exit(1);
437a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
438a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
439a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if ((outbits = fopen(outbitsname,"wb")) == NULL) {
440a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    printf("  iSAC: Cannot write file %s\n", outbitsname);
441a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    exit(1);
442a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
443a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\nInput:%s\nOutput:%s\n\n", inname, outname);
444a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
445a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Error test number 10, garbage data */
446a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (testNum == 10) {
447a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Test to run decoder with garbage data */
448a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    srand(random_seed);
449a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
450a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
451a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("Error: Could not open file %s\n", SEED_FILE);
452a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
453a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    else {
454a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      fprintf(seedfile, "%u\n", random_seed);
455a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      fclose(seedfile);
456a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
457a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
458a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
459a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Runtime statistics */
460a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  starttime = clock()/(double)CLOCKS_PER_SEC;
461a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
462a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Initialize the ISAC and BN structs */
463a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (testNum != 8)
464a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  {
465a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if(1){
466a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err =WebRtcIsacfix_Create(&ISAC_main_inst);
467a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }else{
468a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Test the Assign functions */
469a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      int sss;
470a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      void *ppp;
471a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err =WebRtcIsacfix_AssignSize(&sss);
472a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      ppp=malloc(sss);
473a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err =WebRtcIsacfix_Assign(&ISAC_main_inst,ppp);
474a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
475a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Error check */
476a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (err < 0) {
477a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\n\n Error in create.\n\n");
478a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
479a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (testCE == 1) {
480a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err = WebRtcIsacfix_CreateInternal(ISAC_main_inst);
481a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Error check */
482a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (err < 0) {
483a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n\n Error in createInternal.\n\n");
484a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
485a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
486a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
487a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
488a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Init of bandwidth data */
489a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data.send_time     = 0;
490a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data.arrival_time  = 0;
491a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data.sample_count  = 0;
492a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  BN_data.rtp_number    = 0;
493a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
494a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Initialize encoder and decoder */
495a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  framecnt= 0;
496a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  endfile = 0;
497a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (testNum != 1) {
498a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    WebRtcIsacfix_EncoderInit(ISAC_main_inst, CodingMode);
499a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
500a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (testNum != 2) {
501a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    WebRtcIsacfix_DecoderInit(ISAC_main_inst);
502a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
503a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
504a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (CodingMode == 1) {
505a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    err = WebRtcIsacfix_Control(ISAC_main_inst, bottleneck, framesize);
506a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (err < 0) {
507a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* exit if returned with error */
508a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
509a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\n\n Error in control: %d.\n\n", errtype);
510a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
511a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  } else if(setControlBWE == 1) {
512a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    err = WebRtcIsacfix_ControlBwe(ISAC_main_inst, rateBPS, framesize, fixedFL);
513a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
514a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
515a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (payloadSize != 0) {
516a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    err = WebRtcIsacfix_SetMaxPayloadSize(ISAC_main_inst, payloadSize);
517a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (err < 0) {
518a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* exit if returned with error */
519a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
520a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\n\n Error in SetMaxPayloadSize: %d.\n\n", errtype);
521a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      exit(EXIT_FAILURE);
522a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
523a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
524a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if (payloadRate != 0) {
525a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    err = WebRtcIsacfix_SetMaxRate(ISAC_main_inst, payloadRate);
526a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (err < 0) {
527a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* exit if returned with error */
528a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
529a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      printf("\n\n Error in SetMaxRateInBytes: %d.\n\n", errtype);
530a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      exit(EXIT_FAILURE);
531a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
532a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
533a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
534a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  *speechType = 1;
535a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
536a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
537a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  while (endfile == 0) {
538a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
539a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if(testNum == 7 && (rand()%2 == 0)) {
540a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err = WebRtcIsacfix_EncoderInit(ISAC_main_inst, CodingMode);
541a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Error check */
542a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (err < 0) {
543a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
544a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n\n Error in encoderinit: %d.\n\n", errtype);
545a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
546a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
547a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      err = WebRtcIsacfix_DecoderInit(ISAC_main_inst);
548a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Error check */
549a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (err < 0) {
550a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
551a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\n\n Error in decoderinit: %d.\n\n", errtype);
552a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
553a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
554a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
555a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
556a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    cur_framesmpls = 0;
557a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    while (1) {
558a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Read 10 ms speech block */
559a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (nbTest != 1) {
560a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        endfile = readframe(shortdata, inp, FRAMESAMPLES_10ms);
561a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
562a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        endfile = readframe(shortdata, inp, (FRAMESAMPLES_10ms/2));
563a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
564a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
565a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (testNum == 7) {
566a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        srand(time(NULL));
567a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
568a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
569a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* iSAC encoding */
570a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (!(testNum == 3 && framecnt == 0)) {
571a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (nbTest != 1) {
572a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          short bwe;
573a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
574a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* Encode */
575a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          stream_len = WebRtcIsacfix_Encode(ISAC_main_inst,
576a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                            shortdata,
577a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                            (WebRtc_Word16*)streamdata);
578a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
579a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* If packet is ready, and CE testing, call the different API functions
580a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin             from the internal API.                       */
581a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          if (stream_len>0) {
582a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            if (testCE == 1) {
583a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              err = WebRtcIsacfix_ReadBwIndex((WebRtc_Word16*)streamdata, &bwe);
584a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              stream_len = WebRtcIsacfix_GetNewBitStream(
585a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                  ISAC_main_inst,
586a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                  bwe,
587a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                  scale,
588a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                  (WebRtc_Word16*)streamdata);
589a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            } else if (testCE == 2) {
590a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              /* transcode function not supported */
591a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            } else if (testCE == 3) {
592a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              /* Only for Function testing. The functions should normally
593a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                 not be used in this way                                      */
594a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
595a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              err = WebRtcIsacfix_GetDownLinkBwIndex(ISAC_main_inst, &bwe);
596a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              /* Error Check */
597a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              if (err < 0) {
598a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
599a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                printf("\nError in getSendBWE: %d.\n", errtype);
600a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              }
601a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
602a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              err = WebRtcIsacfix_UpdateUplinkBw(ISAC_main_inst, bwe);
603a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              /* Error Check */
604a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              if (err < 0) {
605a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
606a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                printf("\nError in setBWE: %d.\n", errtype);
607a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin              }
608a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
609a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            }
610a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          }
611a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        } else {
612a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
613a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          stream_len = WebRtcIsacfix_EncodeNb(ISAC_main_inst,
614a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                              shortdata,
615a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                              streamdata);
616a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#else
617a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          stream_len = -1;
618a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
619a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
620a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
621a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      else
622a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      {
623a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        break;
624a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
625a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
626a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (stream_len < 0 || err < 0) {
627a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        /* exit if returned with error */
628a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
629a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\nError in encoder: %d.\n", errtype);
630a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
631a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (fwrite(streamdata, sizeof(char),
632a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                   stream_len, outbits) != (size_t)stream_len) {
633a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          return -1;
634a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
635a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
636a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
637a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      cur_framesmpls += FRAMESAMPLES_10ms;
638a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
639a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* read next bottleneck rate */
640a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (f_bn != NULL) {
641a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        int aux_var;
642a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (fscanf(f_bn, "%d", &aux_var) == EOF) {
643a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* Set pointer to beginning of file */
644a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          fseek(f_bn, 0L, SEEK_SET);
645a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          if (fscanf(f_bn, "%d", &aux_var) == EOF) {
646a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            exit(0);
647a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          }
648a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
649a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        bottleneck = (WebRtc_Word16)aux_var;
650a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (CodingMode == 1) {
651a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          WebRtcIsacfix_Control(ISAC_main_inst, bottleneck, framesize);
652a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
653a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
654a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
655a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* exit encoder loop if the encoder returned a bitstream */
656a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (stream_len != 0) break;
657a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
658a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
659a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* make coded sequence to short be inreasing */
660a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* the length the decoder expects */
661a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (testNum == 4) {
662a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      stream_len += 10;
663a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
664a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
665a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* make coded sequence to long be decreasing */
666a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* the length the decoder expects */
667a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (testNum == 5) {
668a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      stream_len -= 10;
669a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
670a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
671a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (testNum == 6) {
672a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      srand(time(NULL));
673a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      for (i = 0; i < stream_len; i++ ) {
674a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        streamdata[i] = rand();
675a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
676a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
677a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
678a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* set pointer to beginning of file */
679a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (fp_gns != NULL) {
680a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (fscanf(fp_gns, "%d", &cur_delay) == EOF) {
681a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        fseek(fp_gns, 0L, SEEK_SET);
682a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (fscanf(fp_gns, "%d", &cur_delay) == EOF) {
683a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          exit(0);
684a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
685a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
686a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
687a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
688a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* simulate packet handling through NetEq and the modem */
689a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (!(testNum == 3 && framecnt == 0)) {
690a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (gns == 0) {
691a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        get_arrival_time(cur_framesmpls, stream_len, bottleneck,
692a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                         &BN_data);
693a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
694a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        get_arrival_time2(cur_framesmpls, cur_delay, &BN_data);
695a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
696a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
697a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
698a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* packet not dropped */
699a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (cur_delay != -1) {
700a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
701a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Error test number 10, garbage data */
702a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (testNum == 10) {
703a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        for ( i = 0; i < stream_len; i++) {
704a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          streamdata[i] = (short) (streamdata[i] + (short) rand());
705a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
706a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
707a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
708a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (testNum != 9) {
709a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        err = WebRtcIsacfix_UpdateBwEstimate(ISAC_main_inst,
710a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             streamdata,
711a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             stream_len,
712a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             BN_data.rtp_number,
713a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             BN_data.send_time,
714a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             BN_data.arrival_time);
715a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
716a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (err < 0) {
717a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* exit if returned with error */
718a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
719a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          printf("\nError in decoder: %d.\n", errtype);
720a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
721a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
722a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _DEBUG
723a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      fprintf(stderr,"  \rframe = %7d", framecnt);
724a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
725a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
726a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if( readLoss == 1 ) {
727a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if( fread( &lostFrame, sizeof(WebRtc_Word16), 1, plFile ) != 1 ) {
728a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          rewind( plFile );
729a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
730a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        lostFrame = !lostFrame;
731a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
732a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        lostFrame = (rand()%100 < packetLossPercent);
733a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
734a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
735a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
736a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
737a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* iSAC decoding */
738a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if( lostFrame && framecnt >  0) {
739a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (nbTest !=2) {
740a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = WebRtcIsacfix_DecodePlc(ISAC_main_inst,
741a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                           decoded, prevFrameSize );
742a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        } else {
743a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
744a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = WebRtcIsacfix_DecodePlcNb(ISAC_main_inst, decoded,
745a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                             prevFrameSize );
746a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#else
747a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = -1;
748a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
749a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
750a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        lostPackets++;
751a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      } else {
752a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        if (nbTest !=2 ) {
753a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          short FL;
754a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* Call getFramelen, only used here for function test */
755a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          err = WebRtcIsacfix_ReadFrameLen((WebRtc_Word16*)streamdata, &FL);
756a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = WebRtcIsacfix_Decode( ISAC_main_inst, streamdata, stream_len,
757a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                         decoded, speechType );
758a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          /* Error check */
759a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          if (err<0 || declen<0 || FL!=declen) {
760a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
761a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin            printf("\nError in decode_B/or getFrameLen: %d.\n", errtype);
762a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          }
763a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          prevFrameSize = declen/480;
764a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
765a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        } else {
766a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
767a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = WebRtcIsacfix_DecodeNb( ISAC_main_inst, streamdata,
768a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                                           stream_len, decoded, speechType );
769a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#else
770a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          declen = -1;
771a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif
772a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin          prevFrameSize = declen/240;
773a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        }
774a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
775a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
776a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (declen <= 0) {
777a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        /* exit if returned with error */
778a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
779a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf("\nError in decoder: %d.\n", errtype);
780a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
781a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
782a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      /* Write decoded speech frame to file */
783a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if (fwrite(decoded, sizeof(WebRtc_Word16),
784a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin                 declen, outp) != (size_t)declen) {
785a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        return -1;
786a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
787a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      //   fprintf( ratefile, "%f \n", stream_len / ( ((double)declen)/
788a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      // ((double)FS) ) * 8 );
789a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    } else {
790a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      lostPackets++;
791a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
792a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    framecnt++;
793a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
794a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    totalsmpls += declen;
795a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    totalbits += 8 * stream_len;
796a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    kbps = ((double) FS) / ((double) cur_framesmpls) * 8.0 *
797a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        stream_len / 1000.0;// kbits/s
798a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
799a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    /* Error test number 10, garbage data */
800a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    if (testNum == 10) {
801a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
802a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        printf( "Error: Could not open file %s\n", SEED_FILE);
803a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
804a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      else {
805a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        fprintf(seedfile, "ok\n\n");
806a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin        fclose(seedfile);
807a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin      }
808a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    }
809a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
810a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _DEBUG
811a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
812a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    fy = fopen("bit_rate.dat", "a");
813a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    fprintf(fy, "Frame %i = %0.14f\n", framecnt, kbps);
814a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    fclose(fy);
815a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
816a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif /* _DEBUG */
817a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
818a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
819a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\nLost Frames %d ~ %4.1f%%\n", lostPackets,
820a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin         (double)lostPackets/(double)framecnt*100.0 );
821a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\n\ntotal bits                          = %d bits", totalbits);
822a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\nmeasured average bitrate              = %0.3f kbits/s",
823a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin         (double)totalbits *(FS/1000) / totalsmpls);
824a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\n");
825a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
826a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifdef _DEBUG
827a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* fprintf(stderr,"\n\ntotal bits    = %d bits", totalbits);
828a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin     fprintf(stderr,"\nmeasured average bitrate  = %0.3f kbits/s",
829a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin     (double)totalbits *(FS/1000) / totalsmpls);
830a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin     fprintf(stderr,"\n");
831a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  */
832a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif /* _DEBUG */
833a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
834a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  /* Runtime statistics */
835a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
836a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
837a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  runtime = (double)(((double)clock()/(double)CLOCKS_PER_SEC)-starttime);
838a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  length_file = ((double)framecnt*(double)declen/FS);
839a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\n\nLength of speech file: %.1f s\n", length_file);
840a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("Time to run iSAC:      %.2f s (%.2f %% of realtime)\n\n",
841a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin         runtime, (100*runtime/length_file));
842a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  printf("\n\n_______________________________________________\n");
843a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
844a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fclose(inp);
845a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fclose(outp);
846a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  fclose(outbits);
847a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin
848a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  if ( testCE == 1) {
849a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin    WebRtcIsacfix_FreeInternal(ISAC_main_inst);
850a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  }
851a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  WebRtcIsacfix_Free(ISAC_main_inst);
852a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin  return 0;
853a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}
854