cr88192

Bitwise Arithmetic Coder

Jun 17th, 2013
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.31 KB | None | 0 0
  1. /*
  2. Copyright (C) 2013 by Brendan G Bohannon
  3. Copying: http://pastebin.com/iJxtZHm6
  4.  */
  5.  
  6. /*
  7.  
  8. typedef struct BGBBTJ_ArithContext_s BGBBTJ_ArithContext;
  9.  
  10. struct BGBBTJ_ArithContext_s
  11. {
  12. byte *cs;   //current pos in bitstream (input)
  13. byte *ct;   //current pos in bitstream (output)
  14. byte *cse;  //current end pos in bitstream (input)
  15. byte *cte;  //current end pos in bitstream (output)
  16.  
  17. u32 rmin;       //window lower range
  18. u32 rmax;       //window upper range
  19. u32 rval;       //window decode value
  20.  
  21. int wctx;
  22. byte *model;    //pairs of counts
  23. int ctxbits;    //context bits
  24. int ctxmask;    //context mask
  25. };
  26.  
  27. */
  28.  
  29. /*
  30. Bitwise Arithmetic Coder
  31.  */
  32.  
  33. #include <bgbbtj.h>
  34.  
  35. #define BGBBTJ_BITARITH_LOWER       0x00000000
  36. #define BGBBTJ_BITARITH_UPPER       0xFFFFFFFF
  37. #define BGBBTJ_BITARITH_NEUTRAL     0x8000
  38. #define BGBBTJ_BITARITH_WBITS       16
  39. #define BGBBTJ_BITARITH_WMASK       ((1<<BGBBTJ_BITARITH_WBITS)-1)
  40.  
  41. #define BGBBTJ_BITARITH_DATABITS    8   //W: arithmetic coder bits/symbol
  42. //#define BGBBTJ_BITARITH_CTXBITS       16
  43. //#define BGBBTJ_BITARITH_CTXBITS       14
  44. #define BGBBTJ_BITARITH_CTXBITS     13
  45. // #define BGBBTJ_BITARITH_CTXBITS      12
  46. // #define BGBBTJ_BITARITH_CTXBITS      10
  47. // #define BGBBTJ_BITARITH_CTXBITS      8
  48. #define BGBBTJ_BITARITH_CTXMASK     ((1<<BGBBTJ_BITARITH_CTXBITS)-1)
  49.  
  50. u16 bgbbtj_bitarith_divtab[65536];  //division table
  51. u32 bgbbtj_bitarith_divtab2[65536]; //division table (32 bit)
  52.  
  53. void BGBBTJ_BitArith_Init()
  54. {
  55.     static int init=0;
  56.     int i, j, k;
  57.  
  58.     if(init)return;
  59.     init=1;
  60.  
  61.     for(i=0; i<256; i++)
  62.         for(j=0; j<256; j++)
  63.     {
  64.         k=((i+1)<<16)/(i+j+2);
  65.         bgbbtj_bitarith_divtab[i+(j<<8)]=k;
  66.         bgbbtj_bitarith_divtab2[i+(j<<8)]=k<<16;
  67.     }
  68. }
  69.  
  70. byte *BGBBTJ_EmitVLI(byte *ct, int val)
  71. {
  72.     if(val<0)
  73.     {
  74.         *ct++=0;
  75.         return(ct);
  76.     }
  77.  
  78.     if(val<128)
  79.     {
  80.         *ct++=val;
  81.         return(ct);
  82.     }
  83.  
  84.     if(val<16384)
  85.     {
  86.         *ct++=0x80|(val>>8);
  87.         *ct++=val&0xFF;
  88.         return(ct);
  89.     }
  90.  
  91.     if(val<2097152)
  92.     {
  93.         *ct++=0xC0|(val>>16);
  94.         *ct++=(val>>8)&0xFF;
  95.         *ct++=val&0xFF;
  96.         return(ct);
  97.     }
  98.  
  99.     if(val<268435456)
  100.     {
  101.         *ct++=0xE0|(val>>24);
  102.         *ct++=(val>>16)&0xFF;
  103.         *ct++=(val>>8)&0xFF;
  104.         *ct++=val&0xFF;
  105.         return(ct);
  106.     }
  107.  
  108.     *ct++=0xF0;
  109.     *ct++=(val>>24)&0xFF;
  110.     *ct++=(val>>16)&0xFF;
  111.     *ct++=(val>>8)&0xFF;
  112.     *ct++=val&0xFF;
  113.     return(ct);
  114. }
  115.  
  116. byte *BGBBTJ_EmitSVLI(byte *ct, int val)
  117. {
  118.     return(BGBBTJ_EmitVLI(ct,
  119.         (val>=0)?(val<<1):(((-val)<<1)-1)));
  120. }
  121.  
  122. byte *BGBBTJ_DecodeVLI(byte *cs, int *rval)
  123. {
  124.     int i;
  125.    
  126.     if(!cs)return(NULL);
  127.    
  128.     i=*cs++;
  129.     if(!(i&0x80))
  130.     {
  131.         *rval=i; return(cs);
  132.     }else if((i&0xC0)==0x80)
  133.     {
  134.         i=((i&0x3F)<<8)|(*cs++);
  135.         *rval=i; return(cs);
  136.     }else if((i&0xE0)==0xC0)
  137.     {
  138.         i=((i&0x1F)<<8)|(*cs++);
  139.         i=(i<<8)|(*cs++);
  140.         *rval=i; return(cs);
  141.     }else if((i&0xF0)==0xE0)
  142.     {
  143.         i=((i&0x0F)<<8)|(*cs++);
  144.         i=(i<<8)|(*cs++);
  145.         i=(i<<8)|(*cs++);
  146.         *rval=i; return(cs);
  147.     }else if((i&0xF8)==0xF0)
  148.     {
  149.         i=((i&0x0F)<<8)|(*cs++);
  150.         i=(i<<8)|(*cs++);
  151.         i=(i<<8)|(*cs++);
  152.         i=(i<<8)|(*cs++);
  153.         *rval=i; return(cs);
  154.     }
  155.    
  156. //  *(int *)-1=-1;
  157.     *rval=0;
  158. //  return(cs);
  159.     return(NULL);
  160. }
  161.  
  162. byte *BGBBTJ_DecodeSVLI(byte *cs, int *rval)
  163. {
  164.     int i;
  165.    
  166.     cs=BGBBTJ_DecodeVLI(cs, &i);
  167.    
  168.     i=(i&1)?(-((i+1)>>1)):(i>>1);
  169.    
  170.     *rval=i;
  171.     return(cs);
  172. }
  173.  
  174. int BGBBTJ_BitArith_InputByte(BGBBTJ_ArithContext *ctx)
  175. {
  176.     if(ctx->cs>ctx->cse)
  177.         return(0);
  178.  
  179.     return(*ctx->cs++);
  180. }
  181.  
  182. void BGBBTJ_BitArith_OutputByte(BGBBTJ_ArithContext *ctx, int i)
  183. {
  184.     if(ctx->ct>ctx->cte)
  185.         return;
  186.  
  187.     *ctx->ct++=i;
  188. }
  189.  
  190. void BGBBTJ_BitArith_OutputBit(BGBBTJ_ArithContext *ctx,
  191.     int i, u32 w)
  192. {
  193.     u32 r, r2, v;
  194.     int j;
  195.  
  196.     r=ctx->rmax-ctx->rmin;
  197.     v=ctx->rmin+((((u64)r)*((u64)(w<<(32-BGBBTJ_BITARITH_WBITS))))>>32);
  198.  
  199.     if(i)ctx->rmin=v+1;
  200.     else ctx->rmax=v;
  201.  
  202.     //while bits
  203. //  while((ctx->rmin&0xFF000000)==(ctx->rmax&0xFF000000))
  204.     while(!((ctx->rmin^ctx->rmax)>>24))
  205.     {
  206.         BGBBTJ_BitArith_OutputByte(ctx, ctx->rmin>>24);
  207.         ctx->rmin<<=8;
  208.         ctx->rmax<<=8;
  209.         ctx->rmax|=255;
  210.     }
  211. }
  212.  
  213. int BGBBTJ_BitArith_InputBit(BGBBTJ_ArithContext *ctx, u32 w)
  214. {
  215.     u32 r, r2, v, i;
  216.  
  217.     r=ctx->rmax-ctx->rmin;
  218.     v=ctx->rmin+((((u64)r)*((u64)(w<<(32-BGBBTJ_BITARITH_WBITS))))>>32);
  219.  
  220.     i=(ctx->rval>v);
  221.     if(i)ctx->rmin=v+1;
  222.     else ctx->rmax=v;
  223.  
  224.     //while bits
  225. //  while((ctx->rmin&0xFF000000)==(ctx->rmax&0xFF000000))
  226.     while(!((ctx->rmin^ctx->rmax)>>24))
  227.     {
  228.         ctx->rmin<<=8;
  229.         ctx->rmax<<=8;
  230.         ctx->rmax|=255;
  231.  
  232.         ctx->rval<<=8;
  233.         ctx->rval|=BGBBTJ_BitArith_InputByte(ctx);
  234.     }
  235.  
  236.     return(i);
  237. }
  238.  
  239. int BGBBTJ_BitArith_InputModelBit(BGBBTJ_ArithContext *ctx,
  240.     byte *model, int wctx)
  241. {
  242.     u32 r, v, i, w;
  243.     int wc;
  244.  
  245.     r=ctx->rmax-ctx->rmin;
  246.     w=bgbbtj_bitarith_divtab2[((u16 *)model)[wctx]];
  247.     v=ctx->rmin+(((u64)r*(u64)w)>>32);
  248.     wc=wctx<<1;
  249.  
  250.     i=(ctx->rval>v);
  251.     if(i)
  252.     {
  253.         ctx->rmin=v+1;
  254.  
  255.         if((++model[wc|1])&0x80)
  256.         {
  257.             model[wc|0]>>=1;
  258.             model[wc|1]>>=1;
  259.         }
  260.     }else
  261.     {
  262.         ctx->rmax=v;
  263.  
  264.         if((++model[wc])&0x80)
  265.         {
  266.             model[wc|0]>>=1;
  267.             model[wc|1]>>=1;
  268.         }
  269.     }
  270.  
  271.     //while bits
  272. //  while((ctx->rmin&0xFF000000)==(ctx->rmax&0xFF000000))
  273. //  while(!((ctx->rmin^ctx->rmax)&0xFF000000))
  274.     while(!((ctx->rmin^ctx->rmax)>>24))
  275.     {
  276.         ctx->rmin<<=8;
  277.         ctx->rmax<<=8;
  278.         ctx->rmax|=255;
  279.  
  280.         ctx->rval<<=8;
  281.         ctx->rval|=BGBBTJ_BitArith_InputByte(ctx);
  282.     }
  283.  
  284.     return(i);
  285. }
  286.  
  287. void BGBBTJ_BitArith_FlushWBits(BGBBTJ_ArithContext *ctx)
  288. {
  289.     while((ctx->rmin!=BGBBTJ_BITARITH_LOWER) ||
  290.         (ctx->rmax!=BGBBTJ_BITARITH_UPPER))
  291.     {
  292.         BGBBTJ_BitArith_OutputByte(ctx, ctx->rmin>>24);
  293.  
  294.         ctx->rmin<<=8;
  295.         ctx->rmax<<=8;
  296.         ctx->rmax|=255;
  297.     }
  298. }
  299.  
  300.  
  301. int BGBBTJ_BitArith_SetupEncode(BGBBTJ_ArithContext *ctx, byte *out, int sz)
  302. {
  303.     ctx->ct=out;
  304.     ctx->cte=out+sz;
  305.     ctx->rmin=BGBBTJ_BITARITH_LOWER;
  306.     ctx->rmax=BGBBTJ_BITARITH_UPPER;
  307. }
  308.  
  309. int BGBBTJ_BitArith_SetupDecode(BGBBTJ_ArithContext *ctx, byte *in, int sz)
  310. {
  311.     int i;
  312.  
  313.     ctx->cs=in;
  314.     ctx->cse=in+sz;
  315.     ctx->rmin=BGBBTJ_BITARITH_LOWER;
  316.     ctx->rmax=BGBBTJ_BITARITH_UPPER;
  317.  
  318.     ctx->rval=BGBBTJ_BITARITH_LOWER;
  319.     for(i=0; i<4; i++)
  320.         ctx->rval=(ctx->rval<<8)|BGBBTJ_BitArith_InputByte(ctx);
  321. }
  322.  
  323. //arithmetic frontend/modeler
  324. #if 1
  325. int BGBBTJ_BitArith_Predict(
  326.     BGBBTJ_ArithContext *ctx, byte *model, int wctx)
  327. {
  328.     return(bgbbtj_bitarith_divtab[((u16 *)ctx->model)[wctx]]);
  329.  
  330. //  return(bgbbtj_bitarith_divtab[
  331. //      model[(ctx<<1)|0]|
  332. //      (model[(ctx<<1)|1]<<8)]);
  333. }
  334. #endif
  335.  
  336. #if 0
  337. int BGBBTJ_BitArith_Predict(BGBBTJ_ArithContext *ctx, byte *model, int wctx)
  338. {
  339.     u32 i, j, k;
  340.  
  341.     wctx<<=1;
  342.     i=model[wctx|0];
  343.     j=model[wctx|1];
  344.  
  345.     k=((i+1)<<BGBBTJ_BITARITH_WBITS)/(i+j+2);
  346.  
  347. //  k=(k<WARITH2_CLAMP)?WARITH2_CLAMP:
  348. //      ((k>(4096-WARITH2_CLAMP))?(4096-WARITH2_CLAMP):k);
  349. //  k=BGBBTJ_BITARITH_NEUTRAL;
  350.  
  351.     return(k);
  352. }
  353. #endif
  354.  
  355. int BGBBTJ_BitArith_Update(
  356.     BGBBTJ_ArithContext *ctx, byte *model, int wctx, int v)
  357. {
  358.     int i;
  359.  
  360.     i=(wctx<<1);
  361.     ctx->model[i|v]++;
  362.     if(ctx->model[i|v]&0x80)
  363.     {
  364.         ctx->model[i|0]>>=1;
  365.         ctx->model[i|1]>>=1;
  366.     }
  367. }
  368.  
  369. void BGBBTJ_BitArith_EncodeSymbol(BGBBTJ_ArithContext *ctx, int v)
  370. {
  371.     int i, j, k;
  372.  
  373.     i=BGBBTJ_BITARITH_DATABITS;
  374.     while(i--)
  375.     {
  376.         j=(v>>i)&1;
  377.  
  378.         k=BGBBTJ_BitArith_Predict(ctx, ctx->model, ctx->wctx);
  379.         BGBBTJ_BitArith_Update(ctx, ctx->model, ctx->wctx, j);
  380. //      k=BGBBTJ_BITARITH_NEUTRAL;
  381.  
  382.         BGBBTJ_BitArith_OutputBit(ctx, j, k);
  383. //      ctx->wctx=((ctx->wctx<<1)|j)&BGBBTJ_BITARITH_CTXMASK;
  384.         ctx->wctx=((ctx->wctx<<1)|j)&ctx->ctxmask;
  385.     }
  386. }
  387.  
  388. int BGBBTJ_BitArith_DecodeSymbol(BGBBTJ_ArithContext *ctx)
  389. {
  390.     int i, j, k, v;
  391.  
  392. //  v=0;
  393.     i=BGBBTJ_BITARITH_DATABITS;
  394.     while(i--)
  395.     {
  396. //      k=BGBBTJ_BitArith_Predict(ctx->model, ctx->wctx);
  397. //      k=BGBBTJ_BITARITH_NEUTRAL;
  398. //      j=BGBBTJ_BitArith_InputBit(k);
  399. //      BGBBTJ_BitArith_Update(ctx->model, ctx->wctx, j);
  400.  
  401. //      ctx->wctx=v&((1<<WARITH2_CTXBITS)-1);
  402.         j=BGBBTJ_BitArith_InputModelBit(ctx, ctx->model, ctx->wctx);
  403.  
  404. //      ctx->wctx=((ctx->wctx<<1)|j)&((1<<WARITH2_CTXBITS)-1);
  405. //      ctx->wctx=((ctx->wctx<<1)|j)&BGBBTJ_BITARITH_CTXMASK;
  406.         ctx->wctx=((ctx->wctx<<1)|j)&ctx->ctxmask;
  407.     }
  408.  
  409. //  return(ctx->wctx&0xFF);
  410.     return(ctx->wctx&((1<<BGBBTJ_BITARITH_DATABITS)-1));
  411. //  return(v);
  412. }
  413.  
  414. void BGBBTJ_BitArith_SetupContextBits(
  415.     BGBBTJ_ArithContext *ctx, int bits)
  416. {
  417.     int i, j;
  418.  
  419.     if(ctx->model && (ctx->ctxbits==bits))
  420.     {
  421.         j=1<<bits;
  422.         for(i=0; i<j*2; i++)ctx->model[i]=0;
  423.         ctx->wctx=0;
  424.         return;
  425.     }
  426.  
  427.     if(ctx->model)
  428.         { gcfree(ctx->model); }
  429.    
  430.     j=1<<bits;
  431.     ctx->model=gcalloc(j*2*sizeof(byte));
  432.     ctx->ctxbits=bits;
  433.     ctx->ctxmask=(1<<bits)-1;
  434.     ctx->wctx=0;
  435. }
  436.  
  437. BGBBTJ_API int BGBBTJ_BitArith_EncodeDataCtx(
  438.     BGBBTJ_ArithContext *ctx, byte *ibuf, int isz, byte *obuf, int osz)
  439. {
  440.     int i, j, k, l, ll;
  441.     byte *cs, *ct, *cse, *cte, *s2;
  442.  
  443.     if(isz<=0)return(0);
  444.  
  445.     BGBBTJ_BitArith_Init();
  446.  
  447. #if 0
  448. //  j=1<<WARITH2_CTXBITS;
  449.     j=1<<BGBBTJ_BITARITH_CTXBITS;
  450. //  ctx->model=malloc(j*2*sizeof(byte));
  451.     for(i=0; i<j*2; i++)ctx->model[i]=0;
  452.     ctx->wctx=0;
  453. #endif
  454.  
  455.     BGBBTJ_BitArith_SetupContextBits(ctx,
  456.         BGBBTJ_BITARITH_CTXBITS);
  457.  
  458.     ct=obuf; cte=obuf+osz;
  459.  
  460.     //Emit Header
  461.     *ct++=0xBA;     //magic byte
  462.     *ct++=0x00|(BGBBTJ_BITARITH_CTXBITS-12)&7;
  463.  
  464.     ct=BGBBTJ_EmitVLI(ct, isz);
  465.  
  466.     BGBBTJ_BitArith_SetupEncode(ctx, ct, cte-ct);
  467. //  BGBBTJ_BitArith_SetupEncode(ctx, obuf, osz);
  468.  
  469.     cs=ibuf;
  470.     cse=ibuf+isz;
  471.     i=0;
  472.  
  473.     while(cs<cse)
  474.     {
  475.         j=*cs++;
  476.  
  477. //      if(i<16)printf("%02X ", j);
  478.  
  479.         BGBBTJ_BitArith_EncodeSymbol(ctx, j);
  480.         i++;
  481.     }
  482. //  printf("\n");
  483. //  BGBBTJ_BitArith_EncodeSymbol(ctx, 258);
  484.     BGBBTJ_BitArith_FlushWBits(ctx);
  485.  
  486. #if 0
  487.     for(i=0; i<16; i++)
  488.         printf("%02X ", out[i]);
  489.     printf("\n");
  490. #endif
  491.  
  492. #if 0
  493. //test decode
  494. //  for(i=0; i<1024; i++)ctx->model[i]=0;
  495. //  j=1<<WARITH2_CTXBITS;
  496.     j=1<<BGBBTJ_BITARITH_CTXBITS;
  497.     for(i=0; i<j*2; i++)ctx->model[i]=0;
  498.     ctx->wctx=0;
  499.  
  500.     BGBBTJ_BitArith_SetupDecode(ctx, obuf, osz);
  501.  
  502.     cs=ibuf;
  503.     ce=ibuf+isz;
  504.     i=0;
  505.  
  506.     while(cs<ce)
  507.     {
  508.         j=*cs++;
  509.  
  510.         k=BGBBTJ_BitArith_DecodeSymbol(ctx);
  511.  
  512.         if(i<16)printf("%02X ", k);
  513.         if(j!=k)
  514.         {
  515.             printf("break at %d\n", i);
  516.             break;
  517.         }
  518.         i++;
  519.     }
  520.  
  521.     printf("\n");
  522. #endif
  523.  
  524.     i=ctx->ct-obuf;
  525.     return(i);
  526. }
  527.  
  528. BGBBTJ_API int BGBBTJ_BitArith_DecodeDataCtx(
  529.     BGBBTJ_ArithContext *ctx,
  530.     byte *ibuf, int isz, byte *obuf, int osz)
  531. {
  532.     int i, j, k, l, ll, osz1;
  533.     byte *cs, *ct, *cse, *cte, *s2;
  534.  
  535.     if(isz<=0)return(0);
  536.  
  537.     BGBBTJ_BitArith_Init();
  538.  
  539. //  j=1<<BGBBTJ_BITARITH_CTXBITS;
  540. //  for(i=0; i<j*2; i++)ctx->model[i]=0;
  541. //  ctx->wctx=0;
  542.  
  543.     cs=ibuf; cse=ibuf+isz;
  544. //  if((cs[0]!=0xBA)||(cs[1]!=0x00))
  545.     if((cs[0]!=0xBA)||(cs[1]&0xF8))
  546.         return(-1);
  547.  
  548.     BGBBTJ_BitArith_SetupContextBits(ctx, 12+(cs[1]&7));
  549.  
  550.     cs+=2;
  551.  
  552.     cs=BGBBTJ_DecodeVLI(cs, &osz1);
  553.     if(osz1>osz)return(-1);
  554.  
  555.     BGBBTJ_BitArith_SetupDecode(ctx, cs, cse-cs);
  556. //  BGBBTJ_BitArith_SetupDecode(ctx, ibuf, isz);
  557.  
  558.     ct=obuf;
  559. //  cte=obuf+osz;
  560.     cte=obuf+osz1;
  561.     i=0;
  562.  
  563.     while(ct<cte)
  564.     {
  565.         j=BGBBTJ_BitArith_DecodeSymbol(ctx);
  566.         *ct++=j;
  567.     }
  568.  
  569. //  i=ctx->cs-ibuf;
  570.     i=ct-obuf;
  571.     return(i);
  572. }
  573.  
  574. BGBBTJ_API int BGBBTJ_BitArith_EncodeData(
  575.     byte *ibuf, int isz, byte *obuf, int osz)
  576. {
  577.     BGBBTJ_ArithContext *ctx;
  578.     int i, j;
  579.    
  580.     ctx=gcalloc(sizeof(BGBBTJ_ArithContext));
  581.     ctx->cs=NULL; ctx->ct=NULL;
  582. //  j=1<<BGBBTJ_BITARITH_CTXBITS;
  583. //  ctx->model=gcalloc(j*2*sizeof(byte));
  584.     i=BGBBTJ_BitArith_EncodeDataCtx(ctx, ibuf, isz, obuf, osz);
  585.  
  586.     if(ctx->model)gcfree(ctx->model);
  587.     gcfree(ctx);
  588.    
  589.     return(i);
  590. }
  591.  
  592. BGBBTJ_API int BGBBTJ_BitArith_DecodeData(
  593.     byte *ibuf, int isz, byte *obuf, int osz)
  594. {
  595.     BGBBTJ_ArithContext *ctx;
  596.     int i, j;
  597.    
  598.     ctx=gcalloc(sizeof(BGBBTJ_ArithContext));
  599.     ctx->cs=NULL; ctx->ct=NULL;
  600. //  j=1<<BGBBTJ_BITARITH_CTXBITS;
  601. //  ctx->model=gcalloc(j*2*sizeof(byte));
  602.     i=BGBBTJ_BitArith_DecodeDataCtx(ctx, ibuf, isz, obuf, osz);
  603.    
  604.     if(ctx->model)gcfree(ctx->model);
  605.     gcfree(ctx);
  606.    
  607.     return(i);
  608. }
  609.  
  610. BGBBTJ_API int BGBBTJ_BitArith_EncodeTestData(
  611.     byte *ibuf, int isz, byte *obuf, int osz)
  612. {
  613.     BGBBTJ_ArithContext *ctx;
  614.     byte *tbuf;
  615.     int i, j, k;
  616.    
  617.     ctx=gcalloc(sizeof(BGBBTJ_ArithContext));
  618.     ctx->cs=NULL; ctx->ct=NULL;
  619. //  j=1<<BGBBTJ_BITARITH_CTXBITS;
  620. //  ctx->model=gcalloc(j*2*sizeof(byte));
  621.     i=BGBBTJ_BitArith_EncodeDataCtx(ctx, ibuf, isz, obuf, osz);
  622.  
  623.     tbuf=malloc(2*isz);
  624.     j=BGBBTJ_BitArith_DecodeDataCtx(ctx, obuf, i, tbuf, 2*isz);
  625.    
  626.     if(j!=isz)
  627.     {
  628.         printf("BGBBTJ_BitArith_EncodeTestData: Size Check %d->%d\n",
  629.             isz, j);
  630.     }
  631.    
  632.     for(k=0; k<j; k++)
  633.     {
  634.         if(ibuf[k]!=tbuf[k])
  635.         {
  636.             printf("BGBBTJ_BitArith_EncodeTestData: "
  637.                 "Decode Fail At %d\n", k);
  638.             break;
  639.         }
  640.     }
  641.  
  642.     if(k>=j)
  643.     {
  644.         printf("BGBBTJ_BitArith_EncodeTestData: OK\n");
  645.     }
  646.  
  647.     free(tbuf);
  648.  
  649.     if(ctx->model)gcfree(ctx->model);
  650.     gcfree(ctx);
  651.    
  652.     return(i);
  653. }
Advertisement
Add Comment
Please, Sign In to add comment