1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 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/*
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * test_iSACfixfloat.c
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Test compatibility and quality between floating- and fixed-point code
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * */
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdlib.h>
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* include API */
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "isac.h"
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "isacfix.h"
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* max number of samples per frame (= 60 ms frame) */
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MAX_FRAMESAMPLES				960
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* number of samples per 10ms frame */
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define FRAMESAMPLES_10ms				160
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* sampling frequency (Hz) */
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define FS								16000
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* Runtime statistics */
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <time.h>
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define CLOCKS_PER_SEC  1000
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//	FILE *histfile, *ratefile;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* function for reading audio data from PCM file */
45fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint readframe(int16_t *data, FILE *inp, int length) {
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	short k, rlen, status = 0;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
49fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	rlen = fread(data, sizeof(int16_t), length, inp);
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if (rlen < length) {
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		for (k = rlen; k < length; k++)
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			data[k] = 0;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		status = 1;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	return status;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef struct {
60fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	uint32_t send_time;            /* samples */
61fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	uint32_t arrival_time;            /* samples */
62fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	uint32_t sample_count;            /* samples */
63fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	uint16_t rtp_number;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} BottleNeckModel;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid get_arrival_time(int current_framesamples,   /* samples */
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					  int packet_size,            /* bytes */
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					  int bottleneck,             /* excluding headers; bits/s */
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					  BottleNeckModel *BN_data)
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	const int HeaderSize = 35;
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int HeaderRate;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	HeaderRate = HeaderSize * 8 * FS / current_framesamples;     /* bits/s */
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* everything in samples */
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->sample_count = BN_data->sample_count + current_framesamples;
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->arrival_time += ((packet_size + HeaderSize) * 8 * FS) / (bottleneck + HeaderRate);
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->send_time += current_framesamples;
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if (BN_data->arrival_time < BN_data->sample_count)
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		BN_data->arrival_time = BN_data->sample_count;
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data->rtp_number++;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint main(int argc, char* argv[])
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	char inname[50], outname[50], bottleneck_file[50], bitfilename[60], bitending[10]="_bits.pcm";
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	FILE *inp, *outp, *f_bn, *bitsp;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int framecnt, endfile;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int i,j,errtype, plc=0;
99fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t CodingMode;
100fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t bottleneck;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t framesize = 30;           /* ms */
103fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    //int16_t framesize = 60; /* To invoke cisco complexity case at frame 2252 */
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int cur_framesmpls, err;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Runtime statistics */
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	double starttime;
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	double runtime;
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	double length_file;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t stream_len = 0;
113fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t declen;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t shortdata[FRAMESAMPLES_10ms];
116fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t decoded[MAX_FRAMESAMPLES];
117fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	uint16_t streamdata[600];
118fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org	int16_t	speechType[1];
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
120fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org//	int16_t	*iSACstruct;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	char version_number[20];
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int mode=-1, tmp, nbTest=0; /*,sss;*/
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _DEBUG
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	FILE *fy;
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	double kbps;
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int totalbits =0;
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	int totalsmpls =0;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif /* _DEBUG */
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* only one structure used for ISAC encoder */
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	ISAC_MainStruct *ISAC_main_inst;
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	ISACFIX_MainStruct *ISACFIX_main_inst;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BottleNeckModel       BN_data;
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	f_bn  = NULL;
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _DEBUG
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fy = fopen("bit_rate.dat", "w");
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fclose(fy);
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fy = fopen("bytes_frames.dat", "w");
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fclose(fy);
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif /* _DEBUG */
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//histfile = fopen("histo.dat", "ab");
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//ratefile = fopen("rates.dat", "ab");
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* handling wrong input arguments in the command line */
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if ((argc<6) || (argc>10))  {
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 [-I] bottleneck_value infile outfile \n\n");
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("with:\n");
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("[-I]			:	if -I option is specified, the coder will use\n");
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				an instantaneous Bottleneck value. If not, it\n");
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				will be an adaptive Bottleneck value.\n\n");
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("bottleneck_value	:	the value of the bottleneck provided either\n");
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				as a fixed value (e.g. 25000) or\n");
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				read from a file (e.g. bottleneck.txt)\n\n");
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("[-m] mode		: Mode (encoder - decoder):\n");
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				:		0 - float - float \n");
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				:		1 - float - fix \n");
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				:		2 - fix - float \n");
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("				:		3 - fix - fix \n");
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("[-PLC]	 		:	Test PLC packetlosses\n");
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("[-NB] num		:	Test NB interfaces, num=1 encNB, num=2 decNB\n");
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("infile			:	Normal speech input file\n\n");
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("outfile			:	Speech output file\n\n");
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Example usage:\n\n");
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("./kenny.exe -I bottleneck.txt -m 1 speechIn.pcm speechOut.pcm\n\n");
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		exit(0);
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("--------------------START---------------------\n\n");
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsac_version(version_number);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("iSAC FLOAT version %s \n", version_number);
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsacfix_version(version_number);
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("iSAC FIX version   %s \n\n", version_number);
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	CodingMode = 0;
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	tmp=1;
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	for (i = 1; i < argc;i++)
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (!strcmp ("-I", argv[i]))
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		{
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			printf("\nInstantaneous BottleNeck\n");
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			CodingMode = 1;
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			i++;
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			tmp=0;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (!strcmp ("-m", argv[i])) {
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			mode=atoi(argv[i+1]);
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			i++;
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (!strcmp ("-PLC", argv[i]))
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		{
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			plc=1;
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (!strcmp ("-NB", argv[i]))
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		{
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			nbTest = atoi(argv[i + 1]);
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			i++;
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if(mode<0) {
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("\nError! Mode must be set: -m 0 \n");
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		exit(0);
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if (CodingMode == 0)
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("\nAdaptive BottleNeck\n");
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Get Bottleneck value */
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	bottleneck = atoi(argv[2-tmp]);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if (bottleneck == 0)
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		sscanf(argv[2-tmp], "%s", bottleneck_file);
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		f_bn = fopen(bottleneck_file, "rb");
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (f_bn  == NULL)
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		{
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			printf("No value provided for BottleNeck and cannot read file %s.\n", bottleneck_file);
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			exit(0);
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		else {
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			printf("reading bottleneck rates from file %s\n\n",bottleneck_file);
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					/* Set pointer to beginning of file */
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					fseek(f_bn, 0L, SEEK_SET);
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					fscanf(f_bn, "%d", &bottleneck);
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/*	Bottleneck is a cosine function
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			*	Matlab code for writing the bottleneck file:
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			*	BottleNeck_10ms = 20e3 + 10e3 * cos((0:5999)/5999*2*pi);
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			*	fid = fopen('bottleneck.txt', 'wb');
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			*	fprintf(fid, '%d\n', BottleNeck_10ms); fclose(fid);
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			*/
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	else
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	{
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("\nfixed bottleneck rate of %d bits/s\n\n", bottleneck);
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Get Input and Output files */
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	sscanf(argv[argc-2], "%s", inname);
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	sscanf(argv[argc-1], "%s", outname);
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if ((inp = fopen(inname,"rb")) == NULL) {
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("  iSAC: Cannot read file %s.\n", inname);
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		exit(1);
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if ((outp = fopen(outname,"wb")) == NULL) {
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("  iSAC: Cannot write file %s.\n", outname);
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		exit(1);
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("\nInput:%s\nOutput:%s\n", inname, outname);
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	i=0;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	while (outname[i]!='\0') {
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		bitfilename[i]=outname[i];
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		i++;
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	i-=4;
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	for (j=0;j<9;j++, i++)
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		bitfilename[i]=bitending[j];
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	bitfilename[i]='\0';
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if ((bitsp = fopen(bitfilename,"wb")) == NULL) {
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("  iSAC: Cannot read file %s.\n", bitfilename);
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		exit(1);
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("Bitstream:%s\n\n", bitfilename);
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	starttime = clock()/(double)CLOCKS_PER_SEC; /* Runtime statistics */
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Initialize the ISAC and BN structs */
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsac_create(&ISAC_main_inst);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*	WebRtcIsacfix_AssignSize(&sss);
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	iSACstruct=malloc(sss);
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsacfix_Assign(&ISACFIX_main_inst,iSACstruct);*/
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsacfix_Create(&ISACFIX_main_inst);
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data.send_time	  = 0;
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data.arrival_time  = 0;
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data.sample_count  = 0;
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	BN_data.rtp_number    = 0;
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Initialize encoder and decoder */
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    framecnt= 0;
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    endfile	= 0;
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	if (mode==0) { /* Encode using FLOAT, decode using FLOAT */
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Coding mode: Encode using FLOAT, decode using FLOAT \n\n");
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Init iSAC FLOAT */
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_EncoderInit(ISAC_main_inst, CodingMode);
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_DecoderInit(ISAC_main_inst);
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			//	exit(EXIT_FAILURE);
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} else if (mode==1) { /* Encode using FLOAT, decode using FIX */
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Coding mode: Encode using FLOAT, decode using FIX \n\n");
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Init iSAC FLOAT */
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_EncoderInit(ISAC_main_inst, CodingMode);
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_DecoderInit(ISAC_main_inst);
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			//	exit(EXIT_FAILURE);
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Init iSAC FIX */
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_EncoderInit(ISACFIX_main_inst, CodingMode);
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_DecoderInit(ISACFIX_main_inst);
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_Control(ISACFIX_main_inst, bottleneck, framesize);
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} else if (mode==2) { /* Encode using FIX, decode using FLOAT */
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Coding mode: Encode using FIX, decode using FLOAT \n\n");
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Init iSAC FLOAT */
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_EncoderInit(ISAC_main_inst, CodingMode);
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsac_DecoderInit(ISAC_main_inst);
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Init iSAC FIX */
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_EncoderInit(ISACFIX_main_inst, CodingMode);
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_DecoderInit(ISACFIX_main_inst);
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_Control(ISACFIX_main_inst, bottleneck, framesize);
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} else if (mode==3) {
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Coding mode: Encode using FIX, decode using FIX \n\n");
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_EncoderInit(ISACFIX_main_inst, CodingMode);
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		WebRtcIsacfix_DecoderInit(ISACFIX_main_inst);
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (CodingMode == 1) {
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_Control(ISACFIX_main_inst, bottleneck, framesize);
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\n Error in initialization: %d.\n\n", errtype);
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	} else
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		printf("Mode must be value between 0 and 3\n");
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	*speechType = 1;
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//#define BI_TEST 1
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef BI_TEST
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    err = WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_main_inst, 300);
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (err < 0) {
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            /* exit if returned with error */
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            printf("\n\n Error in setMaxPayloadSize: %d.\n\n", errtype);
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fclose(inp);
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fclose(outp);
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            fclose(bitsp);
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return(EXIT_FAILURE);
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (endfile == 0) {
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		cur_framesmpls = 0;
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		while (1) {
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* Read 10 ms speech block */
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (nbTest != 1)
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				endfile = readframe(shortdata, inp, FRAMESAMPLES_10ms);
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			else
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				endfile = readframe(shortdata, inp, (FRAMESAMPLES_10ms/2));
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* iSAC encoding */
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (mode==0 || mode ==1) {
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				stream_len = WebRtcIsac_Encode(ISAC_main_inst, shortdata,	streamdata);
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (stream_len < 0) {
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					/* exit if returned with error */
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					printf("\n\nError in encoder: %d.\n\n", errtype);
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//	exit(EXIT_FAILURE);
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				}
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			} else if (mode==2 || mode==3) {
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* iSAC encoding */
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (nbTest != 1)
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					stream_len = WebRtcIsacfix_Encode(ISACFIX_main_inst, shortdata,	streamdata);
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				else
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					stream_len = WebRtcIsacfix_EncodeNb(ISACFIX_main_inst, shortdata, streamdata);
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (stream_len < 0) {
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					/* exit if returned with error */
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					printf("\n\nError in encoder: %d.\n\n", errtype);
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//	exit(EXIT_FAILURE);
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				}
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			cur_framesmpls += FRAMESAMPLES_10ms;
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* read next bottleneck rate */
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (f_bn != NULL) {
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					/* Set pointer to beginning of file */
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					fseek(f_bn, 0L, SEEK_SET);
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					fscanf(f_bn, "%d", &bottleneck);
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				}
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (CodingMode == 1) {
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					if (mode==0 || mode==1)
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					  WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					else if	(mode==2 || mode==3)
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org						WebRtcIsacfix_Control(ISACFIX_main_inst, bottleneck, framesize);
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				}
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* exit encoder loop if the encoder returned a bitstream */
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (stream_len != 0) break;
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		fwrite(streamdata, 1, stream_len, bitsp); /* NOTE! Writes bytes to file */
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* simulate packet handling through NetEq and the modem */
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		get_arrival_time(cur_framesmpls, stream_len, bottleneck,
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org						 &BN_data);
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//*****************************
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (1){
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		if (mode==0) {
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_UpdateBwEstimate(ISAC_main_inst,
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* iSAC decoding */
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			declen = WebRtcIsac_Decode(ISAC_main_inst,
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  streamdata,
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  	  stream_len,
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  decoded,
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  speechType);
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (declen <= 0) {
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		} else if (mode==1) {
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_UpdateBwEstimate(ISAC_main_inst,
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_main_inst,
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			declen = WebRtcIsac_Decode(ISAC_main_inst,
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  streamdata,
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  	  stream_len,
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  decoded,
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  speechType);
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* iSAC decoding */
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (plc && (framecnt+1)%10 == 0) {
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (nbTest !=2 )
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodePlc( ISACFIX_main_inst, decoded, 1 );
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				else
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodePlcNb( ISACFIX_main_inst, decoded, 1 );
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			} else {
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (nbTest !=2 )
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_Decode(ISACFIX_main_inst,
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  streamdata,
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org											  	  stream_len,
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  decoded,
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  speechType);
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				else
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodeNb(ISACFIX_main_inst,
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  streamdata,
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org											  	  stream_len,
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  decoded,
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  speechType);
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (declen <= 0) {
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		} else if (mode==2) {
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_main_inst,
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsac_UpdateBwEstimate(ISAC_main_inst,
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* iSAC decoding */
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			declen = WebRtcIsac_Decode(ISAC_main_inst,
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  streamdata,
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  	  stream_len,
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  decoded,
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org										  speechType);
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (declen <= 0) {
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsac_GetErrorCode(ISAC_main_inst);
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}  else if (mode==3) {
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			err = WebRtcIsacfix_UpdateBwEstimate(ISACFIX_main_inst,
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  streamdata,
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  stream_len,
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.rtp_number,
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.send_time,
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org									  BN_data.arrival_time);
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (err < 0) {
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			/* iSAC decoding */
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (plc && (framecnt+1)%10 == 0) {
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (nbTest !=2 )
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodePlc( ISACFIX_main_inst, decoded, 1 );
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				else
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodePlcNb( ISACFIX_main_inst, decoded, 1 );
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			} else {
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				if (nbTest !=2 )
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_Decode(ISACFIX_main_inst,
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  streamdata,
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org											  	  stream_len,
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  decoded,
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  speechType);
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				else
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org					declen = WebRtcIsacfix_DecodeNb(ISACFIX_main_inst,
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  streamdata,
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org											  	  stream_len,
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  decoded,
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org												  speechType);
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			if (declen <= 0) {
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				/* exit if returned with error */
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				errtype=WebRtcIsacfix_GetErrorCode(ISACFIX_main_inst);
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				printf("\n\nError in decoder: %d.\n\n", errtype);
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org				//exit(EXIT_FAILURE);
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org			}
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		/* Write decoded speech frame to file */
644fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org		fwrite(decoded, sizeof(int16_t), declen, outp);
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		}
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		fprintf(stderr,"  \rframe = %d", framecnt);
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		framecnt++;
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _DEBUG
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		totalsmpls += declen;
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		totalbits += 8 * stream_len;
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		kbps = ((double) FS) / ((double) cur_framesmpls) * 8.0 * stream_len / 1000.0;// kbits/s
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		fy = fopen("bit_rate.dat", "a");
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		fprintf(fy, "Frame %i = %0.14f\n", framecnt, kbps);
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		fclose(fy);
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif /* _DEBUG */
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	}
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef _DEBUG
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("\n\ntotal bits				= %d bits", totalbits);
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("\nmeasured average bitrate		= %0.3f kbits/s", (double)totalbits *(FS/1000) / totalsmpls);
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("\n");
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif /* _DEBUG */
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	/* Runtime statistics */
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	runtime = (double)(clock()/(double)CLOCKS_PER_SEC-starttime);
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	length_file = ((double)framecnt*(double)declen/FS);
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("\n\nLength of speech file: %.1f s\n", length_file);
675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("Time to run iSAC:      %.2f s (%.2f %% of realtime)\n\n", runtime, (100*runtime/length_file));
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	printf("---------------------END----------------------\n");
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fclose(inp);
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	fclose(outp);
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsac_Free(ISAC_main_inst);
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	WebRtcIsacfix_Free(ISACFIX_main_inst);
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//	fclose(histfile);
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//	fclose(ratefile);
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org	return 0;
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
694