A stereo example.
[opus.git] / tests / ectest.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <math.h>
8 #include "entcode.h"
9 #include "entenc.h"
10 #include "entdec.h"
11
12 #include "../libcelt/rangeenc.c"
13 #include "../libcelt/rangedec.c"
14 #include "../libcelt/entenc.c"
15 #include "../libcelt/entdec.c"
16 #include "../libcelt/entcode.c"
17
18 #ifndef M_LOG2E
19 # define M_LOG2E    1.4426950408889634074
20 #endif
21
22 int main(int _argc,char **_argv){
23   ec_byte_buffer buf;
24   ec_enc         enc;
25   ec_dec         dec;
26   long           nbits;
27   long           nbits2;
28   double         entropy;
29   int            ft;
30   int            ftb;
31   int            sym;
32   int            sz;
33   int            i;
34   int            ret;
35   ret=0;
36   entropy=0;
37   /*Testing encoding of raw bit values.*/
38   ec_byte_writeinit(&buf);
39   ec_enc_init(&enc,&buf);
40   for(ft=2;ft<1024;ft++){
41     for(i=0;i<ft;i++){
42       entropy+=log(ft)*M_LOG2E;
43       ec_enc_uint(&enc,i,ft);
44     }
45   }
46   /*Testing encoding of raw bit values.*/
47   for(ftb=0;ftb<16;ftb++){
48     for(i=0;i<(1<<ftb);i++){
49       entropy+=ftb;
50       nbits=ec_enc_tell(&enc,0);
51       ec_enc_bits(&enc,i,ftb);
52       nbits2=ec_enc_tell(&enc,0);
53       if(nbits2-nbits!=ftb){
54         fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
55          nbits2-nbits,ftb);
56         ret=-1;
57       }
58     }
59   }
60   nbits=ec_enc_tell(&enc,4);
61   ec_enc_done(&enc);
62   fprintf(stderr,
63    "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
64    entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
65   fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
66   ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
67   ec_dec_init(&dec,&buf);
68   for(ft=2;ft<1024;ft++){
69     for(i=0;i<ft;i++){
70       sym=ec_dec_uint(&dec,ft);
71       if(sym!=i){
72         fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
73         ret=-1;
74       }
75     }
76   }
77   for(ftb=0;ftb<16;ftb++){
78     for(i=0;i<(1<<ftb);i++){
79       sym=ec_dec_bits(&dec,ftb);
80       if(sym!=i){
81         fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
82         ret=-1;
83       }
84     }
85   }
86   nbits2=ec_dec_tell(&dec,4);
87   if(nbits!=nbits2){
88     fprintf(stderr,
89      "Reported number of bits used was %0.2lf, should be %0.2lf.\n",
90      ldexp(nbits2,-4),ldexp(nbits,-4));
91     ret=-1;
92   }
93   ec_byte_writeclear(&buf);
94   fprintf(stderr,"Testing random streams...\n");
95   srand(0);
96   for(i=0;i<409600;i++){
97     unsigned *data;
98     int       j;
99     int tell_bits;
100     int zeros;
101     ft=rand()/((RAND_MAX>>(rand()%11))+1)+10;
102     sz=rand()/((RAND_MAX>>(rand()%9))+1);
103     data=(unsigned *)malloc(sz*sizeof(*data));
104     ec_byte_writeinit(&buf);
105     ec_enc_init(&enc,&buf);
106     zeros = rand()%13==0;
107     for(j=0;j<sz;j++){
108       if (zeros)
109         data[j]=0;
110       else
111         data[j]=rand()%ft;
112       ec_enc_uint(&enc,data[j],ft);
113     }
114     if (rand()%2==0)
115       while(ec_enc_tell(&enc, 0)%8 != 0)
116         ec_enc_uint(&enc, rand()%2, 2);
117     tell_bits = ec_enc_tell(&enc, 0);
118     ec_enc_done(&enc);
119     if ((tell_bits+7)/8 < ec_byte_bytes(&buf))
120     {
121       fprintf (stderr, "tell() lied, there's %li bytes instead of %d\n", 
122                ec_byte_bytes(&buf), (tell_bits+7)/8);
123       ret=-1;
124     }
125     tell_bits -= 8*ec_byte_bytes(&buf);
126     ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
127     ec_dec_init(&dec,&buf);
128     for(j=0;j<sz;j++){
129       sym=ec_dec_uint(&dec,ft);
130       if(sym!=data[j]){
131         fprintf(stderr,
132          "Decoded %i instead of %i with ft of %i at position %i of %i.\n",
133          sym,data[j],ft,j,sz);
134         ret=-1;
135       }
136     }
137     ec_byte_writeclear(&buf);
138     free(data);
139   }
140   return ret;
141 }