xref: /aosp_15_r20/external/libopus/tests/test_opus_decode.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2011-2013 Xiph.Org Foundation
2*a58d3d2aSXin Li    Written by Gregory Maxwell */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li    Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li    modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li    are met:
7*a58d3d2aSXin Li 
8*a58d3d2aSXin Li    - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li 
11*a58d3d2aSXin Li    - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li    documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li 
15*a58d3d2aSXin Li    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19*a58d3d2aSXin Li    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li #include <stdio.h>
33*a58d3d2aSXin Li #include <stdlib.h>
34*a58d3d2aSXin Li #include <limits.h>
35*a58d3d2aSXin Li #include <stdint.h>
36*a58d3d2aSXin Li #include <math.h>
37*a58d3d2aSXin Li #include <string.h>
38*a58d3d2aSXin Li #include <time.h>
39*a58d3d2aSXin Li #ifndef _WIN32
40*a58d3d2aSXin Li #include <unistd.h>
41*a58d3d2aSXin Li #else
42*a58d3d2aSXin Li #include <process.h>
43*a58d3d2aSXin Li #define getpid _getpid
44*a58d3d2aSXin Li #endif
45*a58d3d2aSXin Li #include "opus.h"
46*a58d3d2aSXin Li #include "test_opus_common.h"
47*a58d3d2aSXin Li 
48*a58d3d2aSXin Li #define MAX_PACKET (1500)
49*a58d3d2aSXin Li #define MAX_FRAME_SAMP (5760)
50*a58d3d2aSXin Li 
test_decoder_code0(int no_fuzz)51*a58d3d2aSXin Li int test_decoder_code0(int no_fuzz)
52*a58d3d2aSXin Li {
53*a58d3d2aSXin Li    static const opus_int32 fsv[5]={48000,24000,16000,12000,8000};
54*a58d3d2aSXin Li    int err,skip,plen;
55*a58d3d2aSXin Li    int out_samples,fec;
56*a58d3d2aSXin Li    int t;
57*a58d3d2aSXin Li    opus_int32 i;
58*a58d3d2aSXin Li    OpusDecoder *dec[5*2];
59*a58d3d2aSXin Li    opus_int32 decsize;
60*a58d3d2aSXin Li    OpusDecoder *decbak;
61*a58d3d2aSXin Li    opus_uint32 dec_final_range1,dec_final_range2,dec_final_acc;
62*a58d3d2aSXin Li    unsigned char *packet;
63*a58d3d2aSXin Li    unsigned char modes[4096];
64*a58d3d2aSXin Li    short *outbuf_int;
65*a58d3d2aSXin Li    short *outbuf;
66*a58d3d2aSXin Li 
67*a58d3d2aSXin Li    dec_final_range1=dec_final_range2=2;
68*a58d3d2aSXin Li 
69*a58d3d2aSXin Li    packet=malloc(sizeof(unsigned char)*MAX_PACKET);
70*a58d3d2aSXin Li    if(packet==NULL)test_failed();
71*a58d3d2aSXin Li 
72*a58d3d2aSXin Li    outbuf_int=malloc(sizeof(short)*(MAX_FRAME_SAMP+16)*2);
73*a58d3d2aSXin Li    for(i=0;i<(MAX_FRAME_SAMP+16)*2;i++)outbuf_int[i]=32749;
74*a58d3d2aSXin Li    outbuf=&outbuf_int[8*2];
75*a58d3d2aSXin Li 
76*a58d3d2aSXin Li    fprintf(stdout,"  Starting %d decoders...\n",5*2);
77*a58d3d2aSXin Li    for(t=0;t<5*2;t++)
78*a58d3d2aSXin Li    {
79*a58d3d2aSXin Li       int fs=fsv[t>>1];
80*a58d3d2aSXin Li       int c=(t&1)+1;
81*a58d3d2aSXin Li       err=OPUS_INTERNAL_ERROR;
82*a58d3d2aSXin Li       dec[t] = opus_decoder_create(fs, c, &err);
83*a58d3d2aSXin Li       if(err!=OPUS_OK || dec[t]==NULL)test_failed();
84*a58d3d2aSXin Li       fprintf(stdout,"    opus_decoder_create(%5d,%d) OK. Copy ",fs,c);
85*a58d3d2aSXin Li       {
86*a58d3d2aSXin Li          OpusDecoder *dec2;
87*a58d3d2aSXin Li          /*The opus state structures contain no pointers and can be freely copied*/
88*a58d3d2aSXin Li          dec2=(OpusDecoder *)malloc(opus_decoder_get_size(c));
89*a58d3d2aSXin Li          if(dec2==NULL)test_failed();
90*a58d3d2aSXin Li          memcpy(dec2,dec[t],opus_decoder_get_size(c));
91*a58d3d2aSXin Li          memset(dec[t],255,opus_decoder_get_size(c));
92*a58d3d2aSXin Li          opus_decoder_destroy(dec[t]);
93*a58d3d2aSXin Li          printf("OK.\n");
94*a58d3d2aSXin Li          dec[t]=dec2;
95*a58d3d2aSXin Li       }
96*a58d3d2aSXin Li    }
97*a58d3d2aSXin Li 
98*a58d3d2aSXin Li    decsize=opus_decoder_get_size(1);
99*a58d3d2aSXin Li    decbak=(OpusDecoder *)malloc(decsize);
100*a58d3d2aSXin Li    if(decbak==NULL)test_failed();
101*a58d3d2aSXin Li 
102*a58d3d2aSXin Li    for(t=0;t<5*2;t++)
103*a58d3d2aSXin Li    {
104*a58d3d2aSXin Li       int factor=48000/fsv[t>>1];
105*a58d3d2aSXin Li       for(fec=0;fec<2;fec++)
106*a58d3d2aSXin Li       {
107*a58d3d2aSXin Li          opus_int32 dur;
108*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
109*a58d3d2aSXin Li          opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
110*a58d3d2aSXin Li #endif
111*a58d3d2aSXin Li          /*Test PLC on a fresh decoder*/
112*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, fec);
113*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
114*a58d3d2aSXin Li          if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
115*a58d3d2aSXin Li          if(dur!=120/factor)test_failed();
116*a58d3d2aSXin Li 
117*a58d3d2aSXin Li          /*Test on a size which isn't a multiple of 2.5ms*/
118*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor+2, fec);
119*a58d3d2aSXin Li          if(out_samples!=OPUS_BAD_ARG)test_failed();
120*a58d3d2aSXin Li 
121*a58d3d2aSXin Li          /*Test null pointer input*/
122*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, -1, outbuf, 120/factor, fec);
123*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
124*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, 1, outbuf, 120/factor, fec);
125*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
126*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, 10, outbuf, 120/factor, fec);
127*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
128*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], 0, fast_rand(), outbuf, 120/factor, fec);
129*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
130*a58d3d2aSXin Li          if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
131*a58d3d2aSXin Li          if(dur!=120/factor)test_failed();
132*a58d3d2aSXin Li 
133*a58d3d2aSXin Li          /*Zero lengths*/
134*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 0, outbuf, 120/factor, fec);
135*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
136*a58d3d2aSXin Li 
137*a58d3d2aSXin Li          /*Zero buffer*/
138*a58d3d2aSXin Li          outbuf[0]=32749;
139*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 0, outbuf, 0, fec);
140*a58d3d2aSXin Li          if(out_samples>0)test_failed();
141*a58d3d2aSXin Li #if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3))
142*a58d3d2aSXin Li #pragma GCC diagnostic push
143*a58d3d2aSXin Li #pragma GCC diagnostic ignored "-Wnonnull"
144*a58d3d2aSXin Li #endif
145*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 0, 0, 0, fec);
146*a58d3d2aSXin Li #if !defined(OPUS_BUILD) && (OPUS_GNUC_PREREQ(4, 6) || (defined(__clang_major__) && __clang_major__ >= 3))
147*a58d3d2aSXin Li #pragma GCC diagnostic pop
148*a58d3d2aSXin Li #endif
149*a58d3d2aSXin Li          if(out_samples>0)test_failed();
150*a58d3d2aSXin Li          if(outbuf[0]!=32749)test_failed();
151*a58d3d2aSXin Li 
152*a58d3d2aSXin Li          /*Invalid lengths*/
153*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, -1, outbuf, MAX_FRAME_SAMP, fec);
154*a58d3d2aSXin Li          if(out_samples>=0)test_failed();
155*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, INT_MIN, outbuf, MAX_FRAME_SAMP, fec);
156*a58d3d2aSXin Li          if(out_samples>=0)test_failed();
157*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, -1, outbuf, -1, fec);
158*a58d3d2aSXin Li          if(out_samples>=0)test_failed();
159*a58d3d2aSXin Li 
160*a58d3d2aSXin Li          /*Crazy FEC values*/
161*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 1, outbuf, MAX_FRAME_SAMP, fec?-1:2);
162*a58d3d2aSXin Li          if(out_samples>=0)test_failed();
163*a58d3d2aSXin Li 
164*a58d3d2aSXin Li          /*Reset the decoder*/
165*a58d3d2aSXin Li          if(opus_decoder_ctl(dec[t], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
166*a58d3d2aSXin Li       }
167*a58d3d2aSXin Li    }
168*a58d3d2aSXin Li    fprintf(stdout,"  dec[all] initial frame PLC OK.\n");
169*a58d3d2aSXin Li 
170*a58d3d2aSXin Li    /*Count code 0 tests*/
171*a58d3d2aSXin Li    for(i=0;i<64;i++)
172*a58d3d2aSXin Li    {
173*a58d3d2aSXin Li       opus_int32 dur;
174*a58d3d2aSXin Li       int j,expected[5*2];
175*a58d3d2aSXin Li       packet[0]=i<<2;
176*a58d3d2aSXin Li       packet[1]=255;
177*a58d3d2aSXin Li       packet[2]=255;
178*a58d3d2aSXin Li       err=opus_packet_get_nb_channels(packet);
179*a58d3d2aSXin Li       if(err!=(i&1)+1)test_failed();
180*a58d3d2aSXin Li 
181*a58d3d2aSXin Li       for(t=0;t<5*2;t++){
182*a58d3d2aSXin Li          expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1);
183*a58d3d2aSXin Li          if(expected[t]>2880)test_failed();
184*a58d3d2aSXin Li       }
185*a58d3d2aSXin Li 
186*a58d3d2aSXin Li       for(j=0;j<256;j++)
187*a58d3d2aSXin Li       {
188*a58d3d2aSXin Li          packet[1]=j;
189*a58d3d2aSXin Li          for(t=0;t<5*2;t++)
190*a58d3d2aSXin Li          {
191*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
192*a58d3d2aSXin Li             opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
193*a58d3d2aSXin Li #endif
194*a58d3d2aSXin Li             out_samples = opus_decode(dec[t], packet, 3, outbuf, MAX_FRAME_SAMP, 0);
195*a58d3d2aSXin Li             if(out_samples!=expected[t])test_failed();
196*a58d3d2aSXin Li             if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
197*a58d3d2aSXin Li             if(dur!=out_samples)test_failed();
198*a58d3d2aSXin Li             opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
199*a58d3d2aSXin Li             if(t==0)dec_final_range2=dec_final_range1;
200*a58d3d2aSXin Li             else if(dec_final_range1!=dec_final_range2)test_failed();
201*a58d3d2aSXin Li          }
202*a58d3d2aSXin Li       }
203*a58d3d2aSXin Li 
204*a58d3d2aSXin Li       for(t=0;t<5*2;t++){
205*a58d3d2aSXin Li          int factor=48000/fsv[t>>1];
206*a58d3d2aSXin Li          /* The PLC is run for 6 frames in order to get better PLC coverage. */
207*a58d3d2aSXin Li          for(j=0;j<6;j++)
208*a58d3d2aSXin Li          {
209*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
210*a58d3d2aSXin Li             opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
211*a58d3d2aSXin Li #endif
212*a58d3d2aSXin Li             out_samples = opus_decode(dec[t], 0, 0, outbuf, expected[t], 0);
213*a58d3d2aSXin Li             if(out_samples!=expected[t])test_failed();
214*a58d3d2aSXin Li             if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
215*a58d3d2aSXin Li             if(dur!=out_samples)test_failed();
216*a58d3d2aSXin Li          }
217*a58d3d2aSXin Li          /* Run the PLC once at 2.5ms, as a simulation of someone trying to
218*a58d3d2aSXin Li             do small drift corrections. */
219*a58d3d2aSXin Li          if(expected[t]!=120/factor)
220*a58d3d2aSXin Li          {
221*a58d3d2aSXin Li             out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, 0);
222*a58d3d2aSXin Li             if(out_samples!=120/factor)test_failed();
223*a58d3d2aSXin Li             if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
224*a58d3d2aSXin Li             if(dur!=out_samples)test_failed();
225*a58d3d2aSXin Li          }
226*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 2, outbuf, expected[t]-1, 0);
227*a58d3d2aSXin Li          if(out_samples>0)test_failed();
228*a58d3d2aSXin Li       }
229*a58d3d2aSXin Li    }
230*a58d3d2aSXin Li    fprintf(stdout,"  dec[all] all 2-byte prefix for length 3 and PLC, all modes (64) OK.\n");
231*a58d3d2aSXin Li 
232*a58d3d2aSXin Li    if(no_fuzz)
233*a58d3d2aSXin Li    {
234*a58d3d2aSXin Li       fprintf(stdout,"  Skipping many tests which fuzz the decoder as requested.\n");
235*a58d3d2aSXin Li       free(decbak);
236*a58d3d2aSXin Li       for(t=0;t<5*2;t++)opus_decoder_destroy(dec[t]);
237*a58d3d2aSXin Li       printf("  Decoders stopped.\n");
238*a58d3d2aSXin Li 
239*a58d3d2aSXin Li       err=0;
240*a58d3d2aSXin Li       for(i=0;i<8*2;i++)err|=outbuf_int[i]!=32749;
241*a58d3d2aSXin Li       for(i=MAX_FRAME_SAMP*2;i<(MAX_FRAME_SAMP+8)*2;i++)err|=outbuf[i]!=32749;
242*a58d3d2aSXin Li       if(err)test_failed();
243*a58d3d2aSXin Li 
244*a58d3d2aSXin Li       free(outbuf_int);
245*a58d3d2aSXin Li       free(packet);
246*a58d3d2aSXin Li       return 0;
247*a58d3d2aSXin Li    }
248*a58d3d2aSXin Li 
249*a58d3d2aSXin Li    {
250*a58d3d2aSXin Li      /*We only test a subset of the modes here simply because the longer
251*a58d3d2aSXin Li        durations end up taking a long time.*/
252*a58d3d2aSXin Li       static const int cmodes[4]={16,20,24,28};
253*a58d3d2aSXin Li       static const opus_uint32 cres[4]={116290185,2172123586u,2172123586u,2172123586u};
254*a58d3d2aSXin Li       static const opus_uint32 lres[3]={3285687739u,1481572662,694350475};
255*a58d3d2aSXin Li       static const int lmodes[3]={0,4,8};
256*a58d3d2aSXin Li       int mode=fast_rand()%4;
257*a58d3d2aSXin Li 
258*a58d3d2aSXin Li       packet[0]=cmodes[mode]<<3;
259*a58d3d2aSXin Li       dec_final_acc=0;
260*a58d3d2aSXin Li       t=fast_rand()%10;
261*a58d3d2aSXin Li 
262*a58d3d2aSXin Li       for(i=0;i<65536;i++)
263*a58d3d2aSXin Li       {
264*a58d3d2aSXin Li          int factor=48000/fsv[t>>1];
265*a58d3d2aSXin Li          packet[1]=i>>8;
266*a58d3d2aSXin Li          packet[2]=i&255;
267*a58d3d2aSXin Li          packet[3]=255;
268*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0);
269*a58d3d2aSXin Li          if(out_samples!=120/factor)test_failed();
270*a58d3d2aSXin Li          opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
271*a58d3d2aSXin Li          dec_final_acc+=dec_final_range1;
272*a58d3d2aSXin Li       }
273*a58d3d2aSXin Li       if(dec_final_acc!=cres[mode])test_failed();
274*a58d3d2aSXin Li       fprintf(stdout,"  dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,cmodes[mode]);
275*a58d3d2aSXin Li 
276*a58d3d2aSXin Li       mode=fast_rand()%3;
277*a58d3d2aSXin Li       packet[0]=lmodes[mode]<<3;
278*a58d3d2aSXin Li       dec_final_acc=0;
279*a58d3d2aSXin Li       t=fast_rand()%10;
280*a58d3d2aSXin Li       for(i=0;i<65536;i++)
281*a58d3d2aSXin Li       {
282*a58d3d2aSXin Li          int factor=48000/fsv[t>>1];
283*a58d3d2aSXin Li          packet[1]=i>>8;
284*a58d3d2aSXin Li          packet[2]=i&255;
285*a58d3d2aSXin Li          packet[3]=255;
286*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0);
287*a58d3d2aSXin Li          if(out_samples!=480/factor)test_failed();
288*a58d3d2aSXin Li          opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
289*a58d3d2aSXin Li          dec_final_acc+=dec_final_range1;
290*a58d3d2aSXin Li       }
291*a58d3d2aSXin Li       if(dec_final_acc!=lres[mode])test_failed();
292*a58d3d2aSXin Li       fprintf(stdout,"  dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,lmodes[mode]);
293*a58d3d2aSXin Li    }
294*a58d3d2aSXin Li 
295*a58d3d2aSXin Li    skip=fast_rand()%7;
296*a58d3d2aSXin Li    for(i=0;i<64;i++)
297*a58d3d2aSXin Li    {
298*a58d3d2aSXin Li       int j,expected[5*2];
299*a58d3d2aSXin Li       packet[0]=i<<2;
300*a58d3d2aSXin Li       for(t=0;t<5*2;t++)expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1);
301*a58d3d2aSXin Li       for(j=2+skip;j<1275;j+=4)
302*a58d3d2aSXin Li       {
303*a58d3d2aSXin Li          int jj;
304*a58d3d2aSXin Li          for(jj=0;jj<j;jj++)packet[jj+1]=fast_rand()&255;
305*a58d3d2aSXin Li          for(t=0;t<5*2;t++)
306*a58d3d2aSXin Li          {
307*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
308*a58d3d2aSXin Li             opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
309*a58d3d2aSXin Li #endif
310*a58d3d2aSXin Li             out_samples = opus_decode(dec[t], packet, j+1, outbuf, MAX_FRAME_SAMP, 0);
311*a58d3d2aSXin Li             if(out_samples!=expected[t])test_failed();
312*a58d3d2aSXin Li             opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
313*a58d3d2aSXin Li             if(t==0)dec_final_range2=dec_final_range1;
314*a58d3d2aSXin Li             else if(dec_final_range1!=dec_final_range2)test_failed();
315*a58d3d2aSXin Li          }
316*a58d3d2aSXin Li       }
317*a58d3d2aSXin Li    }
318*a58d3d2aSXin Li    fprintf(stdout,"  dec[all] random packets, all modes (64), every 8th size from from %d bytes to maximum OK.\n",2+skip);
319*a58d3d2aSXin Li 
320*a58d3d2aSXin Li    debruijn2(64,modes);
321*a58d3d2aSXin Li    plen=(fast_rand()%18+3)*8+skip+3;
322*a58d3d2aSXin Li    for(i=0;i<4096;i++)
323*a58d3d2aSXin Li    {
324*a58d3d2aSXin Li       int j,expected[5*2];
325*a58d3d2aSXin Li       packet[0]=modes[i]<<2;
326*a58d3d2aSXin Li       for(t=0;t<5*2;t++)expected[t]=opus_decoder_get_nb_samples(dec[t],packet,plen);
327*a58d3d2aSXin Li       for(j=0;j<plen;j++)packet[j+1]=(fast_rand()|fast_rand())&255;
328*a58d3d2aSXin Li       memcpy(decbak,dec[0],decsize);
329*a58d3d2aSXin Li       if(opus_decode(decbak, packet, plen+1, outbuf, expected[0], 1)!=expected[0])test_failed();
330*a58d3d2aSXin Li       memcpy(decbak,dec[0],decsize);
331*a58d3d2aSXin Li       if(opus_decode(decbak,  0, 0, outbuf, MAX_FRAME_SAMP, 1)<20)test_failed();
332*a58d3d2aSXin Li       memcpy(decbak,dec[0],decsize);
333*a58d3d2aSXin Li       if(opus_decode(decbak,  0, 0, outbuf, MAX_FRAME_SAMP, 0)<20)test_failed();
334*a58d3d2aSXin Li       for(t=0;t<5*2;t++)
335*a58d3d2aSXin Li       {
336*a58d3d2aSXin Li          opus_int32 dur;
337*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
338*a58d3d2aSXin Li          opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
339*a58d3d2aSXin Li #endif
340*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, plen+1, outbuf, MAX_FRAME_SAMP, 0);
341*a58d3d2aSXin Li          if(out_samples!=expected[t])test_failed();
342*a58d3d2aSXin Li          if(t==0)dec_final_range2=dec_final_range1;
343*a58d3d2aSXin Li          else if(dec_final_range1!=dec_final_range2)test_failed();
344*a58d3d2aSXin Li          if(opus_decoder_ctl(dec[t], OPUS_GET_LAST_PACKET_DURATION(&dur))!=OPUS_OK)test_failed();
345*a58d3d2aSXin Li          if(dur!=out_samples)test_failed();
346*a58d3d2aSXin Li       }
347*a58d3d2aSXin Li    }
348*a58d3d2aSXin Li    fprintf(stdout,"  dec[all] random packets, all mode pairs (4096), %d bytes/frame OK.\n",plen+1);
349*a58d3d2aSXin Li 
350*a58d3d2aSXin Li    plen=(fast_rand()%18+3)*8+skip+3;
351*a58d3d2aSXin Li    t=rand()&3;
352*a58d3d2aSXin Li    for(i=0;i<4096;i++)
353*a58d3d2aSXin Li    {
354*a58d3d2aSXin Li       int count,j,expected;
355*a58d3d2aSXin Li       packet[0]=modes[i]<<2;
356*a58d3d2aSXin Li       expected=opus_decoder_get_nb_samples(dec[t],packet,plen);
357*a58d3d2aSXin Li       for(count=0;count<10;count++)
358*a58d3d2aSXin Li       {
359*a58d3d2aSXin Li #if defined(ENABLE_OSCE) || defined(ENABLE_DEEP_PLC)
360*a58d3d2aSXin Li          opus_decoder_ctl(dec[t], OPUS_SET_COMPLEXITY(fast_rand()%11));
361*a58d3d2aSXin Li #endif
362*a58d3d2aSXin Li          for(j=0;j<plen;j++)packet[j+1]=(fast_rand()|fast_rand())&255;
363*a58d3d2aSXin Li          out_samples = opus_decode(dec[t], packet, plen+1, outbuf, MAX_FRAME_SAMP, 0);
364*a58d3d2aSXin Li          if(out_samples!=expected)test_failed();
365*a58d3d2aSXin Li       }
366*a58d3d2aSXin Li    }
367*a58d3d2aSXin Li    fprintf(stdout,"  dec[%3d] random packets, all mode pairs (4096)*10, %d bytes/frame OK.\n",t,plen+1);
368*a58d3d2aSXin Li 
369*a58d3d2aSXin Li    {
370*a58d3d2aSXin Li       int tmodes[1]={25<<2};
371*a58d3d2aSXin Li       opus_uint32 tseeds[1]={140441};
372*a58d3d2aSXin Li       int tlen[1]={157};
373*a58d3d2aSXin Li       opus_int32 tret[1]={480};
374*a58d3d2aSXin Li       t=fast_rand()&1;
375*a58d3d2aSXin Li       for(i=0;i<1;i++)
376*a58d3d2aSXin Li       {
377*a58d3d2aSXin Li          int j;
378*a58d3d2aSXin Li          packet[0]=tmodes[i];
379*a58d3d2aSXin Li          Rw=Rz=tseeds[i];
380*a58d3d2aSXin Li          for(j=1;j<tlen[i];j++)packet[j]=fast_rand()&255;
381*a58d3d2aSXin Li          out_samples=opus_decode(dec[t], packet, tlen[i], outbuf, MAX_FRAME_SAMP, 0);
382*a58d3d2aSXin Li          if(out_samples!=tret[i])test_failed();
383*a58d3d2aSXin Li       }
384*a58d3d2aSXin Li       fprintf(stdout,"  dec[%3d] pre-selected random packets OK.\n",t);
385*a58d3d2aSXin Li    }
386*a58d3d2aSXin Li 
387*a58d3d2aSXin Li    free(decbak);
388*a58d3d2aSXin Li    for(t=0;t<5*2;t++)opus_decoder_destroy(dec[t]);
389*a58d3d2aSXin Li    printf("  Decoders stopped.\n");
390*a58d3d2aSXin Li 
391*a58d3d2aSXin Li    err=0;
392*a58d3d2aSXin Li    for(i=0;i<8*2;i++)err|=outbuf_int[i]!=32749;
393*a58d3d2aSXin Li    for(i=MAX_FRAME_SAMP*2;i<(MAX_FRAME_SAMP+8)*2;i++)err|=outbuf[i]!=32749;
394*a58d3d2aSXin Li    if(err)test_failed();
395*a58d3d2aSXin Li 
396*a58d3d2aSXin Li    free(outbuf_int);
397*a58d3d2aSXin Li    free(packet);
398*a58d3d2aSXin Li    return 0;
399*a58d3d2aSXin Li }
400*a58d3d2aSXin Li 
401*a58d3d2aSXin Li #ifndef DISABLE_FLOAT_API
test_soft_clip(void)402*a58d3d2aSXin Li void test_soft_clip(void)
403*a58d3d2aSXin Li {
404*a58d3d2aSXin Li    int i,j;
405*a58d3d2aSXin Li    float x[1024];
406*a58d3d2aSXin Li    float s[8] = {0, 0, 0, 0, 0, 0, 0, 0};
407*a58d3d2aSXin Li    fprintf(stdout,"  Testing opus_pcm_soft_clip... ");
408*a58d3d2aSXin Li    for(i=0;i<1024;i++)
409*a58d3d2aSXin Li    {
410*a58d3d2aSXin Li       for (j=0;j<1024;j++)
411*a58d3d2aSXin Li       {
412*a58d3d2aSXin Li         x[j]=(j&255)*(1/32.f)-4.f;
413*a58d3d2aSXin Li       }
414*a58d3d2aSXin Li       opus_pcm_soft_clip(&x[i],1024-i,1,s);
415*a58d3d2aSXin Li       for (j=i;j<1024;j++)
416*a58d3d2aSXin Li       {
417*a58d3d2aSXin Li         if(x[j]>1.f)test_failed();
418*a58d3d2aSXin Li         if(x[j]<-1.f)test_failed();
419*a58d3d2aSXin Li       }
420*a58d3d2aSXin Li    }
421*a58d3d2aSXin Li    for(i=1;i<9;i++)
422*a58d3d2aSXin Li    {
423*a58d3d2aSXin Li       for (j=0;j<1024;j++)
424*a58d3d2aSXin Li       {
425*a58d3d2aSXin Li         x[j]=(j&255)*(1/32.f)-4.f;
426*a58d3d2aSXin Li       }
427*a58d3d2aSXin Li       opus_pcm_soft_clip(x,1024/i,i,s);
428*a58d3d2aSXin Li       for (j=0;j<(1024/i)*i;j++)
429*a58d3d2aSXin Li       {
430*a58d3d2aSXin Li         if(x[j]>1.f)test_failed();
431*a58d3d2aSXin Li         if(x[j]<-1.f)test_failed();
432*a58d3d2aSXin Li       }
433*a58d3d2aSXin Li    }
434*a58d3d2aSXin Li    opus_pcm_soft_clip(x,0,1,s);
435*a58d3d2aSXin Li    opus_pcm_soft_clip(x,1,0,s);
436*a58d3d2aSXin Li    opus_pcm_soft_clip(x,1,1,0);
437*a58d3d2aSXin Li    opus_pcm_soft_clip(x,1,-1,s);
438*a58d3d2aSXin Li    opus_pcm_soft_clip(x,-1,1,s);
439*a58d3d2aSXin Li    opus_pcm_soft_clip(0,1,1,s);
440*a58d3d2aSXin Li    printf("OK.\n");
441*a58d3d2aSXin Li }
442*a58d3d2aSXin Li #endif
443*a58d3d2aSXin Li 
main(int _argc,char ** _argv)444*a58d3d2aSXin Li int main(int _argc, char **_argv)
445*a58d3d2aSXin Li {
446*a58d3d2aSXin Li    const char * oversion;
447*a58d3d2aSXin Li    const char * env_seed;
448*a58d3d2aSXin Li    int env_used;
449*a58d3d2aSXin Li 
450*a58d3d2aSXin Li    if(_argc>2)
451*a58d3d2aSXin Li    {
452*a58d3d2aSXin Li       fprintf(stderr,"Usage: %s [<seed>]\n",_argv[0]);
453*a58d3d2aSXin Li       return 1;
454*a58d3d2aSXin Li    }
455*a58d3d2aSXin Li 
456*a58d3d2aSXin Li    env_used=0;
457*a58d3d2aSXin Li    env_seed=getenv("SEED");
458*a58d3d2aSXin Li    if(_argc>1)iseed=atoi(_argv[1]);
459*a58d3d2aSXin Li    else if(env_seed)
460*a58d3d2aSXin Li    {
461*a58d3d2aSXin Li       iseed=atoi(env_seed);
462*a58d3d2aSXin Li       env_used=1;
463*a58d3d2aSXin Li    }
464*a58d3d2aSXin Li    else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16);
465*a58d3d2aSXin Li    Rw=Rz=iseed;
466*a58d3d2aSXin Li 
467*a58d3d2aSXin Li    oversion=opus_get_version_string();
468*a58d3d2aSXin Li    if(!oversion)test_failed();
469*a58d3d2aSXin Li    fprintf(stderr,"Testing %s decoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535);
470*a58d3d2aSXin Li    if(env_used)fprintf(stderr,"  Random seed set from the environment (SEED=%s).\n", env_seed);
471*a58d3d2aSXin Li 
472*a58d3d2aSXin Li    /*Setting TEST_OPUS_NOFUZZ tells the tool not to send garbage data
473*a58d3d2aSXin Li      into the decoders. This is helpful because garbage data
474*a58d3d2aSXin Li      may cause the decoders to clip, which angers CLANG IOC.*/
475*a58d3d2aSXin Li    test_decoder_code0(getenv("TEST_OPUS_NOFUZZ")!=NULL);
476*a58d3d2aSXin Li #ifndef DISABLE_FLOAT_API
477*a58d3d2aSXin Li    test_soft_clip();
478*a58d3d2aSXin Li #endif
479*a58d3d2aSXin Li 
480*a58d3d2aSXin Li    return 0;
481*a58d3d2aSXin Li }
482