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

流媒体/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. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  12. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  13. as specified by the MPEG-4 Video. 
  14. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  15. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  16. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  17. The original developer of this software module and his/her company, 
  18. the subsequent editors and their companies, 
  19. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  20. Copyright is not released for non MPEG-4 Video conforming products. 
  21. Microsoft retains full right to use the code for his/her own purpose, 
  22. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  23. This copyright notice must be included in all copies or derivative works. 
  24. Copyright (c) 1996, 1997.
  25. Module Name:
  26. MBDec.cpp
  27. Abstract:
  28. MacroBlock level decoder
  29. Revision History:
  30.         May. 9   1998:  add boundary by Hyundai Electronics 
  31.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr) 
  32. *************************************************************************/
  33. #include "typeapi.h"
  34. #include "codehead.h"
  35. #include "mode.hpp"
  36. #include "global.hpp"
  37. #include "entropy/bitstrm.hpp"
  38. #include "entropy/entropy.hpp"
  39. #include "entropy/huffman.hpp"
  40. #include "vopses.hpp"
  41. #include "vopsedec.hpp"
  42. #ifdef __MFC_
  43. #ifdef _DEBUG
  44. #undef THIS_FILE
  45. static char BASED_CODE THIS_FILE[] = __FILE__;
  46. #endif
  47. #define new DEBUG_NEW    
  48. #endif // __MFC_
  49. Void CVideoObjectDecoder::swapCurrAndRightMBForShape ()
  50. {
  51. CVOPU8YUVBA* pvopcTmp = m_pvopcCurrMB;
  52. m_pvopcCurrMB = m_pvopcRightMB;
  53. m_pvopcRightMB = pvopcTmp;
  54. m_ppxlcCurrMBBY = (PixelC*) m_pvopcCurrMB->pixelsBY ();
  55. m_ppxlcCurrMBBUV = (PixelC*) m_pvopcCurrMB->pixelsBUV ();
  56. m_ppxlcRightMBBY = (PixelC*) m_pvopcRightMB->pixelsBY ();
  57. m_ppxlcRightMBBUV = (PixelC*) m_pvopcRightMB->pixelsBUV ();
  58. }
  59. Void CVideoObjectDecoder::copyFromPredForYAndRefForCToCurrQ (
  60. CoordI x, CoordI y, 
  61. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,
  62. CRct *prctMVLimit
  63. )
  64. {
  65. Int iUnit = sizeof(PixelC); // NBIT: for memcpy
  66. // needs limiting to reference area bounding box
  67. limitMVRangeToExtendedBBFullPel(x,y,prctMVLimit,MB_SIZE);
  68. Int iOffsetUV = (y / 2 + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + x / 2 + EXPANDUV_REF_FRAME;
  69. const PixelC* ppxlcPredMBY = m_ppxlcPredMBY;
  70. const PixelC* ppxlcRefMBU = m_pvopcRefQ0->pixelsU () + iOffsetUV;
  71. const PixelC* ppxlcRefMBV = m_pvopcRefQ0->pixelsV () + iOffsetUV;
  72. CoordI iY;
  73. for (iY = 0; iY < BLOCK_SIZE; iY++) {
  74. memcpy (ppxlcCurrQMBY, ppxlcPredMBY, MB_SIZE*iUnit);
  75. memcpy (ppxlcCurrQMBU, ppxlcRefMBU, BLOCK_SIZE*iUnit);
  76. memcpy (ppxlcCurrQMBV, ppxlcRefMBV, BLOCK_SIZE*iUnit);
  77. ppxlcCurrQMBY += m_iFrameWidthY; ppxlcPredMBY += MB_SIZE;
  78. ppxlcCurrQMBU += m_iFrameWidthUV; ppxlcRefMBU += m_iFrameWidthUV;
  79. ppxlcCurrQMBV += m_iFrameWidthUV; ppxlcRefMBV += m_iFrameWidthUV;
  80. memcpy (ppxlcCurrQMBY, ppxlcPredMBY, MB_SIZE*iUnit);
  81. ppxlcCurrQMBY += m_iFrameWidthY; ppxlcPredMBY += MB_SIZE;
  82. }
  83. }
  84. Void CVideoObjectDecoder::copyAlphaFromPredToCurrQ (
  85. CoordI x, CoordI y, 
  86. PixelC* ppxlcCurrQMBA
  87. )
  88. {
  89. const PixelC* ppxlcPredMBA = m_ppxlcPredMBA;
  90. CoordI iY;
  91. for (iY = 0; iY < MB_SIZE; iY++) {
  92. memcpy (ppxlcCurrQMBA, ppxlcPredMBA, MB_SIZE);
  93. ppxlcCurrQMBA += m_iFrameWidthY; 
  94. ppxlcPredMBA += MB_SIZE;
  95. }
  96. }
  97. // for Direct and Interpolate mode in B-VOP
  98. Void CVideoObjectDecoder::averagePredAndAddErrorToCurrQ (
  99. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV
  100. )
  101. {
  102. CoordI ix, iy, ic = 0;
  103. for (iy = 0; iy < MB_SIZE; iy++) {
  104. for (ix = 0; ix < MB_SIZE; ix++, ic++) {
  105. ppxlcCurrQMBY [ix] = m_rgiClipTab [
  106. ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1) + 
  107. m_ppxliErrorMBY [ic]
  108. ];
  109. }
  110. ppxlcCurrQMBY += m_iFrameWidthY;
  111. }
  112. ic = 0;
  113. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  114. for (ix = 0; ix < BLOCK_SIZE; ix++, ic++) {
  115. ppxlcCurrQMBU [ix] = m_rgiClipTab [
  116. ((m_ppxlcPredMBU [ic] + m_ppxlcPredMBBackU [ic] + 1) >> 1) + 
  117. m_ppxliErrorMBU [ic]
  118. ];
  119. ppxlcCurrQMBV [ix] = m_rgiClipTab [
  120. ((m_ppxlcPredMBV [ic] + m_ppxlcPredMBBackV [ic] + 1) >> 1) + 
  121. m_ppxliErrorMBV [ic]
  122. ];
  123. }
  124. ppxlcCurrQMBU += m_iFrameWidthUV;
  125. ppxlcCurrQMBV += m_iFrameWidthUV;
  126. }
  127. }
  128. Void CVideoObjectDecoder::averagePredAndAssignToCurrQ (
  129. PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV
  130. )
  131. {
  132. CoordI ix, iy, ic = 0;
  133. for (iy = 0; iy < MB_SIZE; iy++) {
  134. for (ix = 0; ix < MB_SIZE; ix++, ic++)
  135. ppxlcCurrQMBY [ix] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1; // don't need to clip
  136. ppxlcCurrQMBY += m_iFrameWidthY;
  137. }
  138. ic = 0;
  139. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  140. for (ix = 0; ix < BLOCK_SIZE; ix++, ic++) {
  141. ppxlcCurrQMBU [ix] = (m_ppxlcPredMBU [ic] + m_ppxlcPredMBBackU [ic] + 1) >> 1;
  142. ppxlcCurrQMBV [ix] = (m_ppxlcPredMBV [ic] + m_ppxlcPredMBBackV [ic] + 1) >> 1;
  143. }
  144. ppxlcCurrQMBU += m_iFrameWidthUV;
  145. ppxlcCurrQMBV += m_iFrameWidthUV;
  146. }
  147. }
  148. // texture and overhead
  149. // Intra
  150. Void CVideoObjectDecoder::decodeTextureIntraMB (
  151. CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, 
  152. PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV)
  153. {
  154. assert (pmbmd != NULL);
  155. if (pmbmd -> m_rgTranspStatus [0] == ALL) 
  156. return;
  157. assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);
  158. Int iQP = pmbmd->m_stepSize;
  159. Int iDcScalerY, iDcScalerC;
  160. if (iQP <= 4) {
  161. iDcScalerY = 8;
  162. iDcScalerC = 8;
  163. }
  164. else if (iQP >= 5 && iQP <= 8) {
  165. iDcScalerY = 2 * iQP;
  166. iDcScalerC = (iQP + 13) / 2;
  167. }
  168. else if (iQP >= 9 && iQP <= 24) {
  169. iDcScalerY = iQP + 8;
  170. iDcScalerC = (iQP + 13) / 2;
  171. }
  172. else {
  173. iDcScalerY = 2 * iQP - 16;
  174. iDcScalerC = iQP - 6;
  175. }
  176. assert (iQP > 0);
  177. // more bogus technology
  178. assert (pmbmd -> m_stepSizeDelayed > 0);
  179. if (pmbmd -> m_stepSizeDelayed >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
  180. pmbmd->m_bCodeDcAsAc = TRUE;
  181. else
  182. pmbmd->m_bCodeDcAsAc = FALSE;
  183. //for intra pred
  184. MacroBlockMemory* pmbmLeft = NULL;
  185. MacroBlockMemory* pmbmTop = NULL;
  186. MacroBlockMemory* pmbmLeftTop = NULL;
  187. CMBMode* pmbmdLeft = NULL;
  188. CMBMode* pmbmdTop = NULL;
  189. CMBMode* pmbmdLeftTop = NULL;
  190.  
  191. Int iMBTop = iMBY - 1;
  192. // dshu: begin of modification
  193. if (m_uiSprite == 1 && m_vopmd.SpriteXmitMode != STOP) {
  194. assert (pmbmd->m_iVideoPacketNumber == 0);
  195. if (iMBTop >= 0)
  196. (pmbmd - m_iNumMBX)->m_iVideoPacketNumber = 0;
  197. if (iMBX > 0)
  198. (pmbmd - 1)->m_iVideoPacketNumber = 0;
  199. if (iMBTop >= 0 && iMBX > 0)
  200. (pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber = 0 ;
  201. }
  202. // dshu: end of modification
  203. if (iMBTop >= 0) {
  204. if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX)->m_iVideoPacketNumber) {
  205. pmbmTop  = m_rgpmbmAbove [iMBX];
  206. pmbmdTop = pmbmd - m_iNumMBX; 
  207. }
  208. }
  209. if (iMBX > 0) {
  210. if (pmbmd->m_iVideoPacketNumber == (pmbmd - 1)->m_iVideoPacketNumber) {
  211. pmbmLeft  = m_rgpmbmCurr [iMBX - 1];
  212. pmbmdLeft = pmbmd -  1; 
  213. }
  214. }
  215. if (iMBTop >= 0 && iMBX > 0) {
  216. if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber) {
  217. pmbmLeftTop  = m_rgpmbmAbove [iMBX - 1];
  218. pmbmdLeftTop = pmbmd - m_iNumMBX - 1;
  219. }
  220. }
  221. PixelC* rgchBlkDst = NULL;
  222. Int iWidthDst;
  223. Int iDcScaler;
  224. Int* rgiCoefQ;
  225. for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
  226. if (iBlk < U_BLOCK) {
  227. if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 
  228. continue;
  229. switch (iBlk) 
  230. {
  231. case (Y_BLOCK1): 
  232. rgchBlkDst = ppxlcCurrFrmQY;
  233. break;
  234. case (Y_BLOCK2): 
  235. rgchBlkDst = ppxlcCurrFrmQY + BLOCK_SIZE;
  236. break;
  237. case (Y_BLOCK3): 
  238. rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize;
  239. break;
  240. case (Y_BLOCK4): 
  241. rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + BLOCK_SIZE;
  242. break;
  243. }
  244. iWidthDst = m_iFrameWidthY;
  245. iDcScaler = iDcScalerY;
  246. }
  247. else {
  248. iWidthDst = m_iFrameWidthUV;
  249. rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrFrmQU: ppxlcCurrFrmQV;
  250. iDcScaler = iDcScalerC;
  251. }
  252. rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
  253. const BlockMemory blkmPred = NULL;
  254. Int iQpPred = iQP; //default to current if no pred
  255. decideIntraPred (blkmPred, 
  256.  pmbmd,
  257.  iQpPred,
  258.  (BlockNum) iBlk,
  259.  pmbmLeft, 
  260.     pmbmTop, 
  261.  pmbmLeftTop,
  262.  m_rgpmbmCurr [iMBX],
  263.  pmbmdLeft,
  264.  pmbmdTop,
  265.  pmbmdLeftTop);
  266. decodeIntraBlockTexture (rgchBlkDst,
  267.  iWidthDst,
  268.  iQP, 
  269.  iDcScaler,
  270.  iBlk,
  271.  m_rgpmbmCurr [iMBX],
  272.  pmbmd,
  273.    blkmPred, //for intra-pred
  274.  iQpPred);
  275. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  276.                 if (m_vopmd.bInterlace && pmbmd->m_bMerged [0]) {
  277.                         Int iDstBlk = 0;
  278.                         switch (iBlk) {
  279.                                 case (Y_BLOCK1):
  280.                                         if (pmbmd->m_bMerged [1])       iDstBlk = (Int) Y_BLOCK2;
  281.                                         else if (pmbmd->m_bMerged [3])  iDstBlk = (Int) Y_BLOCK3;
  282.                                         else if (pmbmd->m_bMerged [5])  iDstBlk = (Int) Y_BLOCK4;
  283.                                         break;
  284.                                 case (Y_BLOCK2):
  285.                                         if (pmbmd->m_bMerged [4])       iDstBlk = (Int) Y_BLOCK4;
  286.                                         else if (pmbmd->m_bMerged [6])  iDstBlk = (Int) Y_BLOCK3;
  287.                                         break;
  288.                                 case (Y_BLOCK3):
  289.                                         if (pmbmd->m_bMerged [2])       iDstBlk = (Int) Y_BLOCK4;
  290.                                         break;
  291.                         }
  292.                         if (iDstBlk) {
  293.                                 MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
  294.                                 pmbmCurr->rgblkm [iDstBlk-1][0] = pmbmCurr->rgblkm [iBlk-1][0];
  295.                                 for (UInt x = 1; x < (BLOCK_SIZE<<1)-1; x++)
  296.                                         pmbmCurr->rgblkm [iDstBlk-1][x] = 0;
  297.                         }
  298.                 }
  299. // End of Hyundai(1998-5-9)*/
  300. }
  301. }
  302. Void CVideoObjectDecoder::decodeAlphaIntraMB (CMBMode* pmbmd, Int iMBX, Int iMBY, PixelC* ppxlcRefMBA)
  303. {
  304. assert (pmbmd != NULL);
  305. if (pmbmd -> m_rgTranspStatus [0] == ALL) 
  306. return;
  307. assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);
  308. Int iQP = pmbmd->m_stepSizeAlpha;
  309. Int iDcScalerA;
  310. if (pmbmd -> m_stepSizeAlpha < 1)
  311. pmbmd -> m_stepSizeAlpha = 1;
  312. if (iQP <= 4) {
  313. iDcScalerA = 8;
  314. }
  315. else if (iQP >= 5 && iQP <= 8) {
  316. iDcScalerA = 2 * iQP;
  317. }
  318. else if (iQP >= 9 && iQP <= 24) {
  319. iDcScalerA = iQP + 8;
  320. }
  321. else {
  322. iDcScalerA = 2 * iQP - 16;
  323. }
  324. assert (iQP > 0 && iQP < 64);
  325. // should be stepSizeAlpha and a different table
  326. //if (pmbmd -> m_stepSize >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
  327. // pmbmd->m_bCodeDcAsAcAlpha = TRUE;
  328. //else
  329. pmbmd->m_bCodeDcAsAcAlpha = FALSE;
  330. if(pmbmd->m_CODAlpha==ALPHA_ALL255)
  331. {
  332. // fill curr macroblock with 255
  333. Int iY;
  334. PixelC *ppxlc = ppxlcRefMBA;
  335. for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)
  336. pxlcmemset(ppxlc, 255, MB_SIZE);
  337. // fix intra prediction
  338. Int iBlk;
  339. MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
  340. for(iBlk = A_BLOCK1; iBlk<=A_BLOCK4; iBlk++)
  341. {
  342. Int i;
  343. pmbmCurr->rgblkm [iBlk - 1] [0] = divroundnearest(255 * 8, iDcScalerA) * iDcScalerA;
  344. //save recon value of DC for intra pred //save Qcoef in memory
  345. for (i = 1; i < BLOCK_SIZE; i++) {
  346. pmbmCurr->rgblkm [iBlk - 1] [i] = 0;
  347. pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = 0;
  348. }
  349. }
  350. return;
  351. }
  352. //for intra pred
  353. MacroBlockMemory* pmbmLeft = NULL;
  354. MacroBlockMemory* pmbmTop = NULL;
  355. MacroBlockMemory* pmbmLeftTop = NULL;
  356. CMBMode* pmbmdLeft = NULL;
  357. CMBMode* pmbmdTop = NULL;
  358. CMBMode* pmbmdLeftTop = NULL;
  359.  
  360. Int iMBTop = iMBY - 1;
  361. if (iMBTop >= 0) {
  362. if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX)->m_iVideoPacketNumber) {
  363. pmbmTop  = m_rgpmbmAbove [iMBX];
  364. pmbmdTop = pmbmd - m_iNumMBX; 
  365. }
  366. }
  367. if (iMBX > 0) {
  368. if (pmbmd->m_iVideoPacketNumber == (pmbmd - 1)->m_iVideoPacketNumber) {
  369. pmbmLeft  = m_rgpmbmCurr [iMBX - 1];
  370. pmbmdLeft = pmbmd -  1; 
  371. }
  372. }
  373. if (iMBTop >= 0 && iMBX > 0) {
  374. if (pmbmd->m_iVideoPacketNumber == (pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber) {
  375. pmbmLeftTop  = m_rgpmbmAbove [iMBX - 1];
  376. pmbmdLeftTop = pmbmd - m_iNumMBX - 1;
  377. }
  378. }
  379. PixelC* rgchBlkDst = NULL;
  380. Int* rgiCoefQ;
  381. for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
  382. if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 
  383. continue;
  384. switch (iBlk) 
  385. {
  386. case (A_BLOCK1): 
  387. rgchBlkDst = ppxlcRefMBA;
  388. break;
  389. case (A_BLOCK2): 
  390. rgchBlkDst = ppxlcRefMBA + BLOCK_SIZE;
  391. break;
  392. case (A_BLOCK3): 
  393. rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize;
  394. break;
  395. case (A_BLOCK4): 
  396. rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize + BLOCK_SIZE;
  397. break;
  398. }
  399. rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
  400. const BlockMemory blkmPred = NULL;
  401. Int iQpPred = iQP;
  402. decideIntraPred (blkmPred, 
  403.  pmbmd,
  404.  iQpPred,
  405.  (BlockNum) iBlk,
  406.  pmbmLeft, 
  407.     pmbmTop, 
  408.  pmbmLeftTop,
  409.  m_rgpmbmCurr [iMBX], // save for curr coefs
  410.  pmbmdLeft,
  411.  pmbmdTop,
  412.  pmbmdLeftTop);
  413. decodeIntraBlockTexture (rgchBlkDst,
  414.  m_iFrameWidthY,
  415.  iQP, 
  416.  iDcScalerA,
  417.  iBlk,
  418.  m_rgpmbmCurr [iMBX],
  419.  pmbmd,
  420.    blkmPred, //for intra-pred
  421.  iQpPred);
  422. /*BBM// Added for Boundary by Hyundai(1998-5-9)
  423.                 if (m_vopmd.bInterlace && pmbmd->m_bMerged [0]) {
  424.                         Int iDstBlk = 0;
  425.                         switch (iBlk) {
  426.                                 case (A_BLOCK1):
  427.                                         if (pmbmd->m_bMerged [1])       iDstBlk = (Int) A_BLOCK2;
  428.                                         else if (pmbmd->m_bMerged [3])  iDstBlk = (Int) A_BLOCK3;
  429.                                         else if (pmbmd->m_bMerged [5])  iDstBlk = (Int) A_BLOCK4;
  430.                                         break;
  431.                                 case (A_BLOCK2):
  432.                                         if (pmbmd->m_bMerged [4])       iDstBlk = (Int) A_BLOCK4;
  433.                                         else if (pmbmd->m_bMerged [6])  iDstBlk = (Int) A_BLOCK3;
  434.                                         break;
  435.                                 case (A_BLOCK3):
  436.                                         if (pmbmd->m_bMerged [2])       iDstBlk = (Int) A_BLOCK4;
  437.                                         break;
  438.                         }
  439.                         if (iDstBlk) {
  440.                                 MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];
  441.                                 pmbmCurr->rgblkm [iDstBlk-1][0] = pmbmCurr->rgblkm [iBlk-1][0];
  442.                                 for (UInt x = 1; x < (BLOCK_SIZE<<1)-1; x++)
  443.                                         pmbmCurr->rgblkm [iDstBlk-1][x] = 0;
  444.                         }
  445.                 }
  446. // End of Hyundai(1998-5-9)*/
  447. }
  448. }
  449. Void CVideoObjectDecoder::decodeTextureInterMB (CMBMode* pmbmd)
  450. {
  451. assert (pmbmd != NULL);
  452. if (pmbmd->m_rgTranspStatus [0] == ALL || pmbmd->m_bSkip) 
  453. return;
  454. assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);
  455. Int iQP = pmbmd->m_stepSize;
  456. Int* rgiBlkCurrQ = m_ppxliErrorMBY;
  457. Int iWidthCurrQ;
  458. for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
  459. if (iBlk < U_BLOCK) {
  460. if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 
  461. continue;
  462. switch (iBlk) 
  463. {
  464. case (Y_BLOCK1): 
  465. rgiBlkCurrQ = m_ppxliErrorMBY;
  466. break;
  467. case (Y_BLOCK2): 
  468. rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;
  469. break;
  470. case (Y_BLOCK3): 
  471. rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;
  472. break;
  473. case (Y_BLOCK4): 
  474. rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
  475. break;
  476. }
  477. iWidthCurrQ = MB_SIZE;
  478. }
  479. else {
  480. iWidthCurrQ = BLOCK_SIZE;
  481. rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;
  482. }
  483. if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))
  484. decodeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, iQP, FALSE); //all for intra-pred
  485. else 
  486. for (Int i = 0; i < BLOCK_SIZE; i++) {
  487. memset (rgiBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);
  488. rgiBlkCurrQ += iWidthCurrQ;
  489. }
  490. }
  491. }
  492. Void CVideoObjectDecoder::decodeAlphaInterMB (CMBMode* pmbmd, PixelC *ppxlcRefMBA)
  493. {
  494. assert (pmbmd != NULL);
  495. if (pmbmd->m_rgTranspStatus [0] == ALL)
  496. return;
  497. if(pmbmd->m_CODAlpha == ALPHA_ALL255) 
  498. {
  499. // fill curr macroblock with 255
  500. Int iY;
  501. PixelC *ppxlc = ppxlcRefMBA;
  502. for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)
  503. pxlcmemset(ppxlc, 255, MB_SIZE);
  504. return;
  505. }
  506. if(pmbmd->m_CODAlpha != ALPHA_CODED)
  507. return;
  508. assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);
  509. Int iQP = pmbmd->m_stepSizeAlpha;
  510. Int* piBlkCurrQ = NULL;
  511. for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
  512. if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 
  513. continue;
  514. switch (iBlk) 
  515. {
  516. case (A_BLOCK1): 
  517. piBlkCurrQ = m_ppxliErrorMBA;
  518. break;
  519. case (A_BLOCK2): 
  520. piBlkCurrQ = m_ppxliErrorMBA + BLOCK_SIZE;
  521. break;
  522. case (A_BLOCK3): 
  523. piBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE;
  524. break;
  525. case (A_BLOCK4): 
  526. piBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
  527. break;
  528. }
  529. //Int *pix = piBlkCurrQ;
  530. Int i;
  531. if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk))
  532. {
  533. decodeTextureInterBlock (piBlkCurrQ, MB_SIZE, iQP, TRUE);
  534. /*printf("nBlock %d DCT Coefs Quantn",iBlk);
  535. for(i=0;i<64;i++)
  536. printf("%d ",m_rgpiCoefQ [0][i]);
  537. printf("n");
  538. printf("Block %d DCT Coefs Inv Quantn",iBlk);
  539. for(i=0;i<64;i++)
  540. printf("%d ",m_rgiDCTcoef[i]);
  541. printf("n");*/
  542. }
  543. else 
  544. for (i = 0; i < BLOCK_SIZE; i++) {
  545. memset (piBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);
  546. piBlkCurrQ += MB_SIZE;
  547. }
  548. /*Int j;
  549. printf("nblock %d updaten",iBlk);
  550. for(i=0;i<BLOCK_SIZE;i++,pix+=BLOCK_SIZE){
  551. for(j=0;j<BLOCK_SIZE;j++,pix++)
  552. printf("%3d ",*pix);
  553. printf("n");
  554. }*/
  555. }
  556. }
  557. Void CVideoObjectDecoder::setCBPYandC (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk)
  558. {
  559. pmbmd->setCodedBlockPattern (U_BLOCK, (iCBPC >> 1) & 1) ;
  560. pmbmd->setCodedBlockPattern (V_BLOCK, iCBPC & 1) ;
  561. Int iBitPos = 1, iBlk;
  562. for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++) {
  563. if (pmbmd->m_rgTranspStatus [iBlk] != ALL) {
  564. pmbmd->setCodedBlockPattern (
  565. (BlockNum) iBlk, 
  566. (iCBPY >> (cNonTrnspBlk - iBitPos)) & 1
  567. );
  568. iBitPos++;
  569. }
  570. else
  571. pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
  572. }
  573. }