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

流媒体/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. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  9. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  10. as specified by the MPEG-4 Video. 
  11. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  12. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  13. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  14. The original developer of this software module and his/her company, 
  15. the subsequent editors and their companies, 
  16. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  17. Copyright is not released for non MPEG-4 Video conforming products. 
  18. Microsoft retains full right to use the code for his/her own purpose, 
  19. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  20. This copyright notice must be included in all copies or derivative works. 
  21. Copyright (c) 1996, 1997.
  22. Module Name:
  23. MBenc.hpp
  24. Abstract:
  25. MacroBlock encoder
  26. Revision History:
  27. *************************************************************************/
  28. #ifndef __MBENC_HPP_
  29. #define __MBENC_HPP_
  30. Class CMacroBlockEncoder : public CMacroBlock
  31. {
  32. friend class CVOPofMBsEncoder;
  33. public:
  34. // Constructors
  35. ~CMacroBlockEncoder ();
  36. CMacroBlockEncoder (
  37. Time tBCounter, // B-VOP counter
  38. const CVOPIntYUVBA* pvopfCurr, // original VOP 
  39. UInt indexX, // index is the indexTH macroblock of vopF
  40. UInt indexY, // index is the indexTH macroblock of vopF
  41. const VOLMode& volmd, // VOL mode
  42. const VOPMode& vopmd, // VOP mode
  43. const CVOPIntYUVBA* pvopfMRef0, // reference VOP in a previous time for motion estimation
  44. const CVOPIntYUVBA* pvopfMRef1, // reference VOP in a later time for motion estimation
  45. const CVOPIntYUVBA* pvopfRef0, // reference VOP in a previous time
  46. const CVOPIntYUVBA* pvopfRef1, // reference VOP in a later time
  47. COutBitStream* pbitstrmOut, // output bitstream
  48. CEntropyEncoderSet* pentrencSet // collection of entropy encoders
  49. ); 
  50. // Attributes
  51. const CVOPIntYUVBA* pvopfPred () const {return m_pvopfPred;}
  52. const CVOPIntYUVBA* pvopfText () const {return m_pvopfTexture;}
  53. const CStatistics& statistics () const {return m_stat;} // return statistics
  54. // Operations
  55. Void setPredMB (const CVOPIntYUVBA* pvopfPred); // set the predicted MB data
  56. Double motionEsti (
  57. Bool bInBoundRef1, // these data are for direct mode 
  58. const CMBMode* pmbmdRef1 = NULL,
  59. const CMotionVector* rgmvRef1 = NULL,
  60. Time tBCounter = 0
  61. ); // find MV and set some of the modes
  62. CMotionVector motionEstiForShape (const CMotionVector& mvPredictor);
  63. // find MV for binary shape MB
  64. Void textureQuantize (); // DCT and quantize DCT coefficients
  65. Void zigZagScanAndIntraDCACPrediction (const CMacroBlock* pmbPredLeft, 
  66.   const CMacroBlock* pmbPredTop,
  67.   const CMacroBlock* pmbPredLeftTop);
  68. Void dctTextureCoeffCompress (); // compress DCT coefficients
  69. Void dctAlphaCoeffCompress (); // compress DCT coefficients for gray alpha
  70. Void codeOverhead (Int iPart = 0, const CMBMode* pmbmdColocatedRef1 = NULL); //can be split into two parts by iPart
  71. Void codeMotionOverhead (const CMBMode* pmbmdColocatedRef1 = NULL);
  72. Void codeTextureOverhead (const CMBMode* pmbmdColocatedRef1 = NULL);
  73. Void codeAlphaOverhead ();
  74. Void decideSkipMB (); // decide whether to skip the MB
  75. Void setMVStat (UInt nbitsForMV) // set number of bits for MV from vopMBs 
  76. {m_stat.nBitsMV = nbitsForMV;}
  77. Void addMVStat (UInt nbitsForMV) // add number of bits for MV from vopMBs 
  78. {m_stat.nBitsMV += nbitsForMV;}
  79. ///////////////// implementation /////////////////
  80. private:
  81. const CVOPIntYUVBA* m_pvopfMRef0;
  82. const CVOPIntYUVBA* m_pvopfMRef1;
  83. own CVOPIntYUVBA* m_pvopfPred; // predicted MB (only for inter MB)
  84. own CVOPIntYUVBA* m_pvopfTexture; // texture data to be coded
  85. own CIntImage* m_pfiBYOrig;
  86. own CIntImage* m_pfiBUVOrig;
  87. COutBitStream* m_pbitstrmOut; // output bitstream
  88. CEntropyEncoderSet* m_pentrencSet;
  89. CEntropyEncoder* m_pentrencDCT; // collection huffman encoder
  90. CEntropyEncoder* m_pentrencMCBPCinter; // entropy coder for MCBPC
  91. CEntropyEncoder* m_pentrencMCBPCintra; // entropy coder for MCBPC
  92. CEntropyEncoder* m_pentrencMbTypeBVOP; // entropy coder for MBtype (BVOP)
  93. CStatistics m_stat;
  94. Double blockMatch (Bool bForward, Bool bApply8x8); // perform forward or backward block match
  95. Double interpolateMC () const; // compute the SAD for the interpolate mode
  96. Double directMC () const; // compute the SAD for the interpolate mode
  97. Void decideDCTMode (Double sadInter);
  98. Void setBlkToQuanMB (const CIntImage* pfiBlkQ, BlockNum blkNum); // overlay a quantized block to currQ 
  99. Bool zeroMotionV (MBType mbType) const; // check whether the MV's are all zero
  100. Void computeDirectDeltaMV (const CMBMode* pmbmdRef1, const CMotionVector* rgmvRef1, Time tBCounter);
  101. Void decideCODA (); // decide the skip mode of alpha plane
  102. Void storeOriginalBianry (); // original shape is for texture coding
  103. };
  104. #endif // __MBENC_HPP_