PEZW_ac.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /****************************************************************************/
  2. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  3. /*                                                                          */
  4. /*   This software was jointly developed by the following participants:     */
  5. /*                                                                          */
  6. /*   Single-quant,  multi-quant and flow control                            */
  7. /*   are provided by  Sarnoff Corporation                                   */
  8. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  9. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  10. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  11. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  12. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  13. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  14. /*                                                                          */
  15. /*   Bi-level is provided by Texas Instruments                              */
  16. /*     Jie Liang      (liang@ti.com)                                        */
  17. /*                                                                          */
  18. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  19. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  20. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  21. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  22. /*                                                                          */
  23. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  24. /*   exchange and bug fixing.                                               */
  25. /*                                                                          */
  26. /*                                                                          */
  27. /* In the course of development of the MPEG-4 standard, this software       */
  28. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  29. /* specified by the MPEG-4 standard.                                        */
  30. /*                                                                          */
  31. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  32. /* of the MPEG-4 standard free license to use this  software module or      */
  33. /* modifications thereof for hardware or software products claiming         */
  34. /* conformance to the MPEG-4 standard.                                      */
  35. /*                                                                          */
  36. /* Those intending to use this software module in hardware or software      */
  37. /* products are advised that use may infringe existing  patents. The        */
  38. /* original developers of this software module and their companies, the     */
  39. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  40. /* and ISO/IEC have no liability for use of this software module or         */
  41. /* modification thereof in an implementation.                               */
  42. /*                                                                          */
  43. /* Permission is granted to MPEG members to use, copy, modify,              */
  44. /* and distribute the software modules ( or portions thereof )              */
  45. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  46. /*                                                                          */
  47. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  48. /****************************************************************************/
  49. /****************************************************************************/
  50. /*     Texas Instruments Predictive Embedded Zerotree (PEZW) Image Codec    */
  51. /*    Developed by Jie Liang (liang@ti.com)                                */
  52. /*                         */ 
  53. /*     Copyright 1996, 1997, 1998 Texas Instruments                    */
  54. /****************************************************************************/
  55. /****************************************************************************
  56.    File name:         PEZW_ac.c
  57.    Author:            Jie Liang  (liang@ti.com)
  58.    Functions:         adaptive arithmetic coding functions
  59.    Revisions:         This file was adopted from public domain
  60.                       arithmetic coder with changes suited to PEZW coder.
  61. *****************************************************************************/
  62. #include <stdio.h>
  63. #include <stdlib.h>
  64. #include <memory.h>
  65. #include "PEZW_ac.hpp"
  66. /* size of memory blocks allocated each time running out of
  67.    buffer for bitstream */
  68. #define MemBlocksize 1000
  69. #ifndef DEBUG_ZTR_DEC_BS
  70. #define DEBUG_ZTR_DEC_BS   0
  71. #endif
  72. #define Code_value_bits 16
  73. #define Top_value (((long)1<<Code_value_bits)-1)
  74. #define First_qtr (Top_value/4+1)
  75. #define Half   (2*First_qtr)
  76. #define Third_qtr (3*First_qtr)
  77. static void output_bit (Ac_encoder *, int);
  78. static void bit_plus_follow (Ac_encoder *, int);
  79. static int input_bit (Ac_decoder *);
  80. static void update_model (Ac_model *, int);
  81. #define error(m)                                           
  82. do  {                                                         
  83.   fflush (stdout);                                            
  84.   fprintf (stderr, "%s:%d: error: ", __FILE__, __LINE__);     
  85.   fprintf (stderr, m);                                        
  86.   fprintf (stderr, "n");                                     
  87.   exit (1);                                                   
  88. }  while (0)
  89. #define check(b,m)                                         
  90. do  {                                                         
  91.   if (b)                                                      
  92.     error (m);                                                
  93. }  while (0)
  94. static void
  95. output_bit (Ac_encoder *ace, int bit)
  96. {
  97.   ace->buffer <<=1;
  98.   if (bit)
  99.   ace->buffer |= 0x01; 
  100.   ace->bits_to_go -= 1;
  101.   ace->total_bits += 1;
  102.   if (ace->bits_to_go==0)  {
  103.     if (ace->fp)
  104.       putc (ace->buffer, ace->fp);
  105.     else
  106.       putc_buffer (ace->buffer, &ace->stream, &ace->original_stream,
  107.           &ace->space_left);
  108.     ace->bits_to_go = 8;
  109. ace->buffer = 0;
  110.   }
  111.   return;
  112. }
  113. static void
  114. bit_plus_follow (Ac_encoder *ace, int bit)
  115. {
  116.   output_bit (ace, bit);
  117.   while (ace->fbits > 0)  {
  118.     output_bit (ace, !bit);
  119.     ace->fbits -= 1;
  120.   }
  121.   return;
  122. }
  123. static int
  124. input_bit (Ac_decoder *acd)
  125. {
  126.   int t;
  127.   if (acd->bits_to_go==0)  {
  128.     if (acd->fp)
  129. acd->buffer = getc (acd->fp);
  130.     else
  131. acd->buffer = getc_buffer(&acd->stream);
  132.     acd->bits_to_go = 8;
  133.   }
  134.   t = ((acd->buffer&0x80)>0);
  135.   acd->buffer <<=1; 
  136.   acd->bits_to_go -= 1;
  137.   return t;
  138. }
  139. static void
  140. update_model (Ac_model *acm, int sym)
  141. {
  142.   int i;
  143.   if (acm->cfreq[0]==acm->Max_frequency)  {
  144.     int cum = 0;
  145.     acm->cfreq[acm->nsym] = 0;
  146.     for (i = acm->nsym-1; i>=0; i--)  {
  147.       acm->freq[i] = (acm->freq[i] + 1) / 2;
  148.       cum += acm->freq[i];
  149.       acm->cfreq[i] = cum;
  150.     }
  151.   }
  152.   acm->freq[sym] += 1;
  153.   for (i=sym; i>=0; i--)
  154.     acm->cfreq[i] += 1;
  155.   return;
  156. }
  157. void
  158. Ac_encoder_init (Ac_encoder *ace, unsigned char *fn, 
  159.                  int len, int IsStream)
  160. {
  161.   if (IsStream){
  162.       ace->stream = fn;
  163.       ace->original_stream = fn;
  164.       ace->space_left = len;
  165.       ace->fp = NULL;
  166.   }
  167.   else if (fn)  {
  168.     ace->fp = fopen ((char *)fn, "w");
  169.     check (!ace->fp, "arithmetic encoder could not open file");
  170.   }  
  171.   else  {
  172.     ace->fp = NULL;
  173.   }
  174.   ace->bits_to_go = 8;
  175.   ace->low = 0;
  176.   ace->high = Top_value;
  177.   ace->fbits = 0;
  178.   ace->buffer = 0;
  179.   ace->total_bits = 0;
  180.   return;
  181. }
  182. void
  183. Ac_encoder_done (Ac_encoder *ace)
  184. {
  185.   ace->fbits += 1;
  186.   if (ace->low < First_qtr)
  187.     bit_plus_follow (ace, 0);
  188.   else
  189.     bit_plus_follow (ace, 1);
  190.   if (ace->fp){
  191.     putc (ace->buffer >> ace->bits_to_go, ace->fp);
  192.     fclose (ace->fp);
  193.   }
  194.   else if (ace->bits_to_go <8)
  195.       putc_buffer (ace->buffer << ace->bits_to_go, &ace->stream,
  196.           &ace->original_stream, &ace->space_left);
  197.   if (DEBUG_ZTR_DEC_BS)
  198.     fprintf(stdout, "bits to go: %d  last byte: %dn",
  199.     ace->bits_to_go, *(ace->stream-1));
  200.       
  201.   return;
  202. }
  203. void
  204. Ac_decoder_open (Ac_decoder *acd, unsigned char *fn, int IsStream)
  205. {
  206.   if (IsStream){
  207.       acd->stream = fn;
  208.       acd->fp = NULL;
  209.   }
  210.   else {
  211.       acd->fp = fopen ((char *)fn, "r");
  212.       check (!acd->fp, "arithmetic decoder could not open file");
  213.   }
  214.  
  215.   return;
  216. }
  217. void
  218. Ac_decoder_init (Ac_decoder *acd, unsigned char *fn)
  219. {
  220.   int i;
  221.   acd->bits_to_go = 0;
  222.   acd->garbage_bits = 0;
  223.   acd->value = 0;
  224.   for (i=1; i<=Code_value_bits; i++)  {
  225.     acd->value = 2*acd->value + input_bit(acd);
  226.   }
  227.   acd->low = 0;
  228.   acd->high = Top_value;
  229.   return;
  230. }
  231. void
  232. Ac_decoder_done (Ac_decoder *acd)
  233. {
  234.   fclose (acd->fp);
  235.   return;
  236. }
  237. void
  238. Ac_model_init (Ac_model *acm, int nsym, int *ifreq, int Max_freq, int adapt)
  239. {
  240.   int i;
  241.   acm->nsym = nsym;
  242. #ifndef MODEL_COUNT_LARGE
  243.       acm->freq = (unsigned char *) (void *) calloc (nsym, sizeof (unsigned char));
  244. #else
  245.       acm->freq = (int *) (void *) calloc (nsym, sizeof (int));
  246. #endif  
  247.   check (!acm->freq, "arithmetic coder model allocation failure");
  248.   acm->cfreq = (int *) (void *) calloc (nsym+1, sizeof (int));
  249.   check (!acm->cfreq, "arithmetic coder model allocation failure");
  250.   acm->Max_frequency = Max_freq;
  251.   acm->adapt = adapt;
  252.   if (ifreq)  {
  253.     acm->cfreq[acm->nsym] = 0;
  254.     for (i=acm->nsym-1; i>=0; i--)  {
  255.       acm->freq[i] = ifreq[i];
  256.       acm->cfreq[i] = acm->cfreq[i+1] + acm->freq[i];
  257.     }
  258.   if (acm->cfreq[0] > acm->Max_frequency)  {
  259.     int cum = 0;
  260.     acm->cfreq[acm->nsym] = 0;
  261.     for (i = acm->nsym-1; i>=0; i--)  {
  262.       acm->freq[i] = (acm->freq[i] + 1) / 2;
  263.       cum += acm->freq[i];
  264.       acm->cfreq[i] = cum;
  265.     }
  266.   }
  267.     if (acm->cfreq[0] > acm->Max_frequency)
  268.       error ("arithmetic coder model max frequency exceeded");
  269.   }  else  {
  270.     for (i=0; i<acm->nsym; i++) {
  271.       acm->freq[i] = 1;
  272.       acm->cfreq[i] = acm->nsym - i;
  273.     }
  274.     acm->cfreq[acm->nsym] = 0;
  275.   }
  276.   return;
  277. }
  278. void
  279. Ac_model_save (Ac_model *acm, int *ifreq)
  280. {
  281.   int i;
  282.   for (i=acm->nsym-1; i>=0; i--)  {
  283.     ifreq[i] = acm->freq[i];
  284.   }
  285.   return;
  286. }
  287. void
  288. Ac_model_done (Ac_model *acm)
  289. {
  290.   acm->nsym = 0;
  291.   free (acm->freq);
  292.   acm->freq = NULL;
  293.   free (acm->cfreq);
  294.   acm->cfreq = NULL;
  295.   return;
  296. }
  297. long
  298. Ac_encoder_bits (Ac_encoder *ace)
  299. {
  300.   return ace->total_bits;
  301. }
  302. void
  303. Ac_encode_symbol (Ac_encoder *ace, Ac_model *acm, int sym)
  304. {
  305.   long range;
  306.  
  307.   check (sym<0||sym>=acm->nsym, "symbol out of range");
  308. #ifdef AC_DEBUG
  309.   printf(" %d ", sym);
  310. #endif
  311.   range = (long)(ace->high-ace->low)+1;
  312.   ace->high = ace->low + (range*acm->cfreq[sym])/acm->cfreq[0]-1;
  313.   ace->low = ace->low + (range*acm->cfreq[sym+1])/acm->cfreq[0];
  314.   for (;;)  {
  315.     if (ace->high<Half)  {
  316.       bit_plus_follow (ace, 0);
  317.     }  else if (ace->low>=Half)  {
  318.       bit_plus_follow (ace, 1);
  319.       ace->low -= Half;
  320.       ace->high -= Half;
  321.     }  else if (ace->low>=First_qtr && ace->high<Third_qtr)  {
  322.       ace->fbits += 1;
  323.       ace->low -= First_qtr;
  324.       ace->high -= First_qtr;
  325.     }  else
  326.       break;
  327.     ace->low = 2*ace->low;
  328.     ace->high = 2*ace->high+1;
  329.   }
  330.   if (acm->adapt)
  331.     update_model (acm, sym);
  332.   return;
  333. }
  334. int
  335. Ac_decode_symbol (Ac_decoder *acd, Ac_model *acm)
  336. {
  337.   long range;
  338.   int cum;
  339.   int sym;
  340.   range = (long)(acd->high-acd->low)+1;
  341.   cum = (((long)(acd->value-acd->low)+1)*acm->cfreq[0]-1)/range;
  342.   for (sym = 0; acm->cfreq[sym+1]>cum; sym++)
  343.     /* do nothing */ ;
  344.   check (sym<0||sym>=acm->nsym, "symbol out of range");
  345.   acd->high = acd->low + (range*acm->cfreq[sym])/acm->cfreq[0]-1;
  346.   acd->low = acd->low +  (range*acm->cfreq[sym+1])/acm->cfreq[0];
  347.   for (;;)  {
  348.     if (acd->high<Half)  {
  349.       /* do nothing */
  350.     }  else if (acd->low>=Half)  {
  351.       acd->value -= Half;
  352.       acd->low -= Half;
  353.       acd->high -= Half;
  354.     }  else if (acd->low>=First_qtr && acd->high<Third_qtr)  {
  355.       acd->value -= First_qtr;
  356.       acd->low -= First_qtr;
  357.       acd->high -= First_qtr;
  358.     }  else
  359.       break;
  360.     acd->low = 2*acd->low;
  361.     acd->high = 2*acd->high+1;
  362.     acd->value = 2*acd->value + input_bit(acd);
  363.   }
  364.   if (acm->adapt)
  365.     update_model (acm, sym);
  366. #ifdef AC_DEBUG
  367.   printf(" %d ", sym);
  368. #endif
  369.   return sym;
  370. }
  371. int getc_buffer (unsigned char **stream)
  372. {
  373.    int output;
  374.    
  375.    output = **stream;
  376.    (*stream)++;
  377.    return(output);
  378. }
  379. void putc_buffer (int x, unsigned char **buffer_curr, 
  380.          unsigned char **buffer_start, int *space_len)
  381. {
  382.     int len;
  383.     unsigned char *temp;
  384.     if (*space_len<=0)
  385.     {
  386.         /* reallocate memory */
  387.         temp = *buffer_start;
  388.         len =  *buffer_curr-*buffer_start;
  389.         *buffer_start = (unsigned char *) calloc(len+MemBlocksize,
  390.             sizeof(char));
  391.         memcpy(*buffer_start, temp, len);
  392.         *buffer_curr = *buffer_start+len;
  393.         *space_len=MemBlocksize;
  394.         free(temp);
  395.     }
  396.     **buffer_curr=x;
  397. (*buffer_curr)++;
  398.     (*space_len)--;
  399.     return;
  400. }
  401. /* adjust decoder buffer pointer to the right byte 
  402.    at the end of the decoding. Returns the bit location
  403.    for the last bit */
  404.  
  405. int AC_decoder_buffer_adjust (Ac_decoder *acd)
  406. {
  407. int bits_to_go;
  408. /* rewind 14 bits for buffer */
  409. if (DEBUG_ZTR_DEC_BS)
  410. fprintf(stdout, "bits to go: %d n",acd->bits_to_go);
  411. if (acd->bits_to_go>1)
  412. acd->stream--;
  413.   
  414. acd->stream--;
  415. if (acd->bits_to_go>1)
  416. bits_to_go = acd->bits_to_go-2;
  417. else
  418. bits_to_go = acd->bits_to_go+6;
  419. return (bits_to_go);
  420. }
  421. void AC_free_model (Ac_model *acm)
  422. {
  423.   free(acm->freq);
  424.   free(acm->cfreq);
  425. }