1 /* Copyright (c) 2011-2013 Xiph.Org Foundation
2 Written by Gregory Maxwell */
3 /*
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10
11 - Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <limits.h>
35 #include <stdint.h>
36 #include <math.h>
37 #include <string.h>
38 #include <time.h>
39 #if (!defined WIN32 && !defined _WIN32) || defined(__MINGW32__)
40 #include <unistd.h>
41 #else
42 #include <process.h>
43 #define getpid _getpid
44 #endif
45 #include "opus_multistream.h"
46 #include "opus.h"
47 #include "../src/opus_private.h"
48 #include "test_opus_common.h"
49
50 #define MAX_PACKET (1500)
51 #define SAMPLES (48000*30)
52 #define SSAMPLES (SAMPLES/3)
53 #define MAX_FRAME_SAMP (5760)
54 #define PI (3.141592653589793238462643f)
55 #define RAND_SAMPLE(a) (a[fast_rand() % sizeof(a)/sizeof(a[0])])
56
generate_music(short * buf,opus_int32 len)57 void generate_music(short *buf, opus_int32 len)
58 {
59 opus_int32 a1,b1,a2,b2;
60 opus_int32 c1,c2,d1,d2;
61 opus_int32 i,j;
62 a1=b1=a2=b2=0;
63 c1=c2=d1=d2=0;
64 j=0;
65 /*60ms silence*/
66 for(i=0;i<2880;i++)buf[i*2]=buf[i*2+1]=0;
67 for(i=2880;i<len;i++)
68 {
69 opus_uint32 r;
70 opus_int32 v1,v2;
71 v1=v2=(((j*((j>>12)^((j>>10|j>>12)&26&j>>7)))&128)+128)<<15;
72 r=fast_rand();v1+=r&65535;v1-=r>>16;
73 r=fast_rand();v2+=r&65535;v2-=r>>16;
74 b1=v1-a1+((b1*61+32)>>6);a1=v1;
75 b2=v2-a2+((b2*61+32)>>6);a2=v2;
76 c1=(30*(c1+b1+d1)+32)>>6;d1=b1;
77 c2=(30*(c2+b2+d2)+32)>>6;d2=b2;
78 v1=(c1+128)>>8;
79 v2=(c2+128)>>8;
80 buf[i*2]=v1>32767?32767:(v1<-32768?-32768:v1);
81 buf[i*2+1]=v2>32767?32767:(v2<-32768?-32768:v2);
82 if(i%6==0)j++;
83 }
84 }
85
86 #if 0
87 static int save_ctr = 0;
88 static void int_to_char(opus_uint32 i, unsigned char ch[4])
89 {
90 ch[0] = i>>24;
91 ch[1] = (i>>16)&0xFF;
92 ch[2] = (i>>8)&0xFF;
93 ch[3] = i&0xFF;
94 }
95
96 static OPUS_INLINE void save_packet(unsigned char* p, int len, opus_uint32 rng)
97 {
98 FILE *fout;
99 unsigned char int_field[4];
100 char name[256];
101 snprintf(name,255,"test_opus_encode.%llu.%d.bit",(unsigned long long)iseed,save_ctr);
102 fprintf(stdout,"writing %d byte packet to %s\n",len,name);
103 fout=fopen(name, "wb+");
104 if(fout==NULL)test_failed();
105 int_to_char(len, int_field);
106 fwrite(int_field, 1, 4, fout);
107 int_to_char(rng, int_field);
108 fwrite(int_field, 1, 4, fout);
109 fwrite(p, 1, len, fout);
110 fclose(fout);
111 save_ctr++;
112 }
113 #endif
114
get_frame_size_enum(int frame_size,int sampling_rate)115 int get_frame_size_enum(int frame_size, int sampling_rate)
116 {
117 int frame_size_enum;
118
119 if(frame_size==sampling_rate/400)
120 frame_size_enum = OPUS_FRAMESIZE_2_5_MS;
121 else if(frame_size==sampling_rate/200)
122 frame_size_enum = OPUS_FRAMESIZE_5_MS;
123 else if(frame_size==sampling_rate/100)
124 frame_size_enum = OPUS_FRAMESIZE_10_MS;
125 else if(frame_size==sampling_rate/50)
126 frame_size_enum = OPUS_FRAMESIZE_20_MS;
127 else if(frame_size==sampling_rate/25)
128 frame_size_enum = OPUS_FRAMESIZE_40_MS;
129 else if(frame_size==3*sampling_rate/50)
130 frame_size_enum = OPUS_FRAMESIZE_60_MS;
131 else if(frame_size==4*sampling_rate/50)
132 frame_size_enum = OPUS_FRAMESIZE_80_MS;
133 else if(frame_size==5*sampling_rate/50)
134 frame_size_enum = OPUS_FRAMESIZE_100_MS;
135 else if(frame_size==6*sampling_rate/50)
136 frame_size_enum = OPUS_FRAMESIZE_120_MS;
137 else
138 test_failed();
139
140 return frame_size_enum;
141 }
142
test_encode(OpusEncoder * enc,int channels,int frame_size,OpusDecoder * dec,const char * debug_info)143 void test_encode(OpusEncoder *enc, int channels, int frame_size, OpusDecoder *dec, const char* debug_info)
144 {
145 int samp_count = 0;
146 opus_int16 *inbuf;
147 unsigned char packet[MAX_PACKET+257];
148 int len;
149 opus_int16 *outbuf;
150 int out_samples;
151
152 /* Generate input data */
153 inbuf = (opus_int16*)malloc(sizeof(*inbuf)*SSAMPLES);
154 generate_music(inbuf, SSAMPLES/2);
155
156 /* Allocate memory for output data */
157 outbuf = (opus_int16*)malloc(sizeof(*outbuf)*MAX_FRAME_SAMP*3);
158
159 /* Encode data, then decode for sanity check */
160 do {
161 len = opus_encode(enc, &inbuf[samp_count*channels], frame_size, packet, MAX_PACKET);
162 if(len<0 || len>MAX_PACKET) {
163 fprintf(stderr,"%s\n",debug_info);
164 fprintf(stderr,"opus_encode() returned %d\n",len);
165 test_failed();
166 }
167
168 out_samples = opus_decode(dec, packet, len, outbuf, MAX_FRAME_SAMP, 0);
169 if(out_samples!=frame_size) {
170 fprintf(stderr,"%s\n",debug_info);
171 fprintf(stderr,"opus_decode() returned %d\n",out_samples);
172 test_failed();
173 }
174
175 samp_count += frame_size;
176 } while (samp_count < ((SSAMPLES/2)-MAX_FRAME_SAMP));
177
178 /* Clean up */
179 free(inbuf);
180 free(outbuf);
181 }
182
fuzz_encoder_settings(const int num_encoders,const int num_setting_changes)183 void fuzz_encoder_settings(const int num_encoders, const int num_setting_changes)
184 {
185 OpusEncoder *enc;
186 OpusDecoder *dec;
187 int i,j,err;
188
189 /* Parameters to fuzz. Some values are duplicated to increase their probability of being tested. */
190 int sampling_rates[5] = {8000, 12000, 16000, 24000, 48000};
191 int channels[2] = {1, 2};
192 int applications[3] = {OPUS_APPLICATION_AUDIO, OPUS_APPLICATION_VOIP, OPUS_APPLICATION_RESTRICTED_LOWDELAY};
193 int bitrates[11] = {6000, 12000, 16000, 24000, 32000, 48000, 64000, 96000, 510000, OPUS_AUTO, OPUS_BITRATE_MAX};
194 int force_channels[4] = {OPUS_AUTO, OPUS_AUTO, 1, 2};
195 int use_vbr[3] = {0, 1, 1};
196 int vbr_constraints[3] = {0, 1, 1};
197 int complexities[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
198 int max_bandwidths[6] = {OPUS_BANDWIDTH_NARROWBAND, OPUS_BANDWIDTH_MEDIUMBAND,
199 OPUS_BANDWIDTH_WIDEBAND, OPUS_BANDWIDTH_SUPERWIDEBAND,
200 OPUS_BANDWIDTH_FULLBAND, OPUS_BANDWIDTH_FULLBAND};
201 int signals[4] = {OPUS_AUTO, OPUS_AUTO, OPUS_SIGNAL_VOICE, OPUS_SIGNAL_MUSIC};
202 int inband_fecs[3] = {0, 0, 1};
203 int packet_loss_perc[4] = {0, 1, 2, 5};
204 int lsb_depths[2] = {8, 24};
205 int prediction_disabled[3] = {0, 0, 1};
206 int use_dtx[2] = {0, 1};
207 int frame_sizes_ms_x2[9] = {5, 10, 20, 40, 80, 120, 160, 200, 240}; /* x2 to avoid 2.5 ms */
208 char debug_info[512];
209
210 for (i=0; i<num_encoders; i++) {
211 int sampling_rate = RAND_SAMPLE(sampling_rates);
212 int num_channels = RAND_SAMPLE(channels);
213 int application = RAND_SAMPLE(applications);
214
215 dec = opus_decoder_create(sampling_rate, num_channels, &err);
216 if(err!=OPUS_OK || dec==NULL)test_failed();
217
218 enc = opus_encoder_create(sampling_rate, num_channels, application, &err);
219 if(err!=OPUS_OK || enc==NULL)test_failed();
220
221 for (j=0; j<num_setting_changes; j++) {
222 int bitrate = RAND_SAMPLE(bitrates);
223 int force_channel = RAND_SAMPLE(force_channels);
224 int vbr = RAND_SAMPLE(use_vbr);
225 int vbr_constraint = RAND_SAMPLE(vbr_constraints);
226 int complexity = RAND_SAMPLE(complexities);
227 int max_bw = RAND_SAMPLE(max_bandwidths);
228 int sig = RAND_SAMPLE(signals);
229 int inband_fec = RAND_SAMPLE(inband_fecs);
230 int pkt_loss = RAND_SAMPLE(packet_loss_perc);
231 int lsb_depth = RAND_SAMPLE(lsb_depths);
232 int pred_disabled = RAND_SAMPLE(prediction_disabled);
233 int dtx = RAND_SAMPLE(use_dtx);
234 int frame_size_ms_x2 = RAND_SAMPLE(frame_sizes_ms_x2);
235 int frame_size = frame_size_ms_x2*sampling_rate/2000;
236 int frame_size_enum = get_frame_size_enum(frame_size, sampling_rate);
237 force_channel = IMIN(force_channel, num_channels);
238
239 sprintf(debug_info,
240 "fuzz_encoder_settings: %d kHz, %d ch, application: %d, "
241 "%d bps, force ch: %d, vbr: %d, vbr constraint: %d, complexity: %d, "
242 "max bw: %d, signal: %d, inband fec: %d, pkt loss: %d%%, lsb depth: %d, "
243 "pred disabled: %d, dtx: %d, (%d/2) ms\n",
244 sampling_rate/1000, num_channels, application, bitrate,
245 force_channel, vbr, vbr_constraint, complexity, max_bw, sig, inband_fec,
246 pkt_loss, lsb_depth, pred_disabled, dtx, frame_size_ms_x2);
247
248 if(opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate)) != OPUS_OK) test_failed();
249 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(force_channel)) != OPUS_OK) test_failed();
250 if(opus_encoder_ctl(enc, OPUS_SET_VBR(vbr)) != OPUS_OK) test_failed();
251 if(opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(vbr_constraint)) != OPUS_OK) test_failed();
252 if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)) != OPUS_OK) test_failed();
253 if(opus_encoder_ctl(enc, OPUS_SET_MAX_BANDWIDTH(max_bw)) != OPUS_OK) test_failed();
254 if(opus_encoder_ctl(enc, OPUS_SET_SIGNAL(sig)) != OPUS_OK) test_failed();
255 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(inband_fec)) != OPUS_OK) test_failed();
256 if(opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(pkt_loss)) != OPUS_OK) test_failed();
257 if(opus_encoder_ctl(enc, OPUS_SET_LSB_DEPTH(lsb_depth)) != OPUS_OK) test_failed();
258 if(opus_encoder_ctl(enc, OPUS_SET_PREDICTION_DISABLED(pred_disabled)) != OPUS_OK) test_failed();
259 if(opus_encoder_ctl(enc, OPUS_SET_DTX(dtx)) != OPUS_OK) test_failed();
260 if(opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(frame_size_enum)) != OPUS_OK) test_failed();
261
262 test_encode(enc, num_channels, frame_size, dec, debug_info);
263 }
264
265 opus_encoder_destroy(enc);
266 opus_decoder_destroy(dec);
267 }
268 }
269
run_test1(int no_fuzz)270 int run_test1(int no_fuzz)
271 {
272 static const int fsizes[6]={960*3,960*2,120,240,480,960};
273 static const char *mstrings[3] = {" LP","Hybrid"," MDCT"};
274 unsigned char mapping[256] = {0,1,255};
275 unsigned char db62[36];
276 opus_int32 i,j;
277 int rc,err;
278 OpusEncoder *enc;
279 OpusMSEncoder *MSenc;
280 OpusDecoder *dec;
281 OpusMSDecoder *MSdec;
282 OpusMSDecoder *MSdec_err;
283 OpusDecoder *dec_err[10];
284 short *inbuf;
285 short *outbuf;
286 short *out2buf;
287 opus_int32 bitrate_bps;
288 unsigned char packet[MAX_PACKET+257];
289 opus_uint32 enc_final_range;
290 opus_uint32 dec_final_range;
291 int fswitch;
292 int fsize;
293 int count;
294
295 /*FIXME: encoder api tests, fs!=48k, mono, VBR*/
296
297 fprintf(stdout," Encode+Decode tests.\n");
298
299 enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &err);
300 if(err != OPUS_OK || enc==NULL)test_failed();
301
302 for(i=0;i<2;i++)
303 {
304 int *ret_err;
305 ret_err = i?0:&err;
306 MSenc = opus_multistream_encoder_create(8000, 2, 2, 0, mapping, OPUS_UNIMPLEMENTED, ret_err);
307 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
308
309 MSenc = opus_multistream_encoder_create(8000, 0, 1, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
310 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
311
312 MSenc = opus_multistream_encoder_create(44100, 2, 2, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
313 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
314
315 MSenc = opus_multistream_encoder_create(8000, 2, 2, 3, mapping, OPUS_APPLICATION_VOIP, ret_err);
316 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
317
318 MSenc = opus_multistream_encoder_create(8000, 2, -1, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
319 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
320
321 MSenc = opus_multistream_encoder_create(8000, 256, 2, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
322 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
323 }
324
325 MSenc = opus_multistream_encoder_create(8000, 2, 2, 0, mapping, OPUS_APPLICATION_AUDIO, &err);
326 if(err != OPUS_OK || MSenc==NULL)test_failed();
327
328 /*Some multistream encoder API tests*/
329 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_BITRATE(&i))!=OPUS_OK)test_failed();
330 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_LSB_DEPTH(&i))!=OPUS_OK)test_failed();
331 if(i<16)test_failed();
332
333 {
334 OpusEncoder *tmp_enc;
335 if(opus_multistream_encoder_ctl(MSenc, OPUS_MULTISTREAM_GET_ENCODER_STATE(1,&tmp_enc))!=OPUS_OK)test_failed();
336 if(opus_encoder_ctl(tmp_enc, OPUS_GET_LSB_DEPTH(&j))!=OPUS_OK)test_failed();
337 if(i!=j)test_failed();
338 if(opus_multistream_encoder_ctl(MSenc, OPUS_MULTISTREAM_GET_ENCODER_STATE(2,&tmp_enc))!=OPUS_BAD_ARG)test_failed();
339 }
340
341 dec = opus_decoder_create(48000, 2, &err);
342 if(err != OPUS_OK || dec==NULL)test_failed();
343
344 MSdec = opus_multistream_decoder_create(48000, 2, 2, 0, mapping, &err);
345 if(err != OPUS_OK || MSdec==NULL)test_failed();
346
347 MSdec_err = opus_multistream_decoder_create(48000, 3, 2, 0, mapping, &err);
348 if(err != OPUS_OK || MSdec_err==NULL)test_failed();
349
350 dec_err[0]=(OpusDecoder *)malloc(opus_decoder_get_size(2));
351 memcpy(dec_err[0],dec,opus_decoder_get_size(2));
352 dec_err[1] = opus_decoder_create(48000, 1, &err);
353 dec_err[2] = opus_decoder_create(24000, 2, &err);
354 dec_err[3] = opus_decoder_create(24000, 1, &err);
355 dec_err[4] = opus_decoder_create(16000, 2, &err);
356 dec_err[5] = opus_decoder_create(16000, 1, &err);
357 dec_err[6] = opus_decoder_create(12000, 2, &err);
358 dec_err[7] = opus_decoder_create(12000, 1, &err);
359 dec_err[8] = opus_decoder_create(8000, 2, &err);
360 dec_err[9] = opus_decoder_create(8000, 1, &err);
361 for(i=0;i<10;i++)if(dec_err[i]==NULL)test_failed();
362
363 {
364 OpusEncoder *enccpy;
365 /*The opus state structures contain no pointers and can be freely copied*/
366 enccpy=(OpusEncoder *)malloc(opus_encoder_get_size(2));
367 memcpy(enccpy,enc,opus_encoder_get_size(2));
368 memset(enc,255,opus_encoder_get_size(2));
369 opus_encoder_destroy(enc);
370 enc=enccpy;
371 }
372
373 inbuf=(short *)malloc(sizeof(short)*SAMPLES*2);
374 outbuf=(short *)malloc(sizeof(short)*SAMPLES*2);
375 out2buf=(short *)malloc(sizeof(short)*MAX_FRAME_SAMP*3);
376 if(inbuf==NULL || outbuf==NULL || out2buf==NULL)test_failed();
377
378 generate_music(inbuf,SAMPLES);
379
380 /* FILE *foo;
381 foo = fopen("foo.sw", "wb+");
382 fwrite(inbuf, 1, SAMPLES*2*2, foo);
383 fclose(foo);*/
384
385 if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO))!=OPUS_OK)test_failed();
386 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(-2))!=OPUS_BAD_ARG)test_failed();
387 if(opus_encode(enc, inbuf, 500, packet, MAX_PACKET)!=OPUS_BAD_ARG)test_failed();
388
389 for(rc=0;rc<3;rc++)
390 {
391 if(opus_encoder_ctl(enc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed();
392 if(opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
393 if(opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
394 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
395 for(j=0;j<13;j++)
396 {
397 int rate;
398 int modes[13]={0,0,0,1,1,1,1,2,2,2,2,2,2};
399 int rates[13]={6000,12000,48000,16000,32000,48000,64000,512000,13000,24000,48000,64000,96000};
400 int frame[13]={960*2,960,480,960,960,960,480,960*3,960*3,960,480,240,120};
401 rate=rates[j]+fast_rand()%rates[j];
402 count=i=0;
403 do {
404 int bw,len,out_samples,frame_size;
405 frame_size=frame[j];
406 if((fast_rand()&255)==0)
407 {
408 if(opus_encoder_ctl(enc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
409 if(opus_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
410 if((fast_rand()&1)!=0)
411 {
412 if(opus_decoder_ctl(dec_err[fast_rand()&1], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
413 }
414 }
415 if((fast_rand()&127)==0)
416 {
417 if(opus_decoder_ctl(dec_err[fast_rand()&1], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
418 }
419 if(fast_rand()%10==0){
420 int complex=fast_rand()%11;
421 if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complex))!=OPUS_OK)test_failed();
422 }
423 if(fast_rand()%50==0)opus_decoder_ctl(dec, OPUS_RESET_STATE);
424 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
425 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
426 if(opus_encoder_ctl(enc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
427 if(opus_encoder_ctl(enc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
428 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS((rates[j]>=64000?2:1)))!=OPUS_OK)test_failed();
429 if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
430 if(opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
431 bw=modes[j]==0?OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%3):
432 modes[j]==1?OPUS_BANDWIDTH_SUPERWIDEBAND+(fast_rand()&1):
433 OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%5);
434 if(modes[j]==2&&bw==OPUS_BANDWIDTH_MEDIUMBAND)bw+=3;
435 if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bw))!=OPUS_OK)test_failed();
436 len = opus_encode(enc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
437 if(len<0 || len>MAX_PACKET)test_failed();
438 if(opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
439 if((fast_rand()&3)==0)
440 {
441 if(opus_packet_pad(packet,len,len+1)!=OPUS_OK)test_failed();
442 len++;
443 }
444 if((fast_rand()&7)==0)
445 {
446 if(opus_packet_pad(packet,len,len+256)!=OPUS_OK)test_failed();
447 len+=256;
448 }
449 if((fast_rand()&3)==0)
450 {
451 len=opus_packet_unpad(packet,len);
452 if(len<1)test_failed();
453 }
454 out_samples = opus_decode(dec, packet, len, &outbuf[i<<1], MAX_FRAME_SAMP, 0);
455 if(out_samples!=frame_size)test_failed();
456 if(opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
457 if(enc_final_range!=dec_final_range)test_failed();
458 /*LBRR decode*/
459 out_samples = opus_decode(dec_err[0], packet, len, out2buf, frame_size, (fast_rand()&3)!=0);
460 if(out_samples!=frame_size)test_failed();
461 out_samples = opus_decode(dec_err[1], packet, (fast_rand()&3)==0?0:len, out2buf, MAX_FRAME_SAMP, (fast_rand()&7)!=0);
462 if(out_samples<120)test_failed();
463 i+=frame_size;
464 count++;
465 }while(i<(SSAMPLES-MAX_FRAME_SAMP));
466 fprintf(stdout," Mode %s FB encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate);
467 }
468 }
469
470 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(OPUS_AUTO))!=OPUS_OK)test_failed();
471 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO))!=OPUS_OK)test_failed();
472 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0))!=OPUS_OK)test_failed();
473 if(opus_encoder_ctl(enc, OPUS_SET_DTX(0))!=OPUS_OK)test_failed();
474
475 for(rc=0;rc<3;rc++)
476 {
477 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed();
478 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
479 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
480 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
481 for(j=0;j<16;j++)
482 {
483 int rate;
484 int modes[16]={0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2};
485 int rates[16]={4000,12000,32000,8000,16000,32000,48000,88000,4000,12000,32000,8000,16000,32000,48000,88000};
486 int frame[16]={160*1,160,80,160,160,80,40,20,160*1,160,80,160,160,80,40,20};
487 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0&&j==1))!=OPUS_OK)test_failed();
488 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
489 rate=rates[j]+fast_rand()%rates[j];
490 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
491 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
492 count=i=0;
493 do {
494 int len,out_samples,frame_size,loss;
495 opus_int32 pred;
496 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_PREDICTION_DISABLED(&pred))!=OPUS_OK)test_failed();
497 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PREDICTION_DISABLED((int)(fast_rand()&15)<(pred?11:4)))!=OPUS_OK)test_failed();
498 frame_size=frame[j];
499 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
500 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
501 if((fast_rand()&255)==0)
502 {
503 if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
504 if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
505 if((fast_rand()&3)!=0)
506 {
507 if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
508 }
509 }
510 if((fast_rand()&255)==0)
511 {
512 if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
513 }
514 len = opus_multistream_encode(MSenc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
515 if(len<0 || len>MAX_PACKET)test_failed();
516 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
517 if((fast_rand()&3)==0)
518 {
519 if(opus_multistream_packet_pad(packet,len,len+1,2)!=OPUS_OK)test_failed();
520 len++;
521 }
522 if((fast_rand()&7)==0)
523 {
524 if(opus_multistream_packet_pad(packet,len,len+256,2)!=OPUS_OK)test_failed();
525 len+=256;
526 }
527 if((fast_rand()&3)==0)
528 {
529 len=opus_multistream_packet_unpad(packet,len,2);
530 if(len<1)test_failed();
531 }
532 out_samples = opus_multistream_decode(MSdec, packet, len, out2buf, MAX_FRAME_SAMP, 0);
533 if(out_samples!=frame_size*6)test_failed();
534 if(opus_multistream_decoder_ctl(MSdec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
535 if(enc_final_range!=dec_final_range)test_failed();
536 /*LBRR decode*/
537 loss=(fast_rand()&63)==0;
538 out_samples = opus_multistream_decode(MSdec_err, packet, loss?0:len, out2buf, frame_size*6, (fast_rand()&3)!=0);
539 if(out_samples!=(frame_size*6))test_failed();
540 i+=frame_size;
541 count++;
542 }while(i<(SSAMPLES/12-MAX_FRAME_SAMP));
543 fprintf(stdout," Mode %s NB dual-mono MS encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate);
544 }
545 }
546
547 bitrate_bps=512000;
548 fsize=fast_rand()%31;
549 fswitch=100;
550
551 debruijn2(6,db62);
552 count=i=0;
553 do {
554 unsigned char toc;
555 const unsigned char *frames[48];
556 short size[48];
557 int payload_offset;
558 opus_uint32 dec_final_range2;
559 int jj,dec2;
560 int len,out_samples;
561 int frame_size=fsizes[db62[fsize]];
562 opus_int32 offset=i%(SAMPLES-MAX_FRAME_SAMP);
563
564 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
565
566 len = opus_encode(enc, &inbuf[offset<<1], frame_size, packet, MAX_PACKET);
567 if(len<0 || len>MAX_PACKET)test_failed();
568 count++;
569
570 opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range));
571
572 out_samples = opus_decode(dec, packet, len, &outbuf[offset<<1], MAX_FRAME_SAMP, 0);
573 if(out_samples!=frame_size)test_failed();
574
575 opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
576
577 /* compare final range encoder rng values of encoder and decoder */
578 if(dec_final_range!=enc_final_range)test_failed();
579
580 /* We fuzz the packet, but take care not to only corrupt the payload
581 Corrupted headers are tested elsewhere and we need to actually run
582 the decoders in order to compare them. */
583 if(opus_packet_parse(packet,len,&toc,frames,size,&payload_offset)<=0)test_failed();
584 if((fast_rand()&1023)==0)len=0;
585 for(j=(opus_int32)(frames[0]-packet);j<len;j++)for(jj=0;jj<8;jj++)packet[j]^=((!no_fuzz)&&((fast_rand()&1023)==0))<<jj;
586 out_samples = opus_decode(dec_err[0], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
587 if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed();
588 if((len>0&&out_samples!=frame_size))test_failed(); /*FIXME use lastframe*/
589
590 opus_decoder_ctl(dec_err[0], OPUS_GET_FINAL_RANGE(&dec_final_range));
591
592 /*randomly select one of the decoders to compare with*/
593 dec2=fast_rand()%9+1;
594 out_samples = opus_decode(dec_err[dec2], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
595 if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); /*FIXME, use factor, lastframe for loss*/
596
597 opus_decoder_ctl(dec_err[dec2], OPUS_GET_FINAL_RANGE(&dec_final_range2));
598 if(len>0&&dec_final_range!=dec_final_range2)test_failed();
599
600 fswitch--;
601 if(fswitch<1)
602 {
603 int new_size;
604 fsize=(fsize+1)%36;
605 new_size=fsizes[db62[fsize]];
606 if(new_size==960||new_size==480)fswitch=2880/new_size*(fast_rand()%19+1);
607 else fswitch=(fast_rand()%(2880/new_size))+1;
608 }
609 bitrate_bps=((fast_rand()%508000+4000)+bitrate_bps)>>1;
610 i+=frame_size;
611 }while(i<SAMPLES*4);
612 fprintf(stdout," All framesize pairs switching encode, %d frames OK.\n",count);
613
614 if(opus_encoder_ctl(enc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
615 opus_encoder_destroy(enc);
616 if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
617 opus_multistream_encoder_destroy(MSenc);
618 if(opus_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
619 opus_decoder_destroy(dec);
620 if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
621 opus_multistream_decoder_destroy(MSdec);
622 opus_multistream_decoder_destroy(MSdec_err);
623 for(i=0;i<10;i++)opus_decoder_destroy(dec_err[i]);
624 free(inbuf);
625 free(outbuf);
626 free(out2buf);
627 return 0;
628 }
629
print_usage(char * _argv[])630 void print_usage(char* _argv[])
631 {
632 fprintf(stderr,"Usage: %s [<seed>] [-fuzz <num_encoders> <num_settings_per_encoder>]\n",_argv[0]);
633 }
634
main(int _argc,char ** _argv)635 int main(int _argc, char **_argv)
636 {
637 int args=1;
638 char * strtol_str=NULL;
639 const char * oversion;
640 const char * env_seed;
641 int env_used;
642 int num_encoders_to_fuzz=5;
643 int num_setting_changes=40;
644
645 env_used=0;
646 env_seed=getenv("SEED");
647 if(_argc>1)
648 iseed=strtol(_argv[1], &strtol_str, 10); /* the first input argument might be the seed */
649 if(strtol_str!=NULL && strtol_str[0]=='\0') /* iseed is a valid number */
650 args++;
651 else if(env_seed) {
652 iseed=atoi(env_seed);
653 env_used=1;
654 }
655 else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16);
656 Rw=Rz=iseed;
657
658 while(args<_argc)
659 {
660 if(strcmp(_argv[args], "-fuzz")==0 && _argc==(args+3)) {
661 num_encoders_to_fuzz=strtol(_argv[args+1], &strtol_str, 10);
662 if(strtol_str[0]!='\0' || num_encoders_to_fuzz<=0) {
663 print_usage(_argv);
664 return EXIT_FAILURE;
665 }
666 num_setting_changes=strtol(_argv[args+2], &strtol_str, 10);
667 if(strtol_str[0]!='\0' || num_setting_changes<=0) {
668 print_usage(_argv);
669 return EXIT_FAILURE;
670 }
671 args+=3;
672 }
673 else {
674 print_usage(_argv);
675 return EXIT_FAILURE;
676 }
677 }
678
679 oversion=opus_get_version_string();
680 if(!oversion)test_failed();
681 fprintf(stderr,"Testing %s encoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535);
682 if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed);
683
684 regression_test();
685
686 /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data
687 into the decoders. This is helpful because garbage data
688 may cause the decoders to clip, which angers CLANG IOC.*/
689 run_test1(getenv("TEST_OPUS_NOFUZZ")!=NULL);
690
691 /* Fuzz encoder settings online */
692 if(getenv("TEST_OPUS_NOFUZZ")==NULL) {
693 fprintf(stderr,"Running fuzz_encoder_settings with %d encoder(s) and %d setting change(s) each.\n",
694 num_encoders_to_fuzz, num_setting_changes);
695 fuzz_encoder_settings(num_encoders_to_fuzz, num_setting_changes);
696 }
697
698 fprintf(stderr,"Tests completed successfully.\n");
699
700 return 0;
701 }
702