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

流媒体/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. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  11. Takeshi Nagai (TOSHIBA CORPORATION)
  12. Toshiaki Watanabe (TOSHIBA CORPORATION)
  13. Noboru Yamaguchi (TOSHIBA CORPORATION)
  14. and also edited by
  15. David B. Shu (dbshu@hrl.com), Hughes Electronics/HRL Laboratories
  16. and edited by
  17. Xuemin Chen (xchen@gi.com), General Instrument Corp.
  18. and also edited by
  19. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  20. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  21. (date: July, 1998)
  22. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  23. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  24. as specified by the MPEG-4 Video. 
  25. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  26. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  27. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  28. The original developer of this software module and his/her company, 
  29. the subsequent editors and their companies, 
  30. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  31. Copyright is not released for non MPEG-4 Video conforming products. 
  32. Microsoft retains full right to use the code for his/her own purpose, 
  33. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  34. This copyright notice must be included in all copies or derivative works. 
  35. Copyright (c) 1996, 1997.
  36. Module Name:
  37. vopmbDec.cpp
  38. Abstract:
  39. Decoder for VOP composed of MB's
  40. Revision History:
  41. Nov. 26 , 1997: modified for error resilient by Toshiba
  42. Nov. 30 , 1997: modified for Spatial Scalable by Takefumi Nagumo
  43. (nagumo@av.crl.sony.co.jp) SONY Corporation 
  44. Dec 20, 1997: Interlaced tools added by GI
  45.                         X. Chen (xchen@gi.com), B. Eifrig (beifrig@gi.com)
  46.         May. 9   1998:  add boundary by Hyundai Electronics 
  47.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr) 
  48.         May. 9   1998:  add field based MC padding by Hyundai Electronics 
  49.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr) 
  50. *************************************************************************/
  51. #include <stdio.h>
  52. #include <math.h>
  53. #include <stdlib.h>
  54. #include "typeapi.h"
  55. #include "mode.hpp"
  56. #include "codehead.h"
  57. #include "entropy/bitstrm.hpp"
  58. #include "entropy/entropy.hpp"
  59. #include "entropy/huffman.hpp"
  60. #include "global.hpp"
  61. #include "vopses.hpp"
  62. #include "vopsedec.hpp"
  63. #ifdef __MFC_
  64. #ifdef _DEBUG
  65. #undef THIS_FILE
  66. static char BASED_CODE THIS_FILE[] = __FILE__;
  67. #endif
  68. #define new DEBUG_NEW    
  69. #endif // __MFC_
  70. Void CVideoObjectDecoder::decodeVOP ()
  71. {
  72. if (m_volmd.fAUsage != RECTANGLE) {
  73. // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  74. if(m_volmd.bDataPartitioning && !m_volmd.bShapeOnly){
  75. if (m_vopmd.vopPredType == PVOP)
  76. decodePVOP_WithShape_DataPartitioning ();
  77. else if (m_vopmd.vopPredType == IVOP)
  78. decodeIVOP_WithShape_DataPartitioning ();
  79. else
  80. decodeBVOP_WithShape ();
  81. }
  82. else {
  83. // End Toshiba(1998-1-16:DP+RVLC)
  84. if (m_vopmd.vopPredType == PVOP)
  85. { // Sprite update piece contains no shape information which has been included in the object piece
  86. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)
  87. decodePVOP ();
  88. else
  89. decodePVOP_WithShape ();
  90. }
  91. else if (m_vopmd.vopPredType == IVOP)
  92. decodeIVOP_WithShape ();
  93. else
  94. decodeBVOP_WithShape ();
  95. }
  96. }
  97. else {
  98. // Modified for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  99. if(m_volmd.bDataPartitioning){
  100. if (m_vopmd.vopPredType == PVOP)
  101. decodePVOP_DataPartitioning ();
  102. else if (m_vopmd.vopPredType == IVOP)
  103. decodeIVOP_DataPartitioning ();
  104. else
  105. decodeBVOP ();
  106. }
  107. else {
  108. if (m_vopmd.vopPredType == PVOP)
  109. decodePVOP ();
  110. else if (m_vopmd.vopPredType == IVOP)
  111. decodeIVOP ();
  112. else
  113. decodeBVOP ();
  114. }
  115. // End Toshiba(1998-1-16:DP+RVLC)
  116. }
  117. }
  118. Void CVideoObjectDecoder::decodeIVOP_WithShape ()
  119. {
  120. //in case the IVOP is used as an ref for direct mode
  121. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  122. Int iMBX, iMBY;
  123. CMBMode* pmbmd = m_rgmbmd;
  124. // Added for field based MC padding by Hyundai(1998-5-9)
  125.         CMBMode* field_pmbmd = m_rgmbmd;
  126. // End of Hyundai(1998-5-9)
  127. PixelC* ppxlcRefY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  128. PixelC* ppxlcRefU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  129. PixelC* ppxlcRefV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  130. PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  131. PixelC* ppxlcRefA  = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  132. PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;
  133. pmbmd->m_bFieldDCT=0; // new changes by X. Chen
  134. Int iCurrentQP  = m_vopmd.intStepI;
  135. Int iCurrentQPA = m_vopmd.intStepIAlpha;
  136. // Added for error resilient mode by Toshiba(1997-11-14)
  137. Int iVideoPacketNumber = 0;
  138. m_iVPMBnum = 0;
  139. Bool bRestartDelayedQP = TRUE;
  140. // End Toshiba(1997-11-14)
  141. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
  142. PixelC* ppxlcRefMBY  = ppxlcRefY;
  143. PixelC* ppxlcRefMBU  = ppxlcRefU;
  144. PixelC* ppxlcRefMBV  = ppxlcRefV;
  145. PixelC* ppxlcRefMBBY = ppxlcRefBY;
  146. PixelC* ppxlcRefMBBUV = ppxlcRefBUV;
  147. PixelC* ppxlcRefMBA  = ppxlcRefA;
  148. Bool  bSptMB_NOT_HOLE= TRUE;
  149. // Begin: modified by Hughes   4/9/98
  150. // if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
  151. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
  152. // end:  modified by Hughes   4/9/98
  153. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);  
  154. RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);  // restore current row pointed by *m_rgpmbmCurr
  155. }
  156. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
  157. m_bSptMB_NOT_HOLE  =  bSptMB_NOT_HOLE;
  158. if (!m_bSptMB_NOT_HOLE ) // current Sprite macroblock is not a hole and should be decoded
  159. goto END_OF_DECODING1;
  160. // Added for error resilient mode by Toshiba(1997-11-14)
  161. if (checkResyncMarker()) {
  162. decodeVideoPacketHeader(iCurrentQP);
  163. iVideoPacketNumber++;
  164. bRestartDelayedQP = TRUE;
  165. }
  166. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  167. // End Toshiba(1997-11-14)
  168. decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY, ppxlcRefMBBY);
  169. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  170. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  171.                         if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  172. // End of Hyundai(1998-5-9)*/
  173. if(m_volmd.bShapeOnly==FALSE)
  174. {
  175. pmbmd->m_bPadded=FALSE;
  176. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  177. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  178.                     if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus [0] == PARTIAL)
  179.                             isBoundaryMacroBlockMerged (pmbmd);
  180. // End of Hyundai(1998-5-9)*/
  181. decodeMBTextureHeadOfIVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  182. decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV);
  183. // INTERLACE
  184. //new changes
  185. if ((pmbmd->m_rgTranspStatus [0] == NONE) && 
  186. (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  187. fieldDCTtoFrameC(ppxlcRefMBY);
  188. //end of new changes
  189. // ~INTERLACE
  190. if (m_volmd.fAUsage == EIGHT_BIT) {
  191. decodeMBAlphaHeadOfIVOP (pmbmd, iCurrentQP, iCurrentQPA, m_vopmd.intStepI, m_vopmd.intStepIAlpha);
  192. decodeAlphaIntraMB (pmbmd, iMBX, iMBY, ppxlcRefMBA);
  193. }
  194. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  195.                         if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  196.                                 mergedMacroBlockSplit (pmbmd, ppxlcRefMBY, ppxlcRefMBA);
  197. // End of Hyundai(1998-5-9)*/
  198. // Begin: modified by Hughes   4/9/98
  199. //   if (m_uiSprite == 0)  {  // added for sprite by dshu: [v071] to delay the padding until ready for warping
  200.   if (m_uiSprite == 0 || m_sptMode == BASIC_SPRITE)  {  //  delay the padding until ready for sprite warping
  201. // end:  modified by Hughes   4/9/98
  202. // MC padding
  203.                                         // Added for field based MC padding by Hyundai(1998-5-9)
  204.                                         if (!m_vopmd.bInterlace) {
  205. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  206. mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
  207. padNeighborTranspMBs (
  208. iMBX, iMBY,
  209. pmbmd,
  210. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  211. );
  212. }
  213. // End of Hyundai(1998-5-9)
  214.   }   // added for sprite by dshu: [v071]
  215. }
  216. else {
  217. // Begin: modified by Hughes   4/9/98
  218. //   if (m_uiSprite == 0)    // added for sprite by dshu: [v071] to delay the padding until ready for warping
  219.   if (m_uiSprite == 0 || m_sptMode == BASIC_SPRITE) //  delay the padding until ready for sprite warping
  220. // end:  modified by Hughes   4/9/98
  221. // Added for field based MC padding by Hyundai(1998-5-9)
  222. if (!m_vopmd.bInterlace) {
  223. padCurrAndTopTranspMBFromNeighbor (
  224. iMBX, iMBY,
  225. pmbmd,
  226. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  227. );
  228. }
  229. // End of Hyundai(1998-5-9)
  230. }
  231. }
  232. END_OF_DECODING1:
  233. ppxlcRefMBA += MB_SIZE;
  234. ppxlcRefMBBY += MB_SIZE;
  235. ppxlcRefMBBUV += BLOCK_SIZE;
  236. pmbmd++;
  237. ppxlcRefMBY += MB_SIZE;
  238. ppxlcRefMBU += BLOCK_SIZE;
  239. ppxlcRefMBV += BLOCK_SIZE;
  240. // Begin: modified by Hughes   4/9/98
  241. // if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)
  242. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)
  243. // end:  modified by Hughes   4/9/98
  244. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);  
  245. else
  246. bSptMB_NOT_HOLE= TRUE;
  247. }
  248. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  249. m_rgpmbmAbove = m_rgpmbmCurr;
  250. // dshu: [v071] begin of modification   1/18/98
  251. // Begin: modified by Hughes   4/9/98
  252. //  if  (m_uiSprite == 1)
  253.   if  (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
  254. // end:  modified by Hughes   4/9/98
  255. SaveMBmCurrRow (iMBY, m_rgpmbmCurr);  //   save current row pointed by *m_rgpmbmCurr 
  256. // dshu: [v071] end of modification
  257. m_rgpmbmCurr  = ppmbmTemp;
  258. ppxlcRefY += m_iFrameWidthYxMBSize;
  259. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  260. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  261. ppxlcRefBY += m_iFrameWidthYxMBSize;
  262. ppxlcRefA += m_iFrameWidthYxMBSize;
  263. ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
  264. }
  265. // Added for field based MC padding by Hyundai(1998-5-9)
  266.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  267.                 fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);
  268.         // End of Hyundai(1998-5-9)
  269. }
  270. Void CVideoObjectDecoder::decodeIVOP ()
  271. {
  272. //in case the IVOP is used as an ref for direct mode
  273. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  274. //Int macrotellertje=0;  // [FDS]
  275. Int iMBX, iMBY;
  276. Int iMBXstart, iMBXstop, iMBYstart, iMBYstop; // Added by KPN for short headers
  277. UInt uiNumberOfGobs; // Added by KPN
  278. UInt uiGobNumber; // Added by KPN
  279. CMBMode* pmbmd = m_rgmbmd;
  280. pmbmd->m_stepSize = m_vopmd.intStepI;
  281. PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  282. PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  283. PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  284. pmbmd->m_bFieldDCT = 0;
  285. Int iCurrentQP  = m_vopmd.intStepI;
  286. Int iVideoPacketNumber = 0;  // added for error resilience mode by Toshiba
  287. m_iVPMBnum = 0; // Added for error resilient mode by Toshiba(1997-11-14)
  288. if (!short_video_header) { 
  289. uiNumberOfGobs = 1;
  290. iMBXstart=0; 
  291. iMBXstop= m_iNumMBX;
  292. iMBYstart=0;
  293. iMBYstop= m_iNumMBY;
  294. }
  295. else { // short_header
  296. uiNumberOfGobs = uiNumGobsInVop;
  297. iMBXstart=0; 
  298. iMBXstop= 0;
  299. iMBYstart=0;
  300. iMBYstop= 0;
  301. //uiNumMacroblocksInGob=8;
  302. // dx_in_gob = ;
  303. // dy_in_gob = ;
  304. }
  305. Bool bRestartDelayedQP = TRUE; // decodeMBTextureHeadOfIVOP sets this to false
  306. uiGobNumber=0;
  307. while (uiGobNumber < uiNumberOfGobs) { 
  308. if (short_video_header) {
  309. uiGobHeaderEmpty=1;
  310. if (uiGobNumber != 0) {
  311. if (m_pbitstrmIn->peekBits(17)==1) {
  312. uiGobHeaderEmpty=0;
  313. /* UInt uiGobResyncMarker= wmay */m_pbitstrmIn -> getBits (17);
  314. uiGobNumber=m_pbitstrmIn -> getBits(5);
  315. /* UInt uiGobFrameId = wmay */ m_pbitstrmIn -> getBits(2);
  316. /* UInt uiVopQuant= wmay */m_pbitstrmIn -> getBits(5); 
  317. uiGobNumber++; 
  318. } else {
  319. uiGobNumber++;
  320. }
  321. } else {
  322. uiGobNumber++;
  323. }
  324. iMBXstart=0; 
  325. iMBXstop= m_ivolWidth/16;
  326. iMBYstart=(uiGobNumber*(m_ivolHeight/16)/uiNumberOfGobs)-1;
  327. iMBYstop= iMBYstart+(m_ivolHeight/16)/uiNumberOfGobs;
  328. } else {
  329. uiGobNumber++; 
  330. }
  331. for (iMBY = iMBYstart; iMBY < iMBYstop; iMBY++) { // [FDS]
  332. PixelC* ppxlcRefMBY = ppxlcRefY;
  333. PixelC* ppxlcRefMBU = ppxlcRefU;
  334. PixelC* ppxlcRefMBV = ppxlcRefV;
  335. Bool  bSptMB_NOT_HOLE= TRUE;
  336. // Begin: modified by Hughes   4/9/98
  337. // if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
  338. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP) {
  339. // end:  modified by Hughes   4/9/98
  340. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(0, iMBY, pmbmd);  
  341. RestoreMBmCurrRow (iMBY, m_rgpmbmCurr);  // restore current row pointed by *m_rgpmbmCurr
  342. }
  343. for (iMBX = iMBXstart; iMBX < iMBXstop; iMBX++) {
  344.             
  345.   m_bSptMB_NOT_HOLE  =  bSptMB_NOT_HOLE;
  346.   if (!m_bSptMB_NOT_HOLE )  // current Sprite macroblock is not a hole and should be decoded
  347.   goto END_OF_DECODING2;
  348. if (checkResyncMarker()) {
  349. decodeVideoPacketHeader(iCurrentQP);
  350. iVideoPacketNumber++;
  351. bRestartDelayedQP = TRUE;
  352. }
  353. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec 
  354. decodeMBTextureHeadOfIVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  355. decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV);
  356. // INTERLACE
  357. if ((m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  358. fieldDCTtoFrameC(ppxlcRefMBY);
  359. // ~INTERLACE
  360. END_OF_DECODING2:
  361. pmbmd++;
  362. ppxlcRefMBY += MB_SIZE;
  363. ppxlcRefMBU += BLOCK_SIZE;
  364. ppxlcRefMBV += BLOCK_SIZE;
  365. // Begin: modified by Hughes   4/9/98
  366. // if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)
  367. if (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE && m_vopmd.SpriteXmitMode != STOP)  // get the hole status for the next MB
  368. // end:  modified by Hughes   4/9/98
  369. bSptMB_NOT_HOLE = SptPieceMB_NOT_HOLE(iMBX+1, iMBY, pmbmd);  
  370. else
  371. bSptMB_NOT_HOLE= TRUE;
  372. }
  373. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  374. m_rgpmbmAbove = m_rgpmbmCurr;
  375. // dshu: [v071] begin of modification    1/18/98
  376. // Begin: modified by Hughes   4/9/98
  377. //  if  (m_uiSprite == 1)
  378.   if  (m_uiSprite == 1 && m_sptMode != BASIC_SPRITE)
  379. // end:  modified by Hughes   4/9/98
  380. SaveMBmCurrRow (iMBY, m_rgpmbmCurr);  //   save current row pointed by *m_rgpmbmCurr 
  381. // dshu: [v071] end of modification
  382. m_rgpmbmCurr  = ppmbmTemp;
  383. ppxlcRefY += m_iFrameWidthYxMBSize;
  384. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  385. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  386. // dshu: [v071] begin of modification    1/18/98 move these statements up
  387. // if  (m_uiSprite == 1)
  388. // SaveMBmCurrRow (iMBY, m_rgpmbmCurr);  //   save current row pointed by *m_rgpmbmCurr 
  389. // dshu: [v071] end of modification
  390. }
  391. } // KPN Terminate while loop Gob layer [FDS]
  392. }
  393. Void CVideoObjectDecoder::decodePVOP_WithShape ()
  394. {
  395. Int iMBX, iMBY;
  396. CoordI y = m_rctCurrVOPY.top; 
  397. CMBMode* pmbmd = m_rgmbmd;
  398.         // Added for field based MC padding by Hyundai(1998-5-9)
  399.         CMBMode* field_pmbmd = m_rgmbmd;
  400.         // End of Hyundai(1998-5-9)
  401. CMotionVector* pmv = m_rgmv;
  402. CMotionVector* pmvBY = m_rgmvBY;
  403. PixelC* ppxlcCurrQY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  404. PixelC* ppxlcCurrQU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  405. PixelC* ppxlcCurrQV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  406. PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  407. PixelC* ppxlcCurrQA  = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  408. Int iCurrentQP  = m_vopmd.intStep;
  409. Int iCurrentQPA = m_vopmd.intStepPAlpha;
  410. // Added for error resilient mode by Toshiba(1997-11-14)
  411. Int iVideoPacketNumber = 0;  // added for error resilience mode by Toshiba
  412. m_iVPMBnum = 0;
  413. Bool bRestartDelayedQP = TRUE;
  414. // End Toshiba(1997-11-14)
  415. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  416. PixelC* ppxlcCurrQMBY  = ppxlcCurrQY;
  417. PixelC* ppxlcCurrQMBU  = ppxlcCurrQU;
  418. PixelC* ppxlcCurrQMBV  = ppxlcCurrQV;
  419. PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;
  420. PixelC* ppxlcCurrQMBA  = ppxlcCurrQA;
  421. // Added for error resilient mode by Toshiba(1997-11-14)
  422. if (iMBY != 0) {
  423. if (checkResyncMarker()) {
  424. decodeVideoPacketHeader(iCurrentQP);
  425. iVideoPacketNumber++;
  426. bRestartDelayedQP = TRUE;
  427. }
  428. }
  429. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  430. // End Toshiba(1997-11-14)
  431. // Modified for error resilient mode by Toshiba(1997-11-14)
  432. ShapeMode shpmdColocatedMB;
  433. if(m_vopmd.bShapeCodingType) {
  434. shpmdColocatedMB = m_rgmbmdRef [
  435. MIN (iMBY, m_iNumMBYRef-1) * m_iNumMBXRef
  436. ].m_shpmd;
  437. decodeInterShape (m_pvopcRefQ0, pmbmd, 0, iMBY,
  438. m_rctCurrVOPY.left, y, pmv, pmvBY,
  439. m_ppxlcCurrMBBY, ppxlcCurrQMBBY,
  440. shpmdColocatedMB);
  441. }
  442. else {
  443. decodeIntraShape (pmbmd, 0, iMBY, m_ppxlcCurrMBBY,
  444. ppxlcCurrQMBBY);
  445. }
  446. // End Toshiba(1997-11-14)
  447. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  448. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  449. if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  450. // End of Hyundai(1998-5-9)*/
  451. if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  452. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  453.             if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus [0] == PARTIAL)
  454.                     isBoundaryMacroBlockMerged (pmbmd);
  455. // End of Hyundai(1998-5-9)*/
  456. decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  457. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  458.                         if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  459.                                 swapTransparentModes (pmbmd, BBS);
  460. // End of Hyundai(1998-5-9)*/
  461. decodeMVWithShape (pmbmd, 0, iMBY, pmv);
  462. if(pmbmd->m_bhas4MVForward)
  463. padMotionVectors(pmbmd,pmv);
  464. }
  465. CoordI x = m_rctCurrVOPY.left;
  466. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
  467. pmbmd->m_bPadded = FALSE;
  468. if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  469. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  470.                 if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  471.                     swapTransparentModes (pmbmd, BBM);
  472. // End of Hyundai(1998-5-9)*/
  473. if ((pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) && !pmbmd->m_bSkip) {
  474. decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  475. // INTERLACE
  476. //new changes
  477. if ((pmbmd->m_rgTranspStatus [0] == NONE) && 
  478. (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  479. fieldDCTtoFrameC(ppxlcCurrQMBY);
  480. //end of new changes
  481. // ~INTERLACE
  482. if (m_volmd.fAUsage == EIGHT_BIT) {
  483. decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);
  484. decodeAlphaIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBA);
  485. }
  486. }
  487. else {
  488. if (!pmbmd->m_bSkip) {
  489. decodeTextureInterMB (pmbmd);
  490. // INTERLACE
  491. //new changes
  492. if ((pmbmd->m_rgTranspStatus [0] == NONE) && 
  493. (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  494. fieldDCTtoFrameI(m_ppxliErrorMBY);
  495. //end of new changes
  496. // ~INTERLACE
  497. }
  498. if (m_volmd.fAUsage == EIGHT_BIT) {
  499. decodeMBAlphaHeadOfPVOP (pmbmd, iCurrentQP, iCurrentQPA);
  500. decodeAlphaInterMB (pmbmd, ppxlcCurrQMBA);
  501. }
  502. }
  503. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  504.                 if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  505.                         mergedMacroBlockSplit (pmbmd, ppxlcCurrQMBY, ppxlcCurrQMBA);
  506. // End of Hyundai(1998-5-9)*/
  507. }
  508. // decode shape, overhead, and MV for the right MB
  509. if (iMBX != m_iNumMBX - 1) {
  510. CMBMode* pmbmdRight = pmbmd + 1;
  511. // Added for error resilient mode by Toshiba(1997-11-14)
  512. if (checkResyncMarker()) {
  513. decodeVideoPacketHeader(iCurrentQP);
  514. iVideoPacketNumber++;
  515. bRestartDelayedQP = TRUE;
  516. }
  517. pmbmdRight->m_iVideoPacketNumber = iVideoPacketNumber;
  518. // End Toshiba(1997-11-14)
  519. // Modified for error resilient mode by Toshiba(1997-11-14)
  520. if(m_vopmd.bShapeCodingType) {
  521. shpmdColocatedMB = m_rgmbmdRef [
  522. MIN (MAX (0, iMBX+1), m_iNumMBXRef-1) + 
  523.   MIN (MAX (0, iMBY), m_iNumMBYRef-1) * m_iNumMBXRef
  524. ].m_shpmd;
  525. decodeInterShape (
  526. m_pvopcRefQ0,
  527. pmbmdRight, 
  528. iMBX + 1, iMBY, 
  529. x + MB_SIZE, y, 
  530. pmv + PVOP_MV_PER_REF_PER_MB, pmvBY + 1, 
  531. m_ppxlcRightMBBY,
  532. ppxlcCurrQMBBY + MB_SIZE, 
  533. shpmdColocatedMB
  534. );
  535. }
  536. else {
  537. decodeIntraShape (
  538. pmbmdRight, iMBX + 1, iMBY,
  539. m_ppxlcRightMBBY,
  540. ppxlcCurrQMBBY + MB_SIZE
  541. );
  542. }
  543. // End Toshiba(1997-11-14)
  544. downSampleBY (m_ppxlcRightMBBY, m_ppxlcRightMBBUV);
  545. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  546. if (m_vopmd.bInterlace) initMergedMode (pmbmdRight); 
  547. // End of Hyundai(1998-5-9)*/
  548. if (pmbmdRight->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  549. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  550.                     if (m_vopmd.bInterlace && pmbmdRight->m_rgTranspStatus [0] == PARTIAL)
  551.                             isBoundaryMacroBlockMerged (pmbmdRight, m_ppxlcRightMBBY);
  552. // End of Hyundai(1998-5-9)*/
  553. decodeMBTextureHeadOfPVOP (pmbmdRight, iCurrentQP, bRestartDelayedQP);
  554. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  555.                     if (m_vopmd.bInterlace && pmbmdRight->m_bMerged[0])
  556.                             swapTransparentModes (pmbmdRight, BBS);
  557. // End of Hyundai(1998-5-9)*/
  558. decodeMVWithShape (pmbmdRight, iMBX + 1, iMBY, pmv + PVOP_MV_PER_REF_PER_MB);
  559. if(pmbmdRight->m_bhas4MVForward)
  560. padMotionVectors (pmbmdRight,pmv + PVOP_MV_PER_REF_PER_MB);
  561. }
  562. }
  563. if(m_volmd.bShapeOnly==FALSE) {
  564. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  565. if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) {
  566.   motionCompMB (
  567. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  568. pmv, pmbmd, 
  569. iMBX, iMBY, 
  570. x, y,
  571. pmbmd->m_bSkip, FALSE,
  572. &m_rctRefVOPY0
  573. );
  574. if (!pmbmd->m_bSkip) {
  575. CoordI iXRefUV, iYRefUV;
  576. // INTERLACE //new changes
  577. if(pmbmd->m_bFieldMV) {
  578. CoordI iXRefUV1, iYRefUV1;
  579. mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);
  580.     motionCompFieldUV(m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y,
  581.     iXRefUV, iYRefUV, pmbmd->m_bForwardTop);
  582.     motionCompFieldUV(m_ppxlcPredMBU + BLOCK_SIZE, m_ppxlcPredMBV + BLOCK_SIZE,
  583.     m_pvopcRefQ0, x, y, iXRefUV1, iYRefUV1, pmbmd->m_bForwardBottom);
  584.     }
  585. else {
  586. // INTERALCE //end of new changes
  587. mvLookupUVWithShape (pmbmd, pmv, iXRefUV, iYRefUV);
  588. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,
  589. x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);
  590. }
  591. addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  592. }
  593. else {
  594. if (m_volmd.bAdvPredDisable)
  595. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
  596. else
  597. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
  598. }
  599. if (m_volmd.fAUsage == EIGHT_BIT
  600. && pmbmd->m_CODAlpha!=ALPHA_ALL255)
  601. {
  602.   motionCompMB (
  603. m_ppxlcPredMBA, m_pvopcRefQ0->pixelsA (),
  604. pmv, pmbmd, 
  605. iMBX, iMBY, 
  606. x, y,
  607. FALSE, TRUE,
  608. &m_rctRefVOPY0
  609. );
  610. if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
  611. assignAlphaPredToCurrQ (ppxlcCurrQMBA);
  612. else
  613. addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
  614. }
  615. }
  616. // Added for field based MC padding by Hyundai(1998-5-9)
  617.                                         if (!m_vopmd.bInterlace) {
  618. if (pmbmd->m_rgTranspStatus [0] == PARTIAL)
  619. mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
  620. padNeighborTranspMBs (
  621. iMBX, iMBY,
  622. pmbmd,
  623. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  624. );
  625. }
  626. // End of Hyundai(1998-5-9)
  627. }
  628. else {
  629. // Added for field based MC padding by Hyundai(1998-5-9) 
  630.                                         if (!m_vopmd.bInterlace) {
  631. padCurrAndTopTranspMBFromNeighbor (
  632. iMBX, iMBY,
  633. pmbmd,
  634. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  635. );
  636. }
  637. // End of Hyundai(1998-5-9)
  638. }
  639. }
  640. if (iMBX != m_iNumMBX - 1)
  641. swapCurrAndRightMBForShape ();
  642. pmbmd++;
  643. pmv += PVOP_MV_PER_REF_PER_MB;
  644. pmvBY++;
  645. ppxlcCurrQMBY += MB_SIZE;
  646. ppxlcCurrQMBU += BLOCK_SIZE;
  647. ppxlcCurrQMBV += BLOCK_SIZE;
  648. ppxlcCurrQMBBY += MB_SIZE;
  649. ppxlcCurrQMBA += MB_SIZE;
  650. }
  651. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  652. m_rgpmbmAbove = m_rgpmbmCurr;
  653. m_rgpmbmCurr  = ppmbmTemp;
  654. ppxlcCurrQY  += m_iFrameWidthYxMBSize;
  655. ppxlcCurrQU  += m_iFrameWidthUVxBlkSize;
  656. ppxlcCurrQV  += m_iFrameWidthUVxBlkSize;
  657. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  658. ppxlcCurrQA  += m_iFrameWidthYxMBSize;
  659. }
  660.         // Added for field based MC padding by Hyundai(1998-5-9)
  661.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  662.                 fieldBasedMCPadding (field_pmbmd, m_pvopcRefQ1);
  663.         // End of Hyundai(1998-5-9)
  664. }
  665. Void CVideoObjectDecoder::decodePVOP ()
  666. {
  667. Int iMBX, iMBY;
  668. CoordI y = 0; 
  669. Int iMBXstart, iMBXstop, iMBYstart, iMBYstop; // added by KPN [FDS]
  670. UInt uiNumberOfGobs;
  671. Bool bFirstGobRow;
  672. CMBMode* pmbmd = m_rgmbmd;
  673. CMotionVector* pmv = m_rgmv;
  674. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  675. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  676. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  677. // sprite update piece uses binary mask of the object piece
  678. PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY; 
  679. Int iCurrentQP  = m_vopmd.intStep;
  680. Int iVideoPacketNumber = 0;
  681. // Added for error resilient mode by Toshiba(1997-11-14)
  682. m_iVPMBnum = 0;
  683. // End Toshiba(1997-11-14)
  684. Bool bLeftBndry;
  685. Bool bRightBndry;
  686. Bool bTopBndry;
  687. Bool bZeroMV = (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3) ? TRUE : FALSE;
  688. bFirstGobRow=FALSE;
  689. Bool bRestartDelayedQP = TRUE;
  690. if (!short_video_header) { 
  691. uiNumberOfGobs = 1;
  692. iMBXstart=0; 
  693. iMBXstop= m_iNumMBX;
  694. iMBYstart=0;
  695. iMBYstop= m_iNumMBY;
  696. }
  697. else { // short_header
  698. uiNumberOfGobs = uiNumGobsInVop;
  699. iMBXstart=0; 
  700. iMBXstop= 0;
  701. iMBYstart=0;
  702. iMBYstop= 0;
  703. //uiNumMacroblocksInGob=8;
  704. // dx_in_gob = ;
  705. // dy_in_gob = ;
  706. }
  707. uiGobNumber=0;
  708. while (uiGobNumber < uiNumberOfGobs) { 
  709. if (short_video_header) {
  710. uiGobHeaderEmpty=1;
  711. if (uiGobNumber != 0) {
  712. if (m_pbitstrmIn->peekBits(17)==1) {
  713. uiGobHeaderEmpty=0;
  714. /* UInt uiGobResyncMarker= wmay */m_pbitstrmIn -> getBits (17);
  715. uiGobNumber=m_pbitstrmIn -> getBits(5);
  716. /* UInt uiGobFrameId = wmay */m_pbitstrmIn -> getBits(2);
  717. /* UInt uiVopQuant= wmay */ m_pbitstrmIn -> getBits(5); 
  718. bFirstGobRow=TRUE; 
  719. uiGobNumber++; 
  720. } else {
  721. uiGobNumber++;
  722. }
  723. } else {
  724. uiGobNumber++;
  725. iMBXstart=0; 
  726. iMBXstop= m_ivolWidth/16;
  727. iMBYstart=(uiGobNumber*(m_ivolHeight/16)/uiNumberOfGobs)-1;
  728. iMBYstop= iMBYstart+(m_ivolHeight/16)/uiNumberOfGobs;
  729. } else {
  730. uiGobNumber++; 
  731. }
  732. for (iMBY = iMBYstart; iMBY < iMBYstop; iMBY++, y += MB_SIZE) {
  733. PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
  734. PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
  735. PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
  736. //   In a given Sprite update piece, Check whether current macroblock is not a hole and should be coded ?
  737. PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;
  738. Bool  bSptMB_NOT_HOLE= TRUE;
  739. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) 
  740. bSptMB_NOT_HOLE = SptUpdateMB_NOT_HOLE(0, iMBY, pmbmd); 
  741. // Added for error resilience mode By Toshiba
  742. if (iMBY != 0) {
  743. if (checkResyncMarker()) {
  744. decodeVideoPacketHeader(iCurrentQP);
  745. iVideoPacketNumber++;
  746. bRestartDelayedQP = TRUE;
  747. }
  748. }
  749. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  750. if (iMBY==0) {
  751. bRightBndry = TRUE;
  752. bTopBndry = TRUE;
  753. }
  754. else {
  755. bRightBndry = !((pmbmd - m_iNumMBX + 1) -> m_iVideoPacketNumber == pmbmd->m_iVideoPacketNumber);
  756. bTopBndry = !((pmbmd - m_iNumMBX) -> m_iVideoPacketNumber == pmbmd->m_iVideoPacketNumber);
  757. }
  758. if (bFirstGobRow) // Added by KPN
  759. {
  760. bTopBndry=TRUE;
  761. bRightBndry=TRUE;
  762. }
  763. // only RECTANGLE or non-transparent MB  will be decoded  for the update piece
  764. if (m_uiSprite == 0) {
  765. decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  766. decodeMV (pmbmd, pmv, TRUE, bRightBndry, bTopBndry, bZeroMV, 0, iMBY);
  767. else if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
  768. if (m_volmd.fAUsage != RECTANGLE) {
  769. if (pmbmd -> m_rgTranspStatus [0] != ALL)
  770. decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  771. }
  772. else
  773. decodeMBTextureHeadOfPVOP (pmbmd, iCurrentQP, bRestartDelayedQP);
  774. CoordI x = 0;
  775. for (iMBX = iMBXstart; iMBX < iMBXstop; iMBX++, x += MB_SIZE) { // [FDS]
  776. if (m_uiSprite == 0) {
  777. if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) {
  778. decodeTextureIntraMB (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  779. if ((m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  780. fieldDCTtoFrameC(ppxlcCurrQMBY);
  781. } else {
  782. if (!pmbmd->m_bSkip) {
  783. decodeTextureInterMB (pmbmd);
  784. if ((m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  785. fieldDCTtoFrameI(m_ppxliErrorMBY);
  786. }
  787. }
  788. }
  789. // only non-transparent MB and COD == 0 will be decoded
  790. else if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP)
  791. // sprite update piece use P_VOP syntax with no MV
  792. {
  793. pmv -> setToZero ();  
  794. pmbmd->m_bhas4MVForward = FALSE ;  
  795. pmbmd -> m_dctMd = INTER ;
  796. if ((pmbmd -> m_rgTranspStatus [0] != ALL) && (!pmbmd->m_bSkip))
  797. decodeTextureInterMB (pmbmd);
  798. }
  799. if (iMBX != m_iNumMBX - 1) {
  800. CMBMode* pmbmdRight = pmbmd + 1;
  801. if (checkResyncMarker()) {
  802. decodeVideoPacketHeader(iCurrentQP);
  803. iVideoPacketNumber++;
  804. bRestartDelayedQP = TRUE;
  805. }
  806. pmbmdRight->m_iVideoPacketNumber = iVideoPacketNumber;
  807. if (iMBY == 0 || bFirstGobRow==TRUE) {  // [FDS]
  808. bLeftBndry = !(pmbmd -> m_iVideoPacketNumber == pmbmdRight -> m_iVideoPacketNumber);
  809. bRightBndry = TRUE;
  810. bTopBndry = TRUE;
  811. }
  812. else {
  813. bLeftBndry =  !(pmbmd -> m_iVideoPacketNumber == pmbmdRight -> m_iVideoPacketNumber);
  814. if ((iMBX + 1) == m_iNumMBX - 1)
  815. bRightBndry = TRUE;
  816. else
  817. bRightBndry = !((pmbmdRight - m_iNumMBX + 1) -> m_iVideoPacketNumber == pmbmdRight->m_iVideoPacketNumber);
  818. bTopBndry = !((pmbmdRight - m_iNumMBX) -> m_iVideoPacketNumber == pmbmdRight->m_iVideoPacketNumber);
  819. }
  820. if (m_uiSprite == 0) {
  821. decodeMBTextureHeadOfPVOP (pmbmdRight, iCurrentQP, bRestartDelayedQP);
  822. decodeMV (pmbmdRight, pmv + PVOP_MV_PER_REF_PER_MB, bLeftBndry, bRightBndry, bTopBndry, bZeroMV, iMBX+1, iMBY);
  823. }
  824. // sprite update piece use P_VOP syntax with no MV
  825. else if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) 
  826. {
  827. bSptMB_NOT_HOLE = SptUpdateMB_NOT_HOLE(iMBX+1, iMBY, pmbmdRight);
  828. ppxlcCurrQMBBY += MB_SIZE;
  829. if (pmbmdRight -> m_rgTranspStatus [0] != ALL)
  830. decodeMBTextureHeadOfPVOP (pmbmdRight, iCurrentQP, bRestartDelayedQP);
  831. }
  832. }
  833. if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) {
  834. if (m_uiSprite == 0) {
  835. motionCompMB (
  836. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  837. pmv, pmbmd, 
  838. iMBX, iMBY, 
  839. x, y,
  840. pmbmd->m_bSkip,
  841. FALSE,
  842. &m_rctRefVOPY0
  843. );
  844. if (!pmbmd->m_bSkip) {
  845. CoordI iXRefUV, iYRefUV, iXRefUV1, iYRefUV1;
  846. mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);
  847. // INTERLACE
  848. if(pmbmd->m_bFieldMV) {
  849. motionCompFieldUV(m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y,
  850. iXRefUV, iYRefUV, pmbmd->m_bForwardTop);
  851. motionCompFieldUV(m_ppxlcPredMBU + BLOCK_SIZE, m_ppxlcPredMBV + BLOCK_SIZE,
  852. m_pvopcRefQ0, x, y, iXRefUV1, iYRefUV1, pmbmd->m_bForwardBottom);
  853. }
  854. else 
  855. // ~INTERLACE
  856. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,
  857. x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);
  858. addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  859. }
  860. else {
  861. if (m_volmd.bAdvPredDisable)
  862. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL);
  863. else
  864. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL);
  865. }
  866. } // end else from "if ( m_vopmd.SpriteXmitMode != STOP)" 
  867. // sprite update piece use P_VOP syntax with no motionCompMB
  868. else if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) 
  869. {
  870. CopyCurrQToPred(ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  871. if ((!pmbmd->m_bSkip) && (pmbmd -> m_rgTranspStatus [0] != ALL)) {
  872. addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  873. }
  874. }
  875. }
  876. pmbmd++;
  877. pmv += PVOP_MV_PER_REF_PER_MB;
  878. ppxlcCurrQMBY += MB_SIZE;
  879. ppxlcCurrQMBU += BLOCK_SIZE;
  880. ppxlcCurrQMBV += BLOCK_SIZE;
  881. }
  882. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  883. m_rgpmbmAbove = m_rgpmbmCurr;
  884. m_rgpmbmCurr  = ppmbmTemp;
  885. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  886. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  887. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  888. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  889. bFirstGobRow=FALSE; // KPN
  890. }
  891. } // Terminate while loop
  892. }
  893. Void CVideoObjectDecoder::decodeBVOP ()
  894. {
  895. Int iMBX, iMBY;
  896. CoordI y = 0; 
  897. CMBMode* pmbmd = m_rgmbmd;
  898. CMBMode* pmbmdRef = m_rgmbmdRef;
  899. CMotionVector* pmv = m_rgmv;
  900. CMotionVector* pmvRef = m_rgmvRef;
  901. CMotionVector* pmvBackward = m_rgmvBackward;
  902. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
  903. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
  904. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
  905. Int iCurrentQP  = m_vopmd.intStepB;
  906. // Added for error resilient mode by Toshiba(1998-1-16:B-VOP+Error)
  907. Int iVideoPacketNumber = 0;
  908. m_iVPMBnum = 0;
  909. if(m_bCodedFutureRef==FALSE)
  910. {
  911. pmbmdRef = NULL;
  912. pmvRef = NULL;
  913. }
  914. // End Toshiba(1998-1-16:B-VOP+Error)
  915. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  916. PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
  917. PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
  918. PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
  919. CoordI x = 0;
  920. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  921. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  922. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  923. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  924. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
  925. if(!(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0))
  926. pmbmd->m_bColocatedMBSkip = (pmbmdRef==NULL ? FALSE : pmbmdRef->m_bSkip);
  927. else
  928. pmbmd->m_bColocatedMBSkip = FALSE;
  929. if (pmbmd->m_bColocatedMBSkip &&
  930. (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0)))
  931. {
  932. copyFromRefToCurrQ (
  933. m_pvopcRefQ0,
  934. x, y, 
  935. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL
  936. );
  937. pmbmd->m_bSkip = TRUE;
  938. memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  939. memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  940. pmbmd->m_mbType = FORWARD; // can be set to FORWARD mode since the result is the same
  941. }
  942. else {
  943. if (checkResyncMarker()) {
  944. decodeVideoPacketHeader(iCurrentQP);
  945. iVideoPacketNumber++;
  946. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  947. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  948. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  949. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  950. }
  951. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec 
  952. // End Toshiba(1998-1-16:B-VOP+Error)
  953. decodeMBTextureHeadOfBVOP (pmbmd, iCurrentQP);
  954. decodeMVofBVOP (pmv, pmvBackward, pmbmd, iMBX, iMBY, pmvRef, pmbmdRef);
  955. if (!pmbmd->m_bSkip) {
  956. decodeTextureInterMB (pmbmd);
  957. // INTERLACE
  958. if (m_vopmd.bInterlace == TRUE && pmbmd->m_bFieldDCT == TRUE)
  959. fieldDCTtoFrameI(m_ppxliErrorMBY);
  960. // ~INTERLACE
  961. motionCompAndAddErrorMB_BVOP (
  962. pmv, pmvBackward,
  963. pmbmd, 
  964. iMBX, iMBY, 
  965. x, y,
  966. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  967. &m_rctRefVOPY0,&m_rctRefVOPY1);
  968. }
  969. else {
  970.                     if (m_vopmd.bInterlace) {                       // Need to remove this 'if' (Bob Eifrig)
  971.     assert(pmbmd->m_mbType == DIRECT);
  972.     pmbmd->m_vctDirectDeltaMV.x = 0; 
  973. pmbmd->m_vctDirectDeltaMV.y = 0;
  974.     memset (m_ppxliErrorMBY, 0, MB_SQUARE_SIZE * sizeof(Int));
  975.     memset (m_ppxliErrorMBU, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
  976.     memset (m_ppxliErrorMBV, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
  977.     motionCompAndAddErrorMB_BVOP (
  978.     pmv, pmvBackward,
  979.     pmbmd, 
  980.     iMBX, iMBY, 
  981.     x, y,
  982.     ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  983.     &m_rctRefVOPY0, &m_rctRefVOPY1);
  984.                     } else {
  985.     motionCompSkipMB_BVOP (pmbmd, pmv, pmvBackward,
  986.     x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0, &m_rctRefVOPY1);
  987.                     }
  988. }
  989. }
  990. if(m_bCodedFutureRef!=FALSE)
  991. {
  992. pmbmdRef++;
  993. pmvRef += PVOP_MV_PER_REF_PER_MB;
  994. }
  995. pmbmd++;
  996. pmv         += BVOP_MV_PER_REF_PER_MB;
  997. pmvBackward += BVOP_MV_PER_REF_PER_MB;
  998. ppxlcCurrQMBY += MB_SIZE;
  999. ppxlcCurrQMBU += BLOCK_SIZE;
  1000. ppxlcCurrQMBV += BLOCK_SIZE;
  1001. }
  1002. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  1003. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  1004. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  1005. }
  1006. }
  1007. Void CVideoObjectDecoder::decodeBVOP_WithShape ()
  1008. {
  1009. Int iMBX, iMBY;
  1010. CoordI y = m_rctCurrVOPY.top; 
  1011. CMBMode* pmbmd = m_rgmbmd;
  1012.         // Added for field based MC padding by Hyundai(1998-5-9)
  1013.         CMBMode* field_pmbmd = m_rgmbmd;
  1014.         // End of Hyundai(1998-5-9)
  1015. CMotionVector* pmv = m_rgmv;
  1016. CMotionVector* pmvBackward = m_rgmvBackward;
  1017. CMotionVector* pmvBY = m_rgmvBY;
  1018. const CMotionVector* pmvRef;
  1019. const CMBMode* pmbmdRef;
  1020. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
  1021. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
  1022. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
  1023. PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;
  1024. PixelC* ppxlcCurrQA  = (PixelC*) m_pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;
  1025. // decide prediction direction for shape
  1026. if(m_bCodedFutureRef==FALSE)
  1027. m_vopmd.fShapeBPredDir = B_FORWARD;
  1028. else
  1029. {
  1030. if(m_tFutureRef - m_t >= m_t - m_tPastRef)
  1031. m_vopmd.fShapeBPredDir = B_FORWARD;
  1032. else
  1033. m_vopmd.fShapeBPredDir = B_BACKWARD;
  1034. }
  1035. Int iCurrentQP  = m_vopmd.intStepB;
  1036. Int iCurrentQPA = m_vopmd.intStepBAlpha;
  1037. // Added for error resilient mode by Toshiba(1998-1-16:B-VOP+Error)
  1038. Int iVideoPacketNumber = 0;
  1039. m_iVPMBnum = 0;
  1040. // End Toshiba(1998-1-16:B-VOP+Error)
  1041. for (iMBY = 0; iMBY < m_iNumMBY; iMBY++, y += MB_SIZE) {
  1042. PixelC* ppxlcCurrQMBY = ppxlcCurrQY;
  1043. PixelC* ppxlcCurrQMBU = ppxlcCurrQU;
  1044. PixelC* ppxlcCurrQMBV = ppxlcCurrQV;
  1045. PixelC* ppxlcCurrQMBBY = ppxlcCurrQBY;
  1046. PixelC* ppxlcCurrQMBA  = ppxlcCurrQA;
  1047. CoordI x = m_rctCurrVOPY.left; 
  1048. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  1049. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  1050. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  1051. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  1052. for (iMBX = 0; iMBX < m_iNumMBX; iMBX++, x += MB_SIZE) {
  1053. // Added for error resilient mode by Toshiba(1998-1-16:B-VOP+Error)
  1054. if (checkResyncMarker()) {
  1055. decodeVideoPacketHeader(iCurrentQP);
  1056. iVideoPacketNumber++;
  1057. m_vctForwardMvPredBVOP[0].x  = m_vctForwardMvPredBVOP[0].y  = 0;
  1058. m_vctBackwardMvPredBVOP[0].x = m_vctBackwardMvPredBVOP[0].y = 0;
  1059. m_vctForwardMvPredBVOP[1].x  = m_vctForwardMvPredBVOP[1].y  = 0;
  1060. m_vctBackwardMvPredBVOP[1].x = m_vctBackwardMvPredBVOP[1].y = 0;
  1061. }
  1062. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber; //mv out of if by wchen to set even when errR is off; always used in mbdec 
  1063. // End Toshiba(1998-1-16:B-VOP+Error)
  1064. pmbmd->m_bPadded=FALSE;
  1065. findColocatedMB (iMBX, iMBY, pmbmdRef, pmvRef);
  1066. pmbmd->m_bColocatedMBSkip = (pmbmdRef!=NULL && pmbmdRef->m_bSkip);
  1067. if(m_vopmd.bShapeCodingType)
  1068. {
  1069. ShapeMode shpmdColocatedMB;
  1070. if(m_vopmd.fShapeBPredDir==B_FORWARD)
  1071. shpmdColocatedMB = m_rgshpmd [MIN (MAX (0, iMBX), m_iRefShpNumMBX - 1)
  1072. + MIN (MAX (0, iMBY), m_iRefShpNumMBY - 1) * m_iRefShpNumMBX];
  1073. else
  1074. shpmdColocatedMB = m_rgmbmdRef [MIN (MAX (0, iMBX), m_iNumMBXRef - 1)
  1075. + MIN (MAX (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef].m_shpmd;
  1076. decodeInterShape (
  1077. m_vopmd.fShapeBPredDir==B_FORWARD ? m_pvopcRefQ0 : m_pvopcRefQ1,
  1078. pmbmd, iMBX, iMBY, x, y,
  1079. NULL, pmvBY, m_ppxlcCurrMBBY, ppxlcCurrQMBBY, shpmdColocatedMB);
  1080. } else {
  1081. decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY, ppxlcCurrQMBBY);
  1082. }
  1083. if(m_volmd.bShapeOnly==FALSE)
  1084. {
  1085. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  1086. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  1087. if (m_vopmd.bInterlace) initMergedMode (pmbmd);
  1088. // End of Hyundai(1998-5-9)*/
  1089. if (pmbmd->m_bColocatedMBSkip &&
  1090. (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 3 && m_volmd.iEnhnType == 0))) { 
  1091. // don't need to send any bit for this mode except enhn_layer
  1092. copyFromRefToCurrQ (
  1093. m_pvopcRefQ0,
  1094. x, y, 
  1095. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  1096. &m_rctRefVOPY0
  1097. );
  1098. if(m_volmd.fAUsage == EIGHT_BIT)
  1099. copyAlphaFromRefToCurrQ(m_pvopcRefQ0, x, y, ppxlcCurrQMBA, &m_rctRefVOPY0);
  1100. pmbmd->m_bSkip = TRUE;
  1101. memset (pmv, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  1102. memset (pmvBackward, 0, BVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  1103. pmbmd->m_mbType = FORWARD; // can be set to FORWARD mode since the result is the same
  1104. }
  1105. else {
  1106. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  1107. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  1108. if (m_vopmd.bInterlace && pmbmd->m_rgTranspStatus [0] == PARTIAL)
  1109. isBoundaryMacroBlockMerged (pmbmd);
  1110. // End of Hyundai(1998-5-9)*/
  1111. decodeMBTextureHeadOfBVOP (pmbmd, iCurrentQP);
  1112. decodeMVofBVOP (pmv, pmvBackward, pmbmd, iMBX, iMBY, pmvRef, pmbmdRef);
  1113. if (!pmbmd->m_bSkip) {
  1114. decodeTextureInterMB (pmbmd);
  1115. // INTERLACE
  1116. //new changes
  1117. if ((pmbmd->m_rgTranspStatus [0] == NONE) && 
  1118. (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
  1119. fieldDCTtoFrameI(m_ppxliErrorMBY);
  1120. //end of new changes
  1121. // ~INTERLACE
  1122. //motionCompAndAddErrorMB_BVOP ( // delete by Hyundai, ok swinder
  1123. // pmv, pmvBackward,
  1124. // pmbmd, 
  1125. // iMBX, iMBY, 
  1126. // x, y,
  1127. // ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  1128. // &m_rctRefVOPY0, &m_rctRefVOPY1
  1129. //);
  1130. }
  1131. else {
  1132. // new changes 10/20/98
  1133. if (m_vopmd.bInterlace) {                       
  1134. assert(pmbmd->m_mbType == DIRECT);
  1135. pmbmd->m_vctDirectDeltaMV.x = 0; 
  1136. pmbmd->m_vctDirectDeltaMV.y = 0;
  1137. memset (m_ppxliErrorMBY, 0, MB_SQUARE_SIZE * sizeof(Int));
  1138. memset (m_ppxliErrorMBU, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
  1139. memset (m_ppxliErrorMBV, 0, BLOCK_SQUARE_SIZE * sizeof(Int));
  1140. motionCompAndAddErrorMB_BVOP (
  1141. pmv, pmvBackward,
  1142. pmbmd, 
  1143.      iMBX, iMBY, 
  1144. x, y,
  1145. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  1146. &m_rctRefVOPY0, &m_rctRefVOPY1);
  1147. } else 
  1148. // end of new changes 10/20/98
  1149. {
  1150. //assert(pmbmdRef!=NULL);
  1151. motionCompSkipMB_BVOP (pmbmd, pmv, pmvBackward, x, y,
  1152. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0, &m_rctRefVOPY1);
  1153. }
  1154. }
  1155. if(m_volmd.fAUsage == EIGHT_BIT)
  1156. {
  1157. decodeMBAlphaHeadOfBVOP(pmbmd, iCurrentQP, iCurrentQPA);
  1158. decodeAlphaInterMB(pmbmd, ppxlcCurrQMBA);
  1159. /* delete by Hyundai, ok swinder
  1160. if (pmbmd->m_CODAlpha!=ALPHA_ALL255)
  1161. {
  1162. motionCompAlphaMB_BVOP(
  1163. pmv, pmvBackward,
  1164. pmbmd, 
  1165. iMBX, iMBY, 
  1166. x, y,
  1167. ppxlcCurrQMBA,
  1168. &m_rctRefVOPY0, &m_rctRefVOPY1
  1169. );
  1170. if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
  1171. assignAlphaPredToCurrQ (ppxlcCurrQMBA);
  1172. else
  1173. addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
  1174. }
  1175. */
  1176. }
  1177. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  1178. if (m_vopmd.bInterlace && pmbmd->m_bMerged[0])
  1179. mergedMacroBlockSplit (pmbmd);
  1180. // End of Hyundai(1998-5-9)*/
  1181. if (!pmbmd->m_bSkip) {
  1182. motionCompAndAddErrorMB_BVOP (
  1183. pmv, pmvBackward,
  1184. pmbmd,
  1185. iMBX, iMBY,
  1186. x, y,
  1187. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV,
  1188. &m_rctRefVOPY0, &m_rctRefVOPY1
  1189. );
  1190. }          
  1191. if (m_volmd.fAUsage == EIGHT_BIT) {
  1192. if (pmbmd->m_CODAlpha!=ALPHA_ALL255)
  1193. {  
  1194. motionCompAlphaMB_BVOP(
  1195. pmv, pmvBackward,
  1196. pmbmd,
  1197. iMBX, iMBY,
  1198. x, y,
  1199. ppxlcCurrQMBA,
  1200. &m_rctRefVOPY0, &m_rctRefVOPY1
  1201. );
  1202. if(pmbmd->m_CODAlpha==ALPHA_SKIPPED)
  1203. assignAlphaPredToCurrQ (ppxlcCurrQMBA);
  1204. else
  1205. addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA);
  1206. }
  1207. }
  1208. }
  1209. }
  1210. //padding of bvop is necessary for temporal scalability: bvop in base layer is used for prediction in enhancement layer
  1211. // Added for field based MC padding by Hyundai(1998-5-9)
  1212. if (!m_vopmd.bInterlace) {
  1213. if (pmbmd -> m_rgTranspStatus [0] != ALL) {
  1214. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  1215. mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
  1216. padNeighborTranspMBs (
  1217. iMBX, iMBY,
  1218. pmbmd,
  1219. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1220. );
  1221. }
  1222. else {
  1223. padCurrAndTopTranspMBFromNeighbor (
  1224. iMBX, iMBY,
  1225. pmbmd,
  1226. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1227. );
  1228. }
  1229. }
  1230. // End of Hyundai(1998-5-9)
  1231. }
  1232. pmbmd++;
  1233. pmv += BVOP_MV_PER_REF_PER_MB;
  1234. pmvBY++;
  1235. pmvBackward += BVOP_MV_PER_REF_PER_MB;
  1236. ppxlcCurrQMBY += MB_SIZE;
  1237. ppxlcCurrQMBU += BLOCK_SIZE;
  1238. ppxlcCurrQMBV += BLOCK_SIZE;
  1239. ppxlcCurrQMBBY += MB_SIZE;
  1240. ppxlcCurrQMBA += MB_SIZE;
  1241. }
  1242. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  1243. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  1244. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  1245. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  1246. ppxlcCurrQA += m_iFrameWidthYxMBSize;
  1247. }
  1248.         // Added for field based MC padding by Hyundai(1998-5-9)
  1249.         if (m_vopmd.bInterlace && m_volmd.bShapeOnly == FALSE)
  1250.                 fieldBasedMCPadding (field_pmbmd, m_pvopcCurrQ);
  1251.         // End of Hyundai(1998-5-9)
  1252. }