Home | History | Annotate | Download | only in tests
      1 /* 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 
     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 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 
    115 int 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 
    408 int 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 }
    445