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

流媒体/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.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  10. and also edited by
  11. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  12. Takeshi Nagai (TOSHIBA CORPORATION)
  13. Toshiaki Watanabe (TOSHIBA CORPORATION)
  14. Noboru Yamaguchi (TOSHIBA CORPORATION)
  15. and edited by Xuemin Chen (General Instrument Corp.)
  16. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  17. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  18. as specified by the MPEG-4 Video. 
  19. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  20. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  21. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  22. The original developer of this software module and his/her company, 
  23. the subsequent editors and their companies, 
  24. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  25. Copyright is not released for non MPEG-4 Video conforming products. 
  26. Microsoft retains full right to use the code for his/her own purpose, 
  27. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  28. This copyright notice must be included in all copies or derivative works. 
  29. Copyright (c) 1996, 1997.
  30. Module Name:
  31. vopSes.hpp
  32. Abstract:
  33. Base class for the encoder for one Video Object.
  34. Revision History:
  35.     December 20, 1997   Interlaced tools added by General Instrument Corp.(GI)
  36.                         X. Chen (xchen@gi.com), B. Eifrig (beifrig@gi.com)
  37.         May. 9   1998:  add boundary by Hyundai Electronics 
  38.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr) 
  39.         May. 9   1998:  add field based MC padding by Hyundai Electronics 
  40.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr) 
  41. *************************************************************************/
  42. #ifndef __VOPSES_HPP_ 
  43. #define __VOPSES_HPP_
  44. typedef enum {NOT_DONE, PIECE_DONE, UPDATE_DONE} SptMBstatus;
  45. #define BlockMemory Int*
  46. typedef struct MacroBlockMemory {
  47. BlockMemory* rgblkm;
  48. } MacroBlockMemory;
  49. Class ArCodec;
  50. Class CInvBlockDCT;
  51. Class CVideoObject
  52. {
  53. public:
  54. // Constructors
  55. virtual ~CVideoObject ();
  56. CVideoObject ();
  57. // Attributes
  58. const CVOPU8YUVBA* pvopcQuantCurr () const {return m_pvopcCurrQ;}
  59. const CVOPU8YUVBA* pvopcRefQPrev () const {return m_pvopcRefQ0;}
  60. const CVOPU8YUVBA* pvopcRefQLater () const {return m_pvopcRefQ1;}
  61. //This modification is for reconstructed BVOP image in SS coding should be used as refrence layer 
  62. const CVOPU8YUVBA* pvopcReconCurr () const; 
  63. // {return   ((m_vopmd.vopPredType == BVOP && m_volmd.volType == BASE_LAYER) 
  64. //  ||(m_vopmd.vopPredType == BVOP && m_vopmd.iRefSelectCode != 0)
  65. //  ||(m_vopmd.vopPredType == SPRITE && m_volmd.fAUsage != RECTANGLE)) 
  66. //  ? m_pvopcCurrQ : m_pvopcRefQ1;} //reconstructed current frame
  67. const VOLMode& volmd () const {return m_volmd;}
  68. const VOPMode& vopmd () const {return m_vopmd;}
  69. UInt fSptUsage () const {return m_uiSprite;}
  70. // Operations
  71. //virtual Void encode () {}
  72. Void swapRefQ1toSpt ();
  73. Void changeSizeofCurrQ (CRct rctOrg);
  74. Void setRctDisp (CRct rctDisp) {m_rctSptDisp = rctDisp;}
  75. Int iNumOfPnts () const {return m_iNumOfPnts;}
  76. const CVOPU8YUVBA* pvopcSptQ () const {return m_pvopcSptQ;}   
  77. //low latency sprite stuff
  78. Void Overlay (CU8Image& uci1, CU8Image& uci2, float fscale); //1 on 2
  79. Void VOPOverlay (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, Int iscale = 0); //1 on 2
  80. // dshu: begin of modification
  81. Void U8iGet (CU8Image& uci1, CU8Image& uci2, CRct rctPieceY); 
  82. Void PieceGet (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, CRct rctPieceY);
  83. Void U8iPut (CU8Image& uci1, CU8Image& uci2, CRct rctPieceY); 
  84. Void PiecePut (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, CRct rctPieceY); 
  85. // dshu: end of modification
  86. // dshu: [v071]  Begin of modification
  87. Void padSprite();
  88. Void copySptQShapeYToMb (PixelC* ppxlcDstMB, const PixelC* ppxlcSrc) ;
  89. // dshu: [v071] end of modification
  90. Bool SptPieceMB_NOT_HOLE(Int iMBXoffset, Int iMBYoffset, CMBMode* pmbmd); 
  91. Bool SptUpdateMB_NOT_HOLE(Int iMBXoffset, Int iMBYoffset, CMBMode* pmbmd);
  92. Void SaveMBmCurrRow (Int iMBYoffset, MacroBlockMemory** rgpmbmCurr);
  93. Void RestoreMBmCurrRow (Int iMBYoffset, MacroBlockMemory** rgpmbmCurr);
  94. Void CopyCurrQToPred (PixelC* ppxlcQMBY, PixelC* ppxlcQMBU, PixelC* ppxlcQMBV);
  95. ///// 97/12/22 start
  96. Void copyVOPU8YUVBA (CVOPU8YUVBA*& pvopc0, CVOPU8YUVBA*& pvopc1);
  97. Void copyVOPU8YUVBA (CVOPU8YUVBA*& pvopc0, CVOPU8YUVBA*& pvopc1, CVOPU8YUVBA*& pvopc2);
  98. Void compute_bfShapeMembers ();
  99. ///// 97/12/22 end
  100. ///////////////// implementation /////////////////
  101. Int getWidth(void) { return m_ivolWidth;};
  102. Int getHeight(void) { return m_ivolHeight;};
  103. double getFrameTime(void) { return (m_t / (double)m_volmd.iClockRate); };
  104. Int getClockRate(void) { return m_volmd.iClockRate; };
  105. protected:
  106. // general routines
  107. Void swapVOPU8Pointers (CVOPU8YUVBA*& pvopc0, CVOPU8YUVBA*& pvopc1);
  108. Void swapVOPIntPointers (CVOPIntYUVBA*& pvopi0, CVOPIntYUVBA*& pvopi1);
  109. // VOL routines
  110. Void allocateVOLMembers (Int iSessionWidth, Int iSessionHeight);
  111. Void computeVOLConstMembers ();
  112. // VOP routines
  113. Void computeVOPMembers ();
  114. Void setRefStartingPointers ();
  115. Void updateAllRefVOPs ();
  116. Void updateAllRefVOPs (const CVOPU8YUVBA *pvopcRefBaselayer); // for spatial scalability
  117. Void repeatPadYOrA (PixelC* ppxlcOldLeft, CVOPU8YUVBA* pvopcRef);
  118. Void repeatPadUV (CVOPU8YUVBA* pvopcRef);
  119. Void resetBYPlane ();
  120. // MB routines
  121. Void decideTransparencyStatus (CMBMode* pmbmd, const PixelC* ppxlcMBBY);
  122. Void decideMBTransparencyStatus (CMBMode* pmbmd);
  123. Void downSampleBY (const PixelC* ppxlcMBBY, PixelC* ppxlcMBBUV); // downsample original BY now for LPE padding (using original shape)
  124. // Added for field based MC padding by Hyundai(1998-5-9)
  125.         Void decideFieldTransparencyStatus (
  126.                 CMBMode* pmbmd,
  127.                 const PixelC* ppxlcMBBY,
  128.                 const PixelC* ppxlcMBBUV
  129.         );
  130.         Void fieldBasedDownSampleBY (
  131.                 const PixelC* ppxlcMBBY,
  132.                 PixelC* ppxlcMBBUV
  133.         );
  134. // End of Hyundai(1998-5-9)
  135. // error signal processing
  136. Void addErrorAndPredToCurrQ (PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV);
  137. Void addAlphaErrorAndPredToCurrQ (PixelC* ppxlcRefMBA);
  138. // shape coding functions
  139. Void saveShapeMode();
  140. own Int* computeShapeSubBlkIndex (Int iSubBlkSize, Int iSrcSize);
  141. Int getContextUS (PixelC a, PixelC b, PixelC c, PixelC d, PixelC e, PixelC f, PixelC g, PixelC h);
  142. PixelC getRefValue (const PixelC* ppxlcRow, Int x_adr, Int y_adr, Int h_size, Int v_size);
  143. Void adaptiveUpSampleShape (const PixelC* rgpxlcSrc, PixelC* rgpxlcDst, Int h_size, Int v_size);
  144. Void downSampleShapeMCPred(const PixelC* ppxlcSrc,PixelC* ppxlcDst,Int iRate);
  145. Void upSampleShape (PixelC* ppxlcBYFrm,const PixelC* rgpxlcSrc, PixelC* rgpxlcDst);
  146. Void copyLeftTopBorderFromVOP (PixelC* ppxlcSrc, PixelC* ppxlcDst);
  147. Void subsampleLeftTopBorderFromVOP (PixelC* ppxlcSrc, PixelC* ppxlcDst);
  148. Void makeRightBottomBorder (PixelC* ppxlcSrc, Int iWidth);
  149. Int contextIntra (const PixelC* ppxlcSrc);
  150. Int contextIntraTranspose (const PixelC* ppxlcSrc);
  151. Int contextInter (const PixelC* ppxlcSrc, const PixelC* ppxlcPred);
  152. Int contextInterTranspose (const PixelC* ppxlcSrc, const PixelC* ppxlcPred);
  153. Void copyReconShapeToMbAndRef (PixelC* ppxlcDstMB, PixelC* ppxlcRefFrm, PixelC pxlcSrc);
  154. Void copyReconShapeToMbAndRef (PixelC* ppxlcDstMB, PixelC* ppxlcRefFrm, const PixelC* ppxlcSrc, Int iSrcWidth, Int iBorder);
  155. Void copyRefShapeToMb (PixelC* ppxlcDstMB, const PixelC* ppxlcSrc); // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  156. Void copyReconShapeUVToRef (PixelC* ppxlcRefFrm, const PixelC* ppxlcSrc);
  157. CMotionVector findShapeMVP (const CMotionVector* pmv, const CMotionVector* pmvBY, 
  158. const CMBMode* pmbmd, Int iMBX, Int iMBY) const;
  159. Int m_iInverseCR;
  160. // B-VOP stuff
  161. Void findColocatedMB (Int iMBX, Int iMBY, const CMBMode*& pmbmdRef, const CMotionVector*& pmvRef);
  162. // motion compensation
  163. Void limitMVRangeToExtendedBBHalfPel (CoordI &x,CoordI &y,CRct *prct,Int iBlkSize);
  164. Void limitMVRangeToExtendedBBFullPel (CoordI &x,CoordI &y,CRct *prct,Int iBlkSize);
  165. Void motionCompMB (
  166. PixelC* ppxlcPredMB,
  167. const PixelC* ppxlcRefLeftTop,
  168. const CMotionVector* pmv, const CMBMode* pmbmd, 
  169. Int imbX, Int imbY,
  170. CoordI x, CoordI y,
  171. Bool bSkipNonOBMC,
  172. Bool bAlphaMB,
  173. CRct *prctMVLimit
  174. );
  175. Void motionComp (
  176. PixelC* ppxlcPred, // can be either Y or A
  177. const PixelC* ppxlcRefLeftTop,
  178. Int iSize, // either MB or BLOCK size
  179. CoordI xRef, CoordI yRef, // x + mvX, in half pel unit
  180. Int iRoundingControl,
  181. CRct *prctMVLimit
  182. );
  183. Void motionCompUV (
  184. PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV,
  185. const CVOPU8YUVBA* pvopcRef,
  186. CoordI x, CoordI y, 
  187. CoordI xRefUV, CoordI yRefUV, Int iRoundingControl,
  188. CRct *prctMVLimit
  189. );
  190. // INTERLACE
  191. Void motionCompFieldUV (PixelC* ppxlcPredMBU, PixelC* ppxlcPredMBV,
  192. const CVOPU8YUVBA* pvopcRef,CoordI x, CoordI y, 
  193. CoordI xRefUV, CoordI yRefUV, Int iRefFieldSelect);
  194. Void motionCompYField ( PixelC* ppxlcPred, const PixelC* ppxlcRefLeftTop,
  195. CoordI xRef, CoordI yRef);
  196. // new change 02-19-99
  197. Void motionCompDirectMode(CoordI x, CoordI y,  CMBMode *pmbmd, const CMotionVector *pmvRef,
  198.                             CRct *prctMVLimitFwd, CRct *prctMVLimitBak, Int plane);
  199. Void motionCompOneBVOPReference(CVOPU8YUVBA *pvopcPred, MBType type, CoordI x, CoordI y,
  200.                             const CMBMode *pmbmd, const CMotionVector *pmv, CRct *prctMVLimit);
  201. // ~INTERLACE
  202. Void motionCompOverLap (
  203. PixelC* ppxlcPredMB, 
  204. const PixelC* ppxlcRefLeftTop,
  205. const CMotionVector* pmv, // motion vector
  206. const CMBMode* pmbmd, // macroblk mode
  207. Int imbx, // current macroblk index
  208. Int imby, // current macroblk index
  209. CoordI x, // current coordinate system
  210. CoordI y, // current coordinate system
  211. CRct *prctMVLimit
  212. );
  213. Void motionCompBY (
  214. PixelC* ppxlcPred,
  215. const PixelC* ppxlcRefLeftTop,
  216. CoordI iXRef, CoordI iYRef
  217. );
  218. // B-VOP stuff
  219. Void motionCompInterp (
  220. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  221. CoordI x, CoordI y
  222. );
  223. Void bilnrMCVH (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd);
  224. Void bilnrMCV (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd);
  225. Void bilnrMCH (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd);
  226. Void bilnrMC (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd);
  227. Void assignPredToCurrQ (PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV);
  228. Void assignAlphaPredToCurrQ (PixelC* ppxlcRefMBA);
  229. Void copyFromRefToCurrQ ( // zero motion case
  230. const CVOPU8YUVBA* pvopcRef, // reference VOP
  231. CoordI x, CoordI y, 
  232. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  233. CRct *prctMVLimit
  234. ); // for non-obmc mode
  235. Void copyFromRefToCurrQ_WithShape ( // zero motion case
  236. const CVOPU8YUVBA* pvopcRef, // reference VOP
  237. CoordI x, CoordI y, 
  238. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV, PixelC* ppxlcCurrQMBBY
  239. ); // for non-obmc mode
  240. Void copyAlphaFromRefToCurrQ (
  241. const CVOPU8YUVBA* pvopcRef,
  242. CoordI x, CoordI y, 
  243. PixelC* ppxlcCurrQMBA,
  244. CRct *prctMVLimit
  245. );
  246. // MC padding 
  247. Void mcPadCurrMB (
  248. PixelC* ppxlcRefMBY, 
  249. PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  250. PixelC* ppxlcRefMBA 
  251. );
  252. Void mcPadCurr (
  253. PixelC *ppxlcTextureBase, // (uiStride X ???)
  254. const PixelC *ppxlcAlphaBase, // uiBlkSize X uiBlkSize
  255. UInt uiBlkSize, UInt uiStride
  256. );
  257. Void padNeighborTranspMBs (
  258. CoordI xb, CoordI yb,
  259. CMBMode* pmbmd,
  260. PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  261. PixelC* ppxlcRefMBA
  262. );
  263. Void padCurrAndTopTranspMBFromNeighbor (
  264. CoordI xb, CoordI yb,
  265. CMBMode* pmbmd,
  266. PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  267. PixelC* ppxlcRefMBA
  268. );
  269. Void mcPadLeftMB (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  270. Void mcPadTopMB (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  271. Void mcPadCurrMBFromLeft (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  272. Void mcPadCurrMBFromTop (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  273. Void mcSetTopMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  274. Void mcSetCurrMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  275. Void mcSetLeftMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcRefMBA);
  276. // Added for field based MC padding by Hyundai(1998-5-9)
  277.         Void fieldBasedMCPadding (
  278.                 CMBMode* pmbmd,
  279.                 CVOPU8YUVBA* pvopcCurrQ
  280.         );
  281.         Void mcPadCurrAndNeighborsMBFields (
  282.                 Int     iMBX,
  283.                 Int     iMBY,
  284.                 CMBMode *pmbmd,
  285.                 PixelC* ppxlcRefMBY,
  286.                 PixelC* ppxlcRefMBU,
  287.                 PixelC* ppxlcRefMBV,
  288.                 PixelC* ppxlcRefMBBY,
  289.                 PixelC* ppxlcRefMBBUV,
  290. PixelC* ppxlcRefMBA
  291.         );
  292.         Void mcPadFieldsCurr (
  293.                 Int     iMBX,
  294.                 Int     iMBY,
  295.                 CMBMode *pmbmd,
  296.                 Int     mode,
  297.                 PixelC  *ppxlcCurrMB1,
  298.                 PixelC  *ppxlcCurrMB2,
  299.                 PixelC  *ppxlcCurrMBB,
  300.                 Int     uiBlkXSize,
  301.                 Int     uiStride
  302.         );
  303.         Void mcPadOneField (
  304.                         PixelC *ppxlcTextureBase,
  305.                         const PixelC *ppxlcAlphaBase,
  306.                         Int uiBlkXSize,
  307.                         Int uiStride
  308.         );
  309.         Void padNeighborTranspMBFields (
  310.                 CoordI  xb,
  311.                 CoordI  yb,
  312.                 CMBMode *pmbmd,
  313.                 Int     mode,
  314.                 PixelC  *ppxlcMBField1,
  315.                 PixelC  *ppxlcMBField2,
  316.                 Int     uiBlkXSize,
  317.                 Int     uiStride
  318.         );         
  319.         Void padCurrAndTopTranspMBFieldsFromNeighbor (
  320.                 CoordI  xb,
  321.                 CoordI  yb,
  322.                 CMBMode *pmbmd,
  323.                 Int     mode,
  324.                 PixelC* ppxlcMBField1,
  325.                 PixelC* ppxlcMBField2,
  326.                 Int     uiBlkXSize,
  327.                 Int     uiStride
  328.         );         
  329.         Void mcPadLeftMBFields (
  330.                 PixelC* ppxlcMBField1,
  331.                 PixelC* ppxlcMBField2,
  332.                 Int uiBlkXSize,
  333.                 Int uiStride
  334.         );         
  335.         Void mcPadTopMBFields (
  336.                 PixelC* ppxlcMBField1,
  337.                 PixelC* ppxlcMBField2,
  338.                 Int uiBlkXSize,
  339.                 Int uiStride
  340.         );         
  341.         Void mcPadCurrMBFieldsFromLeft (
  342.                 PixelC* ppxlcMBField1,
  343.                 PixelC* ppxlcMBField2,
  344.                 Int uiBlkXSize,
  345.                 Int uiStride
  346.         );         
  347.         Void mcPadCurrMBFieldsFromTop (
  348.                 PixelC* ppxlcMBField1,
  349.                 PixelC* ppxlcMBField2,
  350.                 Int uiBlkXSize,
  351.                 Int uiStride
  352.         );         
  353.         Void mcSetTopMBFieldsGray (
  354.                 PixelC* ppxlcMBField1,
  355.                 PixelC* ppxlcMBField2,
  356.                 Int uiBlkXSize,
  357.                 Int uiStride
  358.         );         
  359.         Void mcSetLeftMBFieldsGray (
  360.                 PixelC* ppxlcMBField1,
  361.                 PixelC* ppxlcMBField2,
  362.                 Int uiBlkXSize,
  363.                 Int uiStride
  364.         );         
  365.         Void mcSetCurrMBFieldsGray (
  366.                 PixelC* ppxlcMBField1,
  367.                 PixelC* ppxlcMBField2,
  368.                 Int uiBlkXSize,
  369.                 Int uiStride
  370.         );         
  371. // End of Hyundai(1998-5-9)
  372. // motion vector
  373. Void find16x16MVpred (CVector& vctPred, const CMotionVector* pmv, Bool bLeftBndry, Bool bRightBndry, Bool bTopBndry) const;
  374. Void find8x8MVpredAtBoundary (CVector& vctPred, const CMotionVector* pmv, Bool bLeftBndry, Bool bRightBndry, Bool bTopBndry, BlockNum blknCurr) const;
  375. Void find8x8MVpredInterior (CVector& vctPred, const CMotionVector* pmv, BlockNum blknCurr) const;
  376. Void findMVpredGeneric (CVector& vctPred, const CMotionVector* pmv, const CMBMode* pmbmd, Int iBlk, Int iXMB, Int iYMB) const;
  377. Void findMVpredictorOfBVOP (CVector& vctPred, const CMotionVector* pmv, const CMBMode* pmbmd, Int iMBX) const;       //for B-VOP only
  378. Void mvLookupUV (const CMBMode* pmbmd, const CMotionVector* pmv, CoordI& xRefUV, CoordI& yRefUV,
  379.         CoordI& xRefUV1, CoordI& yRefUV1);
  380. Void mvLookupUVWithShape (const CMBMode* pmbmd, const CMotionVector* pmv, CoordI& xRefUV, CoordI& yRefUV);
  381. Bool validBlock (const CMBMode* pmbmdCurr, const CMBMode* pmbmd, BlockNum blkn) const;
  382. Void computeDirectDeltaMV (CVector& vctDiff, const CMotionVector* pmv, const CMotionVector* pmvRef, const CMBMode* pmbmdRef); //for B-VOP only
  383. CVector averageOfRefMV (const CMotionVector* pmvRef, const CMBMode* pmbmdRef); //for B-VOP only
  384. Void padMotionVectors(const CMBMode *pmbmd,CMotionVector *pmv);
  385. Void backwardMVFromForwardMV ( //compute back mv from forward mv and ref mv for direct mode
  386. CMotionVector& mvBackward, const CMotionVector& mvForward, const CMotionVector& mvRef,
  387. CVector vctDirectDeltaMV);
  388. // Added for error resilient mode by Toshiba(1997-11-14)
  389. Bool bVPNoLeft(Int iMBnum, Int iMBX) const;
  390. Bool bVPNoRightTop(Int iMBnum, Int iMBX) const;
  391. Bool bVPNoTop(Int iMBnum) const;
  392. Bool bVPNoLeftTop(Int iMBnum, Int iMBX) const;
  393. Int VPMBnum(Int iMBX, Int iMBY) const;
  394. // End Toshiba(1997-11-14)
  395. // block level
  396. Void inverseQuantizeIntraDc (Int* rgiCoefQ, Int iDcScaler);
  397. Void inverseQuantizeDCTcoefH263 (Int* rgiCoefQ, Int iStart, Int iQP);
  398. Void inverseQuantizeIntraDCTcoefMPEG (Int* rgiCoefQ, Int iStart, Int iQP, Bool bUseAlphaMatrix);
  399. Void inverseQuantizeInterDCTcoefMPEG (Int* rgiCoefQ, Int iStart, Int iQP, Bool bUseAlphaMatrix);
  400. const BlockMemory findPredictorBlock (
  401. BlockNum iBlk, 
  402. IntraPredDirection predDir,
  403. const MacroBlockMemory* pmbmLeft, 
  404. const MacroBlockMemory* pmbmTop,
  405. const MacroBlockMemory* pmbmLeftTop,
  406. const MacroBlockMemory* pmbmCurr,
  407. const CMBMode* pmbmdLeft, 
  408. const CMBMode* pmbmdTop,
  409. const CMBMode* pmbmdLeftTop,
  410. const CMBMode* pmbmdCurr,
  411. Int& iQPpred
  412. );
  413. Int decideIntraPredDir (
  414. Int* rgiCoefQ,
  415. BlockNum blkn,
  416. const BlockMemory* blkmRet, 
  417. const MacroBlockMemory* pmbmLeft, 
  418. const MacroBlockMemory* pmbmTop, 
  419. const MacroBlockMemory* pmbmLeftTop,
  420. const MacroBlockMemory* pmbmCurr,
  421. const CMBMode* pmbmdLeft,
  422. const CMBMode* pmbmdTop,
  423. const CMBMode* pmbmdLeftTop,
  424. CMBMode* pmbmdCurr,
  425. Int& iQPpred,
  426. Int iQPcurr,
  427. Bool bDecideDCOnly = FALSE
  428. );
  429. Time m_t; // current time
  430. Time m_tPastRef; // time of reference frame in past (for P/B)
  431. Time m_tFutureRef; // time of reference frame in future (for B)
  432. Int m_iBCount; // counts 1,2,3 with B frames, used to pad ref vop once.
  433. Bool m_bCodedFutureRef;
  434.     CRct m_rctDisplayWindow; //display windoew position
  435. Int  m_iNumBitsTimeIncr;
  436. Time m_tDistanceBetwIPVOP; //no. of frms betw. I/PVOP = PeriodOfPVOP except for at irregular period (end of sequence)
  437. Time m_tPrevIorPVOPCounter; //frm. no of previous encoded I/PVOP
  438. Time m_tModuloBaseDisp; //of the most recently displayed I/Pvop
  439. Time m_tModuloBaseDecd; //of the most recently decoded I/Pvop
  440. /*Added by SONY (98/03/30)*/
  441. Bool m_bUseGOV ;
  442. Bool m_bLinkisBroken;
  443. /*Added by SONY (98/03/30)*/
  444. // MB buffer data
  445. CVOPU8YUVBA* m_pvopcPredMB;
  446. PixelC *m_ppxlcPredMBY, *m_ppxlcPredMBU, *m_ppxlcPredMBV, *m_ppxlcPredMBA;
  447. CVOPIntYUVBA* m_pvopiErrorMB;
  448. PixelI *m_ppxliErrorMBY, *m_ppxliErrorMBU, *m_ppxliErrorMBV, *m_ppxliErrorMBA;
  449. // B-VOP MB buffer
  450. CVOPU8YUVBA* m_pvopcPredMBBack; // backward buffer data
  451. PixelC *m_ppxlcPredMBBackY, *m_ppxlcPredMBBackU, *m_ppxlcPredMBBackV, *m_ppxlcPredMBBackA;
  452. // MB shape data
  453. ArCodec* m_parcodec; //arithmatic coder
  454. CU8Image* m_puciPredBAB; //motion compensated binary shape
  455. PixelC *m_ppxlcPredBABDown2, *m_ppxlcPredBABDown4;
  456. PixelC* m_ppxlcReconCurrBAB;
  457. Int m_iWidthCurrBAB;
  458. PixelC* m_rgpxlcCaeSymbol;
  459. PixelC *m_ppxlcCurrMBBYDown4, *m_ppxlcCurrMBBYDown2;
  460. ShapeMode* m_rgshpmd;  // for saving reference shape mode
  461. Int m_iRefShpNumMBX;
  462. Int m_iRefShpNumMBY;
  463. CVOPU8YUVBA* m_pvopcCurrMB;
  464. PixelC *m_ppxlcCurrMBY, *m_ppxlcCurrMBU, *m_ppxlcCurrMBV, *m_ppxlcCurrMBBY, *m_ppxlcCurrMBBUV, *m_ppxlcCurrMBA;
  465. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  466.         Void boundaryMacroBlockMerge (CMBMode* pmbmd);
  467.         Void isBoundaryMacroBlockMerged (CMBMode* pmbmd);
  468.         Void isBoundaryMacroBlockMerged (CMBMode* pmbmd, PixelC* ppxlcRightMBBY);
  469.         Void overlayBlocks (UInt x1, UInt x2, UInt y1, UInt y2, DCTMode dctMd);
  470.         Void overlayBlocks (PixelC* SB2, PixelI* ppxlcB1, PixelI* ppxlcB2);
  471.         Void overlayBlocks (PixelC* SB1, PixelC* SB2, PixelC* ppxlcB1, PixelC* ppxlcB2);
  472.         Bool checkMergedStatus (UInt x1, UInt x2, UInt y1, UInt y2);
  473.         Bool checkMergedStatus (UInt x1, UInt x2, UInt y1, UInt y2, PixelC* ppxlcBY);
  474.         Void mergedMacroBlockSplit (CMBMode* pmbmd, PixelC* ppxlcRefMBY = NULL, PixelC* ppxlcRefMBA = NULL);
  475.         Void splitTwoMergedBlocks (UInt x1, UInt x2, UInt y1, UInt y2, PixelC* ppxlcIn1, PixelC* ppxlcIn2 = NULL);
  476.         Void splitTwoMergedBlocks (UInt x1, UInt x2, UInt y1, UInt y2, PixelI* ppxlcIn1, PixelI* ppxlcIn2 = NULL);
  477.         Void swapTransparentModes (CMBMode* pmbmd, Bool mode);
  478.         Void setMergedTransparentModes (CMBMode* pmbmd);
  479.         Void initMergedMode (CMBMode* pmbmd);
  480. // End of Hyundai(1998-5-9)*/
  481. // for MC-padding
  482. Bool* m_pbEmptyRowArray;
  483. Bool* m_pbEmptyColArray;
  484. // VOP mode 
  485. VOLMode m_volmd; // vol mode
  486. VOPMode m_vopmd; // vop mode
  487. UInt m_uiVOId; // VOP ID
  488. // sprite info
  489. UInt m_uiSprite; // whether this is a sprite VOP: 1 - yes; other - no
  490. UInt m_uiWarpingAccuracy; // accuracy for sprite warping
  491. Int m_iNumOfPnts; // for sprite warping
  492. own CSiteD* m_rgstSrcQ; // quantized src sts for sprite warping
  493. own CSiteD* m_rgstDstQ; // quantized dst sts for sprite warping
  494. own CVOPU8YUVBA* m_pvopcSptQ; // Loaded first as original sprite and then become quantized sprite. 
  495. CRct m_rctSpt; // rct of m_pvopcSptQ
  496. CRct m_rctSptDisp; //rct to display sprite (decoder side)
  497. SptMode m_sptMode;  // sprite reconstruction mode : 0 -- basic sprite , 1 -- Object piece only, 2 -- Update piece only, 3 -- intermingled
  498. own MBSptMode* m_rgsptmd; // sprite mode 0: untransmitted; 1: transmitted; 2: updated; 3: done
  499. // internal data
  500. own CVOPU8YUVBA* m_pvopcRefQ0; // original reference VOP in a previous time
  501. own CVOPU8YUVBA* m_pvopcRefQ1; // original reference VOP in a later time
  502. own CVOPU8YUVBA* m_pvopcCurrQ; // original reference VOP in a later time
  503. Int m_iStartInRefToCurrRctY, m_iStartInRefToCurrRctUV;
  504. // motion data
  505. own CDirectModeData* m_pdrtmdRef1; // for direct mode
  506. CVector m_vctForwardMvPredBVOP[2]; // motion vector predictors for B-VOP
  507. CVector m_vctBackwardMvPredBVOP[2];     // [2] added for interlace (top & bottom fields)
  508. // some fixed variables (VOL)
  509. CRct m_rctRefFrameY, m_rctRefFrameUV;
  510. Int m_iFrameWidthYxMBSize, m_iFrameWidthYxBlkSize, m_iFrameWidthUVxBlkSize;
  511. Int m_iFrameWidthY, m_iFrameWidthUV;
  512. Int m_ivolWidth, m_ivolHeight;
  513. // VOP variables
  514. CRct m_rctCurrVOPY, m_rctCurrVOPUV;
  515. CRct m_rctRefVOPY0, m_rctRefVOPUV0;
  516. CRct m_rctRefVOPY1, m_rctRefVOPUV1;
  517. Int m_iOffsetForPadY, m_iOffsetForPadUV;
  518. CRct m_rctPrevNoExpandY, m_rctPrevNoExpandUV;
  519. ////// 97/12/22 start
  520. CRct m_rctBVOPRefVOPY1, m_rctBVOPRefVOPUV1;
  521. Int m_iBVOPOffsetForPadY, m_iBVOPOffsetForPadUV;
  522. CRct m_rctBVOPPrevNoExpandY, m_rctBVOPPrevNoExpandUV;
  523. ///// 97/12/22 end
  524. Int m_iVOPWidthY, m_iVOPWidthUV;
  525. Int m_iNumMB, m_iNumMBX, m_iNumMBY;
  526. Int m_iNumOfTotalMVPerRow;
  527. Int m_iSessNumMB;
  528. CMBMode* m_rgmbmd; // VOP size.  need to renew every VOP
  529. CMotionVector* m_rgmv; // VOP size.  need to renew every VOP
  530. CMotionVector* m_rgmvBackward; // VOP size.  need to renew every VOP
  531. CMotionVector* m_rgmvBY; //Motion vectors for BY plane
  532. CMBMode* m_rgmbmdRef;
  533. CMotionVector* m_rgmvRef; // VOP size.  need to renew every VOP
  534. Int m_iNumMBRef, m_iNumMBXRef, m_iNumMBYRef;
  535. // clipping tables
  536. /* NBIT: change U8 to PixelC
  537. U8* m_rgiClipTab; // clapping the reconstructed pixels
  538. */
  539. PixelC* m_rgiClipTab; // clapping the reconstructed pixels
  540. Int m_iOffset; // NBIT
  541. Void setClipTab(); // NBIT
  542. // Added for error resilient mode by Toshiba(1997-11-14)
  543. Bool  m_bVPNoLeft;
  544. Bool  m_bVPNoRightTop;
  545. Bool  m_bVPNoTop;
  546. Bool  m_bVPNoLeftTop;
  547. Int m_iVPMBnum; // start MB in a VP
  548. // End Toshiba(1997-11-14)
  549. // MB data
  550. Int** m_rgpiCoefQ;
  551. MacroBlockMemory** m_rgpmbmAbove;
  552. MacroBlockMemory** m_rgpmbmCurr;
  553. BlockMemory* m_rgblkmCurrMB; //predictor blocks for each current block
  554. Int* m_rgiQPpred; //QP from previous block for intra ac prediction
  555. Int m_rgiDcScalerY [32]; //intra dc quantization scaler; qp dependent
  556. Int m_rgiDcScalerC [32]; //[0] elem never used
  557. // block data
  558. Int m_rgiDCTcoef [BLOCK_SQUARE_SIZE];
  559. CInvBlockDCT* m_pidct;
  560. // Sprite routines
  561. Void warpYA (const CPerspective2D& persp, const CRct& rctWarpedBound, UInt accuracy);
  562. Void warpUV (const CPerspective2D& persp, const CRct& rctWarpedBound, UInt accuracy);
  563.     // Fast Affine Warping
  564.     Void FastAffineWarp (const CRct& rctWarpedBound, const CRct& rctWarpedBoundUV, UInt accuracy, UInt pntNum);
  565.     PixelC CInterpolatePixelValue (PixelC* F, Int pos, Int width, Int rx, Int ry, Int wpc, Int bias, Int pow_denom);
  566.     Int LinearExtrapolation(Int x0, Int x1, Int x0p, Int x1p, Int W, Int VW);
  567.     Void FourSlashes(Int num, Int denom, Int *quot, Int *res);
  568.     // tentative solution for indicating the first Sprite VOP
  569.     Int tentativeFirstSpriteVop;
  570. // Low-latency sprite info
  571.     Bool m_bFirstSpriteVop ;// flag for indicating the first Sprite VOP     
  572. MacroBlockMemory*** m_rgpmbmCurr_Spt;  //  save MB data to be used as holes
  573. SptMBstatus** m_ppPieceMBstatus;  // MB transmission status (done or not-done)
  574. SptMBstatus** m_ppUpdateMBstatus;
  575. CMBMode* m_rgmbmdSprite;  // dshu: [v071]  added to store mbmd array for sprite
  576. CMBMode** m_rgmbmdSpt; // Sprite size. 
  577. Bool m_bSptMB_NOT_HOLE;    // Current MB is not a hole
  578. own CSiteD* m_rgstSrcQP; // for sprite piece warping
  579. Time m_tPiece; // current sprite piece encode time
  580. Time m_tUpdate; // current sprite update encode time 
  581. own CVOPU8YUVBA* m_pvopcSptP; //  sprite piece    
  582. CRct m_rctSptQ;   //  rct of m_pvopcSptQ 
  583. CRct m_rctOrg;   // Frame size
  584. CRct m_rctPieceQ;  // Region of pieces which have been encoded
  585. CRct m_rctUpdateQ;  // Region of updates which have been encoded
  586. CRct m_rctSptPieceY;  // piece of sprite which is currently been encoded
  587. CRct m_rctSptPieceUV;  // piece of sprite which is currently been encoded
  588. Int m_iStepI;
  589. Int m_iStep; 
  590. Int m_iStep_VOP;
  591. Int m_iPieceXoffset;
  592. Int m_iPieceYoffset;
  593. Int m_iPieceWidth;
  594. Int m_iPieceHeight; 
  595. Bool m_bSptZoom;  // the type of sprite warping(zoom/pan)
  596.     Bool m_bSptHvPan; // the type of sprite warping(Horizontal or vertical panning)
  597. Bool m_bSptRightPiece;  //direction (up/down or right/left) for encoding sprite piece
  598. Int *m_pSptmbBits; // bits used by a sprite macroblock
  599. CRct m_rctSptExp;  // Extend the sprite size to multiples of MBSize
  600. };
  601. #endif // __VOPSES_HPP_