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
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 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
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+257];
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()&255)==0)
251            {
252               if(opus_encoder_ctl(enc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
253               if(opus_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
254               if((fast_rand()&1)!=0)
255               {
256                  if(opus_decoder_ctl(dec_err[fast_rand()&1], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
257               }
258            }
259            if((fast_rand()&127)==0)
260            {
261               if(opus_decoder_ctl(dec_err[fast_rand()&1], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
262            }
263            if(fast_rand()%10==0){
264               int complex=fast_rand()%11;
265               if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complex))!=OPUS_OK)test_failed();
266            }
267            if(fast_rand()%50==0)opus_decoder_ctl(dec, OPUS_RESET_STATE);
268            if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
269            if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
270            if(opus_encoder_ctl(enc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
271            if(opus_encoder_ctl(enc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
272            if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS((rates[j]>=64000?2:1)))!=OPUS_OK)test_failed();
273            if(opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
274            if(opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
275            bw=modes[j]==0?OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%3):
276               modes[j]==1?OPUS_BANDWIDTH_SUPERWIDEBAND+(fast_rand()&1):
277                           OPUS_BANDWIDTH_NARROWBAND+(fast_rand()%5);
278            if(modes[j]==2&&bw==OPUS_BANDWIDTH_MEDIUMBAND)bw+=3;
279            if(opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bw))!=OPUS_OK)test_failed();
280            len = opus_encode(enc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
281            if(len<0 || len>MAX_PACKET)test_failed();
282            if(opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
283            if((fast_rand()&3)==0)
284            {
285               if(opus_packet_pad(packet,len,len+1)!=OPUS_OK)test_failed();
286               len++;
287            }
288            if((fast_rand()&7)==0)
289            {
290               if(opus_packet_pad(packet,len,len+256)!=OPUS_OK)test_failed();
291               len+=256;
292            }
293            if((fast_rand()&3)==0)
294            {
295               len=opus_packet_unpad(packet,len);
296               if(len<1)test_failed();
297            }
298            out_samples = opus_decode(dec, packet, len, &outbuf[i<<1], MAX_FRAME_SAMP, 0);
299            if(out_samples!=frame_size)test_failed();
300            if(opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
301            if(enc_final_range!=dec_final_range)test_failed();
302            /*LBRR decode*/
303            out_samples = opus_decode(dec_err[0], packet, len, out2buf, frame_size, (fast_rand()&3)!=0);
304            if(out_samples!=frame_size)test_failed();
305            out_samples = opus_decode(dec_err[1], packet, (fast_rand()&3)==0?0:len, out2buf, MAX_FRAME_SAMP, (fast_rand()&7)!=0);
306            if(out_samples<120)test_failed();
307            i+=frame_size;
308            count++;
309         }while(i<(SSAMPLES-MAX_FRAME_SAMP));
310         fprintf(stdout,"    Mode %s FB encode %s, %6d bps OK.\n",mstrings[modes[j]],rc==0?" VBR":rc==1?"CVBR":" CBR",rate);
311      }
312   }
313
314   if(opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(OPUS_AUTO))!=OPUS_OK)test_failed();
315   if(opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(OPUS_AUTO))!=OPUS_OK)test_failed();
316   if(opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(0))!=OPUS_OK)test_failed();
317   if(opus_encoder_ctl(enc, OPUS_SET_DTX(0))!=OPUS_OK)test_failed();
318
319   for(rc=0;rc<3;rc++)
320   {
321      if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR(rc<2))!=OPUS_OK)test_failed();
322      if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
323      if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_VBR_CONSTRAINT(rc==1))!=OPUS_OK)test_failed();
324      if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0))!=OPUS_OK)test_failed();
325      for(j=0;j<16;j++)
326      {
327         int rate;
328         int modes[16]={0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2};
329         int rates[16]={4000,12000,32000,8000,16000,32000,48000,88000,4000,12000,32000,8000,16000,32000,48000,88000};
330         int frame[16]={160*1,160,80,160,160,80,40,20,160*1,160,80,160,160,80,40,20};
331         if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_INBAND_FEC(rc==0&&j==1))!=OPUS_OK)test_failed();
332         if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_FORCE_MODE(MODE_SILK_ONLY+modes[j]))!=OPUS_OK)test_failed();
333         rate=rates[j]+fast_rand()%rates[j];
334         if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_DTX(fast_rand()&1))!=OPUS_OK)test_failed();
335         if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_BITRATE(rate))!=OPUS_OK)test_failed();
336         count=i=0;
337         do {
338            int pred,len,out_samples,frame_size,loss;
339            if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_PREDICTION_DISABLED(&pred))!=OPUS_OK)test_failed();
340            if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PREDICTION_DISABLED((int)(fast_rand()&15)<(pred?11:4)))!=OPUS_OK)test_failed();
341            frame_size=frame[j];
342            if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_COMPLEXITY((count>>2)%11))!=OPUS_OK)test_failed();
343            if(opus_multistream_encoder_ctl(MSenc, OPUS_SET_PACKET_LOSS_PERC((fast_rand()&15)&(fast_rand()%15)))!=OPUS_OK)test_failed();
344            if((fast_rand()&255)==0)
345            {
346               if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
347               if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
348               if((fast_rand()&3)!=0)
349               {
350                  if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
351               }
352            }
353            if((fast_rand()&255)==0)
354            {
355               if(opus_multistream_decoder_ctl(MSdec_err, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
356            }
357            len = opus_multistream_encode(MSenc, &inbuf[i<<1], frame_size, packet, MAX_PACKET);
358            if(len<0 || len>MAX_PACKET)test_failed();
359            if(opus_multistream_encoder_ctl(MSenc, OPUS_GET_FINAL_RANGE(&enc_final_range))!=OPUS_OK)test_failed();
360            if((fast_rand()&3)==0)
361            {
362               if(opus_multistream_packet_pad(packet,len,len+1,2)!=OPUS_OK)test_failed();
363               len++;
364            }
365            if((fast_rand()&7)==0)
366            {
367               if(opus_multistream_packet_pad(packet,len,len+256,2)!=OPUS_OK)test_failed();
368               len+=256;
369            }
370            if((fast_rand()&3)==0)
371            {
372               len=opus_multistream_packet_unpad(packet,len,2);
373               if(len<1)test_failed();
374            }
375            out_samples = opus_multistream_decode(MSdec, packet, len, out2buf, MAX_FRAME_SAMP, 0);
376            if(out_samples!=frame_size*6)test_failed();
377            if(opus_multistream_decoder_ctl(MSdec, OPUS_GET_FINAL_RANGE(&dec_final_range))!=OPUS_OK)test_failed();
378            if(enc_final_range!=dec_final_range)test_failed();
379            /*LBRR decode*/
380            loss=(fast_rand()&63)==0;
381            out_samples = opus_multistream_decode(MSdec_err, packet, loss?0:len, out2buf, frame_size*6, (fast_rand()&3)!=0);
382            if(out_samples!=(frame_size*6))test_failed();
383            i+=frame_size;
384            count++;
385         }while(i<(SSAMPLES/12-MAX_FRAME_SAMP));
386         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);
387      }
388   }
389
390   bitrate_bps=512000;
391   fsize=fast_rand()%31;
392   fswitch=100;
393
394   debruijn2(6,db62);
395   count=i=0;
396   do {
397      unsigned char toc;
398      const unsigned char *frames[48];
399      short size[48];
400      int payload_offset;
401      opus_uint32 dec_final_range2;
402      int jj,dec2;
403      int len,out_samples;
404      int frame_size=fsizes[db62[fsize]];
405      opus_int32 offset=i%(SAMPLES-MAX_FRAME_SAMP);
406
407      opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps));
408
409      len = opus_encode(enc, &inbuf[offset<<1], frame_size, packet, MAX_PACKET);
410      if(len<0 || len>MAX_PACKET)test_failed();
411      count++;
412
413      opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range));
414
415      out_samples = opus_decode(dec, packet, len, &outbuf[offset<<1], MAX_FRAME_SAMP, 0);
416      if(out_samples!=frame_size)test_failed();
417
418      opus_decoder_ctl(dec, OPUS_GET_FINAL_RANGE(&dec_final_range));
419
420      /* compare final range encoder rng values of encoder and decoder */
421      if(dec_final_range!=enc_final_range)test_failed();
422
423      /* We fuzz the packet, but take care not to only corrupt the payload
424         Corrupted headers are tested elsewhere and we need to actually run
425         the decoders in order to compare them. */
426      if(opus_packet_parse(packet,len,&toc,frames,size,&payload_offset)<=0)test_failed();
427      if((fast_rand()&1023)==0)len=0;
428      for(j=(frames[0]-packet);j<len;j++)for(jj=0;jj<8;jj++)packet[j]^=((!no_fuzz)&&((fast_rand()&1023)==0))<<jj;
429      out_samples = opus_decode(dec_err[0], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
430      if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed();
431      if((len>0&&out_samples!=frame_size))test_failed(); /*FIXME use lastframe*/
432
433      opus_decoder_ctl(dec_err[0], OPUS_GET_FINAL_RANGE(&dec_final_range));
434
435      /*randomly select one of the decoders to compare with*/
436      dec2=fast_rand()%9+1;
437      out_samples = opus_decode(dec_err[dec2], len>0?packet:NULL, len, out2buf, MAX_FRAME_SAMP, 0);
438      if(out_samples<0||out_samples>MAX_FRAME_SAMP)test_failed(); /*FIXME, use factor, lastframe for loss*/
439
440      opus_decoder_ctl(dec_err[dec2], OPUS_GET_FINAL_RANGE(&dec_final_range2));
441      if(len>0&&dec_final_range!=dec_final_range2)test_failed();
442
443      fswitch--;
444      if(fswitch<1)
445      {
446        int new_size;
447        fsize=(fsize+1)%36;
448        new_size=fsizes[db62[fsize]];
449        if(new_size==960||new_size==480)fswitch=2880/new_size*(fast_rand()%19+1);
450        else fswitch=(fast_rand()%(2880/new_size))+1;
451      }
452      bitrate_bps=((fast_rand()%508000+4000)+bitrate_bps)>>1;
453      i+=frame_size;
454   }while(i<SAMPLES*4);
455   fprintf(stdout,"    All framesize pairs switching encode, %d frames OK.\n",count);
456
457   if(opus_encoder_ctl(enc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
458   opus_encoder_destroy(enc);
459   if(opus_multistream_encoder_ctl(MSenc, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
460   opus_multistream_encoder_destroy(MSenc);
461   if(opus_decoder_ctl(dec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
462   opus_decoder_destroy(dec);
463   if(opus_multistream_decoder_ctl(MSdec, OPUS_RESET_STATE)!=OPUS_OK)test_failed();
464   opus_multistream_decoder_destroy(MSdec);
465   opus_multistream_decoder_destroy(MSdec_err);
466   for(i=0;i<10;i++)opus_decoder_destroy(dec_err[i]);
467   free(inbuf);
468   free(outbuf);
469   free(out2buf);
470   return 0;
471}
472
473int main(int _argc, char **_argv)
474{
475   const char * oversion;
476   const char * env_seed;
477   int env_used;
478
479   if(_argc>2)
480   {
481      fprintf(stderr,"Usage: %s [<seed>]\n",_argv[0]);
482      return 1;
483   }
484
485   env_used=0;
486   env_seed=getenv("SEED");
487   if(_argc>1)iseed=atoi(_argv[1]);
488   else if(env_seed)
489   {
490      iseed=atoi(env_seed);
491      env_used=1;
492   }
493   else iseed=(opus_uint32)time(NULL)^((getpid()&65535)<<16);
494   Rw=Rz=iseed;
495
496   oversion=opus_get_version_string();
497   if(!oversion)test_failed();
498   fprintf(stderr,"Testing %s encoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535);
499   if(env_used)fprintf(stderr,"  Random seed set from the environment (SEED=%s).\n", env_seed);
500
501   /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data
502     into the decoders. This is helpful because garbage data
503     may cause the decoders to clip, which angers CLANG IOC.*/
504   run_test1(getenv("TEST_OPUS_NOFUZZ")!=NULL);
505
506   fprintf(stderr,"Tests completed successfully.\n");
507
508   return 0;
509}
510