Doing multiple rotation passes instead of one produces better pulse spreading.
[opus.git] / libentcode / ectest.c
1 #include <stdio.h>
2 #include "probenc.h"
3 #include "probdec.h"
4
5 int main(int _argc,char **_argv){
6   ec_byte_buffer buf;
7   ec_enc         enc;
8   ec_dec         dec;
9   ec_probmod     mod;
10   ec_uint64      sym64;
11   int            ft;
12   int            ftb;
13   int            sym;
14   int            sz;
15   int            s;
16   int            i;
17   /*Testing encoding of raw bit values.*/
18   ec_byte_writeinit(&buf);
19   ec_enc_init(&enc,&buf);
20   for(ft=0;ft<1024;ft++){
21     for(i=0;i<ft;i++){
22       ec_enc_uint(&enc,i,ft);
23       ec_enc_uint64(&enc,(ec_uint64)i<<30|i,(ec_uint64)ft<<30);
24     }
25   }
26   /*Testing encoding of raw bit values.*/
27   for(ftb=0;ftb<16;ftb++){
28     for(i=0;i<(1<<ftb);i++){
29       ec_enc_bits(&enc,i,ftb);
30       ec_enc_bits64(&enc,(ec_uint64)i<<30|i,ftb+30);
31     }
32   }
33   for(sz=1;sz<256;sz++){
34     ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
35     for(i=0;i<sz;i++){
36       s=((unsigned)(i*45678901+7))%sz;
37       ec_probmod_write(&mod,&enc,s);
38     }
39     ec_probmod_clear(&mod);
40   }
41   for(sz=11;sz<256;sz++){
42     ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
43     for(i=0;i<sz;i++){
44       s=((unsigned)(i*45678901+7))%sz;
45       ec_probmod_write_range(&mod,&enc,s,EC_MAXI(s-5,0),EC_MINI(s+6,sz));
46     }
47     ec_probmod_clear(&mod);
48   }
49   ec_enc_done(&enc);
50   fprintf(stderr,"Encoded to %li bytes.\n",(long)(buf.ptr-buf.buf));
51   ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
52   ec_dec_init(&dec,&buf);
53   for(ft=0;ft<1024;ft++){
54     for(i=0;i<ft;i++){
55       sym=ec_dec_uint(&dec,ft);
56       if(sym!=i){
57         fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
58         return -1;
59       }
60       sym64=ec_dec_uint64(&dec,(ec_uint64)ft<<30);
61       if(sym64!=((ec_uint64)i<<30|i)){
62         fprintf(stderr,"Decoded %lli instead of %lli with ft of %lli.\n",sym64,
63          (ec_uint64)i<<30|i,(ec_uint64)ft<<30);
64       }
65     }
66   }
67   for(ftb=0;ftb<16;ftb++){
68     for(i=0;i<(1<<ftb);i++){
69       sym=ec_dec_bits(&dec,ftb);
70       if(sym!=i){
71         fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
72         return -1;
73       }
74       sym64=ec_dec_bits64(&dec,ftb+30);
75       if(sym64!=((ec_uint64)i<<30|i)){
76         fprintf(stderr,"Decoded %lli instead of %lli with ftb of %i.\n",
77          sym64,(ec_uint64)i<<30|i,ftb+30);
78       }
79     }
80   }
81   for(sz=1;sz<256;sz++){
82     ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
83     for(i=0;i<sz;i++){
84       s=((unsigned)(i*45678901+7))%sz;
85       sym=ec_probmod_read(&mod,&dec);
86       if(sym!=s){
87         fprintf(stderr,"Decoded %i instead of %i with sz of %i.\n",sym,s,sz);
88         return -1;
89       }
90     }
91     ec_probmod_clear(&mod);
92   }
93   for(sz=11;sz<256;sz++){
94     ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
95     for(i=0;i<sz;i++){
96       s=((unsigned)(i*45678901+7))%sz;
97       sym=ec_probmod_read_range(&mod,&dec,EC_MAXI(s-5,0),EC_MINI(s+6,sz));
98       if(sym!=s){
99         fprintf(stderr,"Decoded %i instead of %i with sz of %i.\n",sym,s,sz);
100         return -1;
101       }
102     }
103     ec_probmod_clear(&mod);
104   }
105   ec_byte_writeclear(&buf);
106   fprintf(stderr,"All tests passed.\n");
107   return 0;
108 }