1 /* 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 #include "opus_multistream.h"
42
43 #define MAX_PACKET 1500
44
print_usage(char * argv[])45 void print_usage( char* argv[] )
46 {
47 fprintf(stderr, "Usage: %s [-e] <application> <sampling rate (Hz)> <channels (1/2)> "
48 "<bits per second> [options] <input> <output>\n", argv[0]);
49 fprintf(stderr, " %s -d <sampling rate (Hz)> <channels (1/2)> "
50 "[options] <input> <output>\n\n", argv[0]);
51 fprintf(stderr, "application: voip | audio | restricted-lowdelay\n" );
52 fprintf(stderr, "options:\n" );
53 fprintf(stderr, "-e : only runs the encoder (output the bit-stream)\n" );
54 fprintf(stderr, "-d : only runs the decoder (reads the bit-stream as input)\n" );
55 fprintf(stderr, "-cbr : enable constant bitrate; default: variable bitrate\n" );
56 fprintf(stderr, "-cvbr : enable constrained variable bitrate; default: unconstrained\n" );
57 fprintf(stderr, "-variable-duration : enable frames of variable duration (experts only); default: disabled\n" );
58 fprintf(stderr, "-bandwidth <NB|MB|WB|SWB|FB> : audio bandwidth (from narrowband to fullband); default: sampling rate\n" );
59 fprintf(stderr, "-framesize <2.5|5|10|20|40|60> : frame size in ms; default: 20 \n" );
60 fprintf(stderr, "-max_payload <bytes> : maximum payload size in bytes, default: 1024\n" );
61 fprintf(stderr, "-complexity <comp> : complexity, 0 (lowest) ... 10 (highest); default: 10\n" );
62 fprintf(stderr, "-inbandfec : enable SILK inband FEC\n" );
63 fprintf(stderr, "-forcemono : force mono encoding, even for stereo input\n" );
64 fprintf(stderr, "-dtx : enable SILK DTX\n" );
65 fprintf(stderr, "-loss <perc> : simulate packet loss, in percent (0-100); default: 0\n" );
66 }
67
int_to_char(opus_uint32 i,unsigned char ch[4])68 static void int_to_char(opus_uint32 i, unsigned char ch[4])
69 {
70 ch[0] = i>>24;
71 ch[1] = (i>>16)&0xFF;
72 ch[2] = (i>>8)&0xFF;
73 ch[3] = i&0xFF;
74 }
75
char_to_int(unsigned char ch[4])76 static opus_uint32 char_to_int(unsigned char ch[4])
77 {
78 return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16)
79 | ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3];
80 }
81
check_encoder_option(int decode_only,const char * opt)82 static void check_encoder_option(int decode_only, const char *opt)
83 {
84 if (decode_only)
85 {
86 fprintf(stderr, "option %s is only for encoding\n", opt);
87 exit(EXIT_FAILURE);
88 }
89 }
90
91 static const int silk8_test[][4] = {
92 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 1},
93 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 1},
94 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1},
95 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1},
96 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 2},
97 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 2},
98 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2},
99 {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2}
100 };
101
102 static const int silk12_test[][4] = {
103 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 1},
104 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 1},
105 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 1},
106 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 1},
107 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 2},
108 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 2},
109 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 2},
110 {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 2}
111 };
112
113 static const int silk16_test[][4] = {
114 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 1},
115 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 1},
116 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1},
117 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1},
118 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 2},
119 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 2},
120 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2},
121 {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2}
122 };
123
124 static const int hybrid24_test[][4] = {
125 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1},
126 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1},
127 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2},
128 {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2}
129 };
130
131 static const int hybrid48_test[][4] = {
132 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1},
133 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1},
134 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
135 {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2}
136 };
137
138 static const int celt_test[][4] = {
139 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1},
140 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1},
141 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1},
142 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1},
143
144 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1},
145 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1},
146 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1},
147 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1},
148
149 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 1},
150 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 1},
151 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 1},
152 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 1},
153
154 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 1},
155 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 1},
156 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 1},
157 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 1},
158
159 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
160 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2},
161 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2},
162 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2},
163
164 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2},
165 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2},
166 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2},
167 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2},
168
169 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2},
170 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 2},
171 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 2},
172 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 2},
173
174 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2},
175 {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 2},
176 {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 2},
177 {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 2},
178
179 };
180
181 static const int celt_hq_test[][4] = {
182 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2},
183 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2},
184 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2},
185 {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2},
186 };
187
188 #if 0 /* This is a hack that replaces the normal encoder/decoder with the multistream version */
189 #define OpusEncoder OpusMSEncoder
190 #define OpusDecoder OpusMSDecoder
191 #define opus_encode opus_multistream_encode
192 #define opus_decode opus_multistream_decode
193 #define opus_encoder_ctl opus_multistream_encoder_ctl
194 #define opus_decoder_ctl opus_multistream_decoder_ctl
195 #define opus_encoder_create ms_opus_encoder_create
196 #define opus_decoder_create ms_opus_decoder_create
197 #define opus_encoder_destroy opus_multistream_encoder_destroy
198 #define opus_decoder_destroy opus_multistream_decoder_destroy
199
200 static OpusEncoder *ms_opus_encoder_create(opus_int32 Fs, int channels, int application, int *error)
201 {
202 int streams, coupled_streams;
203 unsigned char mapping[256];
204 return (OpusEncoder *)opus_multistream_surround_encoder_create(Fs, channels, 1, &streams, &coupled_streams, mapping, application, error);
205 }
206 static OpusDecoder *ms_opus_decoder_create(opus_int32 Fs, int channels, int *error)
207 {
208 int streams;
209 int coupled_streams;
210 unsigned char mapping[256]={0,1};
211 streams = 1;
212 coupled_streams = channels==2;
213 return (OpusDecoder *)opus_multistream_decoder_create(Fs, channels, streams, coupled_streams, mapping, error);
214 }
215 #endif
216
main(int argc,char * argv[])217 int main(int argc, char *argv[])
218 {
219 int err;
220 char *inFile, *outFile;
221 FILE *fin, *fout;
222 OpusEncoder *enc=NULL;
223 OpusDecoder *dec=NULL;
224 int args;
225 int len[2];
226 int frame_size, channels;
227 opus_int32 bitrate_bps=0;
228 unsigned char *data[2];
229 unsigned char *fbytes;
230 opus_int32 sampling_rate;
231 int use_vbr;
232 int max_payload_bytes;
233 int complexity;
234 int use_inbandfec;
235 int use_dtx;
236 int forcechannels;
237 int cvbr = 0;
238 int packet_loss_perc;
239 opus_int32 count=0, count_act=0;
240 int k;
241 opus_int32 skip=0;
242 int stop=0;
243 short *in, *out;
244 int application=OPUS_APPLICATION_AUDIO;
245 double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg;
246 double tot_samples=0;
247 opus_uint64 tot_in, tot_out;
248 int bandwidth=OPUS_AUTO;
249 const char *bandwidth_string;
250 int lost = 0, lost_prev = 1;
251 int toggle = 0;
252 opus_uint32 enc_final_range[2];
253 opus_uint32 dec_final_range;
254 int encode_only=0, decode_only=0;
255 int max_frame_size = 48000*2;
256 int curr_read=0;
257 int sweep_bps = 0;
258 int random_framesize=0, newsize=0, delayed_celt=0;
259 int sweep_max=0, sweep_min=0;
260 int random_fec=0;
261 const int (*mode_list)[4]=NULL;
262 int nb_modes_in_list=0;
263 int curr_mode=0;
264 int curr_mode_count=0;
265 int mode_switch_time = 48000;
266 int nb_encoded=0;
267 int remaining=0;
268 int variable_duration=OPUS_FRAMESIZE_ARG;
269 int delayed_decision=0;
270
271 if (argc < 5 )
272 {
273 print_usage( argv );
274 return EXIT_FAILURE;
275 }
276
277 tot_in=tot_out=0;
278 fprintf(stderr, "%s\n", opus_get_version_string());
279
280 args = 1;
281 if (strcmp(argv[args], "-e")==0)
282 {
283 encode_only = 1;
284 args++;
285 } else if (strcmp(argv[args], "-d")==0)
286 {
287 decode_only = 1;
288 args++;
289 }
290 if (!decode_only && argc < 7 )
291 {
292 print_usage( argv );
293 return EXIT_FAILURE;
294 }
295
296 if (!decode_only)
297 {
298 if (strcmp(argv[args], "voip")==0)
299 application = OPUS_APPLICATION_VOIP;
300 else if (strcmp(argv[args], "restricted-lowdelay")==0)
301 application = OPUS_APPLICATION_RESTRICTED_LOWDELAY;
302 else if (strcmp(argv[args], "audio")!=0) {
303 fprintf(stderr, "unknown application: %s\n", argv[args]);
304 print_usage(argv);
305 return EXIT_FAILURE;
306 }
307 args++;
308 }
309 sampling_rate = (opus_int32)atol(argv[args]);
310 args++;
311
312 if (sampling_rate != 8000 && sampling_rate != 12000
313 && sampling_rate != 16000 && sampling_rate != 24000
314 && sampling_rate != 48000)
315 {
316 fprintf(stderr, "Supported sampling rates are 8000, 12000, "
317 "16000, 24000 and 48000.\n");
318 return EXIT_FAILURE;
319 }
320 frame_size = sampling_rate/50;
321
322 channels = atoi(argv[args]);
323 args++;
324
325 if (channels < 1 || channels > 2)
326 {
327 fprintf(stderr, "Opus_demo supports only 1 or 2 channels.\n");
328 return EXIT_FAILURE;
329 }
330
331 if (!decode_only)
332 {
333 bitrate_bps = (opus_int32)atol(argv[args]);
334 args++;
335 }
336
337 /* defaults: */
338 use_vbr = 1;
339 max_payload_bytes = MAX_PACKET;
340 complexity = 10;
341 use_inbandfec = 0;
342 forcechannels = OPUS_AUTO;
343 use_dtx = 0;
344 packet_loss_perc = 0;
345
346 while( args < argc - 2 ) {
347 /* process command line options */
348 if( strcmp( argv[ args ], "-cbr" ) == 0 ) {
349 check_encoder_option(decode_only, "-cbr");
350 use_vbr = 0;
351 args++;
352 } else if( strcmp( argv[ args ], "-bandwidth" ) == 0 ) {
353 check_encoder_option(decode_only, "-bandwidth");
354 if (strcmp(argv[ args + 1 ], "NB")==0)
355 bandwidth = OPUS_BANDWIDTH_NARROWBAND;
356 else if (strcmp(argv[ args + 1 ], "MB")==0)
357 bandwidth = OPUS_BANDWIDTH_MEDIUMBAND;
358 else if (strcmp(argv[ args + 1 ], "WB")==0)
359 bandwidth = OPUS_BANDWIDTH_WIDEBAND;
360 else if (strcmp(argv[ args + 1 ], "SWB")==0)
361 bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND;
362 else if (strcmp(argv[ args + 1 ], "FB")==0)
363 bandwidth = OPUS_BANDWIDTH_FULLBAND;
364 else {
365 fprintf(stderr, "Unknown bandwidth %s. "
366 "Supported are NB, MB, WB, SWB, FB.\n",
367 argv[ args + 1 ]);
368 return EXIT_FAILURE;
369 }
370 args += 2;
371 } else if( strcmp( argv[ args ], "-framesize" ) == 0 ) {
372 check_encoder_option(decode_only, "-framesize");
373 if (strcmp(argv[ args + 1 ], "2.5")==0)
374 frame_size = sampling_rate/400;
375 else if (strcmp(argv[ args + 1 ], "5")==0)
376 frame_size = sampling_rate/200;
377 else if (strcmp(argv[ args + 1 ], "10")==0)
378 frame_size = sampling_rate/100;
379 else if (strcmp(argv[ args + 1 ], "20")==0)
380 frame_size = sampling_rate/50;
381 else if (strcmp(argv[ args + 1 ], "40")==0)
382 frame_size = sampling_rate/25;
383 else if (strcmp(argv[ args + 1 ], "60")==0)
384 frame_size = 3*sampling_rate/50;
385 else {
386 fprintf(stderr, "Unsupported frame size: %s ms. "
387 "Supported are 2.5, 5, 10, 20, 40, 60.\n",
388 argv[ args + 1 ]);
389 return EXIT_FAILURE;
390 }
391 args += 2;
392 } else if( strcmp( argv[ args ], "-max_payload" ) == 0 ) {
393 check_encoder_option(decode_only, "-max_payload");
394 max_payload_bytes = atoi( argv[ args + 1 ] );
395 args += 2;
396 } else if( strcmp( argv[ args ], "-complexity" ) == 0 ) {
397 check_encoder_option(decode_only, "-complexity");
398 complexity = atoi( argv[ args + 1 ] );
399 args += 2;
400 } else if( strcmp( argv[ args ], "-inbandfec" ) == 0 ) {
401 use_inbandfec = 1;
402 args++;
403 } else if( strcmp( argv[ args ], "-forcemono" ) == 0 ) {
404 check_encoder_option(decode_only, "-forcemono");
405 forcechannels = 1;
406 args++;
407 } else if( strcmp( argv[ args ], "-cvbr" ) == 0 ) {
408 check_encoder_option(decode_only, "-cvbr");
409 cvbr = 1;
410 args++;
411 } else if( strcmp( argv[ args ], "-variable-duration" ) == 0 ) {
412 check_encoder_option(decode_only, "-variable-duration");
413 variable_duration = OPUS_FRAMESIZE_VARIABLE;
414 args++;
415 } else if( strcmp( argv[ args ], "-delayed-decision" ) == 0 ) {
416 check_encoder_option(decode_only, "-delayed-decision");
417 delayed_decision = 1;
418 args++;
419 } else if( strcmp( argv[ args ], "-dtx") == 0 ) {
420 check_encoder_option(decode_only, "-dtx");
421 use_dtx = 1;
422 args++;
423 } else if( strcmp( argv[ args ], "-loss" ) == 0 ) {
424 packet_loss_perc = atoi( argv[ args + 1 ] );
425 args += 2;
426 } else if( strcmp( argv[ args ], "-sweep" ) == 0 ) {
427 check_encoder_option(decode_only, "-sweep");
428 sweep_bps = atoi( argv[ args + 1 ] );
429 args += 2;
430 } else if( strcmp( argv[ args ], "-random_framesize" ) == 0 ) {
431 check_encoder_option(decode_only, "-random_framesize");
432 random_framesize = 1;
433 args++;
434 } else if( strcmp( argv[ args ], "-sweep_max" ) == 0 ) {
435 check_encoder_option(decode_only, "-sweep_max");
436 sweep_max = atoi( argv[ args + 1 ] );
437 args += 2;
438 } else if( strcmp( argv[ args ], "-random_fec" ) == 0 ) {
439 check_encoder_option(decode_only, "-random_fec");
440 random_fec = 1;
441 args++;
442 } else if( strcmp( argv[ args ], "-silk8k_test" ) == 0 ) {
443 check_encoder_option(decode_only, "-silk8k_test");
444 mode_list = silk8_test;
445 nb_modes_in_list = 8;
446 args++;
447 } else if( strcmp( argv[ args ], "-silk12k_test" ) == 0 ) {
448 check_encoder_option(decode_only, "-silk12k_test");
449 mode_list = silk12_test;
450 nb_modes_in_list = 8;
451 args++;
452 } else if( strcmp( argv[ args ], "-silk16k_test" ) == 0 ) {
453 check_encoder_option(decode_only, "-silk16k_test");
454 mode_list = silk16_test;
455 nb_modes_in_list = 8;
456 args++;
457 } else if( strcmp( argv[ args ], "-hybrid24k_test" ) == 0 ) {
458 check_encoder_option(decode_only, "-hybrid24k_test");
459 mode_list = hybrid24_test;
460 nb_modes_in_list = 4;
461 args++;
462 } else if( strcmp( argv[ args ], "-hybrid48k_test" ) == 0 ) {
463 check_encoder_option(decode_only, "-hybrid48k_test");
464 mode_list = hybrid48_test;
465 nb_modes_in_list = 4;
466 args++;
467 } else if( strcmp( argv[ args ], "-celt_test" ) == 0 ) {
468 check_encoder_option(decode_only, "-celt_test");
469 mode_list = celt_test;
470 nb_modes_in_list = 32;
471 args++;
472 } else if( strcmp( argv[ args ], "-celt_hq_test" ) == 0 ) {
473 check_encoder_option(decode_only, "-celt_hq_test");
474 mode_list = celt_hq_test;
475 nb_modes_in_list = 4;
476 args++;
477 } else {
478 printf( "Error: unrecognized setting: %s\n\n", argv[ args ] );
479 print_usage( argv );
480 return EXIT_FAILURE;
481 }
482 }
483
484 if (sweep_max)
485 sweep_min = bitrate_bps;
486
487 if (max_payload_bytes < 0 || max_payload_bytes > MAX_PACKET)
488 {
489 fprintf (stderr, "max_payload_bytes must be between 0 and %d\n",
490 MAX_PACKET);
491 return EXIT_FAILURE;
492 }
493
494 inFile = argv[argc-2];
495 fin = fopen(inFile, "rb");
496 if (!fin)
497 {
498 fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
499 return EXIT_FAILURE;
500 }
501 if (mode_list)
502 {
503 int size;
504 fseek(fin, 0, SEEK_END);
505 size = ftell(fin);
506 fprintf(stderr, "File size is %d bytes\n", size);
507 fseek(fin, 0, SEEK_SET);
508 mode_switch_time = size/sizeof(short)/channels/nb_modes_in_list;
509 fprintf(stderr, "Switching mode every %d samples\n", mode_switch_time);
510 }
511
512 outFile = argv[argc-1];
513 fout = fopen(outFile, "wb+");
514 if (!fout)
515 {
516 fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
517 fclose(fin);
518 return EXIT_FAILURE;
519 }
520
521 if (!decode_only)
522 {
523 enc = opus_encoder_create(sampling_rate, channels, application, &err);
524 if (err != OPUS_OK)
525 {
526 fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err));
527 fclose(fin);
528 fclose(fout);
529 return EXIT_FAILURE;
530 }
531 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
532 opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth));
533 opus_encoder_ctl(enc, OPUS_SET_VBR(use_vbr));
534 opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(cvbr));
535 opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));
536 opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(use_inbandfec));
537 opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(forcechannels));
538 opus_encoder_ctl(enc, OPUS_SET_DTX(use_dtx));
539 opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc));
540
541 opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip));
542 opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(16));
543 opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(variable_duration));
544 }
545 if (!encode_only)
546 {
547 dec = opus_decoder_create(sampling_rate, channels, &err);
548 if (err != OPUS_OK)
549 {
550 fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err));
551 fclose(fin);
552 fclose(fout);
553 return EXIT_FAILURE;
554 }
555 }
556
557
558 switch(bandwidth)
559 {
560 case OPUS_BANDWIDTH_NARROWBAND:
561 bandwidth_string = "narrowband";
562 break;
563 case OPUS_BANDWIDTH_MEDIUMBAND:
564 bandwidth_string = "mediumband";
565 break;
566 case OPUS_BANDWIDTH_WIDEBAND:
567 bandwidth_string = "wideband";
568 break;
569 case OPUS_BANDWIDTH_SUPERWIDEBAND:
570 bandwidth_string = "superwideband";
571 break;
572 case OPUS_BANDWIDTH_FULLBAND:
573 bandwidth_string = "fullband";
574 break;
575 case OPUS_AUTO:
576 bandwidth_string = "auto bandwidth";
577 break;
578 default:
579 bandwidth_string = "unknown";
580 break;
581 }
582
583 if (decode_only)
584 fprintf(stderr, "Decoding with %ld Hz output (%d channels)\n",
585 (long)sampling_rate, channels);
586 else
587 fprintf(stderr, "Encoding %ld Hz input at %.3f kb/s "
588 "in %s with %d-sample frames.\n",
589 (long)sampling_rate, bitrate_bps*0.001,
590 bandwidth_string, frame_size);
591
592 in = (short*)malloc(max_frame_size*channels*sizeof(short));
593 out = (short*)malloc(max_frame_size*channels*sizeof(short));
594 /* We need to allocate for 16-bit PCM data, but we store it as unsigned char. */
595 fbytes = (unsigned char*)malloc(max_frame_size*channels*sizeof(short));
596 data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(unsigned char));
597 if ( use_inbandfec ) {
598 data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(unsigned char));
599 }
600 if(delayed_decision)
601 {
602 if (variable_duration!=OPUS_FRAMESIZE_VARIABLE)
603 {
604 if (frame_size==sampling_rate/400)
605 variable_duration = OPUS_FRAMESIZE_2_5_MS;
606 else if (frame_size==sampling_rate/200)
607 variable_duration = OPUS_FRAMESIZE_5_MS;
608 else if (frame_size==sampling_rate/100)
609 variable_duration = OPUS_FRAMESIZE_10_MS;
610 else if (frame_size==sampling_rate/50)
611 variable_duration = OPUS_FRAMESIZE_20_MS;
612 else if (frame_size==sampling_rate/25)
613 variable_duration = OPUS_FRAMESIZE_40_MS;
614 else
615 variable_duration = OPUS_FRAMESIZE_60_MS;
616 opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(variable_duration));
617 }
618 frame_size = 2*48000;
619 }
620 while (!stop)
621 {
622 if (delayed_celt)
623 {
624 frame_size = newsize;
625 delayed_celt = 0;
626 } else if (random_framesize && rand()%20==0)
627 {
628 newsize = rand()%6;
629 switch(newsize)
630 {
631 case 0: newsize=sampling_rate/400; break;
632 case 1: newsize=sampling_rate/200; break;
633 case 2: newsize=sampling_rate/100; break;
634 case 3: newsize=sampling_rate/50; break;
635 case 4: newsize=sampling_rate/25; break;
636 case 5: newsize=3*sampling_rate/50; break;
637 }
638 while (newsize < sampling_rate/25 && bitrate_bps-abs(sweep_bps) <= 3*12*sampling_rate/newsize)
639 newsize*=2;
640 if (newsize < sampling_rate/100 && frame_size >= sampling_rate/100)
641 {
642 opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY));
643 delayed_celt=1;
644 } else {
645 frame_size = newsize;
646 }
647 }
648 if (random_fec && rand()%30==0)
649 {
650 opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rand()%4==0));
651 }
652 if (decode_only)
653 {
654 unsigned char ch[4];
655 err = fread(ch, 1, 4, fin);
656 if (feof(fin))
657 break;
658 len[toggle] = char_to_int(ch);
659 if (len[toggle]>max_payload_bytes || len[toggle]<0)
660 {
661 fprintf(stderr, "Invalid payload length: %d\n",len[toggle]);
662 break;
663 }
664 err = fread(ch, 1, 4, fin);
665 enc_final_range[toggle] = char_to_int(ch);
666 err = fread(data[toggle], 1, len[toggle], fin);
667 if (err<len[toggle])
668 {
669 fprintf(stderr, "Ran out of input, "
670 "expecting %d bytes got %d\n",
671 len[toggle],err);
672 break;
673 }
674 } else {
675 int i;
676 if (mode_list!=NULL)
677 {
678 opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(mode_list[curr_mode][1]));
679 opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(mode_list[curr_mode][0]));
680 opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(mode_list[curr_mode][3]));
681 frame_size = mode_list[curr_mode][2];
682 }
683 err = fread(fbytes, sizeof(short)*channels, frame_size-remaining, fin);
684 curr_read = err;
685 tot_in += curr_read;
686 for(i=0;i<curr_read*channels;i++)
687 {
688 opus_int32 s;
689 s=fbytes[2*i+1]<<8|fbytes[2*i];
690 s=((s&0xFFFF)^0x8000)-0x8000;
691 in[i+remaining*channels]=s;
692 }
693 if (curr_read+remaining < frame_size)
694 {
695 for (i=(curr_read+remaining)*channels;i<frame_size*channels;i++)
696 in[i] = 0;
697 if (encode_only || decode_only)
698 stop = 1;
699 }
700 len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes);
701 nb_encoded = opus_packet_get_samples_per_frame(data[toggle], sampling_rate)*opus_packet_get_nb_frames(data[toggle], len[toggle]);
702 remaining = frame_size-nb_encoded;
703 for(i=0;i<remaining*channels;i++)
704 in[i] = in[nb_encoded*channels+i];
705 if (sweep_bps!=0)
706 {
707 bitrate_bps += sweep_bps;
708 if (sweep_max)
709 {
710 if (bitrate_bps > sweep_max)
711 sweep_bps = -sweep_bps;
712 else if (bitrate_bps < sweep_min)
713 sweep_bps = -sweep_bps;
714 }
715 /* safety */
716 if (bitrate_bps<1000)
717 bitrate_bps = 1000;
718 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
719 }
720 opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range[toggle]));
721 if (len[toggle] < 0)
722 {
723 fprintf (stderr, "opus_encode() returned %d\n", len[toggle]);
724 fclose(fin);
725 fclose(fout);
726 return EXIT_FAILURE;
727 }
728 curr_mode_count += frame_size;
729 if (curr_mode_count > mode_switch_time && curr_mode < nb_modes_in_list-1)
730 {
731 curr_mode++;
732 curr_mode_count = 0;
733 }
734 }
735
736 #if 0 /* This is for testing the padding code, do not enable by default */
737 if (len[toggle]<1275)
738 {
739 int new_len = len[toggle]+rand()%(max_payload_bytes-len[toggle]);
740 if ((err = opus_packet_pad(data[toggle], len[toggle], new_len)) != OPUS_OK)
741 {
742 fprintf(stderr, "padding failed: %s\n", opus_strerror(err));
743 return EXIT_FAILURE;
744 }
745 len[toggle] = new_len;
746 }
747 #endif
748 if (encode_only)
749 {
750 unsigned char int_field[4];
751 int_to_char(len[toggle], int_field);
752 if (fwrite(int_field, 1, 4, fout) != 4) {
753 fprintf(stderr, "Error writing.\n");
754 return EXIT_FAILURE;
755 }
756 int_to_char(enc_final_range[toggle], int_field);
757 if (fwrite(int_field, 1, 4, fout) != 4) {
758 fprintf(stderr, "Error writing.\n");
759 return EXIT_FAILURE;
760 }
761 if (fwrite(data[toggle], 1, len[toggle], fout) != (unsigned)len[toggle]) {
762 fprintf(stderr, "Error writing.\n");
763 return EXIT_FAILURE;
764 }
765 tot_samples += nb_encoded;
766 } else {
767 int output_samples;
768 lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc);
769 if (lost)
770 opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
771 else
772 output_samples = max_frame_size;
773 if( count >= use_inbandfec ) {
774 /* delay by one packet when using in-band FEC */
775 if( use_inbandfec ) {
776 if( lost_prev ) {
777 /* attempt to decode with in-band FEC from next packet */
778 opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
779 output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1);
780 } else {
781 /* regular decode */
782 output_samples = max_frame_size;
783 output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0);
784 }
785 } else {
786 output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 0);
787 }
788 if (output_samples>0)
789 {
790 if (!decode_only && tot_out + output_samples > tot_in)
791 {
792 stop=1;
793 output_samples = tot_in-tot_out;
794 }
795 if (output_samples>skip) {
796 int i;
797 for(i=0;i<(output_samples-skip)*channels;i++)
798 {
799 short s;
800 s=out[i+(skip*channels)];
801 fbytes[2*i]=s&0xFF;
802 fbytes[2*i+1]=(s>>8)&0xFF;
803 }
804 if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){
805 fprintf(stderr, "Error writing.\n");
806 return EXIT_FAILURE;
807 }
808 tot_out += output_samples-skip;
809 }
810 if (output_samples<skip) skip -= output_samples;
811 else skip = 0;
812 } else {
813 fprintf(stderr, "error decoding frame: %s\n",
814 opus_strerror(output_samples));
815 }
816 tot_samples += output_samples;
817 }
818 }
819
820 if (!encode_only)
821 opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
822 /* compare final range encoder rng values of encoder and decoder */
823 if( enc_final_range[toggle^use_inbandfec]!=0 && !encode_only
824 && !lost && !lost_prev
825 && dec_final_range != enc_final_range[toggle^use_inbandfec] ) {
826 fprintf (stderr, "Error: Range coder state mismatch "
827 "between encoder and decoder "
828 "in frame %ld: 0x%8lx vs 0x%8lx\n",
829 (long)count,
830 (unsigned long)enc_final_range[toggle^use_inbandfec],
831 (unsigned long)dec_final_range);
832 fclose(fin);
833 fclose(fout);
834 return EXIT_FAILURE;
835 }
836
837 lost_prev = lost;
838 if( count >= use_inbandfec ) {
839 /* count bits */
840 bits += len[toggle]*8;
841 bits_max = ( len[toggle]*8 > bits_max ) ? len[toggle]*8 : bits_max;
842 bits2 += len[toggle]*len[toggle]*64;
843 if (!decode_only)
844 {
845 nrg = 0.0;
846 for ( k = 0; k < frame_size * channels; k++ ) {
847 nrg += in[ k ] * (double)in[ k ];
848 }
849 nrg /= frame_size * channels;
850 if( nrg > 1e5 ) {
851 bits_act += len[toggle]*8;
852 count_act++;
853 }
854 }
855 }
856 count++;
857 toggle = (toggle + use_inbandfec) & 1;
858 }
859
860 /* Print out bitrate statistics */
861 if(decode_only)
862 frame_size = (int)(tot_samples / count);
863 count -= use_inbandfec;
864 fprintf (stderr, "average bitrate: %7.3f kb/s\n",
865 1e-3*bits*sampling_rate/tot_samples);
866 fprintf (stderr, "maximum bitrate: %7.3f kb/s\n",
867 1e-3*bits_max*sampling_rate/frame_size);
868 if (!decode_only)
869 fprintf (stderr, "active bitrate: %7.3f kb/s\n",
870 1e-3*bits_act*sampling_rate/(1e-15+frame_size*(double)count_act));
871 fprintf (stderr, "bitrate standard deviation: %7.3f kb/s\n",
872 1e-3*sqrt(bits2/count - bits*bits/(count*(double)count))*sampling_rate/frame_size);
873 /* Close any files to which intermediate results were stored */
874 SILK_DEBUG_STORE_CLOSE_FILES
875 silk_TimerSave("opus_timing.txt");
876 opus_encoder_destroy(enc);
877 opus_decoder_destroy(dec);
878 free(data[0]);
879 if (use_inbandfec)
880 free(data[1]);
881 fclose(fin);
882 fclose(fout);
883 free(in);
884 free(out);
885 free(fbytes);
886 return EXIT_SUCCESS;
887 }
888