Recognizes if input is ogg or not.
[xiph.git] / ghost / libentcode / ectest.c
blob0f0fae811dd369d0b1c3ed02143fd4f37430ad3e
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include "probenc.h"
5 #include "probdec.h"
6 #include "bitrenc.h"
8 int main(int _argc,char **_argv){
9 ec_byte_buffer buf;
10 ec_enc enc;
11 ec_dec dec;
12 ec_probmod mod;
13 ec_uint64 sym64;
14 long nbits;
15 long nbits2;
16 double entropy;
17 int ft;
18 int ftb;
19 int sym;
20 int sz;
21 int s;
22 int i;
23 entropy=0;
24 /*Testing encoding of raw bit values.*/
25 ec_byte_writeinit(&buf);
26 ec_enc_init(&enc,&buf);
27 for(ft=0;ft<1024;ft++){
28 for(i=0;i<ft;i++){
29 entropy+=log(ft)*M_LOG2E;
30 ec_enc_uint(&enc,i,ft);
31 entropy+=log(ft)*M_LOG2E+30;
32 ec_enc_uint64(&enc,(ec_uint64)i<<30|i,(ec_uint64)ft<<30);
35 /*Testing encoding of raw bit values.*/
36 for(ftb=0;ftb<16;ftb++){
37 for(i=0;i<(1<<ftb);i++){
38 entropy+=ftb;
39 nbits=ec_enc_tell(&enc,0);
40 ec_enc_bits(&enc,i,ftb);
41 nbits2=ec_enc_tell(&enc,0);
42 if(nbits2-nbits!=ftb){
43 fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
44 nbits2-nbits,ftb);
46 entropy+=ftb+30;
47 nbits=nbits2;
48 ec_enc_bits64(&enc,(ec_uint64)i<<30|i,ftb+30);
49 nbits2=ec_enc_tell(&enc,0);
50 if(nbits2-nbits!=ftb+30){
51 fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
52 nbits2-nbits,ftb+30);
56 for(sz=1;sz<256;sz++){
57 ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
58 for(i=0;i<sz;i++){
59 s=((unsigned)(i*45678901+7))%sz;
60 entropy+=(log(mod.ft)-log(ec_bitree_get_freq(mod.bitree,s)))*M_LOG2E;
61 ec_probmod_write(&mod,&enc,s);
63 ec_probmod_clear(&mod);
65 for(sz=11;sz<256;sz++){
66 ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
67 for(i=0;i<sz;i++){
68 s=((unsigned)(i*45678901+7))%sz;
69 entropy+=(log(ec_bitree_get_cumul(mod.bitree,EC_MINI(s+6,sz))-
70 ec_bitree_get_cumul(mod.bitree,EC_MAXI(s-5,0)))-
71 log(ec_bitree_get_freq(mod.bitree,s)))*M_LOG2E;
72 ec_probmod_write_range(&mod,&enc,s,EC_MAXI(s-5,0),EC_MINI(s+6,sz));
74 ec_probmod_clear(&mod);
76 nbits=ec_enc_tell(&enc,4);
77 ec_enc_done(&enc);
78 fprintf(stderr,
79 "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
80 entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
81 fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
82 ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
83 ec_dec_init(&dec,&buf);
84 for(ft=0;ft<1024;ft++){
85 for(i=0;i<ft;i++){
86 sym=ec_dec_uint(&dec,ft);
87 if(sym!=i){
88 fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
89 return -1;
91 sym64=ec_dec_uint64(&dec,(ec_uint64)ft<<30);
92 if(sym64!=((ec_uint64)i<<30|i)){
93 fprintf(stderr,"Decoded %lli instead of %lli with ft of %lli.\n",sym64,
94 (ec_uint64)i<<30|i,(ec_uint64)ft<<30);
98 for(ftb=0;ftb<16;ftb++){
99 for(i=0;i<(1<<ftb);i++){
100 sym=ec_dec_bits(&dec,ftb);
101 if(sym!=i){
102 fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
103 return -1;
105 sym64=ec_dec_bits64(&dec,ftb+30);
106 if(sym64!=((ec_uint64)i<<30|i)){
107 fprintf(stderr,"Decoded %lli instead of %lli with ftb of %i.\n",
108 sym64,(ec_uint64)i<<30|i,ftb+30);
112 for(sz=1;sz<256;sz++){
113 ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
114 for(i=0;i<sz;i++){
115 s=((unsigned)(i*45678901+7))%sz;
116 sym=ec_probmod_read(&mod,&dec);
117 if(sym!=s){
118 fprintf(stderr,"Decoded %i instead of %i with sz of %i.\n",sym,s,sz);
119 return -1;
122 ec_probmod_clear(&mod);
124 for(sz=11;sz<256;sz++){
125 ec_probmod_init_full(&mod,sz,1,sz+(sz>>1),NULL);
126 for(i=0;i<sz;i++){
127 s=((unsigned)(i*45678901+7))%sz;
128 sym=ec_probmod_read_range(&mod,&dec,EC_MAXI(s-5,0),EC_MINI(s+6,sz));
129 if(sym!=s){
130 fprintf(stderr,"Decoded %i instead of %i with sz of %i.\n",sym,s,sz);
131 return -1;
134 ec_probmod_clear(&mod);
136 nbits2=ec_dec_tell(&dec,4);
137 if(nbits!=nbits2){
138 fprintf(stderr,
139 "Reported number of bits used was %0.2lf, should be %0.2lf.\n",
140 ldexp(nbits2,-4),ldexp(nbits,-4));
142 ec_byte_writeclear(&buf);
143 fprintf(stderr,"Testing random streams...\n");
144 srand(0);
145 for(i=0;i<1024;i++){
146 unsigned *data;
147 int j;
148 ft=rand()/((RAND_MAX>>9)+1)+512;
149 sz=rand()/((RAND_MAX>>9)+1);
150 data=(unsigned *)malloc(sz*sizeof(*data));
151 ec_byte_writeinit(&buf);
152 ec_enc_init(&enc,&buf);
153 for(j=0;j<sz;j++){
154 data[j]=rand()%ft;
155 ec_enc_uint(&enc,data[j],ft);
157 ec_enc_done(&enc);
158 ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
159 ec_dec_init(&dec,&buf);
160 for(j=0;j<sz;j++){
161 sym=ec_dec_uint(&dec,ft);
162 if(sym!=data[j]){
163 fprintf(stderr,
164 "Decoded %i instead of %i with ft of %i at position %i of %i.\n",
165 sym,data[j],ft,j,sz);
168 ec_byte_writeclear(&buf);
169 free(data);
171 return 0;