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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: ac.cpp,v 1.2 2001/04/19 18:32:09 wmay Exp $ */
  2. /****************************************************************************/
  3. /*   MPEG4 Visual Texture Coding (VTC) Mode Software                        */
  4. /*                                                                          */
  5. /*   This software was jointly developed by the following participants:     */
  6. /*                                                                          */
  7. /*   Single-quant,  multi-quant and flow control                            */
  8. /*   are provided by  Sarnoff Corporation                                   */
  9. /*     Iraj Sodagar   (iraj@sarnoff.com)                                    */
  10. /*     Hung-Ju Lee    (hjlee@sarnoff.com)                                   */
  11. /*     Paul Hatrack   (hatrack@sarnoff.com)                                 */
  12. /*     Shipeng Li     (shipeng@sarnoff.com)                                 */
  13. /*     Bing-Bing Chai (bchai@sarnoff.com)                                   */
  14. /*     B.S. Srinivas  (bsrinivas@sarnoff.com)                               */
  15. /*                                                                          */
  16. /*   Bi-level is provided by Texas Instruments                              */
  17. /*     Jie Liang      (liang@ti.com)                                        */
  18. /*                                                                          */
  19. /*   Shape Coding is provided by  OKI Electric Industry Co., Ltd.           */
  20. /*     Zhixiong Wu    (sgo@hlabs.oki.co.jp)                                 */
  21. /*     Yoshihiro Ueda (yueda@hlabs.oki.co.jp)                               */
  22. /*     Toshifumi Kanamaru (kanamaru@hlabs.oki.co.jp)                        */
  23. /*                                                                          */
  24. /*   OKI, Sharp, Sarnoff, TI and Microsoft contributed to bitstream         */
  25. /*   exchange and bug fixing.                                               */
  26. /*                                                                          */
  27. /*                                                                          */
  28. /* In the course of development of the MPEG-4 standard, this software       */
  29. /* module is an implementation of a part of one or more MPEG-4 tools as     */
  30. /* specified by the MPEG-4 standard.                                        */
  31. /*                                                                          */
  32. /* The copyright of this software belongs to ISO/IEC. ISO/IEC gives use     */
  33. /* of the MPEG-4 standard free license to use this  software module or      */
  34. /* modifications thereof for hardware or software products claiming         */
  35. /* conformance to the MPEG-4 standard.                                      */
  36. /*                                                                          */
  37. /* Those intending to use this software module in hardware or software      */
  38. /* products are advised that use may infringe existing  patents. The        */
  39. /* original developers of this software module and their companies, the     */
  40. /* subsequent editors and their companies, and ISO/IEC have no liability    */
  41. /* and ISO/IEC have no liability for use of this software module or         */
  42. /* modification thereof in an implementation.                               */
  43. /*                                                                          */
  44. /* Permission is granted to MPEG members to use, copy, modify,              */
  45. /* and distribute the software modules ( or portions thereof )              */
  46. /* for standardization activity within ISO/IEC JTC1/SC29/WG11.              */
  47. /*                                                                          */
  48. /* Copyright 1995, 1996, 1997, 1998 ISO/IEC                                 */
  49. /****************************************************************************/
  50. /************************************************************/
  51. /*     Sarnoff Very Low Bit Rate Still Image Coder          */
  52. /*     Copyright 1995, 1996, 1997, 1998 Sarnoff Corporation */
  53. /************************************************************/
  54. /************************************************************/
  55. /*  Filename: ac.c                                          */
  56. /*  Author: B.S. Srinivas                                   */
  57. /*  Date Modified: April 23, 1998                           */
  58. /*                                                          */
  59. /*  Descriptions:                                           */
  60. /*    This file contains routines for Integer arithmetic    */
  61. /*    coding, which is based on the ac.c file from the SOL  */
  62. /*    package.                                              */
  63. /*                                                          */
  64. /*    The following routines are modified or created for    */
  65. /*    the latest VTC package:                               */
  66. /*      static Void mzte_output_bit()                       */
  67. /*      Void mzte_ac_encoder_init()                         */
  68. /*      Int mzte_ac_encoder_done()                          */
  69. /*      static Int mzte_input_bit()                         */
  70. /*      Void mzte_ac_decoder_init()                         */
  71. /*      Void mzte_ac_decoder_done()                         */
  72. /*                                                          */
  73. /************************************************************/
  74. //#include <stdio.h>
  75. //#include <stdlib.h>
  76. //#include <assert.h>
  77. #include "dataStruct.hpp"
  78. #include "ac.hpp"
  79. #include "bitpack.hpp"
  80. #include "errorHandler.hpp"
  81. #include "msg.hpp"
  82. #define codeValueBits 16
  83. #define peakValue (((long)1<<codeValueBits)-1)
  84. #define firstQtr  (peakValue/4+1)
  85. #define Half      (2*firstQtr)
  86. #define thirdQtr  (3*firstQtr)
  87. #define BYTETYPE UChar
  88. #define SHORTTYPE UShort
  89. #define MIN(a,b)  (((a)<(b)) ? (a) : (b))
  90. #define STUFFING_CNT 22
  91. #define MIXED  2
  92. /* static function prototypes */
  93. //static Void mzte_output_bit(ac_encoder *,Int);
  94. //static Void mzte_bit_plus_follow(ac_encoder *,Int);
  95. //static Void mzte_update_model(ac_model *,ac_model *,Int);
  96. //static Int mzte_input_bit(ac_decoder *);
  97. static Int zeroStrLen=0;
  98. /************************************************************************/
  99. /*              Error Checking and Handling Macros                      */
  100. /************************************************************************/
  101. #define error(m)                                           
  102. do {                                                      
  103.   fflush(stdout);                                         
  104.   fprIntf(stderr, "%s:%d: error: ", __File__, __LINE__);  
  105.   fprIntf(stderr, m);                                     
  106.   fprIntf(stderr, "n");                                  
  107.   exit(1);                                                
  108. } while (0)
  109. #define check(b,m)                                         
  110. do {     
  111.   if (b)                                                   
  112.  error(m);                                            
  113. } while (0)
  114. /************************************************************************/
  115. /*                           Bit Output                                 */
  116. /************************************************************************/
  117. /**************************************************/
  118. /*  Added bit stuffing to prevent start code      */
  119. /*  emulation, i.e., add a "1" bit after every 22 */
  120. /*  consecutive "0" bits in the bit stream        */
  121. /*                                                */
  122. /*  Modified to use a fixed buffer and write to   */
  123. /*  file directly after the buffer is full. So the*/
  124. /*  ace->bitstreamLength now only has the # of    */
  125. /*  bytes in current buffer. Total bits (bitCount)*/
  126. /*  will indicate the total # bits for arithmetic */
  127. /*  coding part.   */
  128. /**************************************************/
  129. Void CVTCEncoder::mzte_output_bit(ac_encoder *ace,Int bit)
  130. {
  131. register int flag=0;
  132. ace->buffer *= 2;
  133. ace->buffer |= (bit)?0x01:0;
  134. (ace->bitsLeft)--;
  135. (ace->bitCount)++;
  136. if (!(ace->bitsLeft)) {
  137. if (!(ace->bitstream))
  138. errorHandler("Failure to allocate space for array Bitstream " 
  139.                             "in ac_encoder structure");
  140. switch (flag=(ace->bitstreamLength>=MAX_BUFFER)) {
  141. case 1:
  142. write_to_bitstream(ace->bitstream,MAX_BUFFER<<3);
  143. ace->bitstreamLength=0;
  144. break;
  145. default:
  146. break;
  147. }
  148. ace->bitstream[(ace->bitstreamLength)++] = ace->buffer;
  149. ace->bitsLeft = 8;
  150. }
  151. /* Dealing with bit stuffing when 0's are encountered */
  152. zeroStrLen+=(!bit)?1:-zeroStrLen;
  153. if (zeroStrLen==STUFFING_CNT) {
  154. mzte_output_bit(ace,1);
  155. zeroStrLen=0;
  156. }
  157. return;
  158. }
  159. Void CVTCEncoder::mzte_bit_plus_follow(ac_encoder *ace,Int bit)
  160. {
  161. register long followBits;
  162. followBits = ace->followBits;
  163. mzte_output_bit(ace,bit);
  164. while (followBits) {
  165. mzte_output_bit(ace,!bit);
  166. --followBits;
  167. }
  168. ace->followBits = followBits;
  169. return;
  170. }
  171. /************************************************************************/
  172. /*                             Encoder                                  */
  173. /************************************************************************/
  174. Void CVTCEncoder::mzte_ac_encoder_init(ac_encoder *ace)
  175. {
  176. ace->low = 0;
  177. ace->high = peakValue;
  178. ace->followBits = 0;
  179. ace->bitsLeft = 8;
  180. ace->buffer = 0;
  181. ace->bitCount = 0;
  182. ace->bitstreamLength = 0;
  183. ace->bitstream=(BYTETYPE *)malloc((MAX_BUFFER+10)*sizeof(BYTETYPE));
  184. if (ace->bitstream == NULL)
  185. errorHandler("can't allocate memory for ace->bitstream");
  186. // assert((ace->bitstream=(BYTETYPE *)malloc((MAX_BUFFER+10)*sizeof(BYTETYPE))));
  187. zeroStrLen=0;
  188. /* always start arithmetic coding bitstream with a 1 bit. */
  189. emit_bits(1,1);
  190. return;
  191. }
  192. /***************************************************************/
  193. /* Added stuffing bits to prevent start code emulation.        */
  194. /***************************************************************/
  195. Int CVTCEncoder::mzte_ac_encoder_done(ac_encoder *ace)
  196. {
  197. register long bitCount;
  198. register Int bitsLeft;
  199. register Int bitsToWrite;
  200. register long streamLength;
  201. register int flag;
  202. ++(ace->followBits);
  203. flag = (ace->low >= firstQtr);
  204. mzte_bit_plus_follow(ace,flag);
  205. bitsLeft = ace->bitsLeft;
  206. bitCount = ace->bitCount;
  207. streamLength = ace->bitstreamLength;
  208. if (bitsLeft != 8) {
  209. ace->bitstream[streamLength++] = (ace->buffer << bitsLeft);
  210. if (!(ace->bitstream[streamLength-1]&(1<<bitsLeft))) {
  211.    ace->bitstream[streamLength-1] += (1<<bitsLeft)-1;
  212. ++bitCount;
  213. }
  214. }
  215. bitsToWrite = (streamLength > MAX_BUFFER)?(MAX_BUFFER<<3):0;
  216. bitsToWrite += (bitCount % (MAX_BUFFER<<3));
  217. if ((bitsToWrite==0) && (streamLength==MAX_BUFFER))
  218. bitsToWrite=(MAX_BUFFER<<3);
  219. write_to_bitstream(ace->bitstream,bitsToWrite);
  220. if ((bitsLeft==8) && (!(ace->bitstream[streamLength-1]&1))) {
  221. /* stuffing bits to prevent start code emulation */
  222. emit_bits(1,1);
  223. ++bitCount;
  224. }
  225. ace->bitstreamLength=streamLength;
  226. ace->bitCount=bitCount;
  227. free(ace->bitstream);
  228. return(ace->bitCount);
  229. }
  230. Int CVTCEncoder::mzte_ac_encode_symbol(ac_encoder *ace, ac_model *acm, Int sym)
  231. {
  232.   register long low,high;
  233.   register long range;
  234.   register long bitCount;
  235.   
  236.   if (sym<0 || sym>=acm->nsym)
  237.     errorHandler("Invalid symbol passed to mzte_ac_encode_symbol " 
  238.  "(sym=%d while nsym=%d)", 
  239.  sym,acm->nsym);
  240.   low = ace->low;
  241.   high = ace->high;
  242.   range = (long) (high - low) + 1;
  243.   
  244.   high=low+(range*(Int)acm->cfreq[sym])/(Int)acm->cfreq[0] - 1;
  245.   low=low+(range*(Int)acm->cfreq[sym+1])/(Int)acm->cfreq[0];
  246.   bitCount = ace->bitCount;
  247.   while (1) {
  248.     if (high < Half)  {
  249.       mzte_bit_plus_follow(ace,0);
  250.     }
  251.     else if (low >= Half)  {
  252.       mzte_bit_plus_follow(ace,1);
  253.       low -= Half;
  254.       high -= Half;
  255.     }
  256.     else if ((low >= firstQtr) && (high < thirdQtr)) {
  257.       ++(ace->followBits);
  258.       low -= firstQtr;
  259.       high -= firstQtr;
  260.     }
  261.     else
  262.       break;
  263.     low = 2*low;
  264.     high = 2*high + 1;
  265.   }
  266.   ace->low = low;
  267.   ace->high = high;
  268.   if (acm->adapt)
  269.     mzte_update_model(acm,sym);
  270.   return ace->bitCount - bitCount;
  271. }
  272. /************************************************************************/
  273. /*                            Bit Input                                 */
  274. /************************************************************************/
  275. /*********************************************************/
  276. /* Modified to be consistant with the functions in       */
  277. /* bitpack.c, i.e., using nextinputbit() to get the new  */
  278. /* bits from the bit stream.                             */
  279. /*                                                       */
  280. /* Included remove stuffing bits, refer to   */
  281. /* mzte_output_bit() for more details.                   */
  282. /*********************************************************/
  283. Int CVTCDecoder::mzte_input_bit(ac_decoder *acd)
  284. {
  285. register Int t;
  286. if (!(acd->bitsLeft))
  287. acd->bitsLeft = 8;
  288. t = nextinputbit();
  289. --(acd->bitsLeft);
  290. ++(acd->bitCount);
  291. /* remove stuffing bits */
  292. zeroStrLen+=(!t)?1:-zeroStrLen;
  293. if(zeroStrLen==STUFFING_CNT) {
  294. if (!mzte_input_bit(acd))
  295. errorHandler("Error in decoding stuffing bits " 
  296.                          "(must be 1 after %d 0's)",STUFFING_CNT);
  297. zeroStrLen=0;
  298. }
  299. return(t);
  300. }
  301. /************************************************************************/
  302. /*                             Decoder                                  */
  303. /************************************************************************/
  304. Void CVTCDecoder::mzte_ac_decoder_init(ac_decoder *acd)
  305. {
  306. register long i,value=0;
  307. /* remove first stuffing bit */
  308. if(!get_X_bits(1))
  309. errorHandler("Error in extracting the stuffing bit at then"
  310.                         "beginning of arithmetic decoding"
  311.                         "refer mzte_encoder_init in ac.c)");
  312. zeroStrLen=0;
  313. i = codeValueBits;
  314. do {
  315. value <<= 1;
  316. value += mzte_input_bit(acd);
  317. } while (--i);
  318. acd->value = value;
  319. acd->low = 0;
  320. acd->high = peakValue;
  321. acd->bitCount = 0;
  322. acd->bitsLeft = 0;
  323. return;
  324. }
  325. /*******************************************************/
  326. /* Added restore_arithmetic_offset() called to recover */
  327. /* the extra bits read in by decoder. This routine is  */
  328. /* defined in bitpack.c                                */
  329. /*******************************************************/
  330. Void CVTCDecoder::mzte_ac_decoder_done(ac_decoder *acd)
  331. {
  332. restore_arithmetic_offset(acd->bitsLeft);
  333. acd->bitCount += acd->bitsLeft;
  334. if ((acd->bitCount)%8)
  335. errorHandler("Did not get alignment in arithmetic decoding");
  336. }
  337. Int CVTCDecoder::mzte_ac_decode_symbol(ac_decoder *acd,ac_model *acm)
  338. {
  339.   register Int high,low,value;
  340.   register long range;
  341.   register Int cum;
  342.   Int sym;
  343.   Int modify=0;
  344.   
  345.   high=acd->high; low=acd->low; value=acd->value;
  346.   range = (long)(high-low)+1;
  347.   
  348.   cum = (((long)(value-low)+1)*(Int)(acm->cfreq[0])-1)/range;
  349.   for (sym=0; (Int)(acm->cfreq[sym+1])>cum; sym++)
  350.     /* do nothing */ ;
  351.   high = low + (range*(Int)(acm->cfreq[sym]))/(Int)(acm->cfreq[0])-1;
  352.   low  = low + (range*(Int)(acm->cfreq[sym+1]))/(Int)(acm->cfreq[0]);
  353.   modify = acm->adapt; 
  354.   while (1) {
  355.     if (high < Half) {
  356.       /* do nothing */
  357.     } else if (low >= Half) {
  358.       value -= Half;
  359.       low -= Half;
  360.       high -= Half;
  361.     }
  362.     else if ((low >= firstQtr) && (high < thirdQtr))  {
  363.       value -= firstQtr;
  364.       low -= firstQtr;
  365.       high -= firstQtr;
  366.     }
  367.     else
  368.       break;
  369.     low <<= 1;
  370.     high = (high<<1)+1;
  371.     value = (value<<1) + mzte_input_bit(acd);
  372.   }
  373.   acd->high = high;
  374.   acd->low = low;
  375.   acd->value = value;
  376.   if (modify)
  377.     mzte_update_model(acm,sym);
  378.   
  379.   return sym;
  380. }
  381. /************************************************************************/
  382. /*                       Probability Model                              */
  383. /************************************************************************/
  384. Void CVTCCommon::mzte_ac_model_init(ac_model *acm,Int nsym,SHORTTYPE *ifreq,Int adapt,
  385. Int inc)
  386. {
  387. register Int i;
  388. register UShort tmpFreq=0;
  389. acm->inc = inc;
  390. acm->nsym = nsym;
  391. acm->adapt = adapt;
  392.   if ((acm->freq=(UShort *)malloc(nsym*sizeof(UShort)))==NULL)
  393.     errorHandler("Can't allocate %d bytes for acm->freq in " 
  394.  "mzte_ac_model_init.",
  395.  nsym*sizeof(UShort));
  396.   if  ((acm->cfreq=(UShort *) malloc((nsym+1)*sizeof(UShort)))==NULL)
  397.     errorHandler("Can't allocate %d bytes for acm->cfreq in " 
  398.  "mzte_ac_model_init.",
  399.  (nsym+1)*sizeof(UShort));
  400.   
  401. if (ifreq) {
  402. acm->cfreq[nsym] = 0;
  403. for (i=nsym-1; i>=0; i--) {
  404. acm->freq[i] = ifreq[i];
  405. acm->cfreq[i] = tmpFreq + ifreq[i];
  406. tmpFreq = acm->cfreq[i];
  407. }
  408. /* NOTE: This check won't always work for mixture of models */
  409. if (acm->cfreq[0] > acm->Max_frequency) {
  410. register Int cum=0;
  411. acm->cfreq[nsym] = 0;
  412. for (i=nsym-1; i>=0; i--)  {
  413. acm->freq[i] = ((Int) ifreq[i] + 1)/2;
  414. cum += (ifreq[i] + 1)/2;
  415. acm->cfreq[i] = cum;
  416. }
  417. }
  418. if (acm->cfreq[0] > acm->Max_frequency)
  419. errorHandler("error in acm->cfreq[0]");
  420. }
  421. else {
  422. for (i=0; i < nsym; i++) {
  423. acm->freq[i] = 1;
  424. acm->cfreq[i] = nsym - i;
  425. }
  426. acm->cfreq[nsym] = 0;
  427. }
  428. }
  429. Void CVTCCommon::mzte_ac_model_done(ac_model *acm)
  430. {
  431. acm->nsym = 0;
  432. free(acm->freq);
  433. acm->freq = NULL;
  434. free(acm->cfreq);
  435. acm->cfreq = NULL;
  436. }
  437. Void CVTCCommon::mzte_update_model(ac_model *acm,Int sym)
  438. {
  439.   register SHORTTYPE *freq,*cfreq;
  440.   register Int i;
  441.   register Int inc;
  442.   freq = acm->freq;
  443.   cfreq = acm->cfreq;
  444.   /* scale freq count down */
  445.   if (cfreq[0] == acm->Max_frequency) {
  446.     register Int cum=0,nsym;
  447.     nsym = acm->nsym;
  448.     cfreq[nsym] = 0;
  449.     for (i=nsym-1; i>=0; i--) {
  450.       freq[i] = ((Int)freq[i] + 1)/2;
  451.       cum += freq[i];
  452.       cfreq[i] = cum;
  453.     }
  454.   }
  455.   inc = acm->inc;
  456.   freq[sym] += inc;
  457.   for (i=sym; i>=0; i--)
  458.     cfreq[i] += inc;
  459. }