Fix the test for gcc version >= 4.6 to work for gcc 5 and up.
[opus.git] / tests / test_opus_decode.c
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 FOUNDATION OR
19    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 #include <unistd.h>
40 #include "../include/opus.h"
41 #include "test_opus_common.h"
42
43 #define MAX_PACKET (1500)
44 #define MAX_FRAME_SAMP (288000)
45 extern int jackpot;
46
47 int test_decoder_code0(void)
48 {
49    static const opus_int32 fsv[5]={48000,24000,16000,12000,8000};
50    int err,skip,plen;
51    int out_samples,fec;
52    int t;
53    opus_int32 i;
54    OpusDecoder *dec[5*2];
55    opus_uint32 dec_final_range1,dec_final_range2,dec_final_acc;
56    unsigned char *packet;
57    unsigned char modes[4096];
58    short *outbuf_int;
59    short *outbuf;
60
61    dec_final_range1=dec_final_range2=2;
62
63    packet=malloc(sizeof(unsigned char)*MAX_PACKET);
64    if(packet==NULL)test_failed();
65
66    outbuf_int=malloc(sizeof(short)*(MAX_FRAME_SAMP+16)*2);
67    for(i=0;i<(MAX_FRAME_SAMP+16)*2;i++)outbuf_int[i]=32749;
68    outbuf=&outbuf_int[8*2];
69
70    fprintf(stdout,"  Starting %d decoders...\n",5*2);
71    for(t=0;t<5*2;t++)
72    {
73       int fs=fsv[t>>1];
74       int c=(t&1)+1;
75       err=OPUS_INTERNAL_ERROR;
76       dec[t] = opus_decoder_create(fs, c, &err);
77       if(err!=OPUS_OK || dec[t]==NULL)test_failed();
78       fprintf(stdout,"    opus_decoder_create(%5d,%d) OK. Copy ",fs,c);
79       {
80          OpusDecoder *dec2;
81          /*The opus state structures contain no pointers and can be freely copied*/
82          dec2=(OpusDecoder *)malloc(opus_decoder_get_size(c));
83          if(dec2==NULL)test_failed();
84          memcpy(dec2,dec[t],opus_decoder_get_size(c));
85          memset(dec[t],255,opus_decoder_get_size(c));
86          opus_decoder_destroy(dec[t]);
87          printf("OK.\n");
88          dec[t]=dec2;
89       }
90    }
91
92    for(t=0;t<5*2;t++)
93    {
94       int factor=48000/fsv[t>>1];
95       for(fec=0;fec<2;fec++)
96       {
97          /*Test PLC on a fresh decoder*/
98          out_samples = opus_decode(dec[t], 0, 0, outbuf, MAX_FRAME_SAMP, fec);
99          if(out_samples!=120/factor)test_failed();
100
101          /*Test null pointer input*/
102          out_samples = opus_decode(dec[t], 0, -1, outbuf, MAX_FRAME_SAMP, fec);
103          if(out_samples!=120/factor)test_failed();
104          out_samples = opus_decode(dec[t], 0, 1, outbuf, MAX_FRAME_SAMP, fec);
105          if(out_samples!=120/factor)test_failed();
106          out_samples = opus_decode(dec[t], 0, 10, outbuf, MAX_FRAME_SAMP, fec);
107          if(out_samples!=120/factor)test_failed();
108          out_samples = opus_decode(dec[t], 0, fast_rand(), outbuf, MAX_FRAME_SAMP, fec);
109          if(out_samples!=120/factor)test_failed();
110
111          /*Zero lengths*/
112          out_samples = opus_decode(dec[t], packet, 0, outbuf, MAX_FRAME_SAMP, fec);
113          if(out_samples!=120/factor)test_failed();
114
115          /*Zero buffer*/
116          outbuf[0]=32749;
117          out_samples = opus_decode(dec[t], packet, 0, outbuf, 0, fec);
118          if(out_samples>0)test_failed();
119          out_samples = opus_decode(dec[t], packet, 0, 0, 0, fec);
120          if(out_samples>0)test_failed();
121          if(outbuf[0]!=32749)test_failed();
122
123          /*Invalid lengths*/
124          out_samples = opus_decode(dec[t], packet, -1, outbuf, MAX_FRAME_SAMP, fec);
125          if(out_samples>=0)test_failed();
126          out_samples = opus_decode(dec[t], packet, INT_MIN, outbuf, MAX_FRAME_SAMP, fec);
127          if(out_samples>=0)test_failed();
128          out_samples = opus_decode(dec[t], packet, -1, outbuf, -1, fec);
129          if(out_samples>=0)test_failed();
130
131          /*Crazy FEC values*/
132          out_samples = opus_decode(dec[t], packet, 1, outbuf, MAX_FRAME_SAMP, fec?-1:2);
133          if(out_samples>=0)test_failed();
134
135          /*Reset the decoder*/
136          if(opus_decoder_ctl(dec[t], OPUS_RESET_STATE)!=OPUS_OK)test_failed();
137       }
138    }
139    fprintf(stdout,"  dec[all] initial frame PLC OK.\n");
140
141    /*Count code 0 tests*/
142    for(i=0;i<64;i++)
143    {
144       int j,expected[5*2];
145       packet[0]=i<<2;
146       packet[1]=255;
147       packet[2]=255;
148       err=opus_packet_get_nb_channels(packet);
149       if(err!=(i&1)+1)test_failed();
150
151       for(t=0;t<5*2;t++){
152          expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1);
153          if(expected[t]>2880)test_failed();
154       }
155
156       for(j=0;j<256;j++)
157       {
158          packet[1]=j;
159          for(t=0;t<5*2;t++)
160          {
161             out_samples = opus_decode(dec[t], packet, 3, outbuf, MAX_FRAME_SAMP, 0);
162             if(out_samples!=expected[t])test_failed();
163             opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
164             if(t==0)dec_final_range2=dec_final_range1;
165             else if(dec_final_range1!=dec_final_range2)test_failed();
166          }
167       }
168
169       for(t=0;t<5*2;t++){
170          int factor=48000/fsv[t>>1];
171          /* The PLC is run for 6 frames in order to get better PLC coverage. */
172          for(j=0;j<6;j++)
173          {
174             out_samples = opus_decode(dec[t], 0, 0, outbuf, MAX_FRAME_SAMP, 0);
175             if(out_samples!=expected[t])test_failed();
176          }
177          /* Run the PLC once at 2.5ms, as a simulation of someone trying to
178             do small drift corrections. */
179          if(expected[t]!=120/factor)
180          {
181             out_samples = opus_decode(dec[t], 0, 0, outbuf, 120/factor, 0);
182             if(out_samples!=120/factor)test_failed();
183          }
184          out_samples = opus_decode(dec[t], packet, 2, outbuf, expected[t]-1, 0);
185          if(out_samples>0)test_failed();
186       }
187    }
188    fprintf(stdout,"  dec[all] all 2-byte prefix for length 3 and PLC, all modes (64) OK.\n");
189
190    {
191      /*We only test a subset of the modes here simply because the longer
192        durations end up taking a long time.*/
193       static const int cmodes[4]={16,20,24,28};
194       static const opus_uint32 cres[4]={116290185,2172123586,2172123586,2172123586};
195       static const opus_uint32 lres[3]={3285687739,1481572662,694350475};
196       static const int lmodes[3]={0,4,8};
197       int mode=fast_rand()%4;
198
199       packet[0]=cmodes[mode]<<3;
200       dec_final_acc=0;
201       t=fast_rand()%10;
202
203       for(i=0;i<65536;i++)
204       {
205          int factor=48000/fsv[t>>1];
206          packet[1]=i>>8;
207          packet[2]=i&255;
208          packet[3]=255;
209          out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0);
210          if(out_samples!=120/factor)test_failed();
211          opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
212          dec_final_acc+=dec_final_range1;
213       }
214       if(dec_final_acc!=cres[mode])test_failed();
215       fprintf(stdout,"  dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,cmodes[mode]);
216
217       mode=fast_rand()%3;
218       packet[0]=lmodes[mode]<<3;
219       dec_final_acc=0;
220       t=fast_rand()%10;
221       for(i=0;i<65536;i++)
222       {
223          int factor=48000/fsv[t>>1];
224          packet[1]=i>>8;
225          packet[2]=i&255;
226          packet[3]=255;
227          out_samples = opus_decode(dec[t], packet, 4, outbuf, MAX_FRAME_SAMP, 0);
228          if(out_samples!=480/factor)test_failed();
229          opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
230          dec_final_acc+=dec_final_range1;
231       }
232       if(dec_final_acc!=lres[mode])test_failed();
233       fprintf(stdout,"  dec[%3d] all 3-byte prefix for length 4, mode %2d OK.\n",t,lmodes[mode]);
234    }
235
236    skip=fast_rand()%7;
237    for(i=0;i<64;i++)
238    {
239       int j,expected[5*2];
240       packet[0]=i<<2;
241       for(t=0;t<5*2;t++)expected[t]=opus_decoder_get_nb_samples(dec[t],packet,1);
242       for(j=2+skip;j<1275;j+=4)
243       {
244          int jj;
245          for(jj=0;jj<j;jj++)packet[jj+1]=fast_rand()&255;
246          for(t=0;t<5*2;t++)
247          {
248             out_samples = opus_decode(dec[t], packet, j+1, outbuf, MAX_FRAME_SAMP, 0);
249             if(out_samples!=expected[t])test_failed();
250             opus_decoder_ctl(dec[t], OPUS_GET_FINAL_RANGE(&dec_final_range1));
251             if(t==0)dec_final_range2=dec_final_range1;
252             else if(dec_final_range1!=dec_final_range2)test_failed();
253          }
254       }
255    }
256    fprintf(stdout,"  dec[all] random packets, all modes (64), every 8th size from from %d bytes to maximum OK.\n",2+skip);
257
258    debruijn2(64,modes);
259    plen=(fast_rand()%18+3)*8+skip+3;
260    for(i=0;i<4096;i++)
261    {
262       int j,expected[5*2];
263       packet[0]=modes[i]<<2;
264       for(t=0;t<5*2;t++)expected[t]=opus_decoder_get_nb_samples(dec[t],packet,plen);
265       for(j=0;j<plen;j++)packet[j+1]=(fast_rand()|fast_rand())&255;
266       for(t=0;t<5*2;t++)
267       {
268          out_samples = opus_decode(dec[t], packet, plen+1, outbuf, MAX_FRAME_SAMP, 0);
269          if(out_samples!=expected[t])test_failed();
270          if(t==0)dec_final_range2=dec_final_range1;
271          else if(dec_final_range1!=dec_final_range2)test_failed();
272       }
273    }
274    fprintf(stdout,"  dec[all] random packets, all mode pairs (4096), %d bytes/frame OK.\n",plen+1);
275
276    plen=(fast_rand()%18+3)*8+skip+3;
277    t=rand()&3;
278    for(i=0;i<4096;i++)
279    {
280       int count,j,expected;
281       packet[0]=modes[i]<<2;
282       expected=opus_decoder_get_nb_samples(dec[t],packet,plen);
283       for(count=0;count<10;count++)
284       {
285          for(j=0;j<plen;j++)packet[j+1]=(fast_rand()|fast_rand())&255;
286          out_samples = opus_decode(dec[t], packet, plen+1, outbuf, MAX_FRAME_SAMP, 0);
287          if(out_samples!=expected)test_failed();
288       }
289    }
290    fprintf(stdout,"  dec[%3d] random packets, all mode pairs (4096)*10, %d bytes/frame OK.\n",t,plen+1);
291
292    {
293       int tmodes[1]={25<<2};
294       opus_uint32 tseeds[1]={140441};
295       int tlen[1]={157};
296       opus_int32 tret[1]={480};
297       t=fast_rand()&1;
298       for(i=0;i<1;i++)
299       {
300          int j;
301          packet[0]=tmodes[i];
302          Rw=Rz=tseeds[i];
303          for(j=1;j<tlen[i];j++)packet[j]=fast_rand()&255;
304          out_samples=opus_decode(dec[t], packet, tlen[i], outbuf, MAX_FRAME_SAMP, 0);
305          if(out_samples!=tret[i])test_failed();
306       }
307       fprintf(stdout,"  dec[%3d] pre-selected random packets OK.\n",t);
308    }
309
310    for(t=0;t<5*2;t++)opus_decoder_destroy(dec[t]);
311    printf("  Decoders stopped.\n");
312
313    err=0;
314    for(i=0;i<8*2;i++)err|=outbuf_int[i]!=32749;
315    for(i=MAX_FRAME_SAMP*2;i<(MAX_FRAME_SAMP+8)*2;i++)err|=outbuf[i]!=32749;
316    if(err)test_failed();
317
318    free(outbuf_int);
319    free(packet);
320    return 0;
321 }
322
323 int main(int _argc, char **_argv)
324 {
325    const char * oversion;
326    if(_argc>2)
327    {
328       fprintf(stderr,"Usage: %s [<seed>]\n",_argv[0]);
329       return 1;
330    }
331
332    if(_argc>1)iseed=atoi(_argv[1]);
333    else iseed=(opus_uint32)time(NULL)^((getpid()&65535)<<16);
334    Rw=Rz=iseed;
335
336    oversion=opus_get_version_string();
337    if(!oversion)test_failed();
338    fprintf(stderr,"Testing %s decoder. Random seed: %u (%.4X)\n", oversion, iseed, fast_rand() % 65535);
339
340    test_decoder_code0();
341
342    return 0;
343 }