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