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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Wei-ge Chen (wchen@microsoft.com), Microsoft Corporation
  4. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  5. Simon Winder (swinder@microsoft.com), Microsoft Corporation
  6. (date: July, 1997)
  7. and edited by
  8. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  9. Takeshi Nagai (TOSHIBA CORPORATION)
  10. Toshiaki Watanabe (TOSHIBA CORPORATION)
  11. Noboru Yamaguchi (TOSHIBA CORPORATION)
  12. and also edited by
  13. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  14. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  15. (date: July, 1998)
  16. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  17. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  18. as specified by the MPEG-4 Video. 
  19. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  20. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  21. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  22. The original developer of this software module and his/her company, 
  23. the subsequent editors and their companies, 
  24. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  25. Copyright is not released for non MPEG-4 Video conforming products. 
  26. Microsoft retains full right to use the code for his/her own purpose, 
  27. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  28. This copyright notice must be included in all copies or derivative works. 
  29. Copyright (c) 1996, 1997.
  30. Module Name:
  31. MBHeadDec.cpp
  32. Abstract:
  33. MacroBlock overhead decoder
  34. Revision History:
  35. This software module was edited by
  36. Hiroyuki Katata (katata@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  37. Norio Ito (norio@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  38. Shuichi Watanabe (watanabe@imgsl.mkhar.sharp.co.jp), Sharp Corporation
  39. (date: October, 1997)
  40. for object based temporal scalability.
  41.     
  42. Dec 20, 1997: Interlaced tools added by NextLevel Systems (GI)
  43.                     X. Chen (xchen@nlvl.com), B. Eifrig (beifrig@nlvl.com)
  44. *************************************************************************/
  45. #include "typeapi.h"
  46. #include "codehead.h"
  47. #include "mode.hpp"
  48. #include "global.hpp"
  49. #include "entropy/bitstrm.hpp"
  50. #include "entropy/entropy.hpp"
  51. #include "entropy/huffman.hpp"
  52. #include "vopses.hpp"
  53. #include "vopsedec.hpp"
  54. #ifdef __MFC_
  55. #ifdef _DEBUG
  56. #undef THIS_FILE
  57. static char BASED_CODE THIS_FILE[] = __FILE__;
  58. #endif
  59. #define new DEBUG_NEW    
  60. #endif // __MFC_
  61. Void CVideoObjectDecoder::decodeMBTextureHeadOfIVOP (CMBMode* pmbmd, Int& iCurrentQP,
  62.  Bool &bUseNewQPForVlcThr)
  63. {
  64. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  65. Int iBlk = 0, cNonTrnspBlk = 0;
  66. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  67. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  68. cNonTrnspBlk++;
  69. }
  70. Int iCBPC = 0;
  71. Int iCBPY = 0;
  72. //fprintf(stderr,"[%x]",m_pbitstrmIn->peekBits(32));
  73. Int iMCBPC = m_pentrdecSet->m_pentrdecMCBPCintra->decodeSymbol ();
  74. //fprintf(stderr,"MCBPC = %dn",iMCBPC);
  75. assert (iMCBPC >= 0 && iMCBPC <= 7);
  76. pmbmd->m_dctMd = INTRA;
  77. pmbmd->m_bSkip = FALSE; //reset for direct mode 
  78. if (iMCBPC > 3)
  79. pmbmd->m_dctMd = INTRAQ;
  80. iCBPC = iMCBPC % 4;
  81. // pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1);
  82.     if (!short_video_header) {
  83. pmbmd->m_bACPrediction = m_pbitstrmIn->getBits(1);
  84. }
  85. switch (cNonTrnspBlk) {
  86. case 1:
  87. iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  88. break;
  89. case 2:
  90. iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  91. break;
  92. case 3:
  93. iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  94. break;
  95. case 4:
  96. iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  97. break;
  98. default:
  99. assert (FALSE);
  100. }
  101. //fprintf(stderr,"CBPY=%dn",iCBPY);
  102. setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
  103. pmbmd->m_stepSize = iCurrentQP;
  104. pmbmd->m_stepSizeDelayed = iCurrentQP;
  105. if (pmbmd->m_dctMd == INTRAQ) {
  106. Int iDQUANT = m_pbitstrmIn->getBits (2);
  107. switch (iDQUANT) {
  108. case 0:
  109. pmbmd->m_intStepDelta = -1;
  110. break;
  111. case 1:
  112. pmbmd->m_intStepDelta = -2;
  113. break;
  114. case 2:
  115. pmbmd->m_intStepDelta = 1;
  116. break;
  117. case 3:
  118. pmbmd->m_intStepDelta = 2;
  119. break;
  120. default:
  121. assert (FALSE);
  122. }
  123. pmbmd->m_stepSize += pmbmd->m_intStepDelta;
  124. if(bUseNewQPForVlcThr)
  125. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  126. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  127. checkrange (pmbmd->m_stepSize, 1, iQuantMax);
  128. iCurrentQP = pmbmd->m_stepSize;
  129. }
  130. // gets set to true at start of vop / packet header
  131. bUseNewQPForVlcThr = FALSE; // set to false once we decoded a macroblock
  132. pmbmd->m_bSkip = FALSE;
  133. pmbmd->m_bFieldMV = 0;
  134. if (m_vopmd.bInterlace)
  135. pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type
  136. }
  137. Void CVideoObjectDecoder::decodeMBAlphaHeadOfIVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA, Int iVopQP, Int iVopQPA)
  138. {
  139. // update alpha quantiser
  140. if(!m_volmd.bNoGrayQuantUpdate)
  141. {
  142. iCurrQPA = (iCurrQP * iVopQPA) / iVopQP;
  143. if(iCurrQPA<1)
  144. iCurrQPA = 1;
  145. }
  146. pmbmd->m_stepSizeAlpha = iCurrQPA;
  147. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  148. // coded
  149. Int iCODA = m_pbitstrmIn->getBits (1);
  150. pmbmd->m_CODAlpha = iCODA ? ALPHA_ALL255 : ALPHA_CODED;
  151. if(iCODA)
  152. return;
  153. // intra prediction for ac
  154. pmbmd->m_bACPredictionAlpha = m_pbitstrmIn->getBits (1);
  155. // decode CBPA
  156. Int iBlk = 0, cNonTrnspBlk = 0;
  157. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  158. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  159. cNonTrnspBlk++;
  160. }
  161. Int iCBPA = 0;
  162. switch (cNonTrnspBlk) {
  163. case 1:
  164. iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  165. break;
  166. case 2:
  167. iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  168. break;
  169. case 3:
  170. iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  171. break;
  172. case 4:
  173. iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  174. break;
  175. default:
  176. assert (FALSE);
  177. }
  178. Int iBitPos = 1;
  179. for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
  180. if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
  181. pmbmd->setCodedBlockPattern (
  182. (BlockNum) iBlk, 
  183. (iCBPA >> (cNonTrnspBlk - iBitPos)) & 1
  184. );
  185. iBitPos++;
  186. }
  187. else
  188. pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
  189. }
  190. }
  191. // Inter
  192. Void CVideoObjectDecoder::decodeMBTextureHeadOfPVOP (CMBMode* pmbmd, Int& iCurrentQP,
  193.  Bool &bUseNewQPForVlcThr)
  194. {
  195. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  196. Int iBlk = 0, cNonTrnspBlk = 0;
  197. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  198. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  199. cNonTrnspBlk++;
  200. }
  201. Int iCBPC = 0;
  202. Int iCBPY = 0;
  203. pmbmd->m_bSkip = m_pbitstrmIn->getBits (1);
  204. if (!pmbmd->m_bSkip) {
  205. Int iMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol ();
  206. assert (iMCBPC >= 0 && iMCBPC <= 20);
  207. Int iMBtype = iMCBPC / 4; //per H.263's MBtype
  208. pmbmd -> m_bFieldMV = FALSE;
  209. switch (iMBtype) {
  210. case 0:
  211. pmbmd->m_dctMd = INTER;
  212. pmbmd -> m_bhas4MVForward = FALSE;
  213. break;
  214. case 1:
  215. pmbmd->m_dctMd = INTERQ;
  216. pmbmd -> m_bhas4MVForward = FALSE;
  217. break;
  218. case 2:
  219. pmbmd -> m_dctMd = INTER;
  220. pmbmd -> m_bhas4MVForward = TRUE;
  221. break;
  222. case 3:
  223. pmbmd->m_dctMd = INTRA;
  224. break;
  225. case 4:
  226. pmbmd->m_dctMd = INTRAQ;
  227. break;
  228. default:
  229. assert (FALSE);
  230. }
  231. iCBPC = iMCBPC % 4;
  232. if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) {
  233. // pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1); 
  234. if (!short_video_header) {  
  235. pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1); 
  236. switch (cNonTrnspBlk) {
  237. case 1:
  238. iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  239. break;
  240. case 2:
  241. iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  242. break;
  243. case 3:
  244. iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  245. break;
  246. case 4:
  247. iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  248. break;
  249. default:
  250. assert (FALSE);
  251. }
  252. }
  253. else {
  254. switch (cNonTrnspBlk) {
  255. case 1:
  256. iCBPY = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  257. break;
  258. case 2:
  259. iCBPY = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  260. break;
  261. case 3:
  262. iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  263. break;
  264. case 4:
  265. iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  266. break;
  267. default:
  268. assert (FALSE);
  269. }
  270. }
  271. assert (iCBPY >= 0 && iCBPY <= 15);
  272. }
  273. else { //skipped
  274. pmbmd->m_dctMd = INTER;
  275. pmbmd -> m_bhas4MVForward = FALSE;
  276. pmbmd -> m_bFieldMV = FALSE;
  277. }
  278. setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
  279. pmbmd->m_stepSize = iCurrentQP;
  280. pmbmd->m_stepSizeDelayed = iCurrentQP;
  281. if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) {
  282. assert (!pmbmd->m_bSkip);
  283. Int iDQUANT = m_pbitstrmIn->getBits (2);
  284. switch (iDQUANT) {
  285. case 0:
  286. pmbmd->m_intStepDelta = -1;
  287. break;
  288. case 1:
  289. pmbmd->m_intStepDelta = -2;
  290. break;
  291. case 2:
  292. pmbmd->m_intStepDelta = 1;
  293. break;
  294. case 3:
  295. pmbmd->m_intStepDelta = 2;
  296. break;
  297. default:
  298. assert (FALSE);
  299. }
  300. pmbmd->m_stepSize += pmbmd->m_intStepDelta;
  301. if(bUseNewQPForVlcThr) // need to prevent delay of quantiser
  302. pmbmd->m_stepSizeDelayed = pmbmd->m_stepSize;
  303. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  304. checkrange (pmbmd->m_stepSize, 1, iQuantMax);
  305. iCurrentQP = pmbmd->m_stepSize;
  306. }
  307. if(!pmbmd->m_bSkip)
  308. {
  309. // gets set to true at start of vop / packet header
  310. bUseNewQPForVlcThr = FALSE; // set to false once we decoded a non-skipped macroblock
  311. }
  312. // INTERLACE
  313. if (m_vopmd.bInterlace && !pmbmd->m_bSkip) {
  314. if ((pmbmd->m_dctMd == INTRA) || (pmbmd->m_dctMd == INTRAQ) || (iCBPY || iCBPC)) 
  315. pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type
  316. else
  317. pmbmd->m_bFieldDCT = FALSE;
  318. if (((pmbmd->m_dctMd == INTERQ) || (pmbmd->m_dctMd == INTER)) && (pmbmd -> m_bhas4MVForward == FALSE)) {
  319. pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1); // get field_prediction
  320. if (pmbmd->m_bFieldMV == TRUE) {
  321. pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1); // get top field reference
  322. pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1); // get bottom field reference
  323. }
  324. }
  325. }
  326. // ~INTERLACE
  327. }
  328. // B-VOP
  329. Void CVideoObjectDecoder::decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int& iCurrQP)
  330. {
  331. assert (pmbmd -> m_rgTranspStatus [0] != ALL);
  332. pmbmd -> m_bhas4MVForward = pmbmd -> m_bhas4MVBackward = FALSE;
  333. Int iBlk = 0, cNonTrnspBlk = 0;
  334. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  335. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  336. cNonTrnspBlk++;
  337. }
  338. Int iMODB = 0;
  339. //Int iMCBPC = 0;
  340. Int iCBPC = 0;
  341. Int iCBPY = 0;
  342. Int iMbType = -1, uiCBPB = 0;
  343. if (m_pbitstrmIn->getBits (1) == 1)  { //MODB=1 colocated non-skip but curr skip
  344. pmbmd->m_bSkip = TRUE;  
  345. iMODB = 0;
  346. pmbmd->m_mbType = (!(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0))? DIRECT : FORWARD;
  347. pmbmd->m_dctMd = INTER;
  348. if(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0)
  349. return;
  350. }
  351. else if (m_pbitstrmIn->getBits (1) == 1) { //MODB="01"
  352. pmbmd->m_bSkip = FALSE;
  353. if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0))
  354. iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol ();
  355. else {
  356. if (m_pbitstrmIn->getBits (1) == 1)
  357. iMbType = FORWARD;
  358. else if (m_pbitstrmIn->getBits (1) == 1)
  359. iMbType = INTERPOLATE;
  360. else if (m_pbitstrmIn->getBits (1) == 1)
  361. iMbType = BACKWARD;
  362. else {
  363. fprintf(stderr,"MB Type 0000 does not exsit.n");
  364. exit(2);
  365. }
  366. }
  367. assert (iMbType >= 0 && iMbType <= 3);
  368. pmbmd->m_mbType = (MBType) iMbType;
  369. iMODB = 1;
  370. } //MODB="00"
  371. else {
  372. pmbmd->m_bSkip = FALSE;
  373. if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0))
  374. iMbType = m_pentrdecSet->m_pentrdecMbTypeBVOP->decodeSymbol ();
  375. else {
  376. if (m_pbitstrmIn->getBits (1) == 1)
  377. iMbType = FORWARD;
  378. else if (m_pbitstrmIn->getBits (1) == 1)
  379. iMbType = INTERPOLATE;
  380. else if (m_pbitstrmIn->getBits (1) == 1)
  381. iMbType = BACKWARD;
  382. else{
  383. fprintf(stderr,"MB Type 0000 is not exsit.n");
  384. exit(2);
  385. }
  386. }
  387. assert (iMbType >= 0 && iMbType <= 3);
  388. pmbmd->m_mbType = (MBType) iMbType;
  389. iMODB = 2;
  390. uiCBPB = m_pbitstrmIn->getBits (cNonTrnspBlk + 2);
  391. pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; //this is okay; will be reset later
  392. //Only one mv for B-VOP except direct mode (will be reset in mvdec.cpp)
  393. iCBPC = uiCBPB & 0x0003;
  394. iCBPY = (uiCBPB >> 2) & 0x000F;
  395. pmbmd->m_stepSize = iCurrQP;
  396. if (pmbmd->m_mbType != DIRECT) {
  397. Int DQUANT;
  398. if (m_pbitstrmIn->getBits (1) == 0)
  399. DQUANT = 0;
  400. else if (m_pbitstrmIn->getBits (1) == 0)
  401. DQUANT = -2;
  402. else
  403. DQUANT = 2;
  404. pmbmd->m_intStepDelta = DQUANT;
  405. pmbmd->m_stepSize += pmbmd->m_intStepDelta;
  406. Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
  407.             pmbmd->m_stepSize = checkrange (pmbmd->m_stepSize, 1, iQuantMax); 
  408. iCurrQP = pmbmd->m_stepSize;
  409. }
  410. }
  411. setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);
  412. if (pmbmd->m_mbType == DIRECT)
  413. pmbmd->m_dctMd = INTER; //direct mode doesn't have dquant
  414. else
  415. pmbmd->m_dctMd = INTERQ; //meaningless in B_VOP 'cause DQUANT is always sent
  416. // INTERLACE
  417. pmbmd->m_bFieldDCT = FALSE;
  418. pmbmd->m_bFieldMV = FALSE;
  419. if (m_vopmd.bInterlace) {
  420. if (uiCBPB != 0)
  421. pmbmd->m_bFieldDCT = m_pbitstrmIn->getBits (1); // get dct_type
  422. if (pmbmd->m_mbType != DIRECT) {
  423. pmbmd->m_bFieldMV = m_pbitstrmIn->getBits (1);
  424. if (pmbmd->m_bFieldMV) {
  425. if (pmbmd->m_mbType != BACKWARD) {
  426. pmbmd->m_bForwardTop = m_pbitstrmIn->getBits (1);
  427. pmbmd->m_bForwardBottom = m_pbitstrmIn->getBits (1);
  428. }
  429. if (pmbmd->m_mbType != FORWARD) {
  430. pmbmd->m_bBackwardTop = m_pbitstrmIn->getBits (1);
  431. pmbmd->m_bBackwardBottom = m_pbitstrmIn->getBits (1);
  432. }
  433. }
  434. }
  435. }
  436. // ~INTERLACE
  437. }
  438. Void CVideoObjectDecoder::decodeMBAlphaHeadOfPVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA)
  439. {
  440. if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)
  441. {
  442. decodeMBAlphaHeadOfIVOP(pmbmd, iCurrQP, iCurrQPA, m_vopmd.intStep, m_vopmd.intStepPAlpha);
  443. }
  444. else
  445. {
  446. // update alpha quantiser
  447. if(!m_volmd.bNoGrayQuantUpdate)
  448. {
  449. iCurrQPA = (iCurrQP * m_vopmd.intStepPAlpha) / m_vopmd.intStep;
  450. if(iCurrQPA<1)
  451. iCurrQPA = 1;
  452. }
  453. pmbmd->m_stepSizeAlpha = iCurrQPA;
  454. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  455. if(m_pbitstrmIn->getBits (1) == 0)  {
  456. if(m_pbitstrmIn->getBits (1) == 0)
  457. pmbmd->m_CODAlpha = ALPHA_CODED;
  458. else
  459. pmbmd->m_CODAlpha = ALPHA_ALL255;
  460. }
  461. else
  462. pmbmd->m_CODAlpha = ALPHA_SKIPPED;
  463. if(pmbmd->m_CODAlpha!=ALPHA_CODED)
  464. return;
  465. Int iBlk = 0, cNonTrnspBlk = 0;
  466. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  467. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  468. cNonTrnspBlk++;
  469. }
  470. Int iCBPA = 0;
  471. switch (cNonTrnspBlk) {
  472. case 1:
  473. iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  474. break;
  475. case 2:
  476. iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  477. break;
  478. case 3:
  479. iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  480. break;
  481. case 4:
  482. iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  483. break;
  484. default:
  485. assert (FALSE);
  486. }
  487. Int iBitPos = 1;
  488. for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
  489. if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
  490. pmbmd->setCodedBlockPattern (
  491. (BlockNum) iBlk, 
  492. (iCBPA >> (cNonTrnspBlk - iBitPos)) & 1
  493. );
  494. iBitPos++;
  495. }
  496. else
  497. pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
  498. }
  499. }
  500. }
  501. Void CVideoObjectDecoder::decodeMBAlphaHeadOfBVOP (CMBMode* pmbmd, Int iCurrQP, Int iCurrQPA)
  502. {
  503. // update alpha quantiser
  504. if(!m_volmd.bNoGrayQuantUpdate)
  505. {
  506. iCurrQPA = (iCurrQP * m_vopmd.intStepBAlpha) / m_vopmd.intStepB;
  507. if(iCurrQPA<1)
  508. iCurrQPA = 1;
  509. }
  510. pmbmd->m_stepSizeAlpha = iCurrQPA;
  511. assert (pmbmd->m_rgTranspStatus [0] != ALL);
  512. if(m_pbitstrmIn->getBits (1) == 0)  {
  513. if(m_pbitstrmIn->getBits (1) == 0)
  514. pmbmd->m_CODAlpha = ALPHA_CODED;
  515. else
  516. pmbmd->m_CODAlpha = ALPHA_ALL255;
  517. }
  518. else
  519. pmbmd->m_CODAlpha = ALPHA_SKIPPED;
  520. if(pmbmd->m_CODAlpha!=ALPHA_CODED)
  521. return;
  522. Int iBlk = 0, cNonTrnspBlk = 0;
  523. for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {
  524. if (pmbmd->m_rgTranspStatus [iBlk] != ALL)
  525. cNonTrnspBlk++;
  526. }
  527. Int iCBPA = 0;
  528. switch (cNonTrnspBlk) {
  529. case 1:
  530. iCBPA = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();
  531. break;
  532. case 2:
  533. iCBPA = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();
  534. break;
  535. case 3:
  536. iCBPA = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();
  537. break;
  538. case 4:
  539. iCBPA = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();
  540. break;
  541. default:
  542. assert (FALSE);
  543. }
  544. Int iBitPos = 1;
  545. for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
  546. if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
  547. pmbmd->setCodedBlockPattern (
  548. (BlockNum) iBlk, 
  549. (iCBPA >> (cNonTrnspBlk - iBitPos)) & 1
  550. );
  551. iBitPos++;
  552. }
  553. else
  554. pmbmd->setCodedBlockPattern ((BlockNum) iBlk, 0);
  555. }
  556. }