|
Packit |
664db3 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
664db3 |
#include "config.h"
|
|
Packit |
664db3 |
#endif
|
|
Packit |
664db3 |
|
|
Packit |
664db3 |
#include <stdlib.h>
|
|
Packit |
664db3 |
#include <stdio.h>
|
|
Packit |
664db3 |
#include <math.h>
|
|
Packit |
664db3 |
#include "entcode.h"
|
|
Packit |
664db3 |
#include "entenc.c"
|
|
Packit |
664db3 |
#include "entdec.c"
|
|
Packit |
664db3 |
#include "rangeenc.c"
|
|
Packit |
664db3 |
#include "rangedec.c"
|
|
Packit |
664db3 |
#include "cwrs.c"
|
|
Packit |
664db3 |
|
|
Packit |
664db3 |
#ifndef M_LOG2E
|
|
Packit |
664db3 |
# define M_LOG2E 1.4426950408889634074
|
|
Packit |
664db3 |
#endif
|
|
Packit |
664db3 |
|
|
Packit |
664db3 |
int main(int _argc,char **_argv){
|
|
Packit |
664db3 |
ec_byte_buffer buf;
|
|
Packit |
664db3 |
ec_enc enc;
|
|
Packit |
664db3 |
ec_dec dec;
|
|
Packit |
664db3 |
long nbits;
|
|
Packit |
664db3 |
long nbits2;
|
|
Packit |
664db3 |
double entropy;
|
|
Packit |
664db3 |
int ft;
|
|
Packit |
664db3 |
int ftb;
|
|
Packit |
664db3 |
int sym;
|
|
Packit |
664db3 |
int sz;
|
|
Packit |
664db3 |
int i;
|
|
Packit |
664db3 |
int ret;
|
|
Packit |
664db3 |
ret=0;
|
|
Packit |
664db3 |
entropy=0;
|
|
Packit |
664db3 |
/*Testing encoding of raw bit values.*/
|
|
Packit |
664db3 |
ec_byte_writeinit(&buf;;
|
|
Packit |
664db3 |
ec_enc_init(&enc,&buf;;
|
|
Packit |
664db3 |
for(ft=0;ft<1024;ft++){
|
|
Packit |
664db3 |
for(i=0;i
|
|
Packit |
664db3 |
entropy+=log(ft)*M_LOG2E;
|
|
Packit |
664db3 |
ec_enc_uint(&enc,i,ft);
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
/*Testing encoding of raw bit values.*/
|
|
Packit |
664db3 |
for(ftb=0;ftb<16;ftb++){
|
|
Packit |
664db3 |
for(i=0;i<(1<
|
|
Packit |
664db3 |
entropy+=ftb;
|
|
Packit |
664db3 |
nbits=ec_enc_tell(&enc,0);
|
|
Packit |
664db3 |
ec_enc_bits(&enc,i,ftb);
|
|
Packit |
664db3 |
nbits2=ec_enc_tell(&enc,0);
|
|
Packit |
664db3 |
if(nbits2-nbits!=ftb){
|
|
Packit |
664db3 |
fprintf(stderr,"Used %li bits to encode %i bits directly.\n",
|
|
Packit |
664db3 |
nbits2-nbits,ftb);
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
nbits=ec_enc_tell(&enc,4);
|
|
Packit |
664db3 |
ec_enc_done(&enc;;
|
|
Packit |
664db3 |
fprintf(stderr,
|
|
Packit |
664db3 |
"Encoded %0.2lf bits of entropy to %0.2lf bits (%0.3lf%% wasted).\n",
|
|
Packit |
664db3 |
entropy,ldexp(nbits,-4),100*(nbits-ldexp(entropy,4))/nbits);
|
|
Packit |
664db3 |
fprintf(stderr,"Packed to %li bytes.\n",(long)(buf.ptr-buf.buf));
|
|
Packit |
664db3 |
ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
|
|
Packit |
664db3 |
ec_dec_init(&dec,&buf;;
|
|
Packit |
664db3 |
for(ft=0;ft<1024;ft++){
|
|
Packit |
664db3 |
for(i=0;i
|
|
Packit |
664db3 |
sym=ec_dec_uint(&dec,ft);
|
|
Packit |
664db3 |
if(sym!=i){
|
|
Packit |
664db3 |
fprintf(stderr,"Decoded %i instead of %i with ft of %i.\n",sym,i,ft);
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
for(ftb=0;ftb<16;ftb++){
|
|
Packit |
664db3 |
for(i=0;i<(1<
|
|
Packit |
664db3 |
sym=ec_dec_bits(&dec,ftb);
|
|
Packit |
664db3 |
if(sym!=i){
|
|
Packit |
664db3 |
fprintf(stderr,"Decoded %i instead of %i with ftb of %i.\n",sym,i,ftb);
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
nbits2=ec_dec_tell(&dec,4);
|
|
Packit |
664db3 |
if(nbits!=nbits2){
|
|
Packit |
664db3 |
fprintf(stderr,
|
|
Packit |
664db3 |
"Reported number of bits used was %0.2lf, should be %0.2lf.\n",
|
|
Packit |
664db3 |
ldexp(nbits2,-4),ldexp(nbits,-4));
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
ec_byte_writeclear(&buf;;
|
|
Packit |
664db3 |
fprintf(stderr,"Testing random streams...\n");
|
|
Packit |
664db3 |
srand(0);
|
|
Packit |
664db3 |
for(i=0;i<409600;i++){
|
|
Packit |
664db3 |
unsigned *data;
|
|
Packit |
664db3 |
int j;
|
|
Packit |
664db3 |
int tell_bits;
|
|
Packit |
664db3 |
int zeros;
|
|
Packit |
664db3 |
ft=rand()/((RAND_MAX>>(rand()%11))+1)+10;
|
|
Packit |
664db3 |
sz=rand()/((RAND_MAX>>(rand()%9))+1);
|
|
Packit |
664db3 |
data=(unsigned *)malloc(sz*sizeof(*data));
|
|
Packit |
664db3 |
ec_byte_writeinit(&buf;;
|
|
Packit |
664db3 |
ec_enc_init(&enc,&buf;;
|
|
Packit |
664db3 |
zeros = rand()%13==0;
|
|
Packit |
664db3 |
for(j=0;j
|
|
Packit |
664db3 |
if (zeros)
|
|
Packit |
664db3 |
data[j]=0;
|
|
Packit |
664db3 |
else
|
|
Packit |
664db3 |
data[j]=rand()%ft;
|
|
Packit |
664db3 |
ec_enc_uint(&enc,data[j],ft);
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
if (rand()%2==0)
|
|
Packit |
664db3 |
while(ec_enc_tell(&enc, 0)%8 != 0)
|
|
Packit |
664db3 |
ec_enc_uint(&enc, rand()%2, 2);
|
|
Packit |
664db3 |
tell_bits = ec_enc_tell(&enc, 0);
|
|
Packit |
664db3 |
ec_enc_done(&enc;;
|
|
Packit |
664db3 |
if ((tell_bits+7)/8 < ec_byte_bytes(&buf))
|
|
Packit |
664db3 |
{
|
|
Packit |
664db3 |
fprintf (stderr, "tell() lied, there's %li bytes instead of %d\n",
|
|
Packit |
664db3 |
ec_byte_bytes(&buf), (tell_bits+7)/8);
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
tell_bits -= 8*ec_byte_bytes(&buf;;
|
|
Packit |
664db3 |
ec_byte_readinit(&buf,ec_byte_get_buffer(&buf),ec_byte_bytes(&buf));
|
|
Packit |
664db3 |
ec_dec_init(&dec,&buf;;
|
|
Packit |
664db3 |
for(j=0;j
|
|
Packit |
664db3 |
sym=ec_dec_uint(&dec,ft);
|
|
Packit |
664db3 |
if(sym!=data[j]){
|
|
Packit |
664db3 |
fprintf(stderr,
|
|
Packit |
664db3 |
"Decoded %i instead of %i with ft of %i at position %i of %i.\n",
|
|
Packit |
664db3 |
sym,data[j],ft,j,sz);
|
|
Packit |
664db3 |
ret=-1;
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
ec_byte_writeclear(&buf;;
|
|
Packit |
664db3 |
free(data);
|
|
Packit |
664db3 |
}
|
|
Packit |
664db3 |
return ret;
|
|
Packit |
664db3 |
}
|