huffman.hpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  4. Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
  5. Bruce Lin (blin@microsoft.com), Microsoft Corporation
  6. Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
  7. (date: March, 1996)
  8. and edited by
  9. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  10. Takeshi Nagai (TOSHIBA CORPORATION)
  11. Toshiaki Watanabe (TOSHIBA CORPORATION)
  12. Noboru Yamaguchi (TOSHIBA CORPORATION)
  13. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  14. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  15. as specified by the MPEG-4 Video. 
  16. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  17. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  18. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  19. The original developer of this software module and his/her company, 
  20. the subsequent editors and their companies, 
  21. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  22. Copyright is not released for non MPEG-4 Video conforming products. 
  23. Microsoft retains full right to use the code for his/her own purpose, 
  24. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  25. This copyright notice must be included in all copies or derivative works. 
  26. Copyright (c) 1996, 1997.
  27. Module Name:
  28. huffman.hpp
  29. Abstract:
  30. Classes for Huffman encode/decode.
  31. Revision History:
  32. *************************************************************************/
  33. #ifndef _HUFFMAN_HPP_
  34. #define _HUFFMAN_HPP_
  35. #define VM_HOME_DIR "\vm"
  36. class istream;
  37. class ostream;
  38. class CInBitStream;
  39. class COutBitStream;
  40. class CEntropyEncoder;
  41. class CEntropyDecoder;
  42. class CNode;
  43. Class CHuffmanTree
  44. {
  45. public:
  46. // Constructors
  47.     CHuffmanTree (Int lNOfSymbols, Int* lpFrequencies = NULL);//create tree and load with frequencies
  48.     virtual ~CHuffmanTree ();//destroy tree
  49. // Operations
  50.     Void setFrequencies (Int* lpFrequencies);//load frequencies of all symbols
  51.     Void setFrequency (Int lFrequency, Int lIndex);//set frequency of one symbol
  52.     Void buildTree ();//generate huffman table
  53.     Void writeTable (ostream &stream);//write table into text stream
  54.     Void writeTableSorted (ostream &stream);//write table sorted by frequencies into text stream
  55. private:
  56.     CNode* m_pNodes;
  57.     Int m_lNOfSymbols;
  58.     virtual Void writeSymbol (Int symbolNo,ostream &Stream);
  59.     Void writeOneTableEntry (
  60. ostream &Stream,
  61. Int entryNo,
  62.         Double lTotalFrequency,
  63. Double &dNOfBits
  64. );
  65.     Void statistics (Int &lTotalFrequency, Double &dEntropy);
  66.     Void printStatistics (Double dEntropy, Double dNOfBits, ostream &stream);
  67. };
  68. Class CHuffmanCoDec
  69. {
  70. protected:
  71.     virtual Int makeIndexFromSymbolInTable (istream &huffmanTable);
  72.     Void profileTable (
  73. istream &huffmanTable,
  74. Int& lNOfSymbols, 
  75. Int& lMaxCodeSize
  76. );
  77.     Bool processOneLine (
  78. istream &huffmanTable,
  79. Int& lSymbol,
  80. Int& lCodeSize,
  81. Char* pCode
  82. );
  83.     Void trashRestOfLine (istream &str);
  84. };
  85. class CHuffmanDecoderNode;
  86. Class CHuffmanDecoder:public CHuffmanCoDec, public CEntropyDecoder
  87. {
  88. public:
  89. // Constructors
  90.     CHuffmanDecoder () {};//create unattached decoder
  91.     CHuffmanDecoder (CInBitStream &BitStream);//create huffman decoder and attach to bitStream
  92. CHuffmanDecoder (CInBitStream &BitStream, VlcTable *pVlc);
  93.     ~CHuffmanDecoder ();//destroy decoder
  94. // Operations
  95.     Void loadTable (istream &HuffmanTable,Bool bIncompleteTree=TRUE);//load huffman table from the text istream
  96. Void loadTable (VlcTable *pVlc,Bool bIncompleteTree=TRUE);//load huffman table from array
  97. Int decodeSymbol ();//return one decoded symbol from the attached CInBitStream
  98.     void attachStream (CInBitStream &bitStream);//attach bitStream to decoder
  99. CInBitStream* bitstream () {return m_pBitStream;};//return attached CInBitSteam
  100. private:
  101.     Void realloc (Int lOldSize,Int lNewSize);
  102.     CHuffmanDecoderNode* m_pTree;
  103.     CInBitStream* m_pBitStream;
  104. };
  105. Class CHuffmanEncoder:public CHuffmanCoDec, public CEntropyEncoder
  106. {
  107. public:
  108. // Constructors
  109.     CHuffmanEncoder (COutBitStream &bitStream);//create and attach encoder
  110. CHuffmanEncoder (COutBitStream &BitStream, VlcTable *pVlc);
  111.     ~CHuffmanEncoder ();//destroy encoder
  112. // Operations
  113.     Void loadTable (istream &HuffmanTable);//load huffman table from the text istream
  114.     Void loadTable (VlcTable *pVlc);//load huffman table from the text istream
  115.     Void attachStream (COutBitStream &BitStream);//attach bitStream to the decoder
  116.     UInt encodeSymbol (Int lSymbol, Char* rgchSymbolName = NULL, Bool bDontSendBits = FALSE);//encode one symbol and put into the attached COutBitStream
  117. COutBitStream* bitstream () {return m_pBitStream;};//return attached COutBitStream
  118. private:
  119. Int m_lCodeTableEntrySize;
  120.     Int* m_pCodeTable;
  121.     Int* m_pSizeTable;
  122.     COutBitStream* m_pBitStream;
  123. };
  124. Class CEntropyEncoderSet{
  125. public:
  126. // Constructors
  127.     CEntropyEncoderSet () {;} // default constructor; do nothing
  128.     CEntropyEncoderSet (COutBitStream &bitStream); // create and attach encoders
  129.     ~CEntropyEncoderSet (); // destroy encoders
  130. CEntropyEncoder* m_pentrencDCT; // encoder for DCT
  131. CEntropyEncoder* m_pentrencDCTIntra; // encoder for Y and A planes of Intra VOP/MB
  132. CEntropyEncoder* m_pentrencMV; // encoder for MV
  133. CEntropyEncoder* m_pentrencMCBPCintra; // encoder for MCBPC = intra 
  134. CEntropyEncoder* m_pentrencMCBPCinter; // encoder for MCBPC = inter 
  135. CEntropyEncoder* m_pentrencCBPY; // encoder for CBPY
  136. CEntropyEncoder* m_pentrencCBPY1; // encoder for CBPY (1 non-transparent blk) 
  137. CEntropyEncoder* m_pentrencCBPY2; // encoder for CBPY (2 non-transparent blk) 
  138. CEntropyEncoder* m_pentrencCBPY3; // encoder for CBPY (3 non-transparent blk) 
  139. CEntropyEncoder* m_pentrencIntraDCy; // encoder for IntraDC (mpeg2 mode only)
  140. CEntropyEncoder* m_pentrencIntraDCc; // encoder for IntraDC (mpeg2 mode only)
  141. CEntropyEncoder* m_pentrencMbTypeBVOP; // encoder for MBtype in B-VOP
  142. CEntropyEncoder* m_pentrencWrpPnt; // encoder for sprite point coding
  143. CEntropyEncoder* m_ppentrencShapeMode[7]; // encoder for first MMR code
  144. CEntropyEncoder* m_pentrencShapeMV1; // encoder for shape mv part 1
  145. CEntropyEncoder* m_pentrencShapeMV2; // encoder for shape mv part 2
  146.   // Added for error resilience mode By Toshiba(1998-1-16:DP+RVLC)
  147.   CEntropyEncoder* m_pentrencDCTRVLC;
  148.   CEntropyEncoder* m_pentrencDCTIntraRVLC;
  149.   // End Toshiba(1998-1-16:DP+RVLC)
  150. };
  151. Class CEntropyDecoderSet{
  152. public:
  153. // Constructors
  154.     CEntropyDecoderSet () {;} // default constructor; do nothing
  155.     CEntropyDecoderSet (CInBitStream &bitStream); // create and attach encoders
  156.     ~CEntropyDecoderSet (); // destroy encoders
  157. CEntropyDecoder* m_pentrdecDCT; // decoder for DCT
  158. CEntropyDecoder* m_pentrdecDCTIntra; // decoder for Y and A planes of Intra VOP/MB
  159. CEntropyDecoder* m_pentrdecMV; // decoder for MV
  160. CEntropyDecoder* m_pentrdecMCBPCintra; // decoder for MCBPC = intra 
  161. CEntropyDecoder* m_pentrdecMCBPCinter; // decoder for MCBPC = inter 
  162. CEntropyDecoder* m_pentrdecCBPY; // decoder for CBPY 
  163. CEntropyDecoder* m_pentrdecCBPY1; // decoder for CBPY (1 non-transparent blk) 
  164. CEntropyDecoder* m_pentrdecCBPY2; // decoder for CBPY (2 non-transparent blk) 
  165. CEntropyDecoder* m_pentrdecCBPY3; // decoder for CBPY (3 non-transparent blk)
  166. CEntropyDecoder* m_pentrdecIntraDCy; // decoder for IntraDC (mpeg2 mode only)
  167. CEntropyDecoder* m_pentrdecIntraDCc; // decoder for IntraDC (mpeg2 mode only)
  168. CEntropyDecoder* m_pentrdecMbTypeBVOP; // decoder for MBtype in B-VOP
  169. CEntropyDecoder* m_pentrdecWrpPnt;
  170. CEntropyDecoder* m_ppentrdecShapeMode [7]; // decoder for first MMR code
  171. CEntropyDecoder* m_pentrdecShapeMV1; // decoder for shape mv part 1
  172. CEntropyDecoder* m_pentrdecShapeMV2; // decoder for shape mv part 2
  173.   // Added for error resilience mode By Toshiba(1998-1-16:DP+RVLC)
  174.   CEntropyDecoder* m_pentrdecDCTRVLC;
  175.   CEntropyDecoder* m_pentrdecDCTIntraRVLC;
  176.   // End Toshiba(1998-1-16:DP+RVLC)
  177. };
  178. #endif