blob: 9a03eae7479ce2a78e0890d31b19de3f6aa00b2c [file] [log] [blame]
Alexandre Lision744f7422013-09-25 11:39:37 -04001/* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Written by Jean-Marc Valin */
4/*
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8
9 - Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11
12 - Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
20 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <stdio.h>
34#include <stdlib.h>
35#include <math.h>
36#include <string.h>
37#include "opus.h"
38#include "debug.h"
39#include "opus_types.h"
40#include "opus_private.h"
41
42#define MAX_PACKET 1500
43
44void print_usage( char* argv[] )
45{
46 fprintf(stderr, "Usage: %s [-e] <application> <sampling rate (Hz)> <channels (1/2)> "
47 "<bits per second> [options] <input> <output>\n", argv[0]);
48 fprintf(stderr, " %s -d <sampling rate (Hz)> <channels (1/2)> "
49 "[options] <input> <output>\n\n", argv[0]);
50 fprintf(stderr, "mode: voip | audio | restricted-lowdelay\n" );
51 fprintf(stderr, "options:\n" );
52 fprintf(stderr, "-e : only runs the encoder (output the bit-stream)\n" );
53 fprintf(stderr, "-d : only runs the decoder (reads the bit-stream as input)\n" );
54 fprintf(stderr, "-cbr : enable constant bitrate; default: variable bitrate\n" );
55 fprintf(stderr, "-cvbr : enable constrained variable bitrate; default: unconstrained\n" );
56 fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB> : audio bandwidth (from narrowband to fullband); default: sampling rate\n" );
57 fprintf(stderr, "-framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 \n" );
58 fprintf(stderr, "-max_payload <bytes> : maximum payload size in bytes, default: 1024\n" );
59 fprintf(stderr, "-complexity <comp> : complexity, 0 (lowest) ... 10 (highest); default: 10\n" );
60 fprintf(stderr, "-inbandfec : enable SILK inband FEC\n" );
61 fprintf(stderr, "-forcemono : force mono encoding, even for stereo input\n" );
62 fprintf(stderr, "-dtx : enable SILK DTX\n" );
63 fprintf(stderr, "-loss <perc> : simulate packet loss, in percent (0-100); default: 0\n" );
64}
65
66static void int_to_char(opus_uint32 i, unsigned char ch[4])
67{
68 ch[0] = i>>24;
69 ch[1] = (i>>16)&0xFF;
70 ch[2] = (i>>8)&0xFF;
71 ch[3] = i&0xFF;
72}
73
74static opus_uint32 char_to_int(unsigned char ch[4])
75{
76 return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
77 | ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3];
78}
79
80static void check_decoder_option(int encode_only, const char *opt)
81{
82 if (encode_only)
83 {
84 fprintf(stderr, "option %s is only for decoding\n", opt);
85 exit(EXIT_FAILURE);
86 }
87}
88
89static void check_encoder_option(int decode_only, const char *opt)
90{
91 if (decode_only)
92 {
93 fprintf(stderr, "option %s is only for encoding\n", opt);
94 exit(EXIT_FAILURE);
95 }
96}
97
98static const int silk8_test[][4] = {
99 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 1},
100 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 1},
101 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1},
102 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1},
103 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 2},
104 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 2},
105 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2},
106 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2}
107};
108
109static const int silk12_test[][4] = {
110 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 1},
111 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 1},
112 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 1},
113 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 1},
114 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 2},
115 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 2},
116 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 2},
117 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 2}
118};
119
120static const int silk16_test[][4] = {
121 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 1},
122 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 1},
123 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1},
124 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1},
125 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 2},
126 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 2},
127 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2},
128 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2}
129};
130
131static const int hybrid24_test[][4] = {
132 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1},
133 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1},
134 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2},
135 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2}
136};
137
138static const int hybrid48_test[][4] = {
139 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1},
140 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1},
141 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
142 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2}
143};
144
145static const int celt_test[][4] = {
146 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1},
147 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1},
148 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1},
149 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1},
150
151 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1},
152 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1},
153 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1},
154 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1},
155
156 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 1},
157 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 1},
158 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 1},
159 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 1},
160
161 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 1},
162 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 1},
163 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 1},
164 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 1},
165
166 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
167 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2},
168 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2},
169 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2},
170
171 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2},
172 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2},
173 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2},
174 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2},
175
176 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2},
177 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 2},
178 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 2},
179 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 2},
180
181 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2},
182 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 2},
183 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 2},
184 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 2},
185
186};
187
188static const int celt_hq_test[][4] = {
189 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
190 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2},
191 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2},
192 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2},
193};
194
195int main(int argc, char *argv[])
196{
197 int err;
198 char *inFile, *outFile;
199 FILE *fin, *fout;
200 OpusEncoder *enc=NULL;
201 OpusDecoder *dec=NULL;
202 int args;
203 int len[2];
204 int frame_size, channels;
205 opus_int32 bitrate_bps=0;
206 unsigned char *data[2];
207 unsigned char *fbytes;
208 opus_int32 sampling_rate;
209 int use_vbr;
210 int max_payload_bytes;
211 int complexity;
212 int use_inbandfec;
213 int use_dtx;
214 int forcechannels;
215 int cvbr = 0;
216 int packet_loss_perc;
217 opus_int32 count=0, count_act=0;
218 int k;
219 opus_int32 skip=0;
220 int stop=0;
221 short *in, *out;
222 int application=OPUS_APPLICATION_AUDIO;
223 double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg;
224 int bandwidth=-1;
225 const char *bandwidth_string;
226 int lost = 0, lost_prev = 1;
227 int toggle = 0;
228 opus_uint32 enc_final_range[2];
229 opus_uint32 dec_final_range;
230 int encode_only=0, decode_only=0;
231 int max_frame_size = 960*6;
232 int curr_read=0;
233 int sweep_bps = 0;
234 int random_framesize=0, newsize=0, delayed_celt=0;
235 int sweep_max=0, sweep_min=0;
236 int random_fec=0;
237 const int (*mode_list)[4]=NULL;
238 int nb_modes_in_list=0;
239 int curr_mode=0;
240 int curr_mode_count=0;
241 int mode_switch_time = 48000;
242
243 if (argc < 5 )
244 {
245 print_usage( argv );
246 return EXIT_FAILURE;
247 }
248
249 fprintf(stderr, "%s\n", opus_get_version_string());
250
251 args = 1;
252 if (strcmp(argv[args], "-e")==0)
253 {
254 encode_only = 1;
255 args++;
256 } else if (strcmp(argv[args], "-d")==0)
257 {
258 decode_only = 1;
259 args++;
260 }
261 if (!decode_only && argc < 7 )
262 {
263 print_usage( argv );
264 return EXIT_FAILURE;
265 }
266
267 if (!decode_only)
268 {
269 if (strcmp(argv[args], "voip")==0)
270 application = OPUS_APPLICATION_VOIP;
271 else if (strcmp(argv[args], "restricted-lowdelay")==0)
272 application = OPUS_APPLICATION_RESTRICTED_LOWDELAY;
273 else if (strcmp(argv[args], "audio")!=0) {
274 fprintf(stderr, "unknown application: %s\n", argv[args]);
275 print_usage(argv);
276 return EXIT_FAILURE;
277 }
278 args++;
279 }
280 sampling_rate = (opus_int32)atol(argv[args]);
281 args++;
282 channels = atoi(argv[args]);
283 args++;
284 if (!decode_only)
285 {
286 bitrate_bps = (opus_int32)atol(argv[args]);
287 args++;
288 }
289
290 if (sampling_rate != 8000 && sampling_rate != 12000
291 && sampling_rate != 16000 && sampling_rate != 24000
292 && sampling_rate != 48000)
293 {
294 fprintf(stderr, "Supported sampling rates are 8000, 12000, "
295 "16000, 24000 and 48000.\n");
296 return EXIT_FAILURE;
297 }
298 frame_size = sampling_rate/50;
299
300 /* defaults: */
301 use_vbr = 1;
302 bandwidth = OPUS_AUTO;
303 max_payload_bytes = MAX_PACKET;
304 complexity = 10;
305 use_inbandfec = 0;
306 forcechannels = OPUS_AUTO;
307 use_dtx = 0;
308 packet_loss_perc = 0;
309 max_frame_size = 960*6;
310 curr_read=0;
311
312 while( args < argc - 2 ) {
313 /* process command line options */
314 if( strcmp( argv[ args ], "-cbr" ) == 0 ) {
315 check_encoder_option(decode_only, "-cbr");
316 use_vbr = 0;
317 args++;
318 } else if( strcmp( argv[ args ], "-bandwidth" ) == 0 ) {
319 check_encoder_option(decode_only, "-bandwidth");
320 if (strcmp(argv[ args + 1 ], "NB")==0)
321 bandwidth = OPUS_BANDWIDTH_NARROWBAND;
322 else if (strcmp(argv[ args + 1 ], "MB")==0)
323 bandwidth = OPUS_BANDWIDTH_MEDIUMBAND;
324 else if (strcmp(argv[ args + 1 ], "WB")==0)
325 bandwidth = OPUS_BANDWIDTH_WIDEBAND;
326 else if (strcmp(argv[ args + 1 ], "SWB")==0)
327 bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND;
328 else if (strcmp(argv[ args + 1 ], "FB")==0)
329 bandwidth = OPUS_BANDWIDTH_FULLBAND;
330 else {
331 fprintf(stderr, "Unknown bandwidth %s. "
332 "Supported are NB, MB, WB, SWB, FB.\n",
333 argv[ args + 1 ]);
334 return EXIT_FAILURE;
335 }
336 args += 2;
337 } else if( strcmp( argv[ args ], "-framesize" ) == 0 ) {
338 check_encoder_option(decode_only, "-framesize");
339 if (strcmp(argv[ args + 1 ], "2.5")==0)
340 frame_size = sampling_rate/400;
341 else if (strcmp(argv[ args + 1 ], "5")==0)
342 frame_size = sampling_rate/200;
343 else if (strcmp(argv[ args + 1 ], "10")==0)
344 frame_size = sampling_rate/100;
345 else if (strcmp(argv[ args + 1 ], "20")==0)
346 frame_size = sampling_rate/50;
347 else if (strcmp(argv[ args + 1 ], "40")==0)
348 frame_size = sampling_rate/25;
349 else if (strcmp(argv[ args + 1 ], "60")==0)
350 frame_size = 3*sampling_rate/50;
351 else {
352 fprintf(stderr, "Unsupported frame size: %s ms. "
353 "Supported are 2.5, 5, 10, 20, 40, 60.\n",
354 argv[ args + 1 ]);
355 return EXIT_FAILURE;
356 }
357 args += 2;
358 } else if( strcmp( argv[ args ], "-max_payload" ) == 0 ) {
359 check_encoder_option(decode_only, "-max_payload");
360 max_payload_bytes = atoi( argv[ args + 1 ] );
361 args += 2;
362 } else if( strcmp( argv[ args ], "-complexity" ) == 0 ) {
363 check_encoder_option(decode_only, "-complexity");
364 complexity = atoi( argv[ args + 1 ] );
365 args += 2;
366 } else if( strcmp( argv[ args ], "-inbandfec" ) == 0 ) {
367 use_inbandfec = 1;
368 args++;
369 } else if( strcmp( argv[ args ], "-forcemono" ) == 0 ) {
370 check_encoder_option(decode_only, "-forcemono");
371 forcechannels = 1;
372 args++;
373 } else if( strcmp( argv[ args ], "-cvbr" ) == 0 ) {
374 check_encoder_option(decode_only, "-cvbr");
375 cvbr = 1;
376 args++;
377 } else if( strcmp( argv[ args ], "-dtx") == 0 ) {
378 check_encoder_option(decode_only, "-dtx");
379 use_dtx = 1;
380 args++;
381 } else if( strcmp( argv[ args ], "-loss" ) == 0 ) {
382 check_decoder_option(encode_only, "-loss");
383 packet_loss_perc = atoi( argv[ args + 1 ] );
384 args += 2;
385 } else if( strcmp( argv[ args ], "-sweep" ) == 0 ) {
386 check_encoder_option(decode_only, "-sweep");
387 sweep_bps = atoi( argv[ args + 1 ] );
388 args += 2;
389 } else if( strcmp( argv[ args ], "-random_framesize" ) == 0 ) {
390 check_encoder_option(decode_only, "-random_framesize");
391 random_framesize = 1;
392 args++;
393 } else if( strcmp( argv[ args ], "-sweep_max" ) == 0 ) {
394 check_encoder_option(decode_only, "-sweep_max");
395 sweep_max = atoi( argv[ args + 1 ] );
396 args += 2;
397 } else if( strcmp( argv[ args ], "-random_fec" ) == 0 ) {
398 check_encoder_option(decode_only, "-random_fec");
399 random_fec = 1;
400 args++;
401 } else if( strcmp( argv[ args ], "-silk8k_test" ) == 0 ) {
402 check_encoder_option(decode_only, "-silk8k_test");
403 mode_list = silk8_test;
404 nb_modes_in_list = 8;
405 args++;
406 } else if( strcmp( argv[ args ], "-silk12k_test" ) == 0 ) {
407 check_encoder_option(decode_only, "-silk12k_test");
408 mode_list = silk12_test;
409 nb_modes_in_list = 8;
410 args++;
411 } else if( strcmp( argv[ args ], "-silk16k_test" ) == 0 ) {
412 check_encoder_option(decode_only, "-silk16k_test");
413 mode_list = silk16_test;
414 nb_modes_in_list = 8;
415 args++;
416 } else if( strcmp( argv[ args ], "-hybrid24k_test" ) == 0 ) {
417 check_encoder_option(decode_only, "-hybrid24k_test");
418 mode_list = hybrid24_test;
419 nb_modes_in_list = 4;
420 args++;
421 } else if( strcmp( argv[ args ], "-hybrid48k_test" ) == 0 ) {
422 check_encoder_option(decode_only, "-hybrid48k_test");
423 mode_list = hybrid48_test;
424 nb_modes_in_list = 4;
425 args++;
426 } else if( strcmp( argv[ args ], "-celt_test" ) == 0 ) {
427 check_encoder_option(decode_only, "-celt_test");
428 mode_list = celt_test;
429 nb_modes_in_list = 32;
430 args++;
431 } else if( strcmp( argv[ args ], "-celt_hq_test" ) == 0 ) {
432 check_encoder_option(decode_only, "-celt_hq_test");
433 mode_list = celt_hq_test;
434 nb_modes_in_list = 4;
435 args++;
436 } else {
437 printf( "Error: unrecognized setting: %s\n\n", argv[ args ] );
438 print_usage( argv );
439 return EXIT_FAILURE;
440 }
441 }
442
443 if (sweep_max)
444 sweep_min = bitrate_bps;
445
446 if (max_payload_bytes < 0 || max_payload_bytes > MAX_PACKET)
447 {
448 fprintf (stderr, "max_payload_bytes must be between 0 and %d\n",
449 MAX_PACKET);
450 return EXIT_FAILURE;
451 }
452
453 inFile = argv[argc-2];
454 fin = fopen(inFile, "rb");
455 if (!fin)
456 {
457 fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
458 return EXIT_FAILURE;
459 }
460 if (mode_list)
461 {
462 int size;
463 fseek(fin, 0, SEEK_END);
464 size = ftell(fin);
465 fprintf(stderr, "File size is %d bytes\n", size);
466 fseek(fin, 0, SEEK_SET);
467 mode_switch_time = size/sizeof(short)/channels/nb_modes_in_list;
468 fprintf(stderr, "Switching mode every %d samples\n", mode_switch_time);
469 }
470
471 outFile = argv[argc-1];
472 fout = fopen(outFile, "wb+");
473 if (!fout)
474 {
475 fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
476 fclose(fin);
477 return EXIT_FAILURE;
478 }
479
480 if (!decode_only)
481 {
482 enc = opus_encoder_create(sampling_rate, channels, application, &err);
483 if (err != OPUS_OK)
484 {
485 fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err));
486 fclose(fin);
487 fclose(fout);
488 return EXIT_FAILURE;
489 }
490 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
491 opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
492 opus_encoder_ctl(enc, OPUS_SET_VBR(use_vbr));
493 opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(cvbr));
494 opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
495 opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(use_inbandfec));
496 opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(forcechannels));
497 opus_encoder_ctl(enc, OPUS_SET_DTX(use_dtx));
498 opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc));
499
500 opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
501 opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16));
502 }
503 if (!encode_only)
504 {
505 dec = opus_decoder_create(sampling_rate, channels, &err);
506 if (err != OPUS_OK)
507 {
508 fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err));
509 fclose(fin);
510 fclose(fout);
511 return EXIT_FAILURE;
512 }
513 }
514
515
516 switch(bandwidth)
517 {
518 case OPUS_BANDWIDTH_NARROWBAND:
519 bandwidth_string = "narrowband";
520 break;
521 case OPUS_BANDWIDTH_MEDIUMBAND:
522 bandwidth_string = "mediumband";
523 break;
524 case OPUS_BANDWIDTH_WIDEBAND:
525 bandwidth_string = "wideband";
526 break;
527 case OPUS_BANDWIDTH_SUPERWIDEBAND:
528 bandwidth_string = "superwideband";
529 break;
530 case OPUS_BANDWIDTH_FULLBAND:
531 bandwidth_string = "fullband";
532 break;
533 case OPUS_AUTO:
534 bandwidth_string = "auto";
535 break;
536 default:
537 bandwidth_string = "unknown";
538 break;
539 }
540
541 if (decode_only)
542 fprintf(stderr, "Decoding with %ld Hz output (%d channels)\n",
543 (long)sampling_rate, channels);
544 else
545 fprintf(stderr, "Encoding %ld Hz input at %.3f kb/s "
546 "in %s mode with %d-sample frames.\n",
547 (long)sampling_rate, bitrate_bps*0.001,
548 bandwidth_string, frame_size);
549
550 in = (short*)malloc(max_frame_size*channels*sizeof(short));
551 out = (short*)malloc(max_frame_size*channels*sizeof(short));
552 fbytes = (unsigned char*)malloc(max_frame_size*channels*sizeof(short));
553 data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
554 if ( use_inbandfec ) {
555 data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
556 }
557 while (!stop)
558 {
559 if (delayed_celt)
560 {
561 frame_size = newsize;
562 delayed_celt = 0;
563 } else if (random_framesize && rand()%20==0)
564 {
565 newsize = rand()%6;
566 switch(newsize)
567 {
568 case 0: newsize=sampling_rate/400; break;
569 case 1: newsize=sampling_rate/200; break;
570 case 2: newsize=sampling_rate/100; break;
571 case 3: newsize=sampling_rate/50; break;
572 case 4: newsize=sampling_rate/25; break;
573 case 5: newsize=3*sampling_rate/50; break;
574 }
575 while (newsize < sampling_rate/25 && bitrate_bps-fabs(sweep_bps) <= 3*12*sampling_rate/newsize)
576 newsize*=2;
577 if (newsize < sampling_rate/100 && frame_size >= sampling_rate/100)
578 {
579 opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY));
580 delayed_celt=1;
581 } else {
582 frame_size = newsize;
583 }
584 }
585 if (random_fec && rand()%30==0)
586 {
587 opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rand()%4==0));
588 }
589 if (decode_only)
590 {
591 unsigned char ch[4];
592 err = fread(ch, 1, 4, fin);
593 if (feof(fin))
594 break;
595 len[toggle] = char_to_int(ch);
596 if (len[toggle]>max_payload_bytes || len[toggle]<0)
597 {
598 fprintf(stderr, "Invalid payload length: %d\n",len[toggle]);
599 break;
600 }
601 err = fread(ch, 1, 4, fin);
602 enc_final_range[toggle] = char_to_int(ch);
603 err = fread(data[toggle], 1, len[toggle], fin);
604 if (err<len[toggle])
605 {
606 fprintf(stderr, "Ran out of input, "
607 "expecting %d bytes got %d\n",
608 len[toggle],err);
609 break;
610 }
611 } else {
612 int i;
613 if (mode_list!=NULL)
614 {
615 opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(mode_list[curr_mode][1]));
616 opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(mode_list[curr_mode][0]));
617 opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(mode_list[curr_mode][3]));
618 frame_size = mode_list[curr_mode][2];
619 }
620 err = fread(fbytes, sizeof(short)*channels, frame_size, fin);
621 curr_read = err;
622 for(i=0;i<curr_read*channels;i++)
623 {
624 opus_int32 s;
625 s=fbytes[2*i+1]<<8|fbytes[2*i];
626 s=((s&0xFFFF)^0x8000)-0x8000;
627 in[i]=s;
628 }
629 if (curr_read < frame_size)
630 {
631 for (i=curr_read*channels;i<frame_size*channels;i++)
632 in[i] = 0;
633 stop = 1;
634 }
635 len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes);
636 if (sweep_bps!=0)
637 {
638 bitrate_bps += sweep_bps;
639 if (sweep_max)
640 {
641 if (bitrate_bps > sweep_max)
642 sweep_bps = -sweep_bps;
643 else if (bitrate_bps < sweep_min)
644 sweep_bps = -sweep_bps;
645 }
646 /* safety */
647 if (bitrate_bps<1000)
648 bitrate_bps = 1000;
649 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
650 }
651 opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range[toggle]));
652 if (len[toggle] < 0)
653 {
654 fprintf (stderr, "opus_encode() returned %d\n", len[toggle]);
655 fclose(fin);
656 fclose(fout);
657 return EXIT_FAILURE;
658 }
659 curr_mode_count += frame_size;
660 if (curr_mode_count > mode_switch_time && curr_mode < nb_modes_in_list-1)
661 {
662 curr_mode++;
663 curr_mode_count = 0;
664 }
665 }
666
667 if (encode_only)
668 {
669 unsigned char int_field[4];
670 int_to_char(len[toggle], int_field);
671 if (fwrite(int_field, 1, 4, fout) != 4) {
672 fprintf(stderr, "Error writing.\n");
673 return EXIT_FAILURE;
674 }
675 int_to_char(enc_final_range[toggle], int_field);
676 if (fwrite(int_field, 1, 4, fout) != 4) {
677 fprintf(stderr, "Error writing.\n");
678 return EXIT_FAILURE;
679 }
680 if (fwrite(data[toggle], 1, len[toggle], fout) != (unsigned)len[toggle]) {
681 fprintf(stderr, "Error writing.\n");
682 return EXIT_FAILURE;
683 }
684 } else {
685 int output_samples;
686 lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc);
687 if (lost)
688 opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
689 else
690 output_samples = max_frame_size;
691 if( count >= use_inbandfec ) {
692 /* delay by one packet when using in-band FEC */
693 if( use_inbandfec ) {
694 if( lost_prev ) {
695 /* attempt to decode with in-band FEC from next packet */
696 opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
697 output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1);
698 } else {
699 /* regular decode */
700 output_samples = max_frame_size;
701 output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0);
702 }
703 } else {
704 output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 0);
705 }
706 if (output_samples>0)
707 {
708 if (output_samples>skip) {
709 int i;
710 for(i=0;i<(output_samples-skip)*channels;i++)
711 {
712 short s;
713 s=out[i+(skip*channels)];
714 fbytes[2*i]=s&0xFF;
715 fbytes[2*i+1]=(s>>8)&0xFF;
716 }
717 if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){
718 fprintf(stderr, "Error writing.\n");
719 return EXIT_FAILURE;
720 }
721 }
722 if (output_samples<skip) skip -= output_samples;
723 else skip = 0;
724 } else {
725 fprintf(stderr, "error decoding frame: %s\n",
726 opus_strerror(output_samples));
727 }
728 }
729 }
730
731 if (!encode_only)
732 opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
733 /* compare final range encoder rng values of encoder and decoder */
734 if( enc_final_range[toggle^use_inbandfec]!=0 && !encode_only
735 && !lost && !lost_prev
736 && dec_final_range != enc_final_range[toggle^use_inbandfec] ) {
737 fprintf (stderr, "Error: Range coder state mismatch "
738 "between encoder and decoder "
739 "in frame %ld: 0x%8lx vs 0x%8lx\n",
740 (long)count,
741 (unsigned long)enc_final_range[toggle^use_inbandfec],
742 (unsigned long)dec_final_range);
743 fclose(fin);
744 fclose(fout);
745 return EXIT_FAILURE;
746 }
747
748 lost_prev = lost;
749
750 /* count bits */
751 bits += len[toggle]*8;
752 bits_max = ( len[toggle]*8 > bits_max ) ? len[toggle]*8 : bits_max;
753 if( count >= use_inbandfec ) {
754 nrg = 0.0;
755 if (!decode_only)
756 {
757 for ( k = 0; k < frame_size * channels; k++ ) {
758 nrg += in[ k ] * (double)in[ k ];
759 }
760 }
761 if ( ( nrg / ( frame_size * channels ) ) > 1e5 ) {
762 bits_act += len[toggle]*8;
763 count_act++;
764 }
765 /* Variance */
766 bits2 += len[toggle]*len[toggle]*64;
767 }
768 count++;
769 toggle = (toggle + use_inbandfec) & 1;
770 }
771 fprintf (stderr, "average bitrate: %7.3f kb/s\n",
772 1e-3*bits*sampling_rate/(frame_size*(double)count));
773 fprintf (stderr, "maximum bitrate: %7.3f kb/s\n",
774 1e-3*bits_max*sampling_rate/frame_size);
775 if (!decode_only)
776 fprintf (stderr, "active bitrate: %7.3f kb/s\n",
777 1e-3*bits_act*sampling_rate/(frame_size*(double)count_act));
778 fprintf (stderr, "bitrate standard deviation: %7.3f kb/s\n",
779 1e-3*sqrt(bits2/count - bits*bits/(count*(double)count))*sampling_rate/frame_size);
780 /* Close any files to which intermediate results were stored */
781 SILK_DEBUG_STORE_CLOSE_FILES
782 silk_TimerSave("opus_timing.txt");
783 opus_encoder_destroy(enc);
784 opus_decoder_destroy(dec);
785 free(data[0]);
786 if (use_inbandfec)
787 free(data[1]);
788 fclose(fin);
789 fclose(fout);
790 free(in);
791 free(out);
792 free(fbytes);
793 return EXIT_SUCCESS;
794}