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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* $Id: bitpack.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: bitpack.c                                     */
  56. /*  Author: Bing-Bing CHai                                  */
  57. /*  Date: Dec. 24, 1997                                     */
  58. /*                                                          */
  59. /*  Descriptions:                                           */
  60. /*      This file contains the functions to read and write  */
  61. /*      to files. Most of the functions are the sames as    */ 
  62. /*      that are used in older version of MZTE.             */
  63. /*                                                          */
  64. /*      The following functions have been created or        */
  65. /*      modified.                                           */
  66. /*        Void init_bit_packing_fp(File *fp)                */
  67. /*        Int nextinputbit()                                */
  68. /*        Int get_bit_rate()                                */
  69. /*        Void restore_arithmetic_offset(Int bits_to_go)    */
  70. /************************************************************/
  71. #include <stdio.h>
  72. #include <stdlib.h>
  73. #include "basic.hpp"
  74. #include "dataStruct.hpp"
  75. #include "bitpack.hpp"
  76. //#include "PEZW_zerotree.h"
  77. //#include "wvtPEZW.h"
  78. #include "msg.hpp"
  79. #include "errorHandler.hpp"
  80. #define BUFFER_SIZE 1024
  81. #define EXTRABYTES 8  // hjlee 0901
  82. #define MAXLOOKBITS (EXTRABYTES*8)  // hjlee 0901
  83. static Int bytes_in_buffer=0, huff_put_buffer=0, huff_put_bits=0,
  84.        byte_ptr=0,buffer_length=0,totalBitRate=0;
  85. static Int  bit_num = -1;  /* signal to start */
  86. static UInt bit_buf = 0;
  87. static UChar output_buffer[BUFFER_SIZE];
  88. static FILE *bitfile;
  89. static Int byte_count=0;
  90. static Int count, junkCount;
  91. static Int zerocount=0;
  92. /****************************************************************/
  93. /* Intilization of file poInter, must be called prior to using  */
  94. /* any function in this file. By Bing-Bing Chai                 */
  95. /****************************************************************/
  96. Void CVTCCommon::init_bit_packing_fp(FILE *fp, Int clearByte)
  97.     byte_count=0;
  98.     /*count=0;*/
  99.     bitfile=fp;
  100.     bytes_in_buffer=huff_put_buffer=huff_put_bits=bit_buf=0;
  101.     /* clean byte poInter only when asked for */
  102.     if(clearByte == 0)
  103.        fseek(bitfile,-(buffer_length-byte_ptr+((bit_num+1)/8)),SEEK_CUR);
  104.     buffer_length=byte_ptr=0;
  105.     bit_num=-1;
  106. }
  107. /**********************************/
  108. /*  return total bit rate in bits */
  109. /**********************************/
  110. Int CVTCEncoder::get_total_bit_rate()
  111. {
  112.   return (totalBitRate);
  113. }
  114. Int CVTCEncoder::get_total_bit_rate_dec()
  115. {
  116.   return (count);
  117. }
  118. Int CVTCEncoder::get_total_bit_rate_junk()
  119. {
  120.   return (junkCount);
  121. }
  122. /****************************************************************/
  123. /******************  utilities for bit packing  *****************/
  124. /****************************************************************/
  125. /* put a byte on the bit stream */
  126. #define emit_byte(val)  
  127.    if (bytes_in_buffer >= BUFFER_SIZE) 
  128.       flush_bytes1(); 
  129.    output_buffer[bytes_in_buffer++] = (UChar) (val)
  130. /* Outputting bytes to the file */
  131. Void CVTCCommon::flush_bytes1()
  132. {
  133.   if (bytes_in_buffer) {  
  134.      fwrite(output_buffer, bytes_in_buffer, sizeof(UChar), bitfile);
  135.   }
  136.   bytes_in_buffer = 0;
  137. }
  138. /* Outputting bytes to the file and count the last few bits, used by main.c */
  139. Void CVTCEncoder::flush_bytes()
  140. {
  141.   if (bytes_in_buffer) {
  142.      fwrite(output_buffer, bytes_in_buffer, sizeof(UChar), bitfile);
  143.      totalBitRate +=8-totalBitRate%8;
  144.   }
  145.   bytes_in_buffer = 0;
  146. }
  147. Void CVTCCommon::emit_bits(UShort code, Int size)
  148. {
  149.    register UInt put_buffer = code;
  150.    register Int    put_bits   = huff_put_bits;
  151.    Int c;
  152.    if (size == 0) {
  153.       return;
  154.    }
  155.    totalBitRate +=size;
  156.    /* Mask off any excess bits in code */
  157.    put_buffer &= (((Int)1) << size) - 1; 
  158.    /* new number of bits in buffer */
  159.    put_bits += size;
  160.   
  161.    /* align incoming bits */
  162.    put_buffer <<= 24 - put_bits;  
  163.    /* and merge with old buffer contents */
  164.    put_buffer |= huff_put_buffer; 
  165.   
  166.    while (put_bits >= 8) {
  167.      c = (Int) ((put_buffer >> 16) & 0xFF);
  168.      emit_byte(c);
  169.      put_buffer <<= 8;
  170.      put_bits    -= 8;
  171.    }
  172.    huff_put_buffer = put_buffer;        /* Update global variables */
  173.    huff_put_bits   = put_bits;
  174. }
  175. /* modified by Jie Liang (Texas Instruments)
  176.    to return the last bits left in the last byte */
  177. Void CVTCEncoder::flush_bits1 ()
  178. {
  179.   Int i;
  180.   if((i=huff_put_bits%8)==0)
  181.     return;
  182.   emit_bits((UShort) 0x7F, 8-i); /* fill any partial byte with ones */
  183.   huff_put_buffer = 0;                   /* and reset bit-buffer to empty */
  184.   huff_put_bits = 0;
  185. }
  186. Void CVTCEncoder::flush_bits ()
  187. {
  188.   Int i=(huff_put_bits%8);
  189.   UShort usflush;
  190.   usflush = (0x7F >> i);
  191.   emit_bits(usflush, 8-i);  /* fill any partial byte with ones */
  192.   huff_put_buffer = 0;                   /* and reset bit-buffer to empty */
  193.   huff_put_bits = 0;
  194. }
  195. Void CVTCEncoder::flush_bits_zeros ()
  196. {
  197.   Int i;
  198.   if((i=huff_put_bits%8)==0)
  199.     return;
  200.   emit_bits((UShort) 0, 8-i); /* fill any partial byte with ones */
  201.   huff_put_buffer = 0;                   /* and reset bit-buffer to empty */
  202.   huff_put_bits = 0;
  203. }
  204. /*********************************************************/
  205. /* put a parameter Into the file, refer to VTC syntax    */
  206. /* for algorithm                                         */
  207. /*********************************************************/
  208. Int CVTCEncoder::put_param(Int value, Int nbits)
  209. {
  210.    Int extension;
  211.    Int module = 1 << nbits;
  212.    Int mask = (1 << nbits) - 1;
  213.    Int put_bits = 0;
  214.    while (value/module > 0) {
  215.         extension = 1;
  216.         emit_bits( ((value%module) | (extension << nbits)), nbits+1);
  217.         value = value >> nbits;
  218.         put_bits += nbits+1;
  219.    }
  220.    extension = 0;
  221.    emit_bits( ((value & mask) | (extension << nbits)), nbits+1);
  222.    put_bits += nbits+1;
  223.    return (put_bits);
  224. }
  225. /********************************************************/
  226. /***********  Utilities for bit unpacking  **************/
  227. /********************************************************/
  228. /*********************************************************/
  229. /*  Get the next bit from a file                         */
  230. /*  Modified to read in 1000 bytes Into a buffer at a    */
  231. /*  time.                                                */
  232. /*********************************************************/
  233. Int CVTCCommon::nextinputbit()
  234. {
  235.    Int v;
  236.    if (bit_num < 7) {
  237.      if(buffer_length==byte_ptr){
  238.         if((buffer_length=fread(output_buffer,1,BUFFER_SIZE,bitfile)) ==0){
  239.   /* fprintf(stderr,"out of source ");  */
  240.         output_buffer[0]=0;
  241.         buffer_length++;
  242.       }
  243.       if(buffer_length==BUFFER_SIZE){
  244.         buffer_length -=EXTRABYTES;
  245.         fseek(bitfile,-EXTRABYTES,SEEK_CUR);
  246.       
  247.   }
  248.       byte_ptr=0;
  249.       byte_count+=buffer_length;
  250.      }
  251.      bit_buf = (bit_buf << 8) + output_buffer[byte_ptr++];
  252.      bit_num += 8;
  253.    }
  254.    v = (bit_buf >> bit_num) & 0x00001;  
  255.    bit_num--;
  256.    count++;
  257.    return v;
  258. }
  259. /* Read nbits bits from a file */
  260. Int CVTCCommon::get_X_bits(Int nbits)
  261. {
  262.    Int v=0;
  263.    while (nbits--)
  264.       v = (v << 1) + nextinputbit();
  265.    return v;
  266. }
  267. /*-------------------------------------------------------------------*/
  268. /*********************************************************/
  269. /* get a parameter Into the file, refer to VTC syntax    */
  270. /* for algorithm                                         */
  271. /*********************************************************/
  272. Int CVTCDecoder::get_param(Int nbits)
  273. {
  274.    Int countg=0;
  275.    Int word=0;
  276.    Int value=0;
  277.    Int module=1<<(nbits);
  278.    do {
  279.      word=get_X_bits(nbits+1);
  280.      value += (word & (module-1))<<(countg*nbits);
  281.      countg++;
  282.    } while (word>>nbits);
  283.    return (value);
  284. }
  285. /******************************************************************/
  286. /* function to adjust the extra bytes read in by arithmetic coder.*/
  287. /* called by ac_decoder_done                                      */
  288. /******************************************************************/
  289. Void CVTCDecoder::restore_arithmetic_offset(Int bits_to_go)
  290. {
  291.   /* for nonalignment, 14 has something to do with Max_frequency */
  292.   bit_num +=14;
  293.   count -= 14;
  294.   if(((Int)(bit_buf>>(bit_num+1)) &1)==0){
  295.     bit_num--;
  296.     count++;
  297.   }
  298. }
  299. /**********************************************************/
  300. /* This function returns the next n bits in the bitstream */
  301. /* where n<=32                                            */
  302. /**********************************************************/
  303. UInt CVTCEncoder::LookBitsFromStream (Int n)
  304. {
  305.   Int tmp_bit_num=bit_num+1, tmp_byte_ptr=byte_ptr;
  306.   unsigned long tmp_buf=bit_buf,v;
  307.   /* test if enough bits */
  308.   /* hjlee 0901 */
  309.   if(n>MAXLOOKBITS)
  310.     errorHandler("LookBitsFromStream() can only return a maximum of "
  311.                  "%d bits.n", MAXLOOKBITS);  
  312.   if(buffer_length<BUFFER_SIZE-EXTRABYTES)
  313.     if(((buffer_length-tmp_byte_ptr)<<3)+tmp_bit_num<n)
  314.       /*errorHandler("LookBitsFromStream(): "
  315.                    "There are not enough bits in the bitstream.n");*/
  316.       return(0);
  317.   /* get bits */
  318.   while(tmp_bit_num<n/* && tmp_bit_num<(MAXLOOKBITS-8)*/){
  319.     tmp_bit_num +=8;
  320.     tmp_buf = (tmp_buf << 8) + output_buffer[tmp_byte_ptr++];
  321.   }
  322.   v =   (tmp_buf >> (tmp_bit_num-n));
  323.   return(v&1 ); 
  324. }
  325. /* modified by Jie Liang (Texas Instruments)
  326.    to return the last bits left in the last byte */
  327. Int CVTCDecoder::align_byte1()
  328. {
  329.   Int i;
  330.   
  331.   if((i=(bit_num+1)%8)==0)
  332.     return 0;
  333.   
  334.   return(get_X_bits(i)<<(8-i));
  335. }
  336. Int CVTCDecoder::align_byte ()
  337. {
  338.   Int i;
  339.   
  340.   if((i=(bit_num+1)%8)==0)
  341.     i=8;    /* for stuffing as defined in CD 6.2.1 */
  342.   junkCount += i;
  343.   count -= i;
  344.   return(get_X_bits(i)<<(8-i));
  345. }
  346. /* added by Jie Liang (Texas Instruments) */
  347. /* the data needs to by byte aligned first */
  348. Int CVTCDecoder::get_allbits (Char *buffer)
  349.   Int n,len;
  350.   Int loc=0;
  351.   /* read until end of file */
  352.   do {
  353.     buffer[loc]=get_X_bits(8);
  354.     loc++;
  355.   }while (!feof(bitfile));
  356.   /* read until the data in buffer is finished */
  357.   len = buffer_length-byte_ptr+2;
  358.   for (n=0;n<len;n++)
  359.     {
  360.       buffer[loc]=get_X_bits(8);
  361.       loc++;
  362.     }
  363.     
  364.   return loc;
  365. }
  366. /* added by Jie Liang (Texas Instruments) */
  367. /* check the next four bytes for start code */
  368. Int CVTCDecoder::Is_startcode (long startcode)
  369. {
  370.   long next_4bytes=0;
  371.   Int i;
  372.   Int offset;
  373.   
  374.   if (bit_num>=7)
  375.     offset=1;
  376.   else
  377.     offset=0;
  378.   next_4bytes = output_buffer[byte_ptr-offset];
  379.   for(i=0;i<3;i++)
  380.     next_4bytes = (next_4bytes<<8)+output_buffer[byte_ptr-offset+1+i];
  381.   if(next_4bytes == startcode)
  382.     return 1;
  383.   
  384.   return 0;
  385. }
  386. #define MAXRUNZERO 22  // hjlee
  387. Void CVTCEncoder::emit_bits_checksc(UInt code, Int size)
  388. {
  389.   Int m;
  390.   Int bit;
  391.   for(m=size-1;m>=0;m--){
  392.     bit = (code>>m) & (0x01);
  393.     emit_bits (bit, 1);
  394.     
  395.     /* update zero bit count */
  396.     if (bit)
  397.       zerocount=0;
  398.     else
  399.       zerocount++;
  400.     if (zerocount>=MAXRUNZERO)
  401.       {  /* exceeding maximum runs, add 1 */
  402.         emit_bits (1, 1);
  403.         zerocount=0;
  404.     }
  405.   } /* end of m - bits */
  406.   return;
  407.     
  408. }
  409. Void CVTCEncoder::emit_bits_checksc_init()
  410. {
  411.   zerocount=0;
  412. }
  413. Int CVTCDecoder::get_X_bits_checksc(Int nbits)
  414. {
  415.    Int v=0;
  416.    Int bit;
  417.    while (nbits--){
  418.       if(zerocount==MAXRUNZERO) /*skip next bit */
  419.         {
  420. //          if(!nextinputbit())  ; deleted by swinder
  421.   nextinputbit(); // added by swinder
  422. //            noteProgress("Possible start code emulation error: should be 1 after MAXZERORUN 0's");
  423.   zerocount = 0;
  424.         }
  425.       bit = nextinputbit();
  426.       if(!bit)
  427.         zerocount++;
  428.       else
  429.         zerocount =0;
  430.       v = (v << 1) + bit;
  431.    }
  432.    return v;
  433. }
  434. Void CVTCDecoder::get_X_bits_checksc_init()
  435. {
  436.   zerocount=0;
  437. }
  438. Int CVTCDecoder::get_allbits_checksc (unsigned char *buffer)
  439.   Int n,len;
  440.   Int loc=0;
  441.   /* read until end of file */
  442.   do {
  443.     buffer[loc]=get_X_bits_checksc(8);
  444.     loc++;
  445.   }while (!feof(bitfile));
  446.   /* read until the data in buffer is finished */
  447.   len = buffer_length-byte_ptr+2;
  448.   for (n=0;n<len;n++)
  449.     {
  450.       buffer[loc]=get_X_bits_checksc(8);
  451.       loc++;
  452.     }
  453.     
  454.   return loc;
  455. }
  456. Int CVTCDecoder::align_byte_checksc ()
  457. {
  458.   Int bit;
  459.   Int i;
  460.   Int m;
  461.   Int out=0;
  462.   Int n=0;
  463.   if((i=(bit_num+1)%8)==0)
  464.     return 0;
  465.   
  466.   for(m=0;m<i;m++){
  467.     if(zerocount==MAXRUNZERO){
  468.       get_X_bits(1);
  469.       zerocount=0;
  470.     }
  471.     else{
  472.       bit = get_X_bits(1);
  473.       out = (out<<1) | bit;
  474.       if (bit)
  475.         zerocount=0;
  476.       else
  477.         zerocount++;
  478.       n++;
  479.     }
  480.   }
  481.   return(out<<(8-n));
  482. }
  483. /* This program combine the stuff in bitbuffer Into the actual bitstream */
  484. Void CVTCEncoder::write_to_bitstream(UChar *bitbuffer,Int total_bits)
  485. {
  486.   Int i,bit_stream_length=total_bits>>3, resid=total_bits%8;
  487.   /* write to file assume file has been opened by control program*/
  488.   for(i=0;i<bit_stream_length;i++)
  489.     emit_bits(bitbuffer[i],8);
  490.   if(resid != 0)
  491.     emit_bits(bitbuffer[bit_stream_length]>>(8-resid),resid);
  492. }
  493. /* get the number of bytes already decoded */
  494. int CVTCDecoder::decoded_bytes_from_bitstream ()
  495. {
  496.     long n;
  497.     n = ftell(bitfile);
  498.     return (n+byte_ptr);
  499. }