vopmbenc.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:46k
源码类别:

流媒体/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. Simon Winder (swinder@microsoft.com), Microsoft Corporation
  8. (date: March, 1996)
  9. and edited by
  10.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  11. and also edited by
  12. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  13. Takeshi Nagai (TOSHIBA CORPORATION)
  14. Toshiaki Watanabe (TOSHIBA CORPORATION)
  15. Noboru Yamaguchi (TOSHIBA CORPORATION)
  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. vopmbEnc.cpp
  32. Abstract:
  33. Encode MB's for each VOP (I-, P-, and B-VOP's)
  34. Revision History:
  35. Dec. 11, 1997: Interlaced tools added by NextLevel Systems (GI)
  36.                     B. Eifrig, (beifrig@nlvl.com) X. Chen, (xchen@nlvl.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. May 9, 1999: tm5 rate control by DemoGraFX, duhoff@mediaone.net
  42. *************************************************************************/
  43. #include <stdio.h>
  44. #include <math.h>
  45. #include <stdlib.h>
  46. #include <iostream.h>
  47. #include "typeapi.h"
  48. #include "codehead.h"
  49. #include "entropy/bitstrm.hpp"
  50. #include "entropy/entropy.hpp"
  51. #include "entropy/huffman.hpp"
  52. #include "mode.hpp"
  53. #include "global.hpp"
  54. #include "vopses.hpp"
  55. #include "vopseenc.hpp"
  56. #ifdef __MFC_
  57. #ifdef _DEBUG
  58. #undef THIS_FILE
  59. static char BASED_CODE THIS_FILE[] = __FILE__;
  60. #endif
  61. #define new DEBUG_NEW    
  62. #endif // __MFC_
  63. Void CVideoObjectEncoder::encodeVOP ()
  64. {
  65. if (m_uiRateControl>=RC_TM5) {
  66. m_tm5rc.tm5rc_init_pict(m_vopmd.vopPredType,
  67. m_pvopcOrig->pixelsBoundY (),
  68. m_iFrameWidthY,
  69. m_iNumMBX,
  70. m_iNumMBY);
  71. }
  72. // Added for Data Partitioning mode by Toshiba(1998-1-16)
  73. if( m_volmd.bDataPartitioning ) {
  74. if (m_volmd.fAUsage == RECTANGLE) {
  75. switch( m_vopmd.vopPredType ) {
  76. case PVOP:
  77. encodeNSForPVOP_DP ();
  78. break;
  79. case IVOP:
  80. encodeNSForIVOP_DP ();
  81. break;
  82. case BVOP:
  83. encodeNSForBVOP ();
  84. break;
  85. default:
  86. assert(FALSE); // B-VOP and Sprite-VOP are not supported in DP-mode
  87. }
  88. } else {
  89. switch( m_vopmd.vopPredType ) {
  90. case PVOP:
  91. encodeNSForPVOP_WithShape_DP ();
  92. break;
  93. case IVOP:
  94. encodeNSForIVOP_WithShape_DP ();
  95. break;
  96. case BVOP:
  97. encodeNSForBVOP_WithShape ();
  98. break;
  99. default:
  100. assert(FALSE); // B-VOP and Sprite-VOP are not supported in DP-mode
  101. }
  102. }
  103. } else
  104. // End Toshiba(1998-1-16)
  105. if (m_volmd.fAUsage == RECTANGLE) {
  106. if (m_vopmd.vopPredType == PVOP)
  107. encodeNSForPVOP ();
  108. else if (m_vopmd.vopPredType == IVOP)
  109. encodeNSForIVOP ();
  110. else
  111. encodeNSForBVOP ();
  112. }
  113. else {
  114. if (m_vopmd.vopPredType == PVOP) {
  115. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)
  116. encodeNSForPVOP ();
  117. else
  118. encodeNSForPVOP_WithShape ();
  119. }
  120. else if (m_vopmd.vopPredType == IVOP)
  121. encodeNSForIVOP_WithShape ();
  122. else
  123. encodeNSForBVOP_WithShape ();
  124. }
  125. if (m_uiRateControl>=RC_TM5) {
  126. m_tm5rc.tm5rc_update_pict(m_vopmd.vopPredType, m_statsVOP.total());
  127. }
  128. }
  129. //
  130. // size:
  131. // m_pvopcCurr: original size (QCIF or CIF), same memory through out the session
  132. //  m_pvopfRef: expanded original size (QCIF or CIF expanded by 16), same memory through out the session
  133. // pmbmd and pmv: VOP.  need to reallocate every time
  134. //
  135. // things don't need to recompute:
  136. // m_iWidthY, m_iWidthUV, m_iWidthRefY, m_iWidthRefUV
  137. // need to recompute:
  138. // m_uintNumMBX, m_uintNumMBY, m_uintNumMB
  139. //
  140. Void CVideoObjectEncoder::encodeNSForIVOP ()
  141. {
  142. //in case the IVOP is used as an ref for direct mode
  143. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  144. CMBMode* pmbmd = m_rgmbmd;
  145. Int iQPPrev = m_vopmd.intStepI; //initialization
  146. PixelC* ppxlcRefY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  147. PixelC* ppxlcRefU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  148. PixelC* ppxlcRefV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  149. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  150. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  151. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  152. // MB rate control
  153. //Int iIndexofQ = 0;
  154. //Int rgiQ [4] = {-1, -2, 1, 2};
  155. if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
  156. // -----
  157. Bool bRestartDelayedQP = TRUE;
  158. Int iMBX, iMBY, iMB = 0;
  159. Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
  160. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
  161. PixelC* ppxlcRefMBY  = ppxlcRefY;
  162. PixelC* ppxlcRefMBU  = ppxlcRefU;
  163. PixelC* ppxlcRefMBV  = ppxlcRefV;
  164. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  165. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  166. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  167. // In a given Sprite object piece, identify whether current macroblock is not a hole and should be coded ?
  168. Bool  bSptMB_NOT_HOLE= TRUE;
  169. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
  170. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);
  171. RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);
  172. }
  173. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, iMB++) {
  174.             // code current macroblock only if it is not a hole 
  175. m_bSptMB_NOT_HOLE  =  bSptMB_NOT_HOLE;
  176. if (!m_bSptMB_NOT_HOLE) //low latency
  177. goto EOMB1;
  178. #ifdef __TRACE_AND_STATS_
  179. m_statsMB.reset ();
  180. m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
  181. #endif // __TRACE_AND_STATS_
  182.             pmbmd->m_intStepDelta = 0;
  183. // MB rate control
  184. if (m_uiRateControl>=RC_TM5) {
  185. pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
  186.  m_statsVOP.total()) - iQPPrev;
  187. if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
  188. else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
  189. }
  190. #ifdef _MBQP_CHANGE_
  191. iIndexofQ = (iIndexofQ + 1) % 4;
  192. pmbmd->m_intStepDelta = rgiQ [iIndexofQ];
  193. #endif //_MBQP_CHANGE_
  194. pmbmd->m_bSkip = FALSE; //reset for direct mode
  195. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  196. /* NBIT: change 31 to iMaxQP
  197. assert (pmbmd->m_stepSize <= 31 && pmbmd->m_stepSize > 0);
  198. */
  199. assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);
  200. if ( m_volmd.bVPBitTh >= 0) { // modified by Sharp (98/4/13)
  201. Int iCounter = m_pbitstrmOut -> getCounter();
  202. if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
  203. pmbmd->m_intStepDelta = 0; // reset DQ to use QP in VP header
  204. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  205. m_iVPCounter = iCounter;
  206. bRestartDelayedQP = TRUE;
  207. }
  208. }
  209. // End Toshiba(1998-1-16)
  210. if(bRestartDelayedQP)
  211. {
  212. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  213. bRestartDelayedQP = FALSE;
  214. }
  215. else
  216. pmbmd->m_stepSizeDelayed = iQPPrev;
  217. iQPPrev = pmbmd->m_stepSize;
  218. if (pmbmd->m_intStepDelta == 0)
  219. pmbmd->m_dctMd = INTRA;
  220. else
  221. pmbmd->m_dctMd = INTRAQ;
  222. pmbmd->m_bFieldMV = 0;
  223. copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV); 
  224. quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, NULL);
  225. codeMBTextureHeadOfIVOP (pmbmd);
  226. sendDCTCoefOfIntraMBTexture (pmbmd);
  227. EOMB1:
  228. pmbmd++;
  229. #ifdef __TRACE_AND_STATS_
  230. m_statsVOP   += m_statsMB;
  231. #endif // __TRACE_AND_STATS_
  232. ppxlcRefMBY  += MB_SIZE;
  233. ppxlcRefMBU  += BLOCK_SIZE;
  234. ppxlcRefMBV  += BLOCK_SIZE;
  235. ppxlcOrigMBY += MB_SIZE;
  236. ppxlcOrigMBU += BLOCK_SIZE;
  237. ppxlcOrigMBV += BLOCK_SIZE;
  238. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE) {
  239. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);
  240. m_iNumSptMB++ ;
  241. }
  242. }
  243. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  244. m_rgpmbmAbove = m_rgpmbmCurr;
  245. // dshu: begin of modification
  246.   if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
  247. SaveMBmCurrRow (iMBY, m_rgpmbmCurr);  //   save current row pointed by *m_rgpmbmCurr 
  248. // dshu: end of modification
  249. m_rgpmbmCurr  = ppmbmTemp;
  250. ppxlcRefY  += m_iFrameWidthYxMBSize;
  251. ppxlcRefU  += m_iFrameWidthUVxBlkSize;
  252. ppxlcRefV  += m_iFrameWidthUVxBlkSize;
  253. ppxlcOrigY += m_iFrameWidthYxMBSize;
  254. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  255. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  256. }
  257. }
  258. Void CVideoObjectEncoder::encodeNSForIVOP_WithShape ()
  259. {
  260. //in case the IVOP is used as an ref for direct mode
  261. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  262. memset (m_rgmvBY, 0, m_iNumMB * sizeof (CMotionVector));
  263. Int iMBX, iMBY, iMB = 0;
  264. Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
  265. CMBMode* pmbmd = m_rgmbmd;
  266. // Added for field based MC padding by Hyundai(1998-5-9)
  267.         CMBMode* field_pmbmd = m_rgmbmd;
  268. // End of Hyundai(1998-5-9)
  269. Int iQPPrev = m_vopmd.intStepI; //initialization
  270. Int iQPPrevAlpha = m_vopmd.intStepIAlpha;
  271. if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
  272. PixelC* ppxlcRefY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  273. PixelC* ppxlcRefU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  274. PixelC* ppxlcRefV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  275. PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  276. PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;
  277. PixelC *ppxlcRefA = NULL, *ppxlcOrigA = NULL;
  278. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  279. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  280. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  281. PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
  282. if (m_volmd.fAUsage == EIGHT_BIT) {
  283. ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  284. ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();
  285. }
  286. Bool bRestartDelayedQP = TRUE;
  287. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
  288. PixelC* ppxlcRefMBY  = ppxlcRefY;
  289. PixelC* ppxlcRefMBU  = ppxlcRefU;
  290. PixelC* ppxlcRefMBV  = ppxlcRefV;
  291. PixelC* ppxlcRefMBBY = ppxlcRefBY;
  292. PixelC* ppxlcRefMBBUV = ppxlcRefBUV;
  293. PixelC* ppxlcRefMBA  = ppxlcRefA;
  294. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  295. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  296. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  297. PixelC* ppxlcOrigMBBY = ppxlcOrigBY;
  298. PixelC* ppxlcOrigMBA = ppxlcOrigA;
  299.     // In a given Sprite object piece, identify whether current macroblock is not a hole and should be coded ?
  300. Bool  bSptMB_NOT_HOLE= TRUE;
  301. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
  302. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);
  303. RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);
  304. }
  305. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, iMB++) {
  306.   // code current macroblock only if it is not a hole 
  307. m_bSptMB_NOT_HOLE  =  bSptMB_NOT_HOLE;
  308. if (!m_bSptMB_NOT_HOLE) 
  309. goto EOMB2;
  310. // MB rate control
  311. if (m_uiRateControl>=RC_TM5) {
  312. pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
  313.  m_statsVOP.total()) - iQPPrev;
  314. if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
  315. else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
  316. }
  317.             // Added for error resilient mode by Toshiba(1997-11-14)
  318. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  319. if ( m_volmd.bVPBitTh >= 0) {
  320. Int iCounter = m_pbitstrmOut -> getCounter();
  321. if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
  322. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  323. m_iVPCounter = iCounter;
  324. bRestartDelayedQP = TRUE;
  325. }
  326. }
  327.             // End Toshiba(1997-11-14)
  328. #ifdef __TRACE_AND_STATS_
  329. m_statsMB.reset ();
  330. m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
  331. #endif // __TRACE_AND_STATS_
  332. pmbmd->m_bSkip = FALSE; //reset for direct mode 
  333. pmbmd->m_bPadded=FALSE;
  334. copyToCurrBuffWithShape (
  335. ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, 
  336. ppxlcOrigMBBY, ppxlcOrigMBA,
  337. m_iFrameWidthY, m_iFrameWidthUV
  338. );
  339. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  340. decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY);
  341. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL) {
  342. LPEPadding (pmbmd);
  343. m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);
  344. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  345. decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // need to modify it a little (NONE block won't change)
  346. }
  347. else
  348. m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, iMBX, iMBY);
  349. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  350. if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  351. // End of Hyundai(1998-5-9)*/
  352. if(m_volmd.bShapeOnly == FALSE) {// shape only mode
  353. pmbmd->m_stepSizeDelayed = iQPPrev;
  354. if (pmbmd -> m_rgTranspStatus [0] != ALL) {
  355. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  356. assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);
  357. if(bRestartDelayedQP)
  358. {
  359. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  360. bRestartDelayedQP = FALSE;
  361. }
  362. iQPPrev = pmbmd->m_stepSize;
  363. if (pmbmd->m_intStepDelta == 0)
  364. pmbmd->m_dctMd = INTRA;
  365. else
  366. pmbmd->m_dctMd = INTRAQ;
  367. if (m_volmd.fAUsage == EIGHT_BIT) {
  368. // update alpha quant
  369. if(!m_volmd.bNoGrayQuantUpdate)
  370. {
  371. iQPPrevAlpha = (iQPPrev * m_vopmd.intStepIAlpha) / m_vopmd.intStepI;
  372. if(iQPPrevAlpha<1)
  373. iQPPrevAlpha=1;
  374. }
  375. pmbmd->m_stepSizeAlpha = iQPPrevAlpha;
  376. }
  377. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  378. if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus[0] == PARTIAL)
  379. boundaryMacroBlockMerge (pmbmd);
  380. // End of Hyundai(1998-5-9)*/
  381. quantizeTextureIntraMB (iMBX, iMBY, pmbmd, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
  382. codeMBTextureHeadOfIVOP (pmbmd);
  383. sendDCTCoefOfIntraMBTexture (pmbmd);
  384. if (m_volmd.fAUsage == EIGHT_BIT) {
  385. codeMBAlphaHeadOfIVOP (pmbmd);
  386. sendDCTCoefOfIntraMBAlpha (pmbmd);
  387. }
  388. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  389.                     if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  390.                             mergedMacroBlockSplit (pmbmd, ppxlcRefMBY, ppxlcRefMBA);
  391. // End of Hyundai(1998-5-9)*/
  392. // MC padding
  393. // Added for field based MC padding by Hyundai(1998-5-9)
  394. if (!m_vopmd.bInterlace) {
  395. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  396. mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
  397. padNeighborTranspMBs (
  398. iMBX, iMBY,
  399. pmbmd,
  400. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  401. );
  402. }
  403. // End of Hyundai(1998-5-9)
  404. }
  405. else {
  406. // Added for field based MC padding by Hyundai(1998-5-9)
  407. if (!m_vopmd.bInterlace) {
  408. padCurrAndTopTranspMBFromNeighbor (
  409. iMBX, iMBY,
  410. pmbmd,
  411. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  412. );
  413. }
  414. // End of Hyundai(1998-5-9)
  415. }
  416. }
  417. EOMB2:
  418.      ppxlcRefMBA += MB_SIZE;
  419. ppxlcOrigMBBY += MB_SIZE;
  420. ppxlcOrigMBA += MB_SIZE;
  421. pmbmd++;
  422. #ifdef __TRACE_AND_STATS_
  423. m_statsVOP   += m_statsMB;
  424. #endif // __TRACE_AND_STATS_
  425. ppxlcRefMBY  += MB_SIZE;
  426. ppxlcRefMBU  += BLOCK_SIZE;
  427. ppxlcRefMBV  += BLOCK_SIZE;
  428. ppxlcRefMBBY += MB_SIZE;
  429. ppxlcRefMBBUV += BLOCK_SIZE;
  430. ppxlcOrigMBY += MB_SIZE;
  431. ppxlcOrigMBU += BLOCK_SIZE;
  432. ppxlcOrigMBV += BLOCK_SIZE;
  433. // Identify whether next Sprite object macroblock is not a hole and should be coded ?
  434. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
  435. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);
  436. }
  437. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  438. m_rgpmbmAbove = m_rgpmbmCurr;
  439. // dshu: begin of modification
  440.   if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
  441. SaveMBmCurrRow (iMBY, m_rgpmbmCurr);  //   save current row pointed by *m_rgpmbmCurr 
  442. // dshu: end of modification
  443. m_rgpmbmCurr  = ppmbmTemp;
  444. ppxlcRefY  += m_iFrameWidthYxMBSize;
  445. ppxlcRefA  += m_iFrameWidthYxMBSize;
  446. ppxlcRefU  += m_iFrameWidthUVxBlkSize;
  447. ppxlcRefV  += m_iFrameWidthUVxBlkSize;
  448. ppxlcRefBY += m_iFrameWidthYxMBSize;
  449. ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
  450. ppxlcOrigY += m_iFrameWidthYxMBSize;
  451. ppxlcOrigBY += m_iFrameWidthYxMBSize;
  452. ppxlcOrigA += m_iFrameWidthYxMBSize;
  453. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  454. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  455. }
  456. // Added for field based MC padding by Hyundai(1998-5-9)
  457.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  458.                 fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);
  459. // End of Hyundai(1998-5-9)
  460. }
  461. Void CVideoObjectEncoder::encodeNSForPVOP ()
  462. {
  463.     if (m_uiSprite == 0) //low latency: not motion esti
  464.     motionEstPVOP ();
  465. // Rate Control
  466. if (m_uiRateControl==RC_MPEG4) {
  467. Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16);
  468. m_statRC.setMad (Ec);
  469. if (m_statRC.noCodedFrame () >= RC_START_RATE_CONTROL) {
  470. UInt newQStep = m_statRC.updateQuanStepsize ();
  471. m_vopmd.intStepDiff = newQStep - m_vopmd.intStep; // DQUANT
  472. m_vopmd.intStep = newQStep;
  473. }
  474. cout << "t" << "Q:" << "ttt" << m_vopmd.intStep << "n";
  475. m_statRC.setQc (m_vopmd.intStep);
  476. }
  477. // MB rate control
  478. //Int iIndexofQ = 0;
  479. //Int rgiQ [4] = {-1, -2, 1, 2};
  480. // -----
  481. Int iMBX, iMBY, iMB = 0;
  482. Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
  483. CoordI y = 0; 
  484. CMBMode* pmbmd = m_rgmbmd;
  485. Int iQPPrev = m_vopmd.intStep;
  486. if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
  487. CMotionVector* pmv = m_rgmv;
  488. PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  489. PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  490. PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  491. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  492. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  493. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  494. Bool bRestartDelayedQP = TRUE;
  495. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  496. PixelC* ppxlcRefMBY = ppxlcRefY;
  497. PixelC* ppxlcRefMBU = ppxlcRefU;
  498. PixelC* ppxlcRefMBV = ppxlcRefV;
  499. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  500. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  501. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  502. CoordI x = 0; 
  503. // In a given Sprite update piece, identify whether current macroblock is not a hole and should be coded ?
  504. Bool  bSptMB_NOT_HOLE= TRUE;
  505. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
  506. bSptMB_NOT_HOLE = SptUpdateMB_NOT_HOLE(0, iMBY, pmbmd);
  507. m_statsMB.nBitsShape = 0;  
  508. }
  509. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) {
  510.             // skip current Sprite update macroblock if it is transparent
  511. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP && pmbmd -> m_rgTranspStatus [0] == ALL)
  512. goto EOMB3;
  513. else if (m_uiSprite == 1) {
  514. m_bSptMB_NOT_HOLE = bSptMB_NOT_HOLE;
  515. pmv -> setToZero ();
  516. pmbmd->m_bhas4MVForward = FALSE ;
  517. pmbmd -> m_dctMd = INTER ;
  518. }
  519. #ifdef __TRACE_AND_STATS_
  520. m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
  521. m_statsMB.reset ();
  522. #endif // __TRACE_AND_STATS_
  523. pmbmd->m_intStepDelta = 0;
  524. // MB rate control
  525. if (m_uiRateControl>=RC_TM5) {
  526. pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
  527.  m_statsVOP.total()) - iQPPrev;
  528. if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
  529. else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
  530. }
  531. #ifdef _MBQP_CHANGE_
  532. if (!pmbmd ->m_bhas4MVForward && !pmbmd ->m_bSkip) {
  533. iIndexofQ = (iIndexofQ + 1) % 4;
  534. pmbmd->m_intStepDelta = rgiQ [iIndexofQ];
  535. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  536. if ((iQPPrev + pmbmd->m_intStepDelta) > iQuantMax) 
  537. pmbmd->m_intStepDelta = 0;
  538. if ((iQPPrev + pmbmd->m_intStepDelta) <= 0)
  539. pmbmd->m_intStepDelta = 0;
  540. if (pmbmd->m_intStepDelta != 0) {
  541. if (pmbmd->m_dctMd == INTRA)
  542. pmbmd->m_dctMd = INTRAQ;
  543. else if (pmbmd ->m_dctMd == INTER)
  544. pmbmd->m_dctMd = INTERQ;
  545. }
  546. }
  547. // -----
  548. #endif //_MBQP_CHANGE_
  549. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  550. /* NBIT: change 31 to iMaxQP
  551. assert (pmbmd->m_stepSize <= 31 && pmbmd->m_stepSize > 0);
  552. */
  553. assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);
  554. if ( m_volmd.bVPBitTh >= 0) {
  555. Int iCounter = m_pbitstrmOut -> getCounter();
  556. if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
  557. // reset DQ to use QP in VP header
  558. pmbmd->m_intStepDelta = 0;
  559. if (pmbmd->m_dctMd == INTRAQ)
  560. pmbmd->m_dctMd = INTRA;
  561. else if (pmbmd ->m_dctMd == INTERQ)
  562. pmbmd->m_dctMd = INTER;
  563. iQPPrev = pmbmd->m_stepSize;
  564. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  565. m_iVPCounter = iCounter;
  566. bRestartDelayedQP = TRUE;
  567. }
  568. }
  569. if(bRestartDelayedQP)
  570. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  571. else
  572. pmbmd->m_stepSizeDelayed = iQPPrev;
  573. copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV); 
  574. encodePVOPMB (
  575. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
  576. pmbmd, pmv,
  577. iMBX, iMBY,
  578. x, y
  579. );
  580. if (!pmbmd->m_bSkip)
  581. {
  582. iQPPrev = pmbmd->m_stepSize;
  583. bRestartDelayedQP = FALSE;
  584. }
  585. EOMB3:
  586. pmbmd++;
  587. pmv += PVOP_MV_PER_REF_PER_MB;
  588. #ifdef __TRACE_AND_STATS_
  589. m_statsVOP += m_statsMB;
  590. #endif // __TRACE_AND_STATS_
  591. ppxlcRefMBY += MB_SIZE;
  592. ppxlcRefMBU += BLOCK_SIZE;
  593. ppxlcRefMBV += BLOCK_SIZE;
  594. ppxlcOrigMBY += MB_SIZE;
  595. ppxlcOrigMBU += BLOCK_SIZE;
  596. ppxlcOrigMBV += BLOCK_SIZE;
  597. // Identify whether next Sprite update macroblock is not a hole and should be coded ?
  598. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP && iMBX < (m_iNumMBX-1))
  599. bSptMB_NOT_HOLE = SptUpdateMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);   
  600. }
  601. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  602. m_rgpmbmAbove = m_rgpmbmCurr;
  603. m_rgpmbmCurr  = ppmbmTemp;
  604. ppxlcRefY += m_iFrameWidthYxMBSize;
  605. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  606. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  607. ppxlcOrigY += m_iFrameWidthYxMBSize;
  608. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  609. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  610. }
  611. }
  612. Void CVideoObjectEncoder::encodeNSForPVOP_WithShape ()
  613. {
  614. Int iMBX, iMBY, iMB = 0;
  615. motionEstPVOP_WithShape ();
  616. // shape bitstream is set to shape cache
  617. m_pbitstrmShapeMBOut = m_pbitstrmShape;
  618. // Rate Control
  619. if (m_uiRateControl==RC_MPEG4) {
  620. Double Ec = m_iMAD / (Double) (m_iNumMBY * m_iNumMBX * 16 * 16);
  621. m_statRC.setMad (Ec);
  622. if (m_statRC.noCodedFrame () >= RC_START_RATE_CONTROL) {
  623. UInt newQStep = m_statRC.updateQuanStepsize ();
  624. m_vopmd.intStepDiff = newQStep - m_vopmd.intStep; // DQUANT
  625. m_vopmd.intStep = newQStep;
  626. }
  627. cout << "t" << "Q:" << "ttt" << m_vopmd.intStep << "n";
  628. m_statRC.setQc (m_vopmd.intStep);
  629. }
  630. CoordI y = m_rctCurrVOPY.top; 
  631. CMBMode* pmbmd = m_rgmbmd;
  632. // Added for field based MC padding by Hyundai(1998-5-9)
  633. CMBMode* field_pmbmd = m_rgmbmd;
  634. // End of Hyundai(1998-5-9)
  635. Int iQPPrev = m_vopmd.intStep;
  636. Int iQPPrevAlpha = m_vopmd.intStepPAlpha;
  637. if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
  638. CMotionVector* pmv = m_rgmv;
  639. CMotionVector* pmvBY = m_rgmvBY;
  640. PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  641. PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  642. PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  643. PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  644. PixelC *ppxlcRefA = NULL, * ppxlcOrigA = NULL;
  645. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  646. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  647. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  648. PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
  649. if (m_volmd.fAUsage == EIGHT_BIT) {
  650. ppxlcRefA = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  651. ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();
  652. }
  653. Bool bRestartDelayedQP = TRUE;
  654. // Added for error resilient mode by Toshiba(1997-11-14)
  655. Bool bCodeVPHeaderNext = FALSE; // needed only for OBMC
  656. Int iTempVPMBnum = 0;
  657. // End Toshiba(1997-11-14)
  658. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  659. PixelC* ppxlcRefMBY = ppxlcRefY;
  660. PixelC* ppxlcRefMBU = ppxlcRefU;
  661. PixelC* ppxlcRefMBV = ppxlcRefV;
  662. PixelC* ppxlcRefMBBY = ppxlcRefBY;
  663. PixelC* ppxlcRefMBA = ppxlcRefA;
  664. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  665. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  666. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  667. PixelC* ppxlcOrigMBBY = ppxlcOrigBY;
  668. PixelC* ppxlcOrigMBA = ppxlcOrigA;
  669. CoordI x = m_rctCurrVOPY.left;
  670. #ifdef __TRACE_AND_STATS_
  671. m_statsMB.reset ();
  672. #endif // __TRACE_AND_STATS_
  673. // initiate advance shape coding
  674.         // Added for error resilient mode by Toshiba(1997-11-14)
  675. // The following operation is needed only for OBMC
  676. if ( m_volmd.bVPBitTh >= 0) {
  677. Int iCounter = m_pbitstrmOut -> getCounter();
  678. bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;
  679. if( bCodeVPHeaderNext ) {
  680. iTempVPMBnum  = m_iVPMBnum;
  681. m_iVPMBnum = VPMBnum(0, iMBY);
  682. m_iVPCounter = iCounter;
  683. }
  684. } else {
  685. bCodeVPHeaderNext = FALSE;
  686. }
  687. // End Toshiba(1997-11-14)
  688. copyToCurrBuffJustShape (ppxlcOrigMBBY, m_iFrameWidthY);
  689. // Modified for error resilient mode by Toshiba(1997-11-14)
  690. ShapeMode shpmdColocatedMB;
  691. if(m_vopmd.bShapeCodingType) {
  692. shpmdColocatedMB = m_rgmbmdRef [
  693. min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
  694. encodePVOPMBJustShape(ppxlcRefMBBY, pmbmd, shpmdColocatedMB, pmv, pmvBY, x, y, 0, iMBY);
  695. }
  696. else {
  697. m_statsMB.nBitsShape += codeIntraShape (ppxlcRefMBBY, pmbmd, 0, iMBY);
  698. decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); 
  699. }
  700. // End Toshiba(1997-11-14)
  701.         // Added for error resilient mode by Toshiba(1997-11-14)
  702. // The following operation is needed only for OBMC
  703. if( bCodeVPHeaderNext )
  704. m_iVPMBnum = iTempVPMBnum;
  705.         // End Toshiba(1997-11-14)
  706. if(pmbmd->m_bhas4MVForward)
  707. padMotionVectors(pmbmd,pmv);
  708. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) {
  709. // MB rate control
  710. if (m_uiRateControl>=RC_TM5) {
  711. pmbmd->m_intStepDelta = m_tm5rc.tm5rc_calc_mquant(iMB,
  712.  m_statsVOP.total()) - iQPPrev;
  713. if (pmbmd->m_intStepDelta>2) pmbmd->m_intStepDelta = 2;
  714. else if (pmbmd->m_intStepDelta<-2) pmbmd->m_intStepDelta = -2;
  715. }
  716.             // Added for error resilient mode by Toshiba(1997-11-14)
  717. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  718. if ( m_volmd.bVPBitTh >= 0) {
  719. if( bCodeVPHeaderNext ) {
  720. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  721. bRestartDelayedQP = TRUE;
  722. }
  723. } else {
  724. bCodeVPHeaderNext = FALSE;
  725. }
  726.             // End Toshiba(1997-11-14)
  727. #ifdef __TRACE_AND_STATS_
  728. m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y (Texture)");
  729. // shape quantization part
  730. m_statsMB.reset ();
  731. #endif // __TRACE_AND_STATS_
  732. pmbmd->m_bPadded=FALSE;
  733. dumpCachedShapeBits();
  734. if(iMBX<m_iNumMBX-1)
  735. {
  736.                 // Added for error resilient mode by Toshiba(1997-11-14)
  737. // The following operation is needed only for OBMC
  738. if ( m_volmd.bVPBitTh >= 0) {
  739. Int iCounter = m_pbitstrmOut -> getCounter();
  740. bCodeVPHeaderNext = iCounter - m_iVPCounter > m_volmd.bVPBitTh;
  741. if( bCodeVPHeaderNext ) {
  742. iTempVPMBnum  = m_iVPMBnum;
  743. m_iVPMBnum = VPMBnum(iMBX+1, iMBY);
  744. m_iVPCounter = iCounter;
  745. }
  746. } else {
  747. bCodeVPHeaderNext = FALSE;
  748. }
  749.                 // End Toshiba(1997-11-14)
  750. // code shape 1mb in advance
  751. copyToCurrBuffJustShape (ppxlcOrigMBBY+MB_SIZE,m_iFrameWidthY);
  752. // Modified for error resilient mode by Toshiba(1997-11-14)
  753. if(m_vopmd.bShapeCodingType) {
  754. shpmdColocatedMB = m_rgmbmdRef [
  755. min (max (0, iMBX+1), m_iNumMBXRef-1) + 
  756.   min (max (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
  757. ].m_shpmd;
  758. encodePVOPMBJustShape(
  759. ppxlcRefMBBY+MB_SIZE, pmbmd+1,
  760.  shpmdColocatedMB, pmv + PVOP_MV_PER_REF_PER_MB,
  761.  pmvBY+1, x+MB_SIZE, y,
  762.  iMBX+1, iMBY
  763. );
  764. }
  765. else {
  766. m_statsMB.nBitsShape
  767. += codeIntraShape (
  768. ppxlcRefMBBY+MB_SIZE,
  769. pmbmd+1, iMBX+1, iMBY
  770. );
  771. decideTransparencyStatus (pmbmd+1,
  772.  m_ppxlcCurrMBBY); 
  773. }
  774.     // End Toshiba(1997-11-14)
  775.                 // Added for error resilient mode by Toshiba(1997-11-14)
  776. // The following operation is needed only for OBMC
  777. if( bCodeVPHeaderNext )
  778. m_iVPMBnum = iTempVPMBnum;
  779.                 // End Toshiba(1997-11-14)
  780. // shape needs padded mvs ready for next mb
  781. if((pmbmd+1)->m_bhas4MVForward)
  782. padMotionVectors(pmbmd+1, pmv + PVOP_MV_PER_REF_PER_MB);
  783. }
  784. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  785. if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  786. // End of Hyundai(1998-5-9)*/
  787. if(m_volmd.bShapeOnly==FALSE)
  788. {
  789. pmbmd->m_stepSizeDelayed = iQPPrev;
  790. if (pmbmd -> m_rgTranspStatus [0] != ALL) {
  791. // need to copy binary shape too since curr buff is future shape
  792. copyToCurrBuffWithShape(ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV,
  793. ppxlcRefMBBY, ppxlcOrigMBA, m_iFrameWidthY, m_iFrameWidthUV);
  794. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  795. encodePVOPMBTextureWithShape(ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
  796. ppxlcRefMBA, pmbmd, pmv, iMBX, iMBY, x, y, iQPPrev, iQPPrevAlpha,
  797. bRestartDelayedQP);
  798. // Added for field based MC padding by Hyundai(1998-5-9)
  799. if (!m_vopmd.bInterlace) { 
  800. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  801. mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
  802. padNeighborTranspMBs (
  803. iMBX, iMBY,
  804. pmbmd,
  805. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  806. );
  807. }
  808. // End of Hyundai(1998-5-9)
  809. }
  810. else {
  811. // Added for field based MC padding by Hyundai(1998-5-9)
  812. if (!m_vopmd.bInterlace) { 
  813. padCurrAndTopTranspMBFromNeighbor (
  814. iMBX, iMBY,
  815. pmbmd,
  816. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  817. );
  818. }
  819. // End of Hyundai(1998-5-9)
  820. }
  821. }
  822. pmbmd++;
  823. pmv += PVOP_MV_PER_REF_PER_MB;
  824. pmvBY++;
  825. ppxlcRefMBBY += MB_SIZE;
  826. ppxlcRefMBA += MB_SIZE;
  827. ppxlcOrigMBBY += MB_SIZE;
  828. ppxlcOrigMBA += MB_SIZE;
  829. #ifdef __TRACE_AND_STATS_
  830. m_statsVOP += m_statsMB;
  831. #endif // __TRACE_AND_STATS_
  832. ppxlcRefMBY += MB_SIZE;
  833. ppxlcRefMBU += BLOCK_SIZE;
  834. ppxlcRefMBV += BLOCK_SIZE;
  835. ppxlcOrigMBY += MB_SIZE;
  836. ppxlcOrigMBU += BLOCK_SIZE;
  837. ppxlcOrigMBV += BLOCK_SIZE;
  838. }
  839. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  840. m_rgpmbmAbove = m_rgpmbmCurr;
  841. m_rgpmbmCurr  = ppmbmTemp;
  842. ppxlcRefY += m_iFrameWidthYxMBSize;
  843. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  844. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  845. ppxlcRefBY += m_iFrameWidthYxMBSize;
  846. ppxlcRefA += m_iFrameWidthYxMBSize;
  847. ppxlcOrigY += m_iFrameWidthYxMBSize;
  848. ppxlcOrigBY += m_iFrameWidthYxMBSize;
  849. ppxlcOrigA += m_iFrameWidthYxMBSize;
  850. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  851. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  852. }
  853. // Added for field based MC padding by Hyundai(1998-5-9)
  854.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  855.                 fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);
  856. // End of Hyundai(1998-5-9)
  857. // restore normal output stream
  858. m_pbitstrmShapeMBOut = m_pbitstrmOut;
  859. }
  860. Void CVideoObjectEncoder::encodeNSForBVOP ()
  861. {
  862. motionEstBVOP ();
  863. CoordI y = 0; 
  864. CMBMode* pmbmd = m_rgmbmd;
  865. CMotionVector* pmv = m_rgmv;
  866. CMotionVector* pmvBackward = m_rgmvBackward;
  867. const CMBMode* pmbmdRef = m_rgmbmdRef; //MB mode in ref frame for direct mode
  868. const CMotionVector* pmvRef = m_rgmvRef; //MV in ref frame for direct mode
  869. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
  870. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
  871. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
  872. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  873. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  874. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  875. // MB rate control
  876. //Int iIndexofQ = 0;
  877. //Int rgiQ [4] = {-2, 0, 0, 2};
  878. // -----
  879. Int iQPPrev = m_vopmd.intStepB;
  880. Int iMBX, iMBY, iMB = 0;
  881. Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
  882. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  883. PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
  884. PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
  885. PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
  886. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  887. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  888. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  889. CoordI x = 0;
  890. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  891. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  892. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  893. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  894. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) {
  895. #ifdef __TRACE_AND_STATS_
  896. m_pbitstrmOut->trace (CSite (iMBX, iMBY), "MB_X_Y");
  897. // shape quantization part
  898. m_statsMB.reset ();
  899. #endif // __TRACE_AND_STATS_
  900. pmbmd->m_intStepDelta = 0;
  901. // MB rate control
  902. if (m_uiRateControl>=RC_TM5) {
  903. int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total());
  904. // special case for BVOP copied from MoMuSys
  905. if (k > iQPPrev) {
  906. if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2;
  907. } else if (k < iQPPrev) {
  908. if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2;
  909. }
  910. }
  911. #ifdef _MBQP_CHANGE_
  912. if (!pmbmd->m_bColocatedMBSkip && pmbmd->m_mbType != DIRECT) {
  913. iIndexofQ = (iIndexofQ + 1) % 4;
  914. pmbmd->m_dctMd = INTERQ;
  915. pmbmd->m_intStepDelta = rgiQ [iIndexofQ];
  916. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  917. if ((iQPPrev + pmbmd->m_intStepDelta) > iQuantMax)
  918. pmbmd->m_intStepDelta = 0;
  919. if ((iQPPrev + pmbmd->m_intStepDelta) <= 0)
  920. pmbmd->m_intStepDelta = 0;
  921. }
  922. // -----
  923. #endif //_MBQP_CHANGE_
  924. pmbmd->m_stepSize = iQPPrev + pmbmd->m_intStepDelta;
  925. /* NBIT: change 31 to iMaxQP
  926. assert (pmbmd->m_stepSize <= 31 && pmbmd->m_stepSize > 0);
  927. */
  928. assert (pmbmd->m_stepSize <= iMaxQP && pmbmd->m_stepSize > 0);
  929. if ( m_volmd.bVPBitTh >= 0) {
  930. Int iCounter = m_pbitstrmOut -> getCounter();
  931. if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
  932. // reset DQ to use QP in VP header
  933. pmbmd->m_intStepDelta = 0;
  934. if (pmbmd ->m_dctMd == INTERQ)
  935. pmbmd->m_dctMd = INTER;
  936. iQPPrev = pmbmd->m_stepSize;
  937. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  938. m_iVPCounter = iCounter;
  939. //reset MV predictor
  940. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  941. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  942. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  943. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  944. }
  945. }
  946. if (pmbmd->m_bColocatedMBSkip &&
  947. (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))
  948. { // don't need to send any bit for this mode
  949. copyFromRefToCurrQ (
  950. m_pvopcRefQ0,
  951. x, y, 
  952. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL
  953. );
  954. }
  955. else {
  956. copyToCurrBuff (ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, m_iFrameWidthY, m_iFrameWidthUV); 
  957. encodeBVOPMB (
  958. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  959. pmbmd, pmv, pmvBackward,
  960. pmbmdRef, pmvRef,
  961. iMBX, iMBY,
  962. x, y
  963. );
  964. if (pmbmd->getCodedBlockPattern (U_BLOCK) ||
  965. pmbmd->getCodedBlockPattern (V_BLOCK) ||
  966. pmbmd->getCodedBlockPattern (Y_BLOCK1) ||
  967. pmbmd->getCodedBlockPattern (Y_BLOCK2) ||
  968. pmbmd->getCodedBlockPattern (Y_BLOCK3) ||
  969. pmbmd->getCodedBlockPattern (Y_BLOCK4))
  970. iQPPrev = pmbmd->m_stepSize;
  971. }
  972. pmbmd++;
  973. pmv         += BVOP_MV_PER_REF_PER_MB;
  974. pmvBackward += BVOP_MV_PER_REF_PER_MB;
  975. pmvRef      += PVOP_MV_PER_REF_PER_MB;
  976. pmbmdRef++;
  977. m_statsVOP += m_statsMB;
  978. ppxlcCurrQMBY += MB_SIZE;
  979. ppxlcCurrQMBU += BLOCK_SIZE;
  980. ppxlcCurrQMBV += BLOCK_SIZE;
  981. ppxlcOrigMBY += MB_SIZE;
  982. ppxlcOrigMBU += BLOCK_SIZE;
  983. ppxlcOrigMBV += BLOCK_SIZE;
  984. }
  985. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  986. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  987. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  988. ppxlcOrigY += m_iFrameWidthYxMBSize;
  989. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  990. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  991. }
  992. }
  993. Void CVideoObjectEncoder::encodeNSForBVOP_WithShape ()
  994. {
  995. motionEstBVOP_WithShape ();
  996. // decide prediction direction for shape
  997. if(m_bCodedFutureRef==FALSE)
  998. m_vopmd.fShapeBPredDir = B_FORWARD;
  999. else
  1000. {
  1001. if(m_tFutureRef - m_t >= m_t - m_tPastRef)
  1002. m_vopmd.fShapeBPredDir = B_FORWARD;
  1003. else
  1004. m_vopmd.fShapeBPredDir = B_BACKWARD;
  1005. }
  1006. Int iQPPrev = m_vopmd.intStepB;
  1007. Int iQPPrevAlpha = m_vopmd.intStepBAlpha;
  1008. if (m_uiRateControl>=RC_TM5) iQPPrev = m_tm5rc.tm5rc_start_mb();
  1009. CoordI y = m_rctCurrVOPY.top; 
  1010. CMBMode*    pmbmd = m_rgmbmd;
  1011. // Added for field based MC padding by Hyundai(1998-5-9)
  1012. CMBMode* field_pmbmd = m_rgmbmd;
  1013. // End of Hyundai(1998-5-9)
  1014. CMotionVector* pmv = m_rgmv;
  1015. CMotionVector* pmvBackward = m_rgmvBackward;
  1016. CMotionVector* pmvBY = m_rgmvBY;
  1017. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
  1018. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
  1019. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
  1020. PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;
  1021. PixelC *ppxlcCurrQA = NULL, * ppxlcOrigA = NULL;
  1022. PixelC* ppxlcOrigY = (PixelC*) m_pvopcOrig->pixelsBoundY ();
  1023. PixelC* ppxlcOrigU = (PixelC*) m_pvopcOrig->pixelsBoundU ();
  1024. PixelC* ppxlcOrigV = (PixelC*) m_pvopcOrig->pixelsBoundV ();
  1025. PixelC* ppxlcOrigBY = (PixelC*) m_pvopcOrig->pixelsBoundBY ();
  1026. if (m_volmd.fAUsage == EIGHT_BIT) {
  1027. ppxlcCurrQA = (PixelC*) m_pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;
  1028. ppxlcOrigA = (PixelC*) m_pvopcOrig->pixelsBoundA ();
  1029. }
  1030. Int iMBX, iMBY, iMB = 0;
  1031. const CMBMode* pmbmdRef;
  1032. const CMotionVector* pmvRef;
  1033. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  1034. PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
  1035. PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
  1036. PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
  1037. PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;
  1038. PixelC* ppxlcCurrQMBA = ppxlcCurrQA;
  1039. PixelC* ppxlcOrigMBY = ppxlcOrigY;
  1040. PixelC* ppxlcOrigMBU = ppxlcOrigU;
  1041. PixelC* ppxlcOrigMBV = ppxlcOrigV;
  1042. PixelC* ppxlcOrigMBBY = ppxlcOrigBY;
  1043. PixelC* ppxlcOrigMBA = ppxlcOrigA;
  1044. CoordI x = m_rctCurrVOPY.left;
  1045. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  1046. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  1047. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  1048. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  1049. Int iMaxQP = (1<<m_volmd.uiQuantPrecision)-1; // NBIT
  1050. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE, iMB++) {
  1051. pmbmd->m_intStepDelta = 0; //sharp added this
  1052. pmbmd->m_bPadded=FALSE;
  1053. // shape quantization part
  1054. m_statsMB.reset ();
  1055. // Modified for error resilience mode by Toshiba(1998-1-16)
  1056. pmbmd->m_stepSize = m_vopmd.intStepB;
  1057. // MB rate control  -- should this be here??????
  1058. if (m_uiRateControl>=RC_TM5) {
  1059. int k = m_tm5rc.tm5rc_calc_mquant(iMB, m_statsVOP.total());
  1060. // special case for BVOP copied from MoMuSys
  1061. if (k > iQPPrev) {
  1062. if (iQPPrev+2 <= iMaxQP) pmbmd->m_intStepDelta = 2;
  1063. } else if (k < iQPPrev) {
  1064. if (iQPPrev-2 > 0) pmbmd->m_intStepDelta = -2;
  1065. }
  1066. }
  1067. if ( m_volmd.bVPBitTh >= 0) {
  1068. Int iCounter = m_pbitstrmOut -> getCounter();
  1069. if( iCounter - m_iVPCounter > m_volmd.bVPBitTh ) {
  1070. // // reset DQ to use QP in VP header
  1071. // pmbmd->m_intStepDelta = 0;
  1072. // if (pmbmd ->m_dctMd == INTERQ)
  1073. // pmbmd->m_dctMd = INTER;
  1074. // iQPPrev = pmbmd->m_stepSize;
  1075. codeVideoPacketHeader (iMBX, iMBY, pmbmd->m_stepSize); // video packet header
  1076. m_iVPCounter = iCounter;
  1077. //reset MV predictor
  1078. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  1079. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  1080. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  1081. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  1082. }
  1083. }
  1084. // End Toshiba(1998-1-16)
  1085. findColocatedMB (iMBX, iMBY,  pmbmdRef, pmvRef);
  1086. ShapeMode shpmdColocatedMB;
  1087. if(m_vopmd.fShapeBPredDir==B_FORWARD)
  1088. shpmdColocatedMB = m_rgshpmd [min (max (0, iMBX), m_iRefShpNumMBX - 1) 
  1089. + min (max (0, iMBY), m_iRefShpNumMBY - 1) * m_iRefShpNumMBX];
  1090. else
  1091. shpmdColocatedMB = m_rgmbmdRef [min (max (0, iMBX), m_iNumMBXRef - 1)
  1092. + min (max (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
  1093. if (pmbmd->m_bColocatedMBSkip &&
  1094. (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))
  1095. { // don't need to send any bit for this mode
  1096. copyToCurrBuffJustShape( ppxlcOrigMBBY, m_iFrameWidthY );
  1097. m_statsMB.nBitsShape += codeInterShape (
  1098. ppxlcCurrQMBBY,
  1099. m_vopmd.fShapeBPredDir==B_FORWARD ? m_pvopcRefQ0 : m_pvopcRefQ1,
  1100. pmbmd, shpmdColocatedMB,
  1101. NULL, pmvBY,
  1102. x, y, 
  1103. iMBX, iMBY
  1104. );
  1105. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  1106. decideTransparencyStatus (pmbmd, m_ppxlcCurrMBBY); // change pmbmd to inter if all transparent
  1107. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  1108. if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  1109. // End of Hyundai(1998-5-9)*/
  1110. // reset motion vectors to zero because of skip
  1111. memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  1112. memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  1113. if (m_volmd.fAUsage == EIGHT_BIT)
  1114. copyAlphaFromRefToCurrQ(m_pvopcRefQ0, x, y, ppxlcCurrQMBA, &m_rctRefVOPY0);
  1115. copyFromRefToCurrQ(
  1116. m_pvopcRefQ0,
  1117. x, y, 
  1118. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0
  1119. );
  1120. }
  1121. else {
  1122. copyToCurrBuffWithShape (
  1123. ppxlcOrigMBY, ppxlcOrigMBU, ppxlcOrigMBV, 
  1124. ppxlcOrigMBBY, ppxlcOrigMBA,
  1125. m_iFrameWidthY, m_iFrameWidthUV
  1126. );
  1127. encodeBVOPMB_WithShape (
  1128. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA, ppxlcCurrQMBBY,
  1129. pmbmd, pmv, pmvBackward,
  1130. pmvBY, shpmdColocatedMB,
  1131. pmbmdRef, pmvRef,
  1132. iMBX, iMBY,
  1133. x, y, iQPPrev, iQPPrevAlpha
  1134. );
  1135. }
  1136. //padding of bvop is necessary for temporal scalability: bvop in base layer is used for prediction in enhancement layer
  1137. if(m_volmd.bShapeOnly == FALSE) {
  1138. // Added for field based MC padding by Hyundai(1998-5-9)
  1139. if (!m_vopmd.bInterlace) {
  1140. if (pmbmd -> m_rgTranspStatus [0] != ALL) {
  1141. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  1142. mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
  1143. padNeighborTranspMBs (
  1144. iMBX, iMBY,
  1145. pmbmd,
  1146. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1147. );
  1148. }
  1149. else {
  1150. padCurrAndTopTranspMBFromNeighbor (
  1151. iMBX, iMBY,
  1152. pmbmd,
  1153. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1154. ); 
  1155. }
  1156. }
  1157. // End of Hyundai(1998-5-9)
  1158. }
  1159. pmvBY++;
  1160. pmbmd++;
  1161. pmv         += BVOP_MV_PER_REF_PER_MB;
  1162. pmvBackward += BVOP_MV_PER_REF_PER_MB;
  1163. m_statsVOP += m_statsMB;
  1164. ppxlcCurrQMBY += MB_SIZE;
  1165. ppxlcCurrQMBU += BLOCK_SIZE;
  1166. ppxlcCurrQMBV += BLOCK_SIZE;
  1167. ppxlcCurrQMBBY += MB_SIZE;
  1168. ppxlcCurrQMBA += MB_SIZE;
  1169. ppxlcOrigMBY += MB_SIZE;
  1170. ppxlcOrigMBU += BLOCK_SIZE;
  1171. ppxlcOrigMBV += BLOCK_SIZE;
  1172. ppxlcOrigMBBY += MB_SIZE;
  1173. ppxlcOrigMBA += MB_SIZE;
  1174. }
  1175. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  1176. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  1177. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  1178. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  1179. ppxlcCurrQA += m_iFrameWidthYxMBSize;
  1180. ppxlcOrigY += m_iFrameWidthYxMBSize;
  1181. ppxlcOrigU += m_iFrameWidthUVxBlkSize;
  1182. ppxlcOrigV += m_iFrameWidthUVxBlkSize;
  1183. ppxlcOrigBY += m_iFrameWidthYxMBSize;
  1184. ppxlcOrigA += m_iFrameWidthYxMBSize;
  1185. }
  1186. // Added for field based MC padding by Hyundai(1998-5-9)
  1187.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  1188.                 fieldBasedMCPadding (field_pmbmd, m_pvopcCurrQ);
  1189. // End of Hyundai(1998-5-9)
  1190. }