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

流媒体/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. and also edited by
  14. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  15. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  16. (date: July, 1998)
  17. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  18. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  19. as specified by the MPEG-4 Video. 
  20. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  21. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  22. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  23. The original developer of this software module and his/her company, 
  24. the subsequent editors and their companies, 
  25. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  26. Copyright is not released for non MPEG-4 Video conforming products. 
  27. Microsoft retains full right to use the code for his/her own purpose, 
  28. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  29. This copyright notice must be included in all copies or derivative works. 
  30. Copyright (c) 1996, 1997.
  31. Module Name:
  32. vopSeDec.hpp
  33. Abstract:
  34. Decoder for one Video Object.
  35. Revision History:
  36. 09-30-97: merge error resilient changes from Toshiba by wchen@microsoft.com
  37. 11-30-97: added Spatial tools by Takefumi Nagumo(nagumo@av.crl.sony.co.jp) SONY corporation
  38. 12-20-97: Interlaced tools added by NextLevel Systems
  39.         X. Chen (xchen@nlvl.com), B. Eifrig (beifrig@nlvl.com)
  40. *************************************************************************/
  41. #ifndef __VOPSEDEC_HPP_ 
  42. #define __VOPSEDEC_HPP_
  43. class CVideoObject;
  44. class istream;
  45. class strstreambuf;
  46. class CInByteStream;
  47. class CInBitStream;
  48. class CEntropyDecoderSet;
  49. class CEntropyDecoder;
  50. class CVOPU8YUVBA;
  51. class CEnhcBufferDecoder;
  52. Class CVideoObjectDecoder : public CVideoObject
  53. {
  54. friend class CVideoObjectDecoderTPS; ///// 97/12/22
  55. friend class CEnhcBufferDecoder;
  56. public:
  57. // Constructors
  58. ~CVideoObjectDecoder ();
  59. CVideoObjectDecoder ();
  60. CVideoObjectDecoder ( 
  61. const Char* pchStrFile, // bitstream file
  62. Int iDisplayWidth, Int iDisplayHeight,
  63. Bool *pbSpatialScalability = NULL,
  64. Bool *p_short_video_header=FALSE //,
  65. // strstreambuf* pistrm = NULL
  66. );
  67.         CVideoObjectDecoder ( // for back/forward shape
  68. int iDisplayWidth, int iDisplayHeight
  69. );
  70. Void SetUpBitstreamBuffer(unsigned char *bptr, 
  71.   uint32_t blen) {
  72.   m_pbitstrmIn->set_buffer(bptr, blen);
  73. };
  74. int get_used_bytes(void) { return m_pbitstrmIn->get_used_bytes(); };
  75. Void FakeOutVOVOLHead(int h, int w, int fr, Bool *pbSpatialScalability);
  76. void postVO_VOLHeadInit(Int iDisplayWidth, Int iDisplayHeight,Bool *pbSpatialScalability);
  77. // Operations
  78. Int decode (const CVOPU8YUVBA* pvopcBVOPQuant = NULL, /* strstreambuf* pistrm = NULL, */ Bool waitForI = FALSE, Bool drop = FALSE);
  79. Int ReadNextVopPredType ();  //for Spatial Scalable Coding
  80. Int h263_decode(); // [FDS]
  81. Void decodeInitSprite ();
  82. Void decodeSpritePieces ();
  83. Int decodeOneSpritePiece ();
  84. CRct decodeVOSHead ();
  85. SptXmitMode m_oldSptXmitMode ;
  86. ///////////////// implementation /////////////////
  87. ///// 97/12/22 start
  88. public:
  89. CVideoObjectDecoder* rgpbfShape [2]; // 0 : backward, 1: forward
  90. ///// 97/12/22 end
  91. // Added by KPN for short headers
  92. void video_plane_with_short_header();
  93. void gob_layer();
  94. void decodeShortHeaderIntraMBDC(Int *rgiCoefQ);
  95. //Added by KPN for short headers - END
  96. //protected:
  97. public:
  98. own int m_pistrm;
  99. own CInBitStream* m_pbitstrmIn; //bitstream
  100. own CEntropyDecoderSet* m_pentrdecSet; //huffman decoder set
  101.   //used for video packet header decoding by Toshiba
  102.   //they are basically cached values of not update after the header decoding
  103. Time m_tOldModuloBaseDisp;   //of the most recently displayed I/Pvop
  104. Time m_tOldModuloBaseDecd;   //of the most recently decoded I/Pvop
  105. // buffer data
  106. CVOPU8YUVBA* m_pvopcRightMB;
  107. PixelC *m_ppxlcRightMBBY, *m_ppxlcRightMBBUV;
  108. // buffers for temporal scalability Added by Sharp(1998-02-10)
  109. CEnhcBufferDecoder* m_pBuffP1;
  110. CEnhcBufferDecoder* m_pBuffP2;
  111. CEnhcBufferDecoder* m_pBuffB1;
  112. CEnhcBufferDecoder* m_pBuffB2;
  113. CEnhcBufferDecoder* m_pBuffE;
  114. int m_coded;
  115. // buffers for temporal scalability End  Sharp(1998-02-10)
  116. // Added for short headers by KPN (1998-02-07, DS)
  117. Bool short_video_header;
  118. UInt uiPei; // [FDS]
  119. UInt uiGobNumber;
  120. UInt uiNumGobsInVop;
  121. UInt uiNumMacroblocksInGob;
  122. UInt uiGobHeaderEmpty;
  123. // Added for short headers by KPN - END
  124. int m_iClockRateScale; // added by Sharp (98/6/26)
  125.   // Added for error resilience mode By Toshiba(1998-1-16:DP+RVLC)
  126.   Int* m_piMCBPC;
  127.   Int* m_piIntraDC;
  128.   // End Toshiba(1998-1-16:DP+RVLC)
  129. // error handling
  130. Void errorInBitstream (Char* rgchErorrMsg);
  131. Int findStartCode(int dontloop = 0);
  132. // VO and VOL routines
  133. Void decodeVOHead ();
  134. Void decodeVOBody();
  135. Void decodeVOLHead ();
  136. Void decodeVOLBody();
  137. // VOP routines
  138. Bool decodeVOPHead ();
  139. Void decodeVOP ();
  140. Void decodeIVOP ();
  141. Void decodePVOP ();
  142. Void decodeBVOP ();
  143. Void decodeIVOP_WithShape ();
  144. Void decodePVOP_WithShape ();
  145. Void decodeBVOP_WithShape ();
  146. // Void computeMVInfo ();
  147.   // Added for error resilience mode By Toshiba(1998-1-16:DP+RVLC)
  148.   Void decodeIVOP_DataPartitioning ();
  149.   Void decodePVOP_DataPartitioning ();
  150. Void decodeIVOP_WithShape_DataPartitioning ();
  151. Void decodePVOP_WithShape_DataPartitioning ();
  152.   // End Toshiba(1998-1-16:DP+RVLC)
  153. // MB routines : texture and overhead
  154. // I-VOP
  155. Void decodeMBTextureHeadOfIVOP (CMBMode* pmbmd, Int& iCurrQP,
  156. Bool &bUseNewQPForVlcThr);
  157. Void decodeTextureIntraMB (CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, 
  158. PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV);
  159. Void decodeMBAlphaHeadOfIVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA, Int iVopQP, Int iVopQPA);
  160. Void decodeAlphaIntraMB (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcRefMBA);
  161. // P-VOP
  162. Void decodeMBTextureHeadOfPVOP (CMBMode* pmbmd, Int& iCurrQP,
  163. Bool &bUseNewQPForVlcThr);
  164. Void decodeMBAlphaHeadOfPVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA);
  165. Void decodeTextureInterMB (CMBMode* pmbmd);
  166. Void decodeAlphaInterMB (CMBMode* pmbmd, PixelC *ppxlcRefMBA);
  167. // B-VOP
  168. Void decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int& iCurrQP);
  169. Void decodeMBAlphaHeadOfBVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA);
  170. Void setCBPYandC (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk);
  171. // motion compensation
  172. Void motionCompTexture (
  173. const CMotionVector* pmv, const CMBMode* pmbmd, 
  174. Int imbX, Int imbY,
  175. CoordI x, CoordI y
  176. );
  177. Void motionCompAlpha (
  178. const CMotionVector* pmv, const CMBMode* pmbmd, 
  179. Int imbX, Int imbY,
  180. CoordI x, CoordI y
  181. );
  182. // B-VOP
  183. Void motionCompAndAddErrorMB_BVOP (
  184. const CMotionVector* pmvForward, const CMotionVector* pmvBackward,
  185.  CMBMode* pmbmd, // new change 02-19-99
  186. Int iMBX, Int iMBY, 
  187. CoordI x, CoordI y,
  188. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  189. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  190. ); 
  191. Void motionCompAlphaMB_BVOP(
  192. const CMotionVector* pmvForward, const CMotionVector* pmvBackward,
  193.  CMBMode* pmbmd, // new change 02-19-99
  194. Int iMBX, Int iMBY, 
  195. CoordI x, CoordI y,
  196. PixelC* ppxlcCurrQMBA,
  197. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  198. );
  199. Void copyFromRefToCurrQ_BVOP (
  200. const CMBMode* pmbmd,
  201. CoordI x, CoordI y, 
  202. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  203. CRct *prctMVLimitForward, CRct *prctMVLimitBackward
  204. );
  205. Void motionCompSkipMB_BVOP (
  206. const CMBMode* pmbmd, const CMotionVector* pmvForward, const CMotionVector* pmvBackward,
  207. CoordI x, CoordI y, 
  208. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  209. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  210. );
  211. Void copyFromPredForYAndRefForCToCurrQ (
  212. CoordI x, CoordI y, 
  213. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  214. CRct *prctMVLimit
  215. ); // for obmc mode
  216. Void copyAlphaFromPredToCurrQ (
  217. CoordI x, CoordI y, 
  218. PixelC* ppxlcCurrQMBA
  219. );
  220. // error signal for B-VOP MB
  221. Void averagePredAndAddErrorToCurrQ (
  222. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV
  223. );
  224. Void averagePredAndAssignToCurrQ (
  225. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV
  226. );
  227. // motion vector
  228. Void decodeMV (const CMBMode* pmbmd, CMotionVector* pmv, Bool bLeftBndry, Bool bRightBndry, Bool bTopBndry, Bool bZeroMV, Int iMBX, Int iMBY);
  229. Void decodeMVWithShape (const CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CMotionVector* pmv);
  230. Void getDiffMV (CVector& vctDiffMV, MVInfo mvinfo); //get half pel
  231. Int  deScaleMV (Int iVLC, Int iResidual, Int iScaleFactor);
  232. Void fitMvInRange (CVector& vctSrc, MVInfo mvinfo);
  233. Void decodeMVofBVOP (CMotionVector* pmvForward, CMotionVector* pmvBackward, CMBMode* pmbmd, 
  234.  Int iMBX, Int iMBY, const CMotionVector* pmvRef, const CMBMode* pmbmdRef);
  235. Void computeDirectForwardMV (CVector vctDiff, CMotionVector* pmv, const CMotionVector* pmvRef, const CMBMode* pmbmdRef);
  236. // shape decoding functions
  237. Void swapCurrAndRightMBForShape ();
  238. Void decodeIntraShape (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcCurrMBBY, PixelC* ppxlcCurrMBBYFrm);
  239. Void decodeInterShape (CVOPU8YUVBA* pvopcRefQ,CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, CoordI iX, CoordI iY, CMotionVector* pmv, CMotionVector* pmvBY, 
  240.    PixelC* ppxlcMBBY, PixelC* ppxlcMBBYFrm, const ShapeMode& shpmdColocatedMB);
  241. Int  shpMdTableIndex (const CMBMode* pmbmd, Int iMBX, Int iMBY);
  242. Void decodeIntraCaeBAB (PixelC* ppxlcCurrMBBY, PixelC* ppxlcCurrMBBYFrm);
  243. Void decodeIntraCAEH ();
  244. Void decodeIntraCAEV ();
  245. Void decodeInterCAEH (const PixelC *);
  246. Void decodeInterCAEV (const PixelC *);
  247. Void decodeMVDS (CMotionVector& mvDiff);
  248. //for temporal scalability Added by Sharp(1998-02-10)
  249. void updateBuffVOPsBase (CVideoObjectDecoder* pvodecEnhc);
  250. void updateRefVOPsEnhc ();
  251. void updateBuffVOPsEnhc ();
  252. void copyRefQ1ToQ0 ();
  253. void copyTobfShape ();
  254. Void decode_IShape (); // for back/forward shape
  255. // Void compute_bfShapeMembers ();
  256. Void BackgroundComposition(char* argv[], Bool bScalability, Int width, Int height, FILE *pfYUV); // for background composition // modified by Sharp (98/10/26)
  257. Void dumpDataOneFrame(char* argv[], Bool bScalability, CRct& rctDisplay); // write pvopcReconCurr () with Sharp's format
  258. Void dumpDataAllFrame(FILE* pfReconYUV, FILE* pfReconSeg, CRct& rctDisplay);
  259. // I/O
  260. Time senseTime ();
  261. Time getTime ();
  262. int getPredType ();
  263. // bufferControl
  264. void set_enh_display_size(CRct rctDisplay, CRct *rctDisplay_SSenh);
  265. void bufferP1flush ();
  266. void bufferB1flush ();
  267. void bufferB2flush ();
  268. void copyBufP2ToB1 ();
  269. //for temporal scalability End  Sharp(1998-02-10)
  270. void setClockRateScale ( CVideoObjectDecoder *pvopdec ); // added by Sharp (98/6/26)
  271. // INTERLACE
  272. Void fieldDCTtoFrameC(PixelC* ppxlcRefMBY);
  273. Void fieldDCTtoFrameI(PixelI* ppxlcCurrMBY);
  274. // ~INTRELACE
  275. // Block decoding functions
  276. Void decodeIntraBlockTexture (PixelC* rgchBlkDst,
  277.  Int iWidthDst,
  278.  Int iQP, 
  279.  Int iDcScaler,
  280.  Bool bIsYBlock,
  281.  MacroBlockMemory* pmbmCurr,
  282.  CMBMode* pmbmd,
  283.    const BlockMemory blkmPred,
  284.  Int iQPPred);
  285. Void decideIntraPred (const BlockMemory& blkmRet, 
  286.    CMBMode* pmbmdCurr,
  287.    Int& iQPpred,
  288.    BlockNum blkn,    
  289.    const MacroBlockMemory* pmbmLeft, 
  290.       const MacroBlockMemory* pmbmTop, 
  291.    const MacroBlockMemory* pmbmLeftTop,
  292.    const MacroBlockMemory* pmbmCurr,
  293.    const CMBMode* pmbmdLeft,
  294.    const CMBMode* pmbmdTop,
  295.    const CMBMode* pmbmdLeftTop);
  296. Void decodeTextureInterBlock (Int* rgiBlkCurrQ, Int iWidthCurrQ, Int iQP, Bool bAlphaBlock);
  297. Void decodeIntraTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag);
  298. Void decodeInterTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag);
  299. Int decodeIntraDCmpeg (Bool bIsYBlk); //decode the intra-dc: mpeg2 method
  300. Void decodeInterVLCtableIndex (Int iIndex, Int&  iLevel, Int&  iRun, Bool& bIsLastRun);  // return islastrun, run and level
  301. Void decodeIntraVLCtableIndex (Int iIndex, Int&  iLevel, Int&  iRun, Bool& bIsLastRun);  // return islastrun, run and level
  302. typedef Void (CVideoObjectDecoder::*DECODE_TABLE_INDEX)(Int iIndex, Bool& bIsLastRun, Int&  iRun, Int&  iLevel); //func ptr code escp. decoding
  303. Void decodeEscape (Int& iLevel, Int& iRun, Int& bIsLastRun, const Int* rgiLMAX, const Int* rgiRMAX, 
  304.    CEntropyDecoder* pentrdec, DECODE_TABLE_INDEX decodeVLCtableIndex);
  305. Void inverseDCACPred (const CMBMode* pmbmd, Int iBlkIdx, Int* rgiCoefQ, Int iQP, Int iDcScaler, const BlockMemory blkmPred, Int iQpPred);
  306. // sprite decoding
  307. Int decodeSpt ();
  308. Void decodeWarpPoints ();
  309. // added for error resilience mode By Toshiba
  310. Int checkResyncMarker();
  311. Bool decodeVideoPacketHeader(Int& iCurrentQP);
  312.   // added for error resilience mode(DP+RVLC) By Toshiba(1998-1-16:DP+RVLC)
  313.   Int checkMotionMarker();
  314.   Int checkDCMarker();
  315.   // I-VOP
  316.   Void decodeMBTextureDCOfIVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP,
  317. Int* piIntraDC, Bool &bUseNewQPForVlcThr);
  318.   Void decodeMBTextureHeadOfIVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC);
  319.   Void decodeTextureIntraMB_DataPartitioning (CMBMode* pmbmd, CoordI iMBX, CoordI iMBY,
  320.   PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV, Int* piIntraDC);
  321.  
  322.   // P-VOP
  323.   Void decodeMBTextureHeadOfPVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP, Int* piMCBPC,
  324. Int* piIntraDC, Bool &bUseNewQPForVlcThr);
  325.   Void decodeTextureInterMB_DataPartitioning (CMBMode* pmbmd);
  326.  
  327.   // B-VOP
  328.   Void decodeMBTextureHeadOfBVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrQP);
  329.  
  330.   Void setCBPYandC_DataPartitioning (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk);
  331.  
  332.   Void decodeIntraBlockTexture_DataPartitioning (Int iBlk, CMBMode* pmbmd, Int* piINtraDC);
  333.   Void decodeIntraBlockTextureTcoef_DataPartitioning (PixelC* rgchBlkDst,
  334.    Int iWidthDst,
  335.    Int iQP, 
  336.    Int iDcScaler,
  337.    Bool bIsYBlock,
  338.    MacroBlockMemory* pmbmCurr,
  339.    CMBMode* pmbmd,
  340.    const BlockMemory blkmPred,
  341.    Int iQPPred,
  342.    Int* piIntraDC);
  343.  
  344.   Void decodeIntraRVLCTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag);
  345.   Void decodeInterRVLCTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag);
  346.   Void decodeInterRVLCtableIndex (Int iIndex, Int&  iLevel, Int&  iRun, Int& bIsLastRun);  // return islastrun, run and level
  347.   Void decodeIntraRVLCtableIndex (Int iIndex, Int&  iLevel, Int&  iRun, Bool& bIsLastRun);  // return islastrun, run and level
  348.   Void decodeRVLCEscape (Int& iLevel, Int& iRun, Int& bIsLastRun, const Int* rgiLMAX, const Int* rgiRMAX, 
  349.      CEntropyDecoder* pentrdec, DECODE_TABLE_INDEX decodeVLCtableIndex);
  350.   // End Toshiba(DP+RVLC)(1998-1-16:DP+RVLC)
  351. };
  352. #endif // __VOPSEDEC_HPP_