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

流媒体/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. Marc Mongenet (Marc.Mongenet@epfl.ch), Swiss Federal Institute of Technology, Lausanne (EPFL)
  14. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  15. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  16. as specified by the MPEG-4 Video. 
  17. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  18. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  19. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  20. The original developer of this software module and his/her company, 
  21. the subsequent editors and their companies, 
  22. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  23. Copyright is not released for non MPEG-4 Video conforming products. 
  24. Microsoft retains full right to use the code for his/her own purpose, 
  25. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  26. This copyright notice must be included in all copies or derivative works. 
  27. Copyright (c) 1996, 1997.
  28. Module Name:
  29. vopSeEnc.hpp
  30. Abstract:
  31. Encoder for one VO.
  32. Revision History:
  33. Sept. 30, 1997: Error resilient tools added by Toshiba
  34. Nov.  27, 1997: Spatial Scalable tools added 
  35. by Takefumi Nagumo(nagumo@av.crl.sony.co.jp) SONY corporation
  36. Dec 20, 1997: Interlaced tools added by NextLevel Systems 
  37.                     X. Chen (xchen@nlvl.com) B. Eifrig (beifrig@nlvl.com)
  38. Jun 16, 1998: add Complexity Estimation syntax support
  39. Marc Mongenet (Marc.Mongenet@epfl.ch) - EPFL
  40. May  9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net
  41. *************************************************************************/
  42. #ifndef __VOPSEENC_HPP_ 
  43. #define __VOPSEENC_HPP_
  44. #ifndef SOURCE_FRAME_RATE //assuming input source is always 30f/s
  45. #define SOURCE_FRAME_RATE 30
  46. #endif
  47. #include "tm5rc.hpp"
  48. Class CFwdBlockDCT;
  49. Class CVideoObjectEncoder : public CVideoObject
  50. {
  51. friend class CSessionEncoder;
  52. // friend Class CSessionEncoderTPS; ///// 97/12/22 // deleted by Sharp (98/2/12)
  53. // friend Class CVideoObjectEncoderTPS; ///// 97/12/22 // deleted by Sharp (98/2/12)
  54. friend class CEnhcBufferEncoder; // added by Sharp (98/2/10)
  55. public:
  56. // Constructors
  57. ~CVideoObjectEncoder ();
  58. CVideoObjectEncoder () {}; // default constructor
  59. CVideoObjectEncoder (
  60. UInt uiVOId, // VO id
  61. VOLMode& volmd, // VOL mode
  62. VOPMode& vopmd, // VOP mode
  63. UInt nFirstFrame, // number of total frames
  64. UInt nLastFrame, // number of total frames
  65. Int iSessionWidth, // session width, in case it's needed
  66. Int iSessionHeight, // session height
  67. UInt uiRateControl, // rate control type
  68. UInt uiBudget, // bit budget for vop
  69. ostream* pstrmTrace, // trace outstream
  70. UInt uiWarpAccuracy, // for sprite warping
  71. Int iNumOfPnts, // for sprite warping
  72. CSiteD** rgstDest, // for sprite warping destination
  73. SptMode SpriteMode, // sprite reconstruction mode
  74. CRct rctFrame, // sprite warping source
  75. CRct rctSpt,                        // rct Sprite
  76. Int iMVFileUsage, // 0==>no usage, 1==>read from MV file, 2==>write to MV file
  77. Char* pchMVFileName      // MV file name
  78. ); // VOP mode
  79. // for back/forward shape
  80. CVideoObjectEncoder (
  81. UInt uiVOId, // VO id
  82. VOLMode& volmd, // VOL mode
  83. VOPMode& vopmd, // VOP mode
  84. Int iSessionWidth, // session width, in case it's needed
  85. Int iSessionHeight //, // session height
  86. ); // VOP mode
  87. // Attributes
  88. const COutBitStream* pOutStream () const {return m_pbitstrmOut;} // output bitstream
  89. const CStatistics& statVOL () const {return m_statsVOL;}
  90. const CStatistics& statVOP () const {return m_statsVOP;}
  91. // Operations
  92. Bool skipTest(
  93. Time t,
  94. VOPpredType vopPredType
  95. );
  96. Void swapSpatialScalabilityBVOP ();
  97. Void encode (
  98. Bool bVOP_Visible, // whether the VOP at this time is encoded
  99. Time t, // relative frame number for the current encoding
  100. VOPpredType vopPredType,
  101. const CVOPU8YUVBA* pvopfRefBaseLayer = NULL //Reference image frm the base layer for spatial scalability
  102. );
  103. // begin: added by Sharp (98/2/10)
  104. // for background composition
  105. Void BackgroundComposition (
  106. const Int width, Int height,
  107. const Int iFrame,   
  108. const Int iPrev,   
  109. const Int iNext,    
  110. const CVOPU8YUVBA* pvopcBuffP1,
  111. const CVOPU8YUVBA* pvopcBuffP2,
  112. const CVOPU8YUVBA* pvopcBuffB1,
  113. const CVOPU8YUVBA* pvopcBuffB2,
  114. const Char* pchReconYUVDir, Int iobj, const Char* pchPrefix, // for output file name
  115. FILE *pchfYUV  // added by Sharp (98/10/26)
  116. );
  117. Void set_LoadShape(
  118.           Int* ieFramebShape, Int* ieFramefShape, // frame number for back/forward shape
  119.           const Int iRate,       // rate of enhancement layer
  120.           const Int ieFrame,       // current frame number
  121.           const Int iFirstFrame,    // first frame number of sequence
  122.           const Int iFirstFrameLoop // first frame number of the enhancement loop
  123.         );
  124. // end: added by Sharp (98/2/10)
  125. ///////////////// implementation /////////////////
  126. ///// 97/12/22 start
  127. public:
  128. CVideoObjectEncoder* rgpbfShape [2]; // 0 : backward, 1: forward
  129. ///// 97/12/22 end
  130. protected:
  131. //Time m_tIVOPCounter;
  132. //Time m_tEncodedVOPCounter;                      // for TPS only
  133. UInt m_nFirstFrame, m_nLastFrame, m_iBufferSize; //for rate control
  134. Int m_uiRateControl; // rate control type
  135. // bitstream stuff
  136. Char* m_pchBitsBuffer;
  137. COutBitStream* m_pbitstrmOut; // output bitstream
  138. Char* m_pchShapeBitsBuffer;
  139. COutBitStream* m_pbitstrmShape;
  140. COutBitStream* m_pbitstrmShapeMBOut;
  141. // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  142. Char** m_pchShapeBitsBuffer_DP;
  143. COutBitStream** m_pbitstrmShape_DP;
  144. // End Toshiba(1998-1-16:DP+RVLC)
  145. CEntropyEncoderSet* m_pentrencSet;
  146. // statistics 
  147. CStatistics m_statsVOL, m_statsVOP, m_statsMB; // accumulated number of bits
  148. Double* m_rgdSNR;
  149. // for rate control
  150. CRCMode m_statRC; // Rate control mode status
  151. TM5rc   m_tm5rc;
  152. // UInt m_uiTotalPrev;
  153. own CVOPU8YUVBA* m_pvopcOrig; // original reference VOP in a previous time
  154. own CVOPU8YUVBA* m_pvopcRefOrig0; // original reference VOP in a previous time
  155. own CVOPU8YUVBA* m_pvopcRefOrig1; // original reference VOP in a later time
  156. own CU8Image* m_puciRefQZoom0; // zoomed reference VOP in a previous time
  157. own CU8Image* m_puciRefQZoom1; // zoomed reference VOP in a later time
  158. // some fixed variables (VOL)
  159. Int m_iFrameWidthZoomYx2Minus2MB, m_iFrameWidthZoomYx2Minus2Blk;
  160. Int m_iFrameWidthZoomY, m_iFrameWidthZoomUV;
  161. // VOP variables
  162. CRct m_rctRefVOPZoom0, m_rctRefVOPZoom1;
  163. // for B-VOP
  164. // MB buffer data
  165. CU8Image *m_puciDirectPredMB, *m_puciInterpPredMB;
  166. PixelC *m_ppxlcDirectPredMBY, *m_ppxlcInterpPredMBY;
  167. CIntImage *m_piiDirectErrorMB, *m_piiInterpErrorMB;
  168. PixelI *m_ppxliDirectErrorMBY, *m_ppxliInterpErrorMBY;
  169. //moved to vopses.hpp
  170. //CVector m_vctDirectDeltaMV; //MVDB for current MB
  171. // block data
  172. CFwdBlockDCT* m_pfdct;
  173. // error resilient variables
  174. Int m_iVopTimeIncr;
  175. UInt m_nBitsModuloBase;
  176. Int m_iVPCounter;// Added for error resilient mode by Toshiba(1997-11-14)
  177. // Added for data partitioning mode by Toshiba(1998-1-16)
  178. Int m_numBitsVPMBnum;
  179. Int m_numVideoPacket;
  180. // End Toshiba(1998-1-16)
  181. // VO and VOL routines
  182. Void codeVOHead ();
  183. Void codeVOLHead (Int iSessionWidth, Int iSessionHeight);//, constt CRct& rctSprite);
  184. Void codeGOVHead (Time t);
  185. // VOP routines
  186. // Void codeVOPHead (const CSiteD* rgstDest = NULL, CRct rctWarp = NULL);
  187. Int m_iMAD;  // for Rate Control
  188. Void codeVOPHead ();
  189. Void codeNonCodedVOPHead ();
  190. Void codeVOPHeadInitial();
  191. //Void decidePredType ();
  192. Void findTightBoundingBox ();
  193. Void findBestBoundingBox ();
  194. Void copyCurrToRefOrig1Y ();
  195. Void updateAllOrigRefVOPs ();
  196. Void biInterpolateY (
  197. const CVOPU8YUVBA* pvopcRefQ, const CRct& rctRefVOP, // reference VOP
  198. CU8Image* puciRefQZoom, const CRct& rctRefVOPZoom, Int iRoundingControl // reference zoomed VOP
  199. );
  200. Void encodeVOP ();
  201. Void encodeNSForIVOP ();
  202. Void encodeNSForIVOP_WithShape ();
  203. Void encodeNSForPVOP ();
  204. Void encodeNSForPVOP_WithShape ();
  205. Void encodeNSForBVOP ();
  206. Void encodeNSForBVOP_WithShape ();
  207.     //classical sprite stuff
  208. Void encodeSptTrajectory (Time t, const CSiteD* rgstDest, const CRct& rctWarp); // code sprite info
  209. Void quantizeSptTrajectory (const CSiteD* rgstDest, CRct rctWarp);
  210. UInt codeWarpPoints ();
  211. //low latency sprite stuff
  212. #define AVGPIECEMB 0
  213. #define AVGUPDATEMB 1
  214. own CVOPU8YUVBA* m_pvopcSpt; // original sprite object
  215. //SptMode m_sptMode;  // sprite reconstruction mode : 0 -- basic sprite , 1 -- Object piece only, 2 -- Update piece only, 3 -- intermingled
  216. CSiteD** m_pprgstDest; // destination sites
  217. Bool m_bSptZoom;  // the type of sprite warping(zoom/pan)
  218.     Bool m_bSptHvPan; // the type of sprite warping(Horizontal or vertical panning)
  219. Bool m_bSptRightPiece; 
  220. Int m_pSptmbBits[2]; // bits used by a sprite macroblock
  221. Int m_iNumSptMB; // bits used by a sprite macroblock
  222. CRct findTightBoundingBox (CVOPU8YUVBA* vopuc);
  223. CRct PieceExpand (const CRct& rctOrg);
  224. Void encodeInitSprite (const CRct& rctOrg) ;
  225. Void initialSpritePiece (Int iSessionWidth, Int iSessionHeight) ;
  226. CRct InitialPieceRect (Time ts);
  227. CRct CornerWarp (const CSiteD* rgstDest, const CSiteD* rgstSrcQ);
  228. Void encodeSpritePiece (Time t) ; // code sprite pieces 
  229. Void codeVOSHead () ; // code sprite piece overhead
  230. Void encSptPiece (CRct rctSptQ, UInt uiSptPieceSize);
  231. Void encodeP (Bool bVOPVisible, Time t)  ; 
  232. CRct PieceSize (Bool rightpiece, UInt uiSptPieceSize);
  233. CRct encPiece (CRct rctpiece);
  234. CRct ZoomOrPan ();
  235. // motion estimation
  236. Void motionEstPVOP ();
  237. Void motionEstPVOP_WithShape ();
  238. virtual Void motionEstBVOP ();
  239. virtual Void motionEstBVOP_WithShape ();
  240. //
  241. // MB routines
  242. //
  243. UInt sumAbsCurrMB (); // for Rate Control
  244. Void copyToCurrBuff (
  245. const PixelC* ppxlcCurrY, const PixelC* ppxlcCurrU, const PixelC* ppxlcCurrV,
  246. Int iWidthY, Int iWidthUV
  247. ); 
  248. Void copyToCurrBuffWithShape (
  249. const PixelC* ppxlcCurrY, const PixelC* ppxlcCurrU, const PixelC* ppxlcCurrV,
  250. const PixelC* ppxlcCurrBY, const PixelC* ppxlcCurrA,
  251. Int iWidthY, Int iWidthUV
  252. );
  253. Void copyToCurrBuffJustShape(const PixelC* ppxlcCurrBY,Int iWidthY);
  254. Void LPEPadding (const CMBMode* pmbmd);
  255. Void LPEPaddingBlk (
  256. PixelC* ppxlcBlk, const PixelC* ppxlcBlkB,
  257. UInt uiSize
  258. );
  259. /*Void encodePVOPMBWithShape (
  260. PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV, PixelC* ppxlcRefMBA, PixelC* ppxlcRefBY,
  261. CMBMode* pmbmd, const CMotionVector* pmv, CMotionVector* pmvBY, ShapeMode shpmdColocatedMB,
  262. Int imbX, Int imbY,
  263. CoordI x, CoordI y, Int& iQPPrev
  264. );*/
  265. Void encodePVOPMBTextureWithShape(
  266. PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  267. PixelC* ppxlcRefMBA, CMBMode* pmbmd, const CMotionVector* pmv,
  268. Int imbX, Int imbY, CoordI x, CoordI y,
  269. Int& iQPPrev, Int &iQPPrevAlpha, Bool &bUseNewQPForVlcThr
  270. );
  271. Void encodePVOPMBJustShape(
  272. PixelC* ppxlcRefBY, CMBMode* pmbmd, ShapeMode shpmdColocatedMB,
  273. const CMotionVector* pmv, CMotionVector* pmvBY,
  274. CoordI x, CoordI y, Int imbX, Int imbY
  275. );
  276. Void dumpCachedShapeBits();
  277. Int dumpCachedShapeBits_DP(Int iMBnum); // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  278. Void encodePVOPMB (
  279. PixelC* ppxlcRefMBY, PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  280. CMBMode* pmbmd, const CMotionVector* pmv,
  281. Int imbX, Int imbY,
  282. CoordI x, CoordI y
  283. );
  284. // B-VOP MB encoding
  285. Void encodeBVOPMB (
  286. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  287. CMBMode* pmbmd, 
  288. const CMotionVector* pmv, const CMotionVector* pmvBackward,
  289. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  290. Int imbX, Int imbY,
  291. CoordI x, CoordI y
  292. );
  293. Void encodeBVOPMB_WithShape (
  294. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV, PixelC* ppxlcCurrQMBA, PixelC* ppxlcCurrQBY,
  295. CMBMode* pmbmd, const CMotionVector* pmv, const CMotionVector* pmvBackward, 
  296. CMotionVector* pmvBY, ShapeMode shpmdColocatedMB,
  297. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  298. Int imbX, Int imbY,
  299. CoordI x, CoordI y,
  300. Int &iQPPrev, Int &iQPPrevAlpha
  301. );
  302. // texture coding
  303. Void quantizeTextureIntraMB (
  304. Int imbX, Int imbY,
  305. CMBMode* pmbmd, 
  306. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  307. PixelC* ppxlcCurrQMBA
  308. );
  309. Void quantizeTextureInterMB (CMBMode* pmbmd, const CMotionVector* pmv,
  310. PixelC *ppxlcCurrQMBA, Bool bSkipAllowed = TRUE); // decide COD here
  311. Void codeMBTextureHeadOfIVOP (const CMBMode* pmbmd);
  312. Void codeMBTextureHeadOfPVOP (const CMBMode* pmbmd);
  313. // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  314. Void codeMBTextureHeadOfIVOP_DP (const CMBMode* pmbmd);
  315. Void codeMBTextureHeadOfPVOP_DP (const CMBMode* pmbmd);
  316. // End Toshiba(1998-1-16:DP+RVLC)
  317. Void codeMBTextureHeadOfBVOP (const CMBMode* pmbmd);
  318. Void sendDCTCoefOfIntraMBTexture (const CMBMode* pmbmd);
  319. Void sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd);
  320. Bool FrameFieldDCTDecideC(PixelC* m_ppxlcCurrMBY);
  321. Void fieldDCTtoFrameC(PixelC* ppxlcCurrQMBY);
  322. Bool FrameFieldDCTDecideI(PixelI* m_ppxliErrorMBY);
  323. Void fieldDCTtoFrameI(PixelI* m_ppxliErrorMBY);
  324. Void averagePredAndComputeErrorY();
  325. Void averagePredAndComputeErrorY_WithShape(); // new chnages
  326. Int interpolateAndDiffYField(
  327. const CMotionVector* pmvFwdTop,
  328. const CMotionVector* pmvFwdBot,
  329. const CMotionVector* pmvBakTop,
  330. const CMotionVector* pmvBakBot,
  331. CoordI x, CoordI y,
  332. CMBMode *pmbmd
  333. );
  334. Int directSAD(
  335. CoordI x, CoordI y,
  336. CMBMode *pmbmd,
  337. const CMBMode *pmbmdRef,
  338. const CMotionVector *pmvRef
  339. );
  340. Int directSADField(
  341. CoordI x, CoordI y,
  342. CMBMode *pmbmd,
  343. const CMBMode *pmbmdRef,
  344. const CMotionVector *pmvRef,
  345. const PixelC* ppxlcRef0MBY,
  346. const PixelC* ppxlcRef1MBY
  347. );
  348. // block level encoding
  349. Int quantizeIntraBlockTexture (
  350. PixelC* ppxlcBlkSrc, 
  351. Int iWidthSrc,  
  352. PixelC* ppxlcCurrQBlock, 
  353. Int iWidthCurrQ,
  354. Int* rgiCoefQ, 
  355. Int iQP,
  356. Int iDcScaler,
  357. Int iBlk, 
  358. MacroBlockMemory* pmbmLeft, 
  359. MacroBlockMemory* pmbmTop, 
  360. MacroBlockMemory* pmbmLeftTop,
  361. MacroBlockMemory* pmbmCurr,
  362. CMBMode* pmbmdLeft,
  363. CMBMode* pmbmdTop,
  364. CMBMode* pmbmdLeftTop,
  365. CMBMode* pmbmdCurr
  366. );
  367. Void quantizeTextureInterBlock (
  368. PixelI* ppxliCurrQBlock, 
  369. Int iWidthCurrQ,
  370. Int* rgiCoefQ, 
  371. Int iQP,
  372. Bool bUseAlphaMatrix
  373. );
  374. Void quantizeIntraDCcoef (Int* rgiCoefQ, Float fltDcScaler);
  375. Void quantizeIntraDCTcoefH263 (Int* rgiCoefQ, Int iStart, Int iQP);
  376. Void quantizeInterDCTcoefH263 (Int* rgiCoefQ, Int iStart, Int iQP);
  377. Void quantizeIntraDCTcoefMPEG (Int* rgiCoefQ, Int iStart, Int iQP, Bool bUseAlphaMatrix);
  378. Void quantizeInterDCTcoefMPEG (Int* rgiCoefQ, Int iStart, Int iQP, Bool bUseAlphaMatrix);
  379. Int findVLCtableIndexOfNonLastEvent (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  380. Int findVLCtableIndexOfLastEvent (Bool bIsLastRun,UInt uiRun, UInt uiLevel);
  381. Int findVLCtableIndexOfIntra (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  382. UInt sendIntraDC (const Int* rgiCoefQ, BlockNum blkn);
  383. UInt sendTCOEFIntra (const Int* rgiCoefQ, Int iStart, Int* rgiZigzag);
  384. UInt sendTCOEFInter (const Int* rgiCoefQ, Int iStart, Int* rgiZigzag);
  385. UInt putBitsOfTCOEFIntra (UInt uiRun, Int iLevel, Bool bIsLastRun);
  386. UInt putBitsOfTCOEFInter (UInt uiRun, Int iLevel, Bool bIsLastRun);
  387. typedef Int (CVideoObjectEncoder::*FIND_TABLE_INDEX)(Bool bIsLastRun, UInt uiRun, UInt uiLevel); //func ptr code escp. coding
  388. UInt escapeEncode (UInt uiRun, Int iLevel, Bool bIsLastRun, Int* rgiLMAX, Int* rgiRMAX, FIND_TABLE_INDEX findVLCtableIndex);
  389. UInt fixLengthCode (UInt uiRun, Int iLevel, Bool bIsLastRun);
  390. Void intraPred ( 
  391. BlockNum blkn, const CMBMode* pmbmd, 
  392. Int* rgiCoefQ, Int iQPcurr, Int iDcScaler,
  393. const BlockMemory pblkmPred, Int iQPpred
  394. );
  395. // gray-scale alpha coding
  396. Void quantizeAlphaInterMB (CMBMode* pmbmd);
  397. Void codeMBAlphaHeadOfIVOP (const CMBMode* pmbmd);
  398. Void codeMBAlphaHeadOfPVOP (const CMBMode* pmbmd);
  399. Void codeMBAlphaHeadOfBVOP (const CMBMode* pmbmd);
  400. Void sendDCTCoefOfIntraMBAlpha (const CMBMode* pmbmd);
  401. Void sendDCTCoefOfInterMBAlpha (const CMBMode* pmbmd);
  402. // MB shape coding
  403. Int codeIntraShape (PixelC* ppxlcSrcFrm, CMBMode* pmbmd, Int iMBX, Int iMBY);
  404. Int codeInterShape (
  405. PixelC* ppxlcSrc, CVOPU8YUVBA* pvopcRefQ, CMBMode* pmbmd,
  406. const ShapeMode& shpmdColocatedMB,
  407. const CMotionVector* pmv, CMotionVector* pmvBY, 
  408. CoordI iX, CoordI iY, Int iMBX, Int IMBY
  409. );
  410. UInt codeShapeModeIntra (ShapeMode shpmd, const CMBMode* pmbmd, Int iMBX, Int iMBY);
  411. UInt codeShapeModeInter (const ShapeMode& shpmd, const ShapeMode& shpmdColocatedMB);
  412. ShapeMode round (PixelC* ppxlcSrcFrm, const CMBMode* pmbmd);
  413. Int downSampleShape (const PixelC* ppxlcSrc, Int* rgiSrcSubBlk,
  414.  PixelC* ppxlcDst, Int* piDstPxl, Int iRate, Int iThreshold, Int nSubBlk);
  415. Bool isErrorLarge (const PixelC* rgppxlcSrc, const Int* rgiSubBlkIndx, Int iWidthSrc, PixelC pxlcRecon, const CMBMode* pmbmd);
  416. Bool isErrorLarge (const PixelC* rgppxlcSrc, const Int* rgiSubBlkIndxSrc, const Int iSizeSrc,
  417.    const PixelC* rgppxlcDst, const Int* rgiSubBlkIndxDst, const Int iSizeDst, const CMBMode* pmbmd);
  418. UInt encodeCAEIntra (ShapeMode shpmd, CAEScanDirection m_shpdir);
  419. UInt encodeCAEInter (ShapeMode shpmd, CAEScanDirection m_shpdir);
  420. UInt encodeMVDS (CMotionVector mvBYD);
  421. Bool sameBlockTranspStatus (const CMBMode* pmbmd, PixelC pxlcRecon);
  422. Bool sameBlockTranspStatus (const CMBMode* pmbmd, const PixelC* pxlcRecon, Int iSizeRecon);
  423. UInt codeCrAndSt (CAEScanDirection shpdir, Int iInverseCR);
  424. Void copyReconShapeToRef (PixelC* ppxlcRef, PixelC pxlcSrc); //no need to reset MB buffer
  425. Void copyReconShapeToRef (PixelC* ppxlcDstMB, const PixelC* ppxlcSrc, Int iSrcWidth, Int iBorder);
  426. Int sadForShape (const PixelC* ppxlcRefBY) const;
  427. Void blkmatchForShape (CVOPU8YUVBA* pvopcRefQ,CMotionVector* pmv, const CVector& mvPredHalfPel, CoordI iX, CoordI iY);
  428. Bool m_bNoShapeChg;
  429. Int *m_rgiSubBlkIndx16x16, *m_rgiSSubBlkIndx16x16, *m_rgiSubBlkIndx18x18, *m_rgiSubBlkIndx20x20;
  430. Int *m_rgiPxlIndx12x12, *m_rgiPxlIndx8x8;
  431. // motion estimation
  432. Void copyToCurrBuffWithShapeY (
  433. const PixelC* ppxlcCurrY,
  434. const PixelC* ppxlcCurrBY
  435. );
  436. Void copyToCurrBuffY (const PixelC* ppxlcCurrY);
  437. Void motionEstMB_PVOP (CoordI x, CoordI y, 
  438.    CMotionVector* pmv, CMBMode* pmbmd); //for spatial scalablity only
  439. Int motionEstMB_PVOP (
  440. CoordI x, CoordI y, 
  441. CMotionVector* pmv, CMBMode* pmbmd, 
  442. const PixelC* ppxliRefMBY
  443. );
  444. Int motionEstMB_PVOP_WithShape (
  445. CoordI x, CoordI y, 
  446. CMotionVector* pmv, CMBMode* pmbmd, 
  447. const PixelC* ppxliRefMBY
  448. );
  449. Int motionEstMB_BVOP_Interlaced (
  450. CoordI x, CoordI y, 
  451. CMotionVector* pmvForward, CMotionVector* pmvBackward,
  452. CMBMode* pmbmd,
  453. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  454. const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
  455. Bool bColocatedMBExist
  456. );
  457. Int motionEstMB_BVOP (
  458. CoordI x, CoordI y, 
  459. CMotionVector* pmvForward, CMotionVector* pmvBackward,
  460. CMBMode* pmbmd,
  461. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  462. const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
  463. Bool bColocatedMBExist
  464. );
  465. // for spatial scalability only
  466. Int CVideoObjectEncoder::motionEstMB_BVOP(
  467. CoordI x, CoordI y, 
  468. CMotionVector* pmvForward, CMotionVector* pmvBackward,
  469. CMBMode* pmbmd,
  470. const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY
  471. );
  472. Int motionEstMB_BVOP_WithShape (
  473. CoordI x, CoordI y, 
  474. CMotionVector* pmvForward, CMotionVector* pmvBackward,
  475. CMBMode* pmbmd, 
  476. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  477. const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
  478. Bool bColocatedMBExist
  479. );
  480. // new changes
  481. Int motionEstMB_BVOP_InterlacedWithShape (
  482. CoordI x, CoordI y, 
  483. CMotionVector* pmvForward, CMotionVector* pmvBackward,
  484. CMBMode* pmbmd, 
  485. const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
  486. const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
  487. Bool bColocatedMBExist
  488. );
  489. Int blkmatch16 (
  490. CMotionVector* pmv, 
  491. CoordI iXRef, CoordI iYRef,
  492. CoordI iXCurr, CoordI iYCurr,
  493. Int iMinSAD,
  494. const PixelC* ppxlcRefMBY,
  495. const CU8Image* puciRefQZoomY,
  496. Int iSearchRange
  497. );
  498. Int blkmatch16WithShape (
  499. CMotionVector* pmv, 
  500. CoordI iXRef, CoordI iYRef,
  501. CoordI iXCurr, CoordI iYCurr,
  502. Int iMinSAD,
  503. const PixelC* ppxlcRefMBY,
  504. const CU8Image* puciRefQZoomY,
  505.         const CMBMode* pmbmd,
  506. Int iSearchRange,
  507. Int iDirection
  508. );
  509. Int blockmatch8 (
  510. const PixelC* ppxlcCodedBlkY, 
  511. CMotionVector* pmv8, 
  512. CoordI x, CoordI y,
  513. const CMotionVector* pmvPred,
  514. Int iSearchRange
  515. );
  516. Int blockmatch8WithShape (
  517. const PixelC* ppxlcCodedBlkY, 
  518. const PixelC* ppxlcCodedBlkBY, 
  519. CMotionVector* pmv8, 
  520. CoordI x, CoordI y,
  521. const CMotionVector* pmvPred,
  522. Int iSearchRange,
  523. Int iDirection
  524. );
  525. Int blkmatch16x8 (
  526. CMotionVector* pmv, 
  527. CoordI iXMB, CoordI iYMB,
  528. Int iFeildSelect,
  529. const PixelC* ppxlcRefMBY,
  530. const PixelC* ppxlcRefHalfPel,
  531. Int iSearchRange
  532. );
  533. // new chnages
  534. Int blkmatch16x8WithShape (
  535. CMotionVector* pmv, 
  536. CoordI iXMB, CoordI iYMB,
  537. Int iFeildSelect,
  538. const PixelC* ppxlcRefMBY,
  539. const PixelC* ppxlcRefHalfPel,
  540. Int iSearchRange,
  541. Int iDirection
  542. );
  543. Int sumDev () const; // compute sum of deviation of an MB
  544. Int sumDevWithShape (UInt uiNumTranspPels) const; // compute sum of deviation of an MB
  545. Int sad16x16At0 (const PixelC* ppxliRef0Y) const;
  546. Int sad16x16At0WithShape (const PixelC* ppxliRefY, const CMBMode* pmbmd) const;
  547. Int sad8x8At0 (const PixelC* ppxlcCurrY, const PixelC* ppxliRef0Y) const; // 0: predictor
  548. Int sad8x8At0WithShape (const PixelC* ppxlcCurrY, const PixelC* ppxlcCurrBY, const PixelC* ppxlcRefY) const;
  549. // motion compensation
  550. Void motionCompMBYEnc (
  551. const CMotionVector* pmv, const CMBMode* pmbmd, 
  552. Int imbX, Int imbY,
  553. CoordI x, CoordI y,
  554. CRct *prctMVLimit
  555. );
  556. Void motionCompMBAEnc (
  557. const CMotionVector* pmv, const CMBMode* pmbmd, 
  558. PixelC * ppxlcPredMBA,
  559. CVOPU8YUVBA* pvopcRefQ,
  560. CoordI x, CoordI y,
  561. Int iRoundingControl,
  562. CRct *prctMVLimit,
  563. Int direction //12.22.98
  564. );
  565. Void motionCompEncY (
  566. const PixelC* ppxlcRef, const PixelC* ppxlcRefZoom,
  567. PixelC* ppxlcPred, // can be either Y or A
  568. Int iSize, // either MB or BLOCK size
  569. const CMotionVector* pmv, // motion vector
  570. CoordI x, CoordI y, // current coordinate system
  571. CRct *prctMVLimit
  572. );
  573. Void motionCompOverLapEncY (
  574. const CMotionVector* pmv, // motion vector
  575. const CMBMode* pmbmd, // macroblk mode
  576. Bool bLeftBndry, Bool bRightBndry, Bool bTopBndry,
  577. CoordI x, // current coordinate system
  578. CoordI y, // current coordinate system
  579. CRct *prctMVLimit
  580. );
  581. Void motionComp8Y (PixelC* ppxlcPredBlk, const CMotionVector* pmv, CoordI x, CoordI y);
  582. Void motionComp8A (PixelC* ppxlcPredBlk, const CMotionVector* pmv, CoordI x, CoordI y);
  583. // B-VOP MC
  584. Void motionCompAndDiff_BVOP_MB (
  585. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  586.  CMBMode* pmbmd, // new change 02-19-99
  587. CoordI x, CoordI y,
  588. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  589. );
  590. Void motionCompAndDiff_BVOP_MB_WithShape (
  591. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  592.  CMBMode* pmbmd, // new change 02-19-99
  593. CoordI x, CoordI y,
  594. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  595. );
  596. Void motionCompAndDiffAlpha_BVOP_MB (
  597. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  598. const CMBMode* pmbmd, 
  599. CoordI x, CoordI y,
  600. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  601. );
  602. Void motionCompInterpAndError (
  603. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  604. CoordI x, CoordI y,
  605. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  606. );
  607. Void motionCompInterpAndError_WithShape (
  608. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  609. CoordI x, CoordI y,
  610. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  611. );
  612. // error signal
  613. Void computeTextureErrorWithShape ();
  614. Void computeTextureError ();
  615. Void computeAlphaError ();
  616. // B-VOP stuff
  617. Int interpolateAndDiffY (
  618. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  619. CoordI x, CoordI y, // the coordinate of the MB
  620. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  621. );
  622. Int interpolateAndDiffY_WithShape (
  623. const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  624. CoordI x, CoordI y, // the coordinate of the MB
  625. CRct *prctMVLimitForward,CRct *prctMVLimitBackward
  626. );
  627. Void averagePredAndComputeErrorUV ();
  628. Void averagePredAndComputeErrorUV_WithShape ();
  629. // MV
  630. UInt encodeMV (
  631. const CMotionVector* pmv, 
  632. const CMBMode* pmbmd,
  633. Bool bLeftMB, Bool bRightMB, Bool bTopMB,Int iMBX, Int iMBY);
  634. UInt encodeMVWithShape (const CMotionVector* pmv, const CMBMode* pmbmd, Int iXMB, Int iYMB);
  635. UInt encodeMVofBVOP (const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 
  636.  const CMBMode* pmbmd, Int iMBX, Int iMBY, const CMotionVector* pmvRef, 
  637.                      const CMBMode* pmbmdRef);  // encode motion vectors for b-vop
  638. UInt sendDiffMV (const CVector& vctDiffMVHalfPel, const MVInfo *pmviDir);
  639. Void scaleMV (Int& iVLC, UInt& uiResidual, Int iDiffMVcomponent, const MVInfo *pmviDir);
  640. // direct mode
  641. Void computeDirectDeltaMV (CVector& vctDiff, const CMotionVector* pmv, const CMotionVector* pmvRef,
  642.         const CMBMode* pmbmdRef); //for (progressive) B-VOP only
  643. // Statistics routines
  644. Void computeSNRs (const CVOPU8YUVBA* pvopcCurrQ);
  645. Void SNRYorA (
  646. const PixelC* ppxlcOrig, const PixelC* ppxlcRef1, // these two should point to the left-top of the rctOrig's bounding box 
  647. Double& dSNR
  648. );
  649. Void SNRUV (const CVOPU8YUVBA* pvopcCurrQ);
  650. Void SNRYorAWithShape (
  651. const PixelC* ppxlcOrig, const PixelC* ppxlcRef1, // these two should point to the left-top of the rctOrig's bounding box 
  652. Double& dSNR
  653. );
  654. Void SNRUVWithShape (const CVOPU8YUVBA* pvopcCurrQ);
  655. // Motion Vector I/O
  656. Int m_iMVLineNo, m_iMVFileUsage;
  657. FILE *m_fMVFile;
  658. Char *m_pchMVFileName;
  659. Void readPVOPMVs(), writePVOPMVs(), readBVOPMVs(), writeBVOPMVs();
  660. Void decideMVInfo ();
  661. // Complexity Estimation syntax support - Marc Mongenet (EPFL) - 16 Jun 1998
  662. Int codedDCECS (Int,   // complexity estimation data to code before writing it into bitstream
  663. UInt); // number of bitstream bits for this data
  664. // error resilient tools added by Toshiba
  665. // Modified for error resilient mode by Toshiba(1997-11-14)
  666. // Bool bVPNoLeft(Int iMBnum, Int iMBX);
  667. // Bool bVPNoRightTop(Int iMBnum, Int iMBX);
  668. // Bool bVPNoTop(Int iMBnum);
  669. // Bool bVPNoLeftTop(Int iMBnum, Int iMBX);
  670. // End Toshiba(1997-11-14)
  671. Void codeVideoPacketHeader (Int iMBX, Int iMBY, Int iQuantScale);
  672. Int codeVideoPacketHeader (Int iQuantScale); // Added by Toshiba(1998-1-16)
  673. Void VideoPacketResetVOP ();//UInt nBitsModuloBase, Int iVopTimeIncr);
  674. UInt encodeMVVP (const CMotionVector* pmv, const CMBMode* pmbmd, Int iMBX, Int iMBY);
  675. //  Added for Data partitioning mode by Toshiba(1998-1-16)
  676. Void encodeNSForPVOP_DP ();
  677. Void encodeNSForIVOP_DP ();
  678. Void encodeNSForIVOP_WithShape_DP ();
  679. Void encodeNSForPVOP_WithShape_DP ();
  680. Void DataPartitioningMotionCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP);
  681. Void DataPartitioningTextureCoding(Int iVPMBnum, Int iVPlastMBnum, CStatistics* m_statsVP, Int*** iCoefQ_DP);
  682. // Added for RVLC by Toshiba
  683. UInt sendTCOEFIntraRVLC (const Int* rgiCoefQ, Int iStart, Int* rgiZigzag, Bool bDontSendBits);
  684. UInt putBitsOfTCOEFIntraRVLC (UInt uiRun, Int iLevel, Bool bIsLastRun, Bool bDontSendBits);
  685. Int findVLCtableIndexOfNonLastEventIntraRVLC (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  686. Int findVLCtableIndexOfLastEventIntraRVLC (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  687. UInt sendTCOEFInterRVLC (const Int* rgiCoefQ, Int iStart, Int* rgiZigzag, Bool bDontSendBits);
  688. UInt putBitsOfTCOEFInterRVLC (UInt uiRun, Int iLevel, Bool bIsLastRun, Bool bDontSendBits);
  689. Int findVLCtableIndexOfNonLastEventInterRVLC (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  690. Int findVLCtableIndexOfLastEventInterRVLC (Bool bIsLastRun, UInt uiRun, UInt uiLevel);
  691. UInt escapeEncodeRVLC (UInt uiRun, Int iLevel, Bool bIsLastRun, Bool bDontSendBits);
  692. // End Toshiba(1998-1-16)
  693. // begin: added by Sharp (98/2/10)
  694. Void setPredType(VOPpredType vopPredType);
  695. Void setRefSelectCode(Int refSelectCode);
  696. // end: added by Sharp (98/2/10)
  697. };
  698. #endif // __VOPSEENC_HPP_