blob: b80def3f64a1ec8bf40dd42cb582d010b5c67d55 [file] [log] [blame]
Alexandre Lision744f7422013-09-25 11:39:37 -04001/* Copyright (c) 2011 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
55#define PI (3.141592653589793238462643f)
56
57void 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
87static int save_ctr = 0;
88static 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
96static 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
115int run_test1(int no_fuzz)
116{
117 static const int fsizes[6]={960*3,960*2,120,240,480,960};
118 static const char *mstrings[3] = {" LP","Hybrid"," MDCT"};
119 unsigned char mapping[256] = {0,1,255};
120 unsigned char db62[36];
121 opus_int32 i;
122 int rc,j,err;
123 OpusEncoder *enc;
124 OpusMSEncoder *MSenc;
125 OpusDecoder *dec;
126 OpusMSDecoder *MSdec;
127 OpusMSDecoder *MSdec_err;
128 OpusDecoder *dec_err[10];
129 short *inbuf;
130 short *outbuf;
131 short *out2buf;
132 opus_int32 bitrate_bps;
133 unsigned char packet[MAX_PACKET];
134 opus_uint32 enc_final_range;
135 opus_uint32 dec_final_range;
136 int fswitch;
137 int fsize;
138 int count;
139
140 /*FIXME: encoder api tests, fs!=48k, mono, VBR*/
141
142 fprintf(stdout," Encode+Decode tests.\n");
143
144 enc = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &err);
145 if(err != OPUS_OK || enc==NULL)test_failed();
146
147 for(i=0;i<2;i++)
148 {
149 int *ret_err;
150 ret_err = i?0:&err;
151 MSenc = opus_multistream_encoder_create(8000, 2, 2, 0, mapping, OPUS_UNIMPLEMENTED, ret_err);
152 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
153
154 MSenc = opus_multistream_encoder_create(8000, 0, 1, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
155 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
156
157 MSenc = opus_multistream_encoder_create(44100, 2, 2, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
158 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
159
160 MSenc = opus_multistream_encoder_create(8000, 2, 2, 3, mapping, OPUS_APPLICATION_VOIP, ret_err);
161 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
162
163 MSenc = opus_multistream_encoder_create(8000, 2, -1, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
164 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
165
166 MSenc = opus_multistream_encoder_create(8000, 256, 2, 0, mapping, OPUS_APPLICATION_VOIP, ret_err);
167 if((ret_err && *ret_err != OPUS_BAD_ARG) || MSenc!=NULL)test_failed();
168 }
169
170 MSenc = opus_multistream_encoder_create(8000, 2, 2, 0, mapping, OPUS_APPLICATION_AUDIO, &err);
171 if(err != OPUS_OK || MSenc==NULL)test_failed();
172
173 /*Some multistream encoder API tests*/
174 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_BITRATE(&i))!=OPUS_OK)test_failed();
175 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_LSB_DEPTH(&i))!=OPUS_OK)test_failed();
176 if(i<16)test_failed();
177
178 {
179 OpusEncoder *tmp_enc;
180 if(opus_multistream_encoder_ctl(MSenc, OPUS_MULTISTREAM_GET_ENCODER_STATE(1,&tmp_enc))!=OPUS_OK)test_failed();
181 if(opus_encoder_ctl(tmp_enc, OPUS_GET_LSB_DEPTH(&j))!=OPUS_OK)test_failed();
182 if(i!=j)test_failed();
183 if(opus_multistream_encoder_ctl(MSenc, OPUS_MULTISTREAM_GET_ENCODER_STATE(2,&tmp_enc))!=OPUS_BAD_ARG)test_failed();
184 }
185
186 dec = opus_decoder_create(48000, 2, &err);
187 if(err != OPUS_OK || dec==NULL)test_failed();
188
189 MSdec = opus_multistream_decoder_create(48000, 2, 2, 0, mapping, &err);
190 if(err != OPUS_OK || MSdec==NULL)test_failed();
191
192 MSdec_err = opus_multistream_decoder_create(48000, 3, 2, 0, mapping, &err);
193 if(err != OPUS_OK || MSdec_err==NULL)test_failed();
194
195 dec_err[0]=(OpusDecoder *)malloc(opus_decoder_get_size(2));
196 memcpy(dec_err[0],dec,opus_decoder_get_size(2));
197 dec_err[1] = opus_decoder_create(48000, 1, &err);
198 dec_err[2] = opus_decoder_create(24000, 2, &err);
199 dec_err[3] = opus_decoder_create(24000, 1, &err);
200 dec_err[4] = opus_decoder_create(16000, 2, &err);
201 dec_err[5] = opus_decoder_create(16000, 1, &err);
202 dec_err[6] = opus_decoder_create(12000, 2, &err);
203 dec_err[7] = opus_decoder_create(12000, 1, &err);
204 dec_err[8] = opus_decoder_create(8000, 2, &err);
205 dec_err[9] = opus_decoder_create(8000, 1, &err);
206 for(i=0;i<10;i++)if(dec_err[i]==NULL)test_failed();
207
208 {
209 OpusEncoder *enccpy;
210 /*The opus state structures contain no pointers and can be freely copied*/
211 enccpy=(OpusEncoder *)malloc(opus_encoder_get_size(2));
212 memcpy(enccpy,enc,opus_encoder_get_size(2));
213 memset(enc,255,opus_encoder_get_size(2));
214 opus_encoder_destroy(enc);
215 enc=enccpy;
216 }
217
218 inbuf=(short *)malloc(sizeof(short)*SAMPLES*2);
219 outbuf=(short *)malloc(sizeof(short)*SAMPLES*2);
220 out2buf=(short *)malloc(sizeof(short)*MAX_FRAME_SAMP*3);
221 if(inbuf==NULL || outbuf==NULL || out2buf==NULL)test_failed();
222
223 generate_music(inbuf,SAMPLES);
224
225/* FILE *foo;
226 foo = fopen("foo.sw", "wb+");
227 fwrite(inbuf, 1, SAMPLES*2*2, foo);
228 fclose(foo);*/
229
230 if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_AUTO))!=OPUS_OK)test_failed();
231 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(-2))!=OPUS_BAD_ARG)test_failed();
232
233 for(rc=0;rc<3;rc++)
234 {
235 if(opus_encoder_ctl(enc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed();
236 if(opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
237 if(opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
238 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
239 for(j=0;j<13;j++)
240 {
241 int rate;
242 int modes[13]={0,0,0,1,1,1,1,2,2,2,2,2,2};
243 int rates[13]={6000,12000,48000,16000,32000,48000,64000,512000,13000,24000,48000,64000,96000};
244 int frame[13]={960*2,960,480,960,960,960,480,960*3,960*3,960,480,240,120};
245 rate=rates[j]+fast_rand()%rates[j];
246 count=i=0;
247 do {
248 int bw,len,out_samples,frame_size;
249 frame_size=frame[j];
250 if(fast_rand()%50==0)opus_encoder_ctl(enc, OPUS_RESET_STATE);
251 if(fast_rand()%50==0)opus_decoder_ctl(dec, OPUS_RESET_STATE);
252 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
253 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
254 if(opus_encoder_ctl(enc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
255 if(opus_encoder_ctl(enc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
256 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS((rates[j]>=64000?2:1)))!=OPUS_OK)test_failed();
257 if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
258 if(opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
259 bw=modes[j]==0?OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%3):
260 modes[j]==1?OPUS_BANDWIDTH_SUPERWIDEBAND+(fast_rand()&1):
261 OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%5);
262 if(modes[j]==2&&bw==OPUS_BANDWIDTH_MEDIUMBAND)bw+=3;
263 if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bw))!=OPUS_OK)test_failed();
264 len = opus_encode(enc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
265 if(len<0 || len>MAX_PACKET)test_failed();
266 if(opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
267 out_samples = opus_decode(dec, packet, len, &outbuf[i<<1], MAX_FRAME_SAMP, 0);
268 if(out_samples!=frame_size)test_failed();
269 if(opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
270 if(enc_final_range!=dec_final_range)test_failed();
271 /*LBRR decode*/
272 out_samples = opus_decode(dec_err[0], packet, len, out2buf, frame_size, (fast_rand()&3)!=0);
273 if(out_samples!=frame_size)test_failed();
274 out_samples = opus_decode(dec_err[1], packet, (fast_rand()&3)==0?0:len, out2buf, MAX_FRAME_SAMP, (fast_rand()&7)!=0);
275 if(out_samples<120)test_failed();
276 i+=frame_size;
277 count++;
278 }while(i<(SSAMPLES-MAX_FRAME_SAMP));
279 fprintf(stdout," Mode %s FB encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate);
280 }
281 }
282
283 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(OPUS_AUTO))!=OPUS_OK)test_failed();
284 if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO))!=OPUS_OK)test_failed();
285 if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0))!=OPUS_OK)test_failed();
286 if(opus_encoder_ctl(enc, OPUS_SET_DTX(0))!=OPUS_OK)test_failed();
287
288 for(rc=0;rc<3;rc++)
289 {
290 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed();
291 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
292 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
293 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
294 for(j=0;j<16;j++)
295 {
296 int rate;
297 int modes[16]={0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2};
298 int rates[16]={4000,12000,32000,8000,16000,32000,48000,88000,4000,12000,32000,8000,16000,32000,48000,88000};
299 int frame[16]={160*1,160,80,160,160,80,40,20,160*1,160,80,160,160,80,40,20};
300 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0&&j==1))!=OPUS_OK)test_failed();
301 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
302 rate=rates[j]+fast_rand()%rates[j];
303 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
304 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
305 count=i=0;
306 do {
307 int len,out_samples,frame_size,loss;
308 frame_size=frame[j];
309 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
310 if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
311 len = opus_multistream_encode(MSenc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
312 if(len<0 || len>MAX_PACKET)test_failed();
313 if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
314 out_samples = opus_multistream_decode(MSdec, packet, len, out2buf, MAX_FRAME_SAMP, 0);
315 if(out_samples!=frame_size*6)test_failed();
316 if(opus_multistream_decoder_ctl(MSdec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
317 if(enc_final_range!=dec_final_range)test_failed();
318 /*LBRR decode*/
319 loss=(fast_rand()&63)==0;
320 out_samples = opus_multistream_decode(MSdec_err, packet, loss?0:len, out2buf, frame_size*6, (fast_rand()&3)!=0);
321 if(out_samples!=(frame_size*6))test_failed();
322 i+=frame_size;
323 count++;
324 }while(i<(SSAMPLES/12-MAX_FRAME_SAMP));
325 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);
326 }
327 }
328
329 bitrate_bps=512000;
330 fsize=fast_rand()%31;
331 fswitch=100;
332
333 debruijn2(6,db62);
334 count=i=0;
335 do {
336 unsigned char toc;
337 const unsigned char *frames[48];
338 short size[48];
339 int payload_offset;
340 opus_uint32 dec_final_range2;
341 int jj,dec2;
342 int len,out_samples;
343 int frame_size=fsizes[db62[fsize]];
344 opus_int32 offset=i%(SAMPLES-MAX_FRAME_SAMP);
345
346 opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
347
348 len = opus_encode(enc, &inbuf[offset<<1], frame_size, packet, MAX_PACKET);
349 if(len<0 || len>MAX_PACKET)test_failed();
350 count++;
351
352 opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range));
353
354 out_samples = opus_decode(dec, packet, len, &outbuf[offset<<1], MAX_FRAME_SAMP, 0);
355 if(out_samples!=frame_size)test_failed();
356
357 opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
358
359 /* compare final range encoder rng values of encoder and decoder */
360 if(dec_final_range!=enc_final_range)test_failed();
361
362 /* We fuzz the packet, but take care not to only corrupt the payload
363 Corrupted headers are tested elsewhere and we need to actually run
364 the decoders in order to compare them. */
365 if(opus_packet_parse(packet,len,&toc,frames,size,&payload_offset)<=0)test_failed();
366 if((fast_rand()&1023)==0)len=0;
367 for(j=(frames[0]-packet);j<len;j++)for(jj=0;jj<8;jj++)packet[j]^=((!no_fuzz)&&((fast_rand()&1023)==0))<<jj;
368 out_samples = opus_decode(dec_err[0], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
369 if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed();
370 if((len>0&&out_samples!=frame_size))test_failed(); /*FIXME use lastframe*/
371
372 opus_decoder_ctl(dec_err[0], OPUS_GET_FINAL_RANGE(&dec_final_range));
373
374 /*randomly select one of the decoders to compare with*/
375 dec2=fast_rand()%9+1;
376 out_samples = opus_decode(dec_err[dec2], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
377 if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); /*FIXME, use factor, lastframe for loss*/
378
379 opus_decoder_ctl(dec_err[dec2], OPUS_GET_FINAL_RANGE(&dec_final_range2));
380 if(len>0&&dec_final_range!=dec_final_range2)test_failed();
381
382 fswitch--;
383 if(fswitch<1)
384 {
385 int new_size;
386 fsize=(fsize+1)%36;
387 new_size=fsizes[db62[fsize]];
388 if(new_size==960||new_size==480)fswitch=2880/new_size*(fast_rand()%19+1);
389 else fswitch=(fast_rand()%(2880/new_size))+1;
390 }
391 bitrate_bps=((fast_rand()%508000+4000)+bitrate_bps)>>1;
392 i+=frame_size;
393 }while(i<SAMPLES*4);
394 fprintf(stdout," All framesize pairs switching encode, %d frames OK.\n",count);
395
396 opus_encoder_destroy(enc);
397 opus_multistream_encoder_destroy(MSenc);
398 opus_decoder_destroy(dec);
399 opus_multistream_decoder_destroy(MSdec);
400 opus_multistream_decoder_destroy(MSdec_err);
401 for(i=0;i<10;i++)opus_decoder_destroy(dec_err[i]);
402 free(inbuf);
403 free(outbuf);
404 free(out2buf);
405 return 0;
406}
407
408int main(int _argc, char **_argv)
409{
410 const char * oversion;
411 const char * env_seed;
412 int env_used;
413
414 if(_argc>2)
415 {
416 fprintf(stderr,"Usage: %s [<seed>]\n",_argv[0]);
417 return 1;
418 }
419
420 env_used=0;
421 env_seed=getenv("SEED");
422 if(_argc>1)iseed=atoi(_argv[1]);
423 else if(env_seed)
424 {
425 iseed=atoi(env_seed);
426 env_used=1;
427 }
428 else iseed=(opus_uint32)time(NULL)^((getpid()&65535)<<16);
429 Rw=Rz=iseed;
430
431 oversion=opus_get_version_string();
432 if(!oversion)test_failed();
433 fprintf(stderr,"Testing %s encoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535);
434 if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed);
435
436 /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data
437 into the decoders. This is helpful because garbage data
438 may cause the decoders to clip, which angers CLANG IOC.*/
439 run_test1(getenv("TEST_OPUS_NOFUZZ")!=NULL);
440
441 fprintf(stderr,"Tests completed successfully.\n");
442
443 return 0;
444}