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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  4. Takeshi Nagai (TOSHIBA CORPORATION)
  5.     and edited by:
  6. Toshiaki Watanabe (TOSHIBA CORPORATION)
  7. Noboru Yamaguchi (TOSHIBA CORPORATION)
  8.   in the course of development of the <MPEG-4 Video(ISO/IEC 14496-2)>. This
  9.   software module is an implementation of a part of one or more <MPEG-4 Video
  10.   (ISO/IEC 14496-2)> tools as specified by the <MPEG-4 Video(ISO/IEC 14496-2)
  11.   >. ISO/IEC gives users of the <MPEG-4 Video(ISO/IEC 14496-2)> free license
  12.   to this software module or modifications thereof for use in hardware or
  13.   software products claiming conformance to the <MPEG-4 Video(ISO/IEC 14496-2
  14.   )>. Those intending to use this software module in hardware or software
  15.   products are advised that its use may infringe existing patents. The
  16.   original developer of this software module and his/her company, the
  17.   subsequent editors and their companies, and ISO/IEC have no liability for
  18.   use of this software module or modifications thereof in an implementation.
  19.   Copyright is not released for non <MPEG-4 Video(ISO/IEC 14496-2)>
  20.   conforming products. TOSHIBA CORPORATION retains full right to use the code
  21.   for his/her own purpose, assign or donate the code to a third party and to
  22.   inhibit third parties from using the code for non <MPEG-4 Video(ISO/IEC
  23.   14496-2)> conforming products. This copyright notice must be included in
  24.   all copies or derivative works.
  25.   Copyright (c)1997.
  26. *************************************************************************/
  27. // Added for error resilience mode By Toshiba
  28. #include <stdio.h>
  29. #include <math.h>
  30. #include <stdlib.h>
  31. #include "typeapi.h"
  32. #include "mode.hpp"
  33. #include "codehead.h"
  34. #include "entropy/bitstrm.hpp"
  35. #include "entropy/entropy.hpp"
  36. #include "entropy/huffman.hpp"
  37. #include "global.hpp"
  38. #include "vopses.hpp"
  39. #include "vopsedec.hpp"
  40. #include "dct.hpp"
  41. #ifdef __MFC_
  42. #ifdef _DEBUG
  43. #undef THIS_FILE
  44. static char BASED_CODE THIS_FILE[] = __FILE__;
  45. #endif
  46. #define new DEBUG_NEW    
  47. #endif // __MFC_
  48. Bool CVideoObjectDecoder::checkResyncMarker()
  49. {
  50. Int nBitsPeeked;
  51. Int iStuffedBits = m_pbitstrmIn->peekBitsTillByteAlign (nBitsPeeked);
  52. Int nBitsResyncMarker = NUMBITS_VP_RESYNC_MARKER;
  53. if(m_volmd.bShapeOnly==FALSE)
  54. {
  55. if(m_vopmd.vopPredType == PVOP)
  56. nBitsResyncMarker += (m_vopmd.mvInfoForward.uiFCode - 1);
  57. else if(m_vopmd.vopPredType == BVOP)
  58. nBitsResyncMarker += MAX(m_vopmd.mvInfoForward.uiFCode, m_vopmd.mvInfoBackward.uiFCode) - 1;
  59. }
  60. assert (nBitsPeeked > 0 && nBitsPeeked <= 8);
  61. if (iStuffedBits == ((1 << (nBitsPeeked - 1)) - 1))
  62. return (m_pbitstrmIn->peekBitsFromByteAlign (nBitsResyncMarker) == RESYNC_MARKER);
  63. return FALSE;
  64. }
  65. #if 0 // revised HEC for shape
  66. Int CVideoObjectDecoder::decodeVideoPacketHeader(Int& iCurrentQP)
  67. {
  68. m_pbitstrmIn -> flush(8);
  69. Int nBitsResyncMarker = NUMBITS_VP_RESYNC_MARKER;
  70. if(m_volmd.bShapeOnly==FALSE)
  71. {
  72. if(m_vopmd.vopPredType == PVOP)
  73. nBitsResyncMarker += (m_vopmd.mvInfoForward.uiFCode - 1);
  74. else if(m_vopmd.vopPredType == BVOP)
  75. nBitsResyncMarker += MAX(m_vopmd.mvInfoForward.uiFCode, m_vopmd.mvInfoBackward.uiFCode) - 1;
  76. }
  77. UInt uiResyncMarker = m_pbitstrmIn -> getBits (nBitsResyncMarker);
  78. Int NumOfMB = m_iNumMBX * m_iNumMBY;
  79. assert (NumOfMB>0);
  80. //Int LengthOfMBNumber = (Int)(log(NumOfMB-1)/log(2)) + 1;
  81. Int iVal = NumOfMB - 1;
  82. Int iLengthOfMBNumber = 0;
  83. for(; iVal; iLengthOfMBNumber++)
  84. iVal>>=1;
  85. UInt uiMBNumber = 0;
  86. if(NumOfMB>1)
  87. uiMBNumber = m_pbitstrmIn -> getBits (iLengthOfMBNumber);
  88. m_iVPMBnum = uiMBNumber;
  89. if(m_volmd.bShapeOnly==FALSE) {
  90. Int stepDecoded = m_pbitstrmIn -> getBits (NUMBITS_VP_QUANTIZER);
  91. iCurrentQP = stepDecoded; 
  92. }
  93. UInt uiHEC = m_pbitstrmIn -> getBits (NUMBITS_VP_HEC);
  94. if (uiHEC){
  95. // Time reference and VOP_pred_type
  96. Int iModuloInc = 0;
  97. while (m_pbitstrmIn -> getBits (1) != 0)
  98. iModuloInc++;
  99. Time tCurrSec = iModuloInc + (m_vopmd.vopPredType != BVOP ? m_tOldModuloBaseDecd : m_tOldModuloBaseDisp);
  100. UInt uiMarker = m_pbitstrmIn -> getBits (1);
  101. assert(uiMarker == 1);
  102. Time tVopIncr = m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
  103. uiMarker = m_pbitstrmIn -> getBits (1);
  104. assert(uiMarker == 1);
  105. // this is bogus - swinder.
  106. //assert (m_t == tCurrSec * 60 + tVopIncr * 60 / m_volmd.iClockRate); //in terms of 60Hz clock ticks
  107. VOPpredType vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VP_PRED_TYPE);
  108. assert(m_vopmd.vopPredType == vopPredType);
  109. if(m_volmd.bShapeOnly==FALSE) {
  110. Int iIntraDcSwitchThr = m_pbitstrmIn->getBits (NUMBITS_VP_INTRA_DC_SWITCH_THR);
  111. assert(m_vopmd.iIntraDcSwitchThr == iIntraDcSwitchThr);
  112. if (m_vopmd.vopPredType == PVOP) {
  113. UInt uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  114. assert(uiFCode == m_vopmd.mvInfoForward.uiFCode);
  115. }
  116. else if (m_vopmd.vopPredType == BVOP) {
  117. UInt uiForwardFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  118. UInt uiBackwardFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  119. assert(uiForwardFCode == m_vopmd.mvInfoForward.uiFCode);
  120. assert(uiBackwardFCode == m_vopmd.mvInfoBackward.uiFCode);
  121. }
  122. }
  123. }
  124. return TRUE;
  125. }
  126. #else
  127. Int CVideoObjectDecoder::decodeVideoPacketHeader(Int& iCurrentQP)
  128. {
  129.   UInt uiHEC = 0;
  130. m_pbitstrmIn -> flush(8);
  131. Int nBitsResyncMarker = NUMBITS_VP_RESYNC_MARKER;
  132. if(m_volmd.bShapeOnly==FALSE)
  133. {
  134. if(m_vopmd.vopPredType == PVOP)
  135. nBitsResyncMarker += (m_vopmd.mvInfoForward.uiFCode - 1);
  136. else if(m_vopmd.vopPredType == BVOP)
  137. nBitsResyncMarker += MAX(m_vopmd.mvInfoForward.uiFCode, m_vopmd.mvInfoBackward.uiFCode) - 1;
  138. }
  139. /* UInt uiResyncMarker = wmay */ m_pbitstrmIn -> getBits (nBitsResyncMarker);
  140. Int NumOfMB = m_iNumMBX * m_iNumMBY;
  141. assert (NumOfMB>0);
  142. //Int LengthOfMBNumber = (Int)(log(NumOfMB-1)/log(2)) + 1;
  143. Int iVal = NumOfMB - 1;
  144. Int iLengthOfMBNumber = 0;
  145. for(; iVal; iLengthOfMBNumber++)
  146. iVal>>=1;
  147. UInt uiMBNumber = 0;
  148. if (m_volmd.fAUsage != RECTANGLE) {
  149. uiHEC = m_pbitstrmIn -> getBits (NUMBITS_VP_HEC);
  150.   if (uiHEC && !(m_uiSprite == 1 && m_vopmd.vopPredType == IVOP)) {
  151.     /* Int width = wmay */ m_pbitstrmIn -> getBits (NUMBITS_VOP_WIDTH);
  152. Int marker;
  153. marker = m_pbitstrmIn -> getBits (1); // marker bit
  154. assert(marker==1);
  155. /* Int height = wmay */ m_pbitstrmIn -> getBits (NUMBITS_VOP_HEIGHT);
  156. marker = m_pbitstrmIn -> getBits (1); // marker bit
  157. assert(marker==1);
  158. //wchen: cd changed to 2s complement
  159. Int left = (m_pbitstrmIn -> getBits (1) == 0) ?
  160. m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) : 
  161. ((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_HORIZONTAL_SPA_REF - 1)));
  162. marker = m_pbitstrmIn -> getBits (1); // marker bit
  163. assert(marker==1);
  164. Int top = (m_pbitstrmIn -> getBits (1) == 0) ?
  165.    m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) : 
  166.    ((Int)m_pbitstrmIn->getBits (NUMBITS_VOP_VERTICAL_SPA_REF - 1) - (1 << (NUMBITS_VOP_VERTICAL_SPA_REF - 1)));
  167. marker = m_pbitstrmIn -> getBits (1); // marker bit
  168. assert(marker==1);
  169. assert(((left | top)&1)==0); // must be even pix unit
  170.   }
  171. }
  172. if(NumOfMB>1)
  173. uiMBNumber = m_pbitstrmIn -> getBits (iLengthOfMBNumber);
  174. m_iVPMBnum = uiMBNumber;
  175. if(m_volmd.bShapeOnly==FALSE) {
  176. Int stepDecoded = m_pbitstrmIn -> getBits (NUMBITS_VP_QUANTIZER);
  177. iCurrentQP = stepDecoded; 
  178. }
  179. if (m_volmd.fAUsage == RECTANGLE)
  180. uiHEC = m_pbitstrmIn -> getBits (NUMBITS_VP_HEC);
  181. if (uiHEC){
  182. // Time reference and VOP_pred_type
  183. Int iModuloInc = 0;
  184. while (m_pbitstrmIn -> getBits (1) != 0)
  185. iModuloInc++;
  186. //Time tCurrSec = iModuloInc + (m_vopmd.vopPredType != BVOP ? m_tOldModuloBaseDecd : m_tOldModuloBaseDisp);
  187. UInt uiMarker = m_pbitstrmIn -> getBits (1);
  188. assert(uiMarker == 1);
  189. /* Time tVopIncr = wmay */ m_pbitstrmIn -> getBits (m_iNumBitsTimeIncr);
  190. uiMarker = m_pbitstrmIn -> getBits (1);
  191. assert(uiMarker == 1);
  192. // this is bogus - swinder.
  193. //assert (m_t == tCurrSec * 60 + tVopIncr * 60 / m_volmd.iClockRate); //in terms of 60Hz clock ticks
  194. VOPpredType vopPredType = (VOPpredType) m_pbitstrmIn -> getBits (NUMBITS_VP_PRED_TYPE);
  195. assert(m_vopmd.vopPredType == vopPredType);
  196. if (m_volmd.fAUsage != RECTANGLE) {
  197. m_volmd.bNoCrChange = m_pbitstrmIn -> getBits (1); //VOP_CR_Change_Disable
  198.         if (m_volmd.bShapeOnly==FALSE && m_vopmd.vopPredType != IVOP)
  199. {
  200. m_vopmd.bShapeCodingType = m_pbitstrmIn -> getBits (1);
  201.          }
  202. }
  203. if(m_volmd.bShapeOnly==FALSE) {
  204. Int iIntraDcSwitchThr = m_pbitstrmIn->getBits (NUMBITS_VP_INTRA_DC_SWITCH_THR);
  205. assert(m_vopmd.iIntraDcSwitchThr == iIntraDcSwitchThr);
  206. if (m_vopmd.vopPredType == PVOP) {
  207. UInt uiFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  208. assert(uiFCode == m_vopmd.mvInfoForward.uiFCode);
  209. }
  210. else if (m_vopmd.vopPredType == BVOP) {
  211. UInt uiForwardFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  212. UInt uiBackwardFCode = m_pbitstrmIn -> getBits (NUMBITS_VOP_FCODE);
  213. assert(uiForwardFCode == m_vopmd.mvInfoForward.uiFCode);
  214. assert(uiBackwardFCode == m_vopmd.mvInfoBackward.uiFCode);
  215. }
  216. }
  217. }
  218. return TRUE;
  219. }
  220. #endif
  221. Int CVideoObjectDecoder::checkMotionMarker()
  222. {
  223. return (m_pbitstrmIn -> peekBits (NUMBITS_DP_MOTION_MARKER) == MOTION_MARKER);
  224. }
  225. Int CVideoObjectDecoder::checkDCMarker()
  226. {
  227. return (m_pbitstrmIn -> peekBits (NUMBITS_DP_DC_MARKER) == DC_MARKER);
  228. }
  229. Void CVideoObjectDecoder::decodeIVOP_DataPartitioning ()
  230. {
  231. // assert (m_volmd.nBits==8);
  232. //in case the IVOP is used as an ref for direct mode
  233. // bug fix by toshiba 98-9-24 start
  234. // memset (m_rgmv, 0, m_iNumMB * 5 * sizeof (CMotionVector));
  235. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  236. // bug fix by toshiba 98-9-24 end
  237. Int iMBX=0, iMBY=0;
  238. CMBMode* pmbmd = m_rgmbmd;
  239. pmbmd->m_stepSize = m_vopmd.intStepI;
  240. PixelC* ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  241. PixelC* ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  242. PixelC* ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  243. Int iCurrentQP  = m_vopmd.intStepI;
  244. Int iVideoPacketNumber = 0;
  245. m_iVPMBnum = 0;
  246. m_piMCBPC = new Int[m_iNumMBX*m_iNumMBY];
  247. Int* piMCBPC = m_piMCBPC;
  248. m_piIntraDC = new Int[m_iNumMBX*m_iNumMBY*V_BLOCK];
  249. Int* piIntraDC = m_piIntraDC;
  250. Int i;
  251. Int mbn = 0, mbnFirst = 0;
  252. Bool bRestartDelayedQP = TRUE;
  253. do{
  254. if( checkResyncMarker() ){
  255. decodeVideoPacketHeader(iCurrentQP);
  256. iVideoPacketNumber++;
  257. bRestartDelayedQP = TRUE;
  258. }
  259. CMBMode* pmbmdFirst = pmbmd;
  260. Int* piMCBPCFirst = piMCBPC;
  261. Int* piIntraDCFirst = piIntraDC;
  262. mbnFirst = mbn;
  263. do{
  264. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  265. *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCintra->decodeSymbol ();
  266. assert (*piMCBPC >= 0 && *piMCBPC <= 7);
  267. pmbmd->m_dctMd = INTRA;
  268. if (*piMCBPC > 3)
  269. pmbmd->m_dctMd = INTRAQ;
  270. decodeMBTextureDCOfIVOP_DataPartitioning (pmbmd, iCurrentQP, piIntraDC, bRestartDelayedQP);
  271. pmbmd++;
  272. mbn++;
  273. piMCBPC++;
  274. piIntraDC+=V_BLOCK;
  275. } while( !checkDCMarker() );
  276. m_pbitstrmIn -> getBits (NUMBITS_DP_DC_MARKER);
  277. pmbmd = pmbmdFirst;
  278. piMCBPC = piMCBPCFirst;
  279. for(i=mbnFirst;i<mbn;i++) {
  280. decodeMBTextureHeadOfIVOP_DataPartitioning (pmbmd, piMCBPC);
  281. pmbmd++;
  282. piMCBPC++;
  283. }
  284. pmbmd = pmbmdFirst;
  285. piIntraDC = piIntraDCFirst;
  286. ppxlcRefY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY + (mbnFirst/m_iNumMBX)*m_iFrameWidthYxMBSize;
  287. ppxlcRefU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV + (mbnFirst/m_iNumMBX)*m_iFrameWidthUVxBlkSize;
  288. ppxlcRefV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV + (mbnFirst/m_iNumMBX)*m_iFrameWidthUVxBlkSize;
  289. PixelC* ppxlcRefMBY = ppxlcRefY + (mbnFirst%m_iNumMBX)*MB_SIZE;
  290. PixelC* ppxlcRefMBU = ppxlcRefU + (mbnFirst%m_iNumMBX)*BLOCK_SIZE;
  291. PixelC* ppxlcRefMBV = ppxlcRefV + (mbnFirst%m_iNumMBX)*BLOCK_SIZE;
  292. for(i=mbnFirst;i<mbn;i++) {
  293. iMBX = i % m_iNumMBX;
  294. iMBY = i / m_iNumMBX;
  295. if(iMBX == 0 ) {
  296. ppxlcRefMBY = ppxlcRefY;
  297. ppxlcRefMBU = ppxlcRefU;
  298. ppxlcRefMBV = ppxlcRefV;
  299. }
  300. decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, piIntraDC);
  301. pmbmd++;
  302. piIntraDC += V_BLOCK;
  303. ppxlcRefMBY += MB_SIZE;
  304. ppxlcRefMBU += BLOCK_SIZE;
  305. ppxlcRefMBV += BLOCK_SIZE;
  306. if(iMBX == m_iNumMBX - 1) {
  307. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  308. m_rgpmbmAbove = m_rgpmbmCurr;
  309. m_rgpmbmCurr  = ppmbmTemp;
  310. ppxlcRefY += m_iFrameWidthYxMBSize;
  311. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  312. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  313. }
  314. }
  315. } while( checkResyncMarker() );
  316. delete m_piMCBPC;
  317. }
  318. Void CVideoObjectDecoder::decodeMBTextureDCOfIVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP,
  319. Int* piIntraDC, Bool &bUseNewQPForVlcThr)
  320. {
  321. Int iBlk = 0;
  322. pmbmd->m_stepSize = iCurrentQP;
  323. pmbmd->m_stepSizeDelayed = iCurrentQP;
  324. if (pmbmd->m_dctMd == INTRAQ) {
  325. Int iDQUANT = m_pbitstrmIn->getBits (2);
  326. switch (iDQUANT) {
  327. case 0:
  328. pmbmd->m_intStepDelta = -1;
  329. break;
  330. case 1:
  331. pmbmd->m_intStepDelta = -2;
  332. break;
  333. case 2:
  334. pmbmd->m_intStepDelta = 1;
  335. break;
  336. case 3:
  337. pmbmd->m_intStepDelta = 2;
  338. break;
  339. default:
  340. assert (FALSE);
  341. }
  342. pmbmd->m_stepSize += pmbmd->m_intStepDelta;
  343. if(bUseNewQPForVlcThr)
  344. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  345. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  346. checkrange (pmbmd->m_stepSize, 1, iQuantMax);
  347. iCurrentQP = pmbmd->m_stepSize;
  348. }
  349. assert (pmbmd != NULL);
  350. if (pmbmd -> m_rgTranspStatus [0] == ALL) 
  351. return;
  352. bUseNewQPForVlcThr = FALSE;
  353. assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);
  354. Int iQP = pmbmd->m_stepSize;
  355. for (Int i = 0; i <= 31; i++) {
  356. if (iQP <= 4) {
  357. m_rgiDcScalerY [i] = 8;
  358. m_rgiDcScalerC [i] = 8;
  359. }
  360. else if (iQP >= 5 && iQP <= 8) {
  361. m_rgiDcScalerY [i] = 2 * iQP;
  362. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  363. }
  364. else if (iQP >= 9 && iQP <= 24) {
  365. m_rgiDcScalerY [i] = iQP + 8;
  366. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  367. }
  368. else {
  369. m_rgiDcScalerY [i] = 2 * iQP - 16;
  370. m_rgiDcScalerC [i] = iQP - 6;
  371. }
  372. }
  373. assert (iQP > 0);
  374. assert (pmbmd -> m_stepSizeDelayed > 0);
  375. if (pmbmd -> m_stepSizeDelayed >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
  376. pmbmd->m_bCodeDcAsAc = TRUE;
  377. else
  378. pmbmd->m_bCodeDcAsAc = FALSE;
  379. for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) {
  380. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  381. decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC);
  382. }
  383. for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) {
  384. decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC);
  385. }
  386. }
  387. Void CVideoObjectDecoder::decodeMBTextureHeadOfIVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC)
  388. {
  389. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  390. Int iBlk = 0, cNonTrnspBlk = 0;
  391. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  392. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  393. cNonTrnspBlk++;
  394. }
  395. Int iCBPC = 0;
  396. Int iCBPY = 0;
  397. // bug fix by toshiba 98-9-24 start
  398. pmbmd->m_dctMd = INTRA;
  399. pmbmd->m_bSkip = FALSE; //reset for direct mode 
  400. if (*piMCBPC > 3)
  401. pmbmd->m_dctMd = INTRAQ;
  402. // bug fix by toshiba 98-9-24 end
  403. iCBPC = *piMCBPC % 4;
  404. pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1);
  405. switch (cNonTrnspBlk) {
  406. case 1:
  407. iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  408. break;
  409. case 2:
  410. iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  411. break;
  412. case 3:
  413. iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  414. break;
  415. case 4:
  416. iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  417. break;
  418. default:
  419. assert (FALSE);
  420. }
  421. setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
  422. }
  423. Void CVideoObjectDecoder::decodeTextureIntraMB_DataPartitioning (
  424. CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, 
  425. PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV, Int* piIntraDC)
  426. {
  427. assert (pmbmd != NULL);
  428. if (pmbmd -> m_rgTranspStatus [0] == ALL) 
  429. return;
  430. assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);
  431. Int iQP = pmbmd->m_stepSize;
  432. for (Int i = 0; i <= 31; i++) {
  433. if (iQP <= 4) {
  434. m_rgiDcScalerY [i] = 8;
  435. m_rgiDcScalerC [i] = 8;
  436. }
  437. else if (iQP >= 5 && iQP <= 8) {
  438. m_rgiDcScalerY [i] = 2 * iQP;
  439. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  440. }
  441. else if (iQP >= 9 && iQP <= 24) {
  442. m_rgiDcScalerY [i] = iQP + 8;
  443. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  444. }
  445. else {
  446. m_rgiDcScalerY [i] = 2 * iQP - 16;
  447. m_rgiDcScalerC [i] = iQP - 6;
  448. }
  449. }
  450. assert (iQP > 0);
  451. assert (pmbmd -> m_stepSizeDelayed > 0);
  452. if (pmbmd -> m_stepSizeDelayed >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
  453. pmbmd->m_bCodeDcAsAc = TRUE;
  454. else
  455. pmbmd->m_bCodeDcAsAc = FALSE;
  456. //for intra pred
  457. MacroBlockMemory* pmbmLeft = NULL;
  458. MacroBlockMemory* pmbmTop = NULL;
  459. MacroBlockMemory* pmbmLeftTop = NULL;
  460. CMBMode* pmbmdLeft = NULL;
  461. CMBMode* pmbmdTop = NULL;
  462. CMBMode* pmbmdLeftTop = NULL;
  463.  
  464. Int iMBTop = iMBY - 1;
  465. if (iMBTop >= 0) {
  466. if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX)->m_iVideoPacketNumber) {
  467. pmbmTop  = m_rgpmbmAbove [iMBX];
  468. pmbmdTop = pmbmd - m_iNumMBX;
  469. }
  470. }
  471. if (iMBX > 0) {
  472. if(pmbmd->m_iVideoPacketNumber==(pmbmd - 1)->m_iVideoPacketNumber) {
  473. pmbmLeft  = m_rgpmbmCurr [iMBX - 1];
  474. pmbmdLeft = pmbmd -  1;
  475. }
  476. }
  477. if (iMBTop >= 0 && iMBX > 0) {
  478. if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber) {
  479. pmbmLeftTop  = m_rgpmbmAbove [iMBX - 1];
  480. pmbmdLeftTop = pmbmd - m_iNumMBX - 1;
  481. }
  482. }
  483. PixelC* rgchBlkDst = NULL;
  484. Int iWidthDst;
  485. Int iDcScaler;
  486. Int* rgiCoefQ;
  487. for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
  488. if (iBlk < U_BLOCK) {
  489. if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 
  490. continue;
  491. switch (iBlk) 
  492. {
  493. case (Y_BLOCK1): 
  494. rgchBlkDst = ppxlcCurrFrmQY;
  495. break;
  496. case (Y_BLOCK2): 
  497. rgchBlkDst = ppxlcCurrFrmQY + BLOCK_SIZE;
  498. break;
  499. case (Y_BLOCK3): 
  500. rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize;
  501. break;
  502. case (Y_BLOCK4): 
  503. rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + BLOCK_SIZE;
  504. break;
  505. }
  506. iWidthDst = m_iFrameWidthY;
  507. iDcScaler = m_rgiDcScalerY [iQP];
  508. }
  509. else {
  510. iWidthDst = m_iFrameWidthUV;
  511. rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrFrmQU: ppxlcCurrFrmQV;
  512. iDcScaler = m_rgiDcScalerC [iQP];
  513. }
  514. rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
  515. const BlockMemory blkmPred = NULL;
  516. Int iQpPred = iQP; //default to current if no pred (use 128 case)
  517. decideIntraPred (blkmPred, 
  518.  pmbmd,
  519.  iQpPred,
  520.  (BlockNum) iBlk,
  521.  pmbmLeft, 
  522.     pmbmTop, 
  523.  pmbmLeftTop,
  524.  m_rgpmbmCurr[iMBX],
  525.  pmbmdLeft,
  526.  pmbmdTop,
  527.  pmbmdLeftTop);
  528. decodeIntraBlockTextureTcoef_DataPartitioning (rgchBlkDst,
  529.  iWidthDst,
  530.  iQP, 
  531.  iDcScaler,
  532.  iBlk,
  533.  *(m_rgpmbmCurr + iMBX),
  534.  pmbmd,
  535.    blkmPred, //for intra-pred
  536.  iQpPred,
  537.  piIntraDC);
  538. }
  539. }
  540. Void CVideoObjectDecoder::decodeIntraBlockTexture_DataPartitioning (Int iBlk, CMBMode* pmbmd, Int* piIntraDC)
  541. {
  542. if (!pmbmd->m_bCodeDcAsAc)
  543. piIntraDC[iBlk - 1] = decodeIntraDCmpeg (iBlk <= Y_BLOCK4 || iBlk >=A_BLOCK1);
  544. }
  545. Void CVideoObjectDecoder::decodeIntraBlockTextureTcoef_DataPartitioning (PixelC* rgpxlcBlkDst,
  546.  Int iWidthDst,
  547.  Int iQP,
  548.  Int iDcScaler,
  549.  Int iBlk,
  550.  MacroBlockMemory* pmbmCurr,
  551.  CMBMode* pmbmd,
  552.    const BlockMemory blkmPred,
  553.  Int iQpPred,
  554.  Int* piIntraDC)
  555. {
  556. Int iCoefStart = 0;
  557. if (!pmbmd->m_bCodeDcAsAc) {
  558. iCoefStart++;
  559. }
  560. Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
  561. rgiCoefQ[0] = piIntraDC [iBlk - 1];
  562. if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
  563. Int* rgiZigzag = grgiStandardZigzag;
  564. if (pmbmd->m_bACPrediction)
  565. rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;
  566.   if(m_volmd.bReversibleVlc)
  567.   decodeIntraRVLCTCOEF (rgiCoefQ, iCoefStart, rgiZigzag);
  568.   else
  569. decodeIntraTCOEF (rgiCoefQ, iCoefStart, rgiZigzag);
  570. }
  571. else
  572. memset (rgiCoefQ + iCoefStart, 0, sizeof (Int) * (BLOCK_SQUARE_SIZE - iCoefStart));
  573. inverseDCACPred (pmbmd, iBlk - 1, rgiCoefQ, iQP, iDcScaler, blkmPred, iQpPred);
  574. inverseQuantizeIntraDc (rgiCoefQ, iDcScaler);
  575. if (m_volmd.fQuantizer == Q_H263)
  576. inverseQuantizeDCTcoefH263 (rgiCoefQ, 1, iQP);
  577. else
  578. inverseQuantizeIntraDCTcoefMPEG (rgiCoefQ, 1, iQP, iBlk>=A_BLOCK1);
  579. Int i, j; //save coefQ (ac) for intra pred
  580. pmbmCurr->rgblkm [iBlk - 1] [0] = m_rgiDCTcoef [0]; //save recon value of DC for intra pred //save Qcoef in memory
  581. for (i = 1, j = 8; i < BLOCK_SIZE; i++, j += BLOCK_SIZE) {
  582. pmbmCurr->rgblkm [iBlk - 1] [i] = rgiCoefQ [i];
  583. pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = rgiCoefQ [j];
  584. }
  585. m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);
  586. }
  587. Void CVideoObjectDecoder::decodePVOP_DataPartitioning ()
  588. {
  589. // assert (m_volmd.nBits==8);
  590. Int iMBX, iMBY;
  591. //CoordI y = 0; 
  592. CMBMode* pmbmd = m_rgmbmd;
  593. CMotionVector* pmv = m_rgmv;
  594. PixelC* ppxlcCurrQY = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  595. PixelC* ppxlcCurrQU = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  596. PixelC* ppxlcCurrQV = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  597. Int iCurrentQP  = m_vopmd.intStep;
  598. Int iVideoPacketNumber = 0;
  599. m_iVPMBnum = 0;
  600. Bool bLeftBndry;
  601. Bool bRightBndry;
  602. Bool bTopBndry;
  603. m_piMCBPC = new Int[m_iNumMBX*m_iNumMBY];
  604. Int* piMCBPC = m_piMCBPC;
  605. m_piIntraDC = new Int[m_iNumMBX*m_iNumMBY*V_BLOCK];
  606. Int* piIntraDC = m_piIntraDC;
  607. // End Toshiba
  608. Int i;
  609. Int mbn = 0, mbnFirst = 0;
  610. CoordI x = 0;
  611. CoordI y = 0;
  612. PixelC* ppxlcCurrQMBY = NULL;
  613. PixelC* ppxlcCurrQMBU = NULL;
  614. PixelC* ppxlcCurrQMBV = NULL;
  615. Bool bMBBackup = FALSE;
  616. CMBMode* pmbmdBackup = NULL;
  617. Int iMBXBackup = 0, iMBYBackup = 0;
  618. CMotionVector* pmvBackup = 0;
  619. PixelC* ppxlcCurrQMBYBackup = NULL;
  620. PixelC* ppxlcCurrQMBUBackup = NULL;
  621. PixelC* ppxlcCurrQMBVBackup = NULL;
  622. Bool bRestartDelayedQP = TRUE;
  623. do{
  624. CMBMode* pmbmdFirst = pmbmd;
  625. CMotionVector* pmvFirst = pmv;
  626. Int* piMCBPCFirst = piMCBPC;
  627. Int* piIntraDCFirst = piIntraDC;
  628. mbnFirst = mbn;
  629. if( checkResyncMarker() ){
  630. decodeVideoPacketHeader(iCurrentQP);
  631. iVideoPacketNumber++;
  632. bRestartDelayedQP = TRUE;
  633. }
  634. do{
  635. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  636. iMBX = mbn % m_iNumMBX;
  637. iMBY = mbn / m_iNumMBX;
  638. pmbmd->m_bSkip = m_pbitstrmIn->getBits (1);
  639. if (!pmbmd->m_bSkip) {
  640. *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol ();
  641. assert (*piMCBPC >= 0 && *piMCBPC <= 20);
  642. Int iMBtype = *piMCBPC / 4; //per H.263's MBtype
  643. switch (iMBtype) {
  644. case 0:
  645. pmbmd->m_dctMd = INTER;
  646. pmbmd -> m_bhas4MVForward = FALSE;
  647. break;
  648. case 1:
  649. pmbmd->m_dctMd = INTERQ;
  650. pmbmd -> m_bhas4MVForward = FALSE;
  651. break;
  652. case 2:
  653. pmbmd -> m_dctMd = INTER;
  654. pmbmd -> m_bhas4MVForward = TRUE;
  655. break;
  656. case 3:
  657. pmbmd->m_dctMd = INTRA;
  658. break;
  659. case 4:
  660. pmbmd->m_dctMd = INTRAQ;
  661. break;
  662. default:
  663. assert (FALSE);
  664. }
  665. } else { //skipped
  666. pmbmd->m_dctMd = INTER;
  667. pmbmd -> m_bhas4MVForward = FALSE;
  668. }
  669. if(iMBX == 0) {
  670. bLeftBndry = TRUE;
  671. } else {
  672. bLeftBndry = !((pmbmd - 1) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber);
  673. }
  674. if(iMBY == 0) {
  675. bTopBndry = TRUE;
  676. } else {
  677. bTopBndry = !((pmbmd - m_iNumMBX) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber);
  678. }
  679. if((iMBX == m_iNumMBX - 1) || (iMBY == 0)) {
  680. bRightBndry = TRUE;
  681. } else {
  682. bRightBndry = !((pmbmd - m_iNumMBX + 1) -> m_iVideoPacketNumber == pmbmd -> m_iVideoPacketNumber);
  683. }
  684. decodeMV (pmbmd, pmv, bLeftBndry, bRightBndry, bTopBndry, FALSE, iMBX, iMBY);
  685. if(bMBBackup){
  686. if (pmbmdBackup->m_dctMd == INTER || pmbmdBackup->m_dctMd == INTERQ) {
  687. motionCompMB (
  688. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  689. pmvBackup, pmbmdBackup, 
  690. iMBXBackup, iMBYBackup, 
  691. x, y,
  692. pmbmdBackup->m_bSkip, FALSE,
  693. &m_rctRefVOPY0
  694. );
  695. if (!pmbmdBackup->m_bSkip) {
  696. CoordI iXRefUV, iYRefUV, iXRefUV1, iYRefUV1;
  697. mvLookupUV (pmbmdBackup, pmvBackup, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);
  698. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl, &m_rctRefVOPY0);
  699. addErrorAndPredToCurrQ (ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup);
  700. }
  701. else {
  702. if (m_volmd.bAdvPredDisable)
  703. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, NULL);
  704. else
  705. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, NULL);
  706. }
  707. }
  708. bMBBackup = FALSE;
  709. }
  710. pmbmd++;
  711. pmv += PVOP_MV_PER_REF_PER_MB;
  712. mbn++;
  713. piMCBPC++;
  714. assert(mbn<=(m_iNumMBX*m_iNumMBY));
  715. } while( !checkMotionMarker() );
  716. m_pbitstrmIn -> getBits (NUMBITS_DP_MOTION_MARKER);
  717. pmbmd = pmbmdFirst;
  718. piMCBPC = piMCBPCFirst;
  719. piIntraDC = piIntraDCFirst;
  720. for(i=mbnFirst;i<mbn;i++) {
  721. decodeMBTextureHeadOfPVOP_DataPartitioning (pmbmd, iCurrentQP, piMCBPC, piIntraDC, bRestartDelayedQP);
  722. pmbmd++;
  723. piMCBPC++;
  724. piIntraDC += V_BLOCK;
  725. }
  726. pmbmd = pmbmdFirst;
  727. pmv = pmvFirst;
  728. piIntraDC = piIntraDCFirst;
  729. for(i=mbnFirst;i<mbn;i++) {
  730. iMBX = i % m_iNumMBX;
  731. iMBY = i / m_iNumMBX;
  732. if(iMBX == 0 ) {
  733. ppxlcCurrQMBY = ppxlcCurrQY;
  734. ppxlcCurrQMBU = ppxlcCurrQU;
  735. ppxlcCurrQMBV = ppxlcCurrQV;
  736. x = 0;
  737. if(iMBY != 0) y += MB_SIZE;
  738. } else {
  739. x += MB_SIZE;
  740. }
  741. if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)
  742. decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, piIntraDC);
  743. else {
  744. if (!pmbmd->m_bSkip)
  745. decodeTextureInterMB (pmbmd);
  746. }
  747. if(i==mbn-1){
  748. bMBBackup = TRUE;
  749. pmbmdBackup = pmbmd;
  750. pmvBackup = pmv;
  751. iMBXBackup = iMBX;
  752. iMBYBackup = iMBY;
  753. ppxlcCurrQMBYBackup = ppxlcCurrQMBY;
  754. ppxlcCurrQMBUBackup = ppxlcCurrQMBU;
  755. ppxlcCurrQMBVBackup = ppxlcCurrQMBV;
  756. }
  757. if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) {
  758. motionCompMB (
  759. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  760. pmv, pmbmd, 
  761. iMBX, iMBY, 
  762. x, y,
  763. pmbmd->m_bSkip, FALSE,
  764. &m_rctRefVOPY0
  765. );
  766. if (!pmbmd->m_bSkip) {
  767. CoordI iXRefUV, iYRefUV, iXRefUV1, iYRefUV1;
  768. mvLookupUV (pmbmd, pmv, iXRefUV, iYRefUV, iXRefUV1, iYRefUV1);
  769. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl, &m_rctRefVOPY0);
  770. addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  771. }
  772. else {
  773. if (m_volmd.bAdvPredDisable)
  774. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL);
  775. else
  776. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, NULL);
  777. }
  778. }
  779. pmbmd++;
  780. pmv += PVOP_MV_PER_REF_PER_MB;
  781. piIntraDC += V_BLOCK;
  782. ppxlcCurrQMBY += MB_SIZE;
  783. ppxlcCurrQMBU += BLOCK_SIZE;
  784. ppxlcCurrQMBV += BLOCK_SIZE;
  785. if(iMBX == m_iNumMBX - 1) {
  786. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  787. m_rgpmbmAbove = m_rgpmbmCurr;
  788. m_rgpmbmCurr  = ppmbmTemp;
  789. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  790. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  791. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  792. }
  793. }
  794. } while( checkResyncMarker() );
  795. delete m_piIntraDC;
  796. delete m_piMCBPC;
  797. }
  798. Void CVideoObjectDecoder::decodeMBTextureHeadOfPVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP, Int* piMCBPC,
  799.   Int* piIntraDC, Bool &bUseNewQPForVlcThr)
  800. {
  801. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  802. Int iBlk = 0, cNonTrnspBlk = 0;
  803. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  804. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  805. cNonTrnspBlk++;
  806. }
  807. Int iCBPC = 0;
  808. Int iCBPY = 0;
  809. if (!pmbmd->m_bSkip) {
  810.   //Int iMBtype = *piMCBPC / 4; //per H.263's MBtype
  811. iCBPC = *piMCBPC % 4;
  812. if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) {
  813. pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1);
  814. switch (cNonTrnspBlk) {
  815. case 1:
  816. iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  817. break;
  818. case 2:
  819. iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  820. break;
  821. case 3:
  822. iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  823. break;
  824. case 4:
  825. iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  826. break;
  827. default:
  828. assert (FALSE);
  829. }
  830. }
  831. else {
  832. switch (cNonTrnspBlk) {
  833. case 1:
  834. iCBPY = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  835. break;
  836. case 2:
  837. iCBPY = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  838. break;
  839. case 3:
  840. iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  841. break;
  842. case 4:
  843. iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  844. break;
  845. default:
  846. assert (FALSE);
  847. }
  848. }
  849. assert (iCBPY >= 0 && iCBPY <= 15);
  850. }
  851. else { //skipped
  852. pmbmd->m_dctMd = INTER;
  853. pmbmd -> m_bhas4MVForward = FALSE;
  854. }
  855. setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
  856. pmbmd->m_stepSize = iCurrentQP;
  857. pmbmd->m_stepSizeDelayed = iCurrentQP;
  858. if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) {
  859. assert (!pmbmd->m_bSkip);
  860. Int iDQUANT = m_pbitstrmIn->getBits (2);
  861. switch (iDQUANT) {
  862. case 0:
  863. pmbmd->m_intStepDelta = -1;
  864. break;
  865. case 1:
  866. pmbmd->m_intStepDelta = -2;
  867. break;
  868. case 2:
  869. pmbmd->m_intStepDelta = 1;
  870. break;
  871. case 3:
  872. pmbmd->m_intStepDelta = 2;
  873. break;
  874. default:
  875. assert (FALSE);
  876. }
  877. pmbmd->m_stepSize += pmbmd->m_intStepDelta;
  878. if(bUseNewQPForVlcThr)
  879. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  880. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  881. if (pmbmd->m_stepSize < 1)
  882. pmbmd->m_stepSize = 1;
  883. else if (pmbmd->m_stepSize > iQuantMax)
  884. pmbmd->m_stepSize = iQuantMax;
  885. iCurrentQP = pmbmd->m_stepSize;
  886. }
  887. if (!pmbmd->m_bSkip)
  888. bUseNewQPForVlcThr = FALSE;
  889. if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) {
  890. Int iQP = pmbmd->m_stepSize;
  891. for (Int i = 0; i <= 31; i++) {
  892. if (iQP <= 4) {
  893. m_rgiDcScalerY [i] = 8;
  894. m_rgiDcScalerC [i] = 8;
  895. }
  896. else if (iQP >= 5 && iQP <= 8) {
  897. m_rgiDcScalerY [i] = 2 * iQP;
  898. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  899. }
  900. else if (iQP >= 9 && iQP <= 24) {
  901. m_rgiDcScalerY [i] = iQP + 8;
  902. m_rgiDcScalerC [i] = (iQP + 13) / 2;
  903. }
  904. else {
  905. m_rgiDcScalerY [i] = 2 * iQP - 16;
  906. m_rgiDcScalerC [i] = iQP - 6;
  907. }
  908. }
  909. assert (iQP > 0);
  910. assert (pmbmd -> m_stepSizeDelayed > 0);
  911. if (pmbmd -> m_stepSizeDelayed >= grgiDCSwitchingThreshold [m_vopmd.iIntraDcSwitchThr])
  912. pmbmd->m_bCodeDcAsAc = TRUE;
  913. else
  914. pmbmd->m_bCodeDcAsAc = FALSE;
  915. for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) {
  916. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  917. decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC);
  918. }
  919. for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) {
  920. decodeIntraBlockTexture_DataPartitioning (iBlk, pmbmd, piIntraDC);
  921. }
  922. }
  923. }
  924. Void CVideoObjectDecoder::decodeIVOP_WithShape_DataPartitioning ()
  925. {
  926. //assert (m_volmd.nBits==8);
  927. assert (m_volmd.fAUsage!=EIGHT_BIT);
  928. //in case the IVOP is used as an ref for direct mode
  929. memset (m_rgmv, 0, m_iNumMB * PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
  930. Int iMBX, iMBY;
  931. CMBMode* pmbmd = m_rgmbmd;
  932. PixelC* ppxlcRefY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  933. PixelC* ppxlcRefU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  934. PixelC* ppxlcRefV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  935. PixelC* ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  936. PixelC* ppxlcRefA  = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  937. PixelC* ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;
  938. Int iCurrentQP  = m_vopmd.intStepI;
  939. Int iVideoPacketNumber = 0;
  940. m_iVPMBnum = 0;
  941. m_piMCBPC = new Int[m_iNumMBX*m_iNumMBY];
  942. Int* piMCBPC = m_piMCBPC;
  943. m_piIntraDC = new Int[m_iNumMBX*m_iNumMBY*V_BLOCK];
  944. Int* piIntraDC = m_piIntraDC;
  945. Bool bRestartDelayedQP = TRUE;
  946. Int i;
  947. Int mbn = 0, mbnFirst = 0;
  948. PixelC* ppxlcRefMBBY = NULL;
  949. PixelC* ppxlcRefMBBUV;
  950. PixelC* ppxlcRefMBY = NULL;
  951. PixelC* ppxlcRefMBU = NULL;
  952. PixelC* ppxlcRefMBV = NULL;
  953. PixelC* ppxlcRefMBA = NULL;
  954. do {
  955. if( checkResyncMarker() ) {
  956. decodeVideoPacketHeader(iCurrentQP);
  957. iVideoPacketNumber++;
  958. bRestartDelayedQP = TRUE;
  959. }
  960. CMBMode* pmbmdFirst = pmbmd;
  961. Int* piMCBPCFirst = piMCBPC;
  962. Int* piIntraDCFirst = piIntraDC;
  963. mbnFirst = mbn;
  964. do{
  965. iMBX = mbn % m_iNumMBX;
  966. iMBY = mbn / m_iNumMBX;
  967. if(iMBX == 0 ) {
  968. ppxlcRefMBBY = ppxlcRefBY;
  969. ppxlcRefMBBUV = ppxlcRefBUV;
  970. }
  971. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  972. decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY, ppxlcRefMBBY);
  973. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  974. if(m_volmd.bShapeOnly==FALSE)
  975. {
  976. pmbmd->m_bPadded=FALSE;
  977. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  978. *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCintra->decodeSymbol ();
  979. assert (*piMCBPC >= 0 && *piMCBPC <= 7);
  980. pmbmd->m_dctMd = INTRA;
  981. if (*piMCBPC > 3)
  982. pmbmd->m_dctMd = INTRAQ;
  983. decodeMBTextureDCOfIVOP_DataPartitioning (pmbmd, iCurrentQP,
  984. piIntraDC, bRestartDelayedQP);
  985. }
  986. }
  987. else {
  988. assert(FALSE);
  989. }
  990. pmbmd++;
  991. mbn++;
  992. piMCBPC++;
  993. piIntraDC+=V_BLOCK;
  994. ppxlcRefMBBY += MB_SIZE;
  995. ppxlcRefMBBUV += BLOCK_SIZE;
  996. if(iMBX == m_iNumMBX - 1) {
  997. ppxlcRefBY += m_iFrameWidthYxMBSize;
  998. ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
  999. }
  1000. } while( !checkDCMarker() );
  1001. m_pbitstrmIn -> getBits (NUMBITS_DP_DC_MARKER);
  1002. pmbmd = pmbmdFirst;
  1003. piMCBPC = piMCBPCFirst;
  1004. for(i=mbnFirst;i<mbn;i++) {
  1005. if (pmbmd->m_rgTranspStatus [0] != ALL)
  1006. decodeMBTextureHeadOfIVOP_DataPartitioning (pmbmd, piMCBPC);
  1007. pmbmd++;
  1008. piMCBPC++;
  1009. }
  1010. pmbmd = pmbmdFirst;
  1011. piIntraDC = piIntraDCFirst;
  1012. ppxlcRefBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY + (mbnFirst/m_iNumMBX)*m_iFrameWidthYxMBSize;
  1013. ppxlcRefBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV + (mbnFirst/m_iNumMBX)*m_iFrameWidthUVxBlkSize;
  1014. ppxlcRefMBBY = ppxlcRefBY + (mbnFirst%m_iNumMBX)*MB_SIZE;
  1015. ppxlcRefMBBUV = ppxlcRefBUV + (mbnFirst%m_iNumMBX)*BLOCK_SIZE;
  1016. for(i=mbnFirst;i<mbn;i++) {
  1017. pmbmd->m_bPadded = FALSE;
  1018. iMBX = i % m_iNumMBX;
  1019. iMBY = i / m_iNumMBX;
  1020. if(iMBX == 0 ) {
  1021. ppxlcRefMBY = ppxlcRefY;
  1022. ppxlcRefMBU = ppxlcRefU;
  1023. ppxlcRefMBV = ppxlcRefV;
  1024. ppxlcRefMBA  = ppxlcRefA;
  1025. ppxlcRefMBBY = ppxlcRefBY;
  1026. ppxlcRefMBBUV = ppxlcRefBUV;
  1027. }
  1028. copyRefShapeToMb(m_ppxlcCurrMBBY, ppxlcRefMBBY);
  1029. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  1030. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  1031. decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, piIntraDC);
  1032. // MC padding
  1033. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  1034. mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA);
  1035. padNeighborTranspMBs (
  1036. iMBX, iMBY,
  1037. pmbmd,
  1038. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  1039. );
  1040. }
  1041. else {
  1042. padCurrAndTopTranspMBFromNeighbor (
  1043. iMBX, iMBY,
  1044. pmbmd,
  1045. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  1046. );
  1047. }
  1048. ppxlcRefMBA += MB_SIZE;
  1049. ppxlcRefMBBY += MB_SIZE;
  1050. ppxlcRefMBBUV += BLOCK_SIZE;
  1051. pmbmd++;
  1052. piIntraDC += V_BLOCK;
  1053. ppxlcRefMBY += MB_SIZE;
  1054. ppxlcRefMBU += BLOCK_SIZE;
  1055. ppxlcRefMBV += BLOCK_SIZE;
  1056. if(iMBX == m_iNumMBX - 1) {
  1057. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  1058. m_rgpmbmAbove = m_rgpmbmCurr;
  1059. m_rgpmbmCurr  = ppmbmTemp;
  1060. ppxlcRefY += m_iFrameWidthYxMBSize;
  1061. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  1062. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  1063. ppxlcRefA += m_iFrameWidthYxMBSize;
  1064. ppxlcRefBY += m_iFrameWidthYxMBSize;
  1065. ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
  1066. }
  1067. }
  1068. } while( checkResyncMarker() );
  1069. delete m_piMCBPC;
  1070. }
  1071. Void CVideoObjectDecoder::decodePVOP_WithShape_DataPartitioning ()
  1072. {
  1073. //assert (m_volmd.nBits==8);
  1074. assert (m_volmd.fAUsage!=EIGHT_BIT);
  1075. Int iMBX, iMBY;
  1076. CoordI y = m_rctCurrVOPY.top; 
  1077. CoordI x = m_rctCurrVOPY.left;
  1078. CoordI y_s = m_rctCurrVOPY.top; 
  1079. CoordI x_s = m_rctCurrVOPY.left;
  1080. CMBMode* pmbmd = m_rgmbmd;
  1081. CMotionVector* pmv = m_rgmv;
  1082. CMotionVector* pmvBY = m_rgmvBY;
  1083. PixelC* ppxlcCurrQY  = (PixelC*) m_pvopcRefQ1->pixelsY () + m_iStartInRefToCurrRctY;
  1084. PixelC* ppxlcCurrQU  = (PixelC*) m_pvopcRefQ1->pixelsU () + m_iStartInRefToCurrRctUV;
  1085. PixelC* ppxlcCurrQV  = (PixelC*) m_pvopcRefQ1->pixelsV () + m_iStartInRefToCurrRctUV;
  1086. PixelC* ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY;
  1087. PixelC* ppxlcCurrQA  = (PixelC*) m_pvopcRefQ1->pixelsA () + m_iStartInRefToCurrRctY;
  1088. PixelC* ppxlcCurrQBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV;
  1089. Int iCurrentQP  = m_vopmd.intStep;
  1090. Int iVideoPacketNumber = 0;  // added for error resilience mode by Toshiba
  1091. m_iVPMBnum = 0;
  1092. m_piMCBPC = new Int[m_iNumMBX*m_iNumMBY];
  1093. Int* piMCBPC = m_piMCBPC;
  1094. m_piIntraDC = new Int[m_iNumMBX*m_iNumMBY*V_BLOCK];
  1095. Int* piIntraDC = m_piIntraDC;
  1096. Int i;
  1097. Int mbn = 0, mbnFirst = 0;
  1098. PixelC* ppxlcCurrQMBY = NULL;
  1099. PixelC* ppxlcCurrQMBU = NULL;
  1100. PixelC* ppxlcCurrQMBV = NULL;
  1101. PixelC* ppxlcCurrQMBBY = NULL;
  1102. PixelC* ppxlcCurrQMBBUV;
  1103. PixelC* ppxlcCurrQMBA = NULL;
  1104. Bool bMBBackup = FALSE;
  1105. CMBMode* pmbmdBackup = NULL;
  1106. Int iMBXBackup = 0, iMBYBackup = 0;
  1107. CMotionVector* pmvBackup = NULL;
  1108. PixelC* ppxlcCurrQMBYBackup = NULL;
  1109. PixelC* ppxlcCurrQMBUBackup = NULL;
  1110. PixelC* ppxlcCurrQMBVBackup = NULL;
  1111. PixelC* ppxlcCurrQMBBYBackup = NULL;
  1112. PixelC* ppxlcCurrQMBBUVBackup;
  1113. PixelC* ppxlcCurrQMBABackup = NULL;
  1114. Bool bPaddedLBackup = FALSE;
  1115. Bool bPaddedTBackup = FALSE;
  1116. Bool bRestartDelayedQP = TRUE;
  1117. do{
  1118. CMBMode* pmbmdFirst = pmbmd;
  1119. CMotionVector* pmvFirst = pmv;
  1120. Int* piMCBPCFirst = piMCBPC;
  1121. Int* piIntraDCFirst = piIntraDC;
  1122. mbnFirst = mbn;
  1123. if( checkResyncMarker() ){
  1124. decodeVideoPacketHeader(iCurrentQP);
  1125. iVideoPacketNumber++;
  1126. bRestartDelayedQP = TRUE;
  1127. }
  1128. do{
  1129. pmbmd->m_iVideoPacketNumber = iVideoPacketNumber;
  1130. iMBX = mbn % m_iNumMBX;
  1131. iMBY = mbn / m_iNumMBX;
  1132. if(iMBX == 0 ) {
  1133. ppxlcCurrQMBBY = ppxlcCurrQBY;
  1134. ppxlcCurrQMBBUV = ppxlcCurrQBUV;
  1135. x_s = m_rctCurrVOPY.left;
  1136. if(iMBY != 0) y_s += MB_SIZE;
  1137. } else {
  1138. x_s += MB_SIZE;
  1139. }
  1140. ShapeMode shpmdColocatedMB;
  1141. if(m_vopmd.bShapeCodingType) {
  1142. shpmdColocatedMB = m_rgmbmdRef [
  1143. MIN (MAX (0, iMBX), m_iNumMBXRef - 1) + 
  1144.   MIN (MAX (0, iMBY), m_iNumMBYRef - 1) * m_iNumMBXRef
  1145. ].m_shpmd;
  1146. decodeInterShape (
  1147. m_pvopcRefQ0,
  1148. pmbmd, 
  1149. iMBX, iMBY, 
  1150. x_s, y_s, 
  1151. pmv, pmvBY, 
  1152. m_ppxlcCurrMBBY, ppxlcCurrQMBBY,
  1153. shpmdColocatedMB
  1154. );
  1155. }
  1156. else {
  1157. decodeIntraShape (pmbmd, iMBX, iMBY, m_ppxlcCurrMBBY,
  1158. ppxlcCurrQMBBY);
  1159. }
  1160. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV);
  1161. if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  1162. pmbmd->m_bSkip = m_pbitstrmIn->getBits (1);
  1163. if (!pmbmd->m_bSkip) {
  1164. *piMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol ();
  1165. assert (*piMCBPC >= 0 && *piMCBPC <= 20);
  1166. Int iMBtype = *piMCBPC / 4; //per H.263's MBtype
  1167. switch (iMBtype) {
  1168. case 0:
  1169. pmbmd->m_dctMd = INTER;
  1170. pmbmd -> m_bhas4MVForward = FALSE;
  1171. break;
  1172. case 1:
  1173. pmbmd->m_dctMd = INTERQ;
  1174. pmbmd -> m_bhas4MVForward = FALSE;
  1175. break;
  1176. case 2:
  1177. pmbmd -> m_dctMd = INTER;
  1178. pmbmd -> m_bhas4MVForward = TRUE;
  1179. break;
  1180. case 3:
  1181. pmbmd->m_dctMd = INTRA;
  1182. break;
  1183. case 4:
  1184. pmbmd->m_dctMd = INTRAQ;
  1185. break;
  1186. default:
  1187. assert (FALSE);
  1188. }
  1189. } else { //skipped
  1190. pmbmd->m_dctMd = INTER;
  1191. pmbmd -> m_bhas4MVForward = FALSE;
  1192. }
  1193. decodeMVWithShape (pmbmd, iMBX, iMBY, pmv);
  1194. if(pmbmd->m_bhas4MVForward)
  1195. padMotionVectors(pmbmd,pmv);
  1196. }
  1197. if(bMBBackup){
  1198. copyRefShapeToMb(m_ppxlcCurrMBBY, ppxlcCurrQMBBYBackup);
  1199. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  1200. pmbmdBackup->m_bPadded = FALSE;
  1201. if(iMBXBackup > 0) (pmbmdBackup-1)->m_bPadded = bPaddedLBackup;
  1202. if(iMBYBackup > 0) (pmbmdBackup-m_iNumMBX)->m_bPadded = bPaddedTBackup;
  1203. if (pmbmdBackup->m_rgTranspStatus [0] != ALL) {
  1204. if (pmbmdBackup->m_dctMd == INTER || pmbmdBackup->m_dctMd == INTERQ) {
  1205.   motionCompMB (
  1206. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  1207. pmvBackup, pmbmdBackup, 
  1208. iMBXBackup, iMBYBackup, 
  1209. x, y,
  1210. pmbmdBackup->m_bSkip, FALSE,
  1211. &m_rctRefVOPY0
  1212. );
  1213. if (!pmbmdBackup->m_bSkip) {
  1214. CoordI iXRefUV, iYRefUV;
  1215. mvLookupUVWithShape (pmbmdBackup, pmvBackup, iXRefUV, iYRefUV);
  1216. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,
  1217. x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);
  1218. addErrorAndPredToCurrQ (ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup);
  1219. }
  1220. else {
  1221. if (m_volmd.bAdvPredDisable)
  1222. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, &m_rctRefVOPY0);
  1223. else
  1224. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, &m_rctRefVOPY0);
  1225. }
  1226. }
  1227. if (pmbmdBackup->m_rgTranspStatus [0] == PARTIAL)
  1228. mcPadCurrMB (ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, ppxlcCurrQMBABackup);
  1229. padNeighborTranspMBs (
  1230. iMBXBackup, iMBYBackup,
  1231. pmbmdBackup,
  1232. ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, ppxlcCurrQMBABackup
  1233. );
  1234. }
  1235. else {
  1236. padCurrAndTopTranspMBFromNeighbor (
  1237. iMBXBackup, iMBYBackup,
  1238. pmbmdBackup,
  1239. ppxlcCurrQMBYBackup, ppxlcCurrQMBUBackup, ppxlcCurrQMBVBackup, ppxlcCurrQMBABackup
  1240. );
  1241. }
  1242. bMBBackup = FALSE;
  1243. }
  1244. pmbmd++;
  1245. pmv += PVOP_MV_PER_REF_PER_MB;
  1246. pmvBY++;
  1247. mbn++;
  1248. piMCBPC++;
  1249. ppxlcCurrQMBBY += MB_SIZE;
  1250. ppxlcCurrQMBBUV += BLOCK_SIZE;
  1251. if(iMBX == m_iNumMBX - 1) {
  1252. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  1253. ppxlcCurrQBUV += m_iFrameWidthUVxBlkSize;
  1254. }
  1255. assert(mbn<=(m_iNumMBX*m_iNumMBY));
  1256. } while( !checkMotionMarker() );
  1257. m_pbitstrmIn -> getBits (NUMBITS_DP_MOTION_MARKER);
  1258. pmbmd = pmbmdFirst;
  1259. piMCBPC = piMCBPCFirst;
  1260. piIntraDC = piIntraDCFirst;
  1261. for(i=mbnFirst;i<mbn;i++) {
  1262. if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  1263. decodeMBTextureHeadOfPVOP_DataPartitioning (pmbmd, iCurrentQP, piMCBPC, piIntraDC, bRestartDelayedQP);
  1264. }
  1265. pmbmd++;
  1266. piMCBPC++;
  1267. piIntraDC += V_BLOCK;
  1268. }
  1269. pmbmd = pmbmdFirst;
  1270. pmv = pmvFirst;
  1271. piIntraDC = piIntraDCFirst;
  1272. ppxlcCurrQBY = (PixelC*) m_pvopcRefQ1->pixelsBY () + m_iStartInRefToCurrRctY + (mbnFirst/m_iNumMBX)*m_iFrameWidthYxMBSize;
  1273. ppxlcCurrQBUV = (PixelC*) m_pvopcRefQ1->pixelsBUV () + m_iStartInRefToCurrRctUV + (mbnFirst/m_iNumMBX)*m_iFrameWidthUVxBlkSize;
  1274. ppxlcCurrQMBBY = ppxlcCurrQBY + (mbnFirst%m_iNumMBX)*MB_SIZE;
  1275. ppxlcCurrQMBBUV = ppxlcCurrQBUV + (mbnFirst%m_iNumMBX)*BLOCK_SIZE;
  1276. for(i=mbnFirst;i<mbn;i++) {
  1277. pmbmd->m_bPadded = FALSE;
  1278. iMBX = i % m_iNumMBX;
  1279. iMBY = i / m_iNumMBX;
  1280. if(iMBX == 0 ) {
  1281. ppxlcCurrQMBY = ppxlcCurrQY;
  1282. ppxlcCurrQMBU = ppxlcCurrQU;
  1283. ppxlcCurrQMBV = ppxlcCurrQV;
  1284. ppxlcCurrQMBBY = ppxlcCurrQBY;
  1285. ppxlcCurrQMBA  = ppxlcCurrQA;
  1286. ppxlcCurrQMBBUV = ppxlcCurrQBUV;
  1287. x = m_rctCurrVOPY.left;
  1288. if(iMBY != 0) y += MB_SIZE;
  1289. } else {
  1290. x += MB_SIZE;
  1291. }
  1292. copyRefShapeToMb(m_ppxlcCurrMBBY, ppxlcCurrQMBBY);
  1293. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  1294. if (pmbmd->m_rgTranspStatus [0] != ALL && m_volmd.bShapeOnly==FALSE) {
  1295. if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)
  1296. decodeTextureIntraMB_DataPartitioning (pmbmd, iMBX, iMBY, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, piIntraDC);
  1297. else {
  1298. if (!pmbmd->m_bSkip)
  1299. decodeTextureInterMB (pmbmd);
  1300. }
  1301. }
  1302. if(i==mbn-1){
  1303. bMBBackup = TRUE;
  1304. pmbmdBackup = pmbmd;
  1305. pmvBackup = pmv;
  1306. iMBXBackup = iMBX;
  1307. iMBYBackup = iMBY;
  1308. ppxlcCurrQMBYBackup = ppxlcCurrQMBY;
  1309. ppxlcCurrQMBUBackup = ppxlcCurrQMBU;
  1310. ppxlcCurrQMBVBackup = ppxlcCurrQMBV;
  1311. ppxlcCurrQMBBYBackup = ppxlcCurrQMBBY;
  1312. ppxlcCurrQMBBUVBackup = ppxlcCurrQMBBUV;
  1313. ppxlcCurrQMBABackup = ppxlcCurrQMBA;
  1314. bPaddedLBackup = (pmbmdBackup-1)->m_bPadded;
  1315. bPaddedTBackup = (pmbmdBackup-m_iNumMBX)->m_bPadded;
  1316. }
  1317. if (pmbmd->m_rgTranspStatus [0] != ALL) {
  1318. if (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) {
  1319. // Addded for data partitioning mode by Toshiba(1997-11-26:DP+RVLC)
  1320.   motionCompMB (
  1321. m_ppxlcPredMBY, m_pvopcRefQ0->pixelsY (),
  1322. pmv, pmbmd, 
  1323. iMBX, iMBY, 
  1324. x, y,
  1325. pmbmd->m_bSkip, FALSE,
  1326. &m_rctRefVOPY0
  1327. );
  1328. if (!pmbmd->m_bSkip) {
  1329. CoordI iXRefUV, iYRefUV;
  1330. mvLookupUVWithShape (pmbmd, pmv, iXRefUV, iYRefUV);
  1331. motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0,
  1332. x, y, iXRefUV, iYRefUV, m_vopmd.iRoundingControl,&m_rctRefVOPY0);
  1333. addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV);
  1334. }
  1335. else {
  1336. if (m_volmd.bAdvPredDisable)
  1337. copyFromRefToCurrQ (m_pvopcRefQ0, x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
  1338. else
  1339. copyFromPredForYAndRefForCToCurrQ (x, y, ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, &m_rctRefVOPY0);
  1340. }
  1341. }
  1342. if (pmbmd->m_rgTranspStatus [0] == PARTIAL)
  1343. mcPadCurrMB (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA);
  1344. padNeighborTranspMBs (
  1345. iMBX, iMBY,
  1346. pmbmd,
  1347. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1348. );
  1349. }
  1350. else {
  1351. padCurrAndTopTranspMBFromNeighbor (
  1352. iMBX, iMBY,
  1353. pmbmd,
  1354. ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV, ppxlcCurrQMBA
  1355. );
  1356. }
  1357. pmbmd++;
  1358. pmv += PVOP_MV_PER_REF_PER_MB;
  1359. piIntraDC += V_BLOCK;
  1360. ppxlcCurrQMBY += MB_SIZE;
  1361. ppxlcCurrQMBU += BLOCK_SIZE;
  1362. ppxlcCurrQMBV += BLOCK_SIZE;
  1363. ppxlcCurrQMBBY += MB_SIZE;
  1364. ppxlcCurrQMBBUV += BLOCK_SIZE;
  1365. ppxlcCurrQMBA += MB_SIZE;
  1366. if(iMBX == m_iNumMBX - 1) {
  1367. MacroBlockMemory** ppmbmTemp = m_rgpmbmAbove;
  1368. m_rgpmbmAbove = m_rgpmbmCurr;
  1369. m_rgpmbmCurr  = ppmbmTemp;
  1370. ppxlcCurrQY += m_iFrameWidthYxMBSize;
  1371. ppxlcCurrQU += m_iFrameWidthUVxBlkSize;
  1372. ppxlcCurrQV += m_iFrameWidthUVxBlkSize;
  1373. ppxlcCurrQBY += m_iFrameWidthYxMBSize;
  1374. ppxlcCurrQBUV += m_iFrameWidthYxBlkSize;
  1375. ppxlcCurrQA  += m_iFrameWidthYxMBSize;
  1376. }
  1377. }
  1378. } while( checkResyncMarker() );
  1379. delete m_piIntraDC;
  1380. delete m_piMCBPC;
  1381. }
  1382. // End Toshiba