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