16 # define M_LOG2E 1.4426950408889634074
19 int main(int _argc,char **_argv){
34 /*Testing encoding of raw bit values.*/
35 ec_byte_writeinit(&buf);
36 ec_enc_init(&enc,&buf);
37 for(ft=0;ft<1024;ft++){
39 entropy+=log(ft)*M_LOG2E;
40 ec_enc_uint(&enc,i,ft);
43 /*Testing encoding of raw bit values.*/
44 for(ftb=0;ftb<16;ftb++){
45 for(i=0;i<(1<<ftb);i++){
47 nbits=ec_enc_tell(&enc,0);
48 ec_enc_bits(&enc,i,ftb);
49 nbits2=ec_enc_tell(&enc,0);
50 if(nbits2-nbits!=ftb){
51 fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
57 nbits=ec_enc_tell(&enc,4);
60 "Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
61 entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
62 fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
63 ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
64 ec_dec_init(&dec,&buf);
65 for(ft=0;ft<1024;ft++){
67 sym=ec_dec_uint(&dec,ft);
69 fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
74 for(ftb=0;ftb<16;ftb++){
75 for(i=0;i<(1<<ftb);i++){
76 sym=ec_dec_bits(&dec,ftb);
78 fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
83 nbits2=ec_dec_tell(&dec,4);
86 "Reported number of bits used was %0.2lf, should be %0.2lf.\n",
87 ldexp(nbits2,-4),ldexp(nbits,-4));
90 ec_byte_writeclear(&buf);
91 fprintf(stderr,"Testing random streams...\n");
93 for(i=0;i<409600;i++){
98 ft=rand()/((RAND_MAX>>(rand()%11))+1)+10;
99 sz=rand()/((RAND_MAX>>(rand()%9))+1);
100 data=(unsigned *)malloc(sz*sizeof(*data));
101 ec_byte_writeinit(&buf);
102 ec_enc_init(&enc,&buf);
103 zeros = rand()%13==0;
109 ec_enc_uint(&enc,data[j],ft);
112 while(ec_enc_tell(&enc, 0)%8 != 0)
113 ec_enc_uint(&enc, rand()%2, 2);
114 tell_bits = ec_enc_tell(&enc, 0);
116 if ((tell_bits+7)/8 < ec_byte_bytes(&buf))
118 fprintf (stderr, "tell() lied, there's %li bytes instead of %d\n",
119 ec_byte_bytes(&buf), (tell_bits+7)/8);
122 tell_bits -= 8*ec_byte_bytes(&buf);
123 ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
124 ec_dec_init(&dec,&buf);
126 sym=ec_dec_uint(&dec,ft);
129 "Decoded %i instead of %i with ft of %i at position %i of %i.\n",
130 sym,data[j],ft,j,sz);
134 ec_byte_writeclear(&buf);