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

流媒体/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. (date: July, 1997)
  8. and edited by
  9.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  10. and also edited by
  11. Yoshihiro Kikuchi (TOSHIBA CORPORATION)
  12. Takeshi Nagai (TOSHIBA CORPORATION)
  13. Toshiaki Watanabe (TOSHIBA CORPORATION)
  14. Noboru Yamaguchi (TOSHIBA CORPORATION)
  15. and also edited by
  16. Dick van Smirren (D.vanSmirren@research.kpn.com), KPN Research
  17. Cor Quist (C.P.Quist@research.kpn.com), KPN Research
  18. (date: July, 1998)
  19. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  20. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  21. as specified by the MPEG-4 Video. 
  22. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  23. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  24. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  25. The original developer of this software module and his/her company, 
  26. the subsequent editors and their companies, 
  27. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  28. Copyright is not released for non MPEG-4 Video conforming products. 
  29. Microsoft retains full right to use the code for his/her own purpose, 
  30. assign or donate the code to a third party and to inhibit third parties from using the code for non <MPEG standard> conforming products. 
  31. This copyright notice must be included in all copies or derivative works. 
  32. Copyright (c) 1996, 1997.
  33. Module Name:
  34. blkdec.cpp
  35. Abstract:
  36. Block decoding functions
  37. Revision History
  38.     Dec 20, 1977    Interlaced tools added by NextLevel Systems
  39. *************************************************************************/
  40. #include <stdlib.h>
  41. #include <math.h>
  42. #include "typeapi.h"
  43. #include "codehead.h"
  44. #include "mode.hpp"
  45. #include "global.hpp"
  46. #include "entropy/bitstrm.hpp"
  47. #include "entropy/entropy.hpp"
  48. #include "entropy/huffman.hpp"
  49. #include "grayf.hpp"
  50. #include "dct.hpp"
  51. #include "vopses.hpp"
  52. #include "vopsedec.hpp"
  53. #ifdef __MFC_
  54. #ifdef _DEBUG
  55. #undef THIS_FILE
  56. static char BASED_CODE THIS_FILE[] = __FILE__;
  57. #endif
  58. #define new DEBUG_NEW    
  59. #endif // __MFC_
  60. Void CVideoObjectDecoder::decodeIntraBlockTexture (PixelC* rgpxlcBlkDst,
  61.  Int iWidthDst,
  62.  Int iQP, 
  63.  Int iDcScaler,
  64.  Int iBlk,
  65.  MacroBlockMemory* pmbmCurr,
  66.  CMBMode* pmbmd,
  67.    const BlockMemory blkmPred,
  68.  Int iQpPred)
  69. {
  70. Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
  71. Int iCoefStart = 0; // intra-DC 
  72. //UInt nBits = m_volmd.nBits; // NBIT
  73. // Added for short headers by KPN (1998-02-07, DS)
  74.  
  75. if (short_video_header==1) // short_header
  76. {
  77. decodeShortHeaderIntraMBDC(rgiCoefQ); // 8 bits FLC & fixed quantizer op 8.
  78. iCoefStart++;
  79. }
  80. else 
  81. {  
  82. if (iBlk<=V_BLOCK && pmbmd->m_bCodeDcAsAc==FALSE
  83. || iBlk>=A_BLOCK1 && pmbmd->m_bCodeDcAsAcAlpha==FALSE) {
  84. rgiCoefQ [0] = decodeIntraDCmpeg (iBlk <= Y_BLOCK4 || iBlk >=A_BLOCK1);
  85. iCoefStart++;
  86. }
  87. // Added for short headers by KPN - END
  88. if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
  89. Int* rgiZigzag = grgiStandardZigzag;
  90.     if (m_vopmd.bAlternateScan && iBlk<=V_BLOCK) // 12.22.98 Changes
  91.             rgiZigzag = grgiVerticalZigzag;
  92.         else if (iBlk<=V_BLOCK && pmbmd->m_bACPrediction
  93. || iBlk >= A_BLOCK1 && pmbmd->m_bACPredictionAlpha)
  94. rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;
  95.   // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  96.   if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)
  97.   decodeIntraRVLCTCOEF (rgiCoefQ, iCoefStart, rgiZigzag);
  98.   else
  99. // End Toshiba(1998-1-16:DP+RVLC)
  100. decodeIntraTCOEF (rgiCoefQ, iCoefStart, rgiZigzag);
  101. }
  102. else
  103. memset (rgiCoefQ + iCoefStart, 0, sizeof (Int) * (BLOCK_SQUARE_SIZE - iCoefStart));
  104. inverseDCACPred (pmbmd, iBlk - 1, rgiCoefQ, iQP, iDcScaler, blkmPred, iQpPred);
  105. // Added for short headers by KPN (1998-02-07, DS)
  106. if (short_video_header) inverseQuantizeIntraDc(rgiCoefQ,8); 
  107. else inverseQuantizeIntraDc (rgiCoefQ, iDcScaler); 
  108. // Added for short headers by KPN - END
  109. if (m_volmd.fQuantizer == Q_H263)
  110. inverseQuantizeDCTcoefH263 (rgiCoefQ, 1, iQP);
  111. else
  112. inverseQuantizeIntraDCTcoefMPEG (rgiCoefQ, 1, iQP, iBlk>=A_BLOCK1);
  113. Int i, j; //save coefQ (ac) for intra pred
  114. pmbmCurr->rgblkm [iBlk - 1] [0] = m_rgiDCTcoef [0]; //save recon value of DC for intra pred //save Qcoef in memory
  115. for (i = 1, j = 8; i < BLOCK_SIZE; i++, j += BLOCK_SIZE) {
  116. pmbmCurr->rgblkm [iBlk - 1] [i] = rgiCoefQ [i];
  117. pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = rgiCoefQ [j];
  118. }
  119. // this idct includes output clipping 0 -> (2**nbits-1)
  120. m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);
  121. }
  122. Void CVideoObjectDecoder::decideIntraPred (const BlockMemory& blkmRet, 
  123.    CMBMode* pmbmdCurr,
  124.    Int& iQPpred,
  125.    BlockNum blkn,    
  126.    const MacroBlockMemory* pmbmLeft, 
  127.       const MacroBlockMemory* pmbmTop, 
  128.    const MacroBlockMemory* pmbmLeftTop,
  129.    const MacroBlockMemory* pmbmCurr,
  130.    const CMBMode* pmbmdLeft,
  131.    const CMBMode* pmbmdTop,
  132.    const CMBMode* pmbmdLeftTop)
  133. {
  134. Int iQPpredTop, iQPpredLeftTop, iQPpredLeft;
  135. const BlockMemory blkmTop = findPredictorBlock (blkn, VERTICAL,   pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, iQPpredTop);
  136. const BlockMemory blkmLeftTop = findPredictorBlock (blkn, DIAGONAL,   pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, iQPpredLeftTop);
  137. const BlockMemory blkmLeft = findPredictorBlock (blkn, HORIZONTAL, pmbmLeft, pmbmTop, pmbmLeftTop, pmbmCurr, pmbmdLeft, pmbmdTop, pmbmdLeftTop, pmbmdCurr, iQPpredLeft);
  138. Int iDefVal = 1<<(m_volmd.nBits+2); // NBIT
  139. Int iPredLeftTop = (blkmLeftTop == NULL) ? iDefVal : blkmLeftTop [0];
  140. Int iHorizontalGrad = ((blkmTop  == NULL) ? iDefVal : blkmTop  [0]) - iPredLeftTop;
  141. Int iVerticalGrad = ((blkmLeft == NULL) ? iDefVal : blkmLeft [0]) - iPredLeftTop;
  142. blkmRet = NULL;
  143. if (abs(iVerticalGrad)  < abs (iHorizontalGrad)) {
  144. pmbmdCurr->m_preddir [blkn - 1] = VERTICAL;
  145. if (blkmTop != NULL) {
  146. blkmRet = blkmTop;
  147. iQPpred = iQPpredTop;
  148. }
  149. }
  150. else {
  151. pmbmdCurr->m_preddir [blkn - 1] = HORIZONTAL;
  152. if (blkmLeft != NULL) {
  153. blkmRet = blkmLeft;
  154. iQPpred = iQPpredLeft;
  155. }
  156. }
  157. }
  158. Void CVideoObjectDecoder::decodeTextureInterBlock (Int* rgiBlkCurrQ, Int iWidthDst, Int iQP, Bool bAlphaBlock)
  159. {
  160. Int* rgiCoefQ = m_rgpiCoefQ [0]; //doesn't matter which one to use
  161. // Added for data partitioning mode By Toshiba(1998-1-16:DP+RVLC)
  162. if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)
  163. decodeInterRVLCTCOEF (rgiCoefQ, 0, grgiStandardZigzag);
  164. else
  165. // End Toshiba(1998-1-16:DP+RVLC)
  166. // 12.22.98 begin of changes
  167. decodeInterTCOEF (rgiCoefQ, 0, //else don't add error signal
  168.         (m_vopmd.bAlternateScan&&!bAlphaBlock) ? grgiVerticalZigzag : grgiStandardZigzag);
  169. // 12.22.98 end of changes
  170. if (m_volmd.fQuantizer == Q_H263)
  171. inverseQuantizeDCTcoefH263 (rgiCoefQ, 0, iQP);
  172. else
  173. inverseQuantizeInterDCTcoefMPEG (rgiCoefQ, 0, iQP, bAlphaBlock);
  174. // this idct does not include clipping, but clipping is performed
  175. // in addErrorAndPredToCurrQ to range 0 -> (2**nbits-1)
  176. m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgiBlkCurrQ, iWidthDst);
  177. }
  178. Void CVideoObjectDecoder::decodeIntraTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag)
  179. {
  180. Bool bIsLastRun = FALSE;
  181. Int  iRun = 0;
  182. Int  iLevel = 0;
  183. Int  iCoef = iCoefStart;
  184. Long lIndex;
  185. while (!bIsLastRun) {
  186. // Added for short headers by KPN (1998-02-07, DS)
  187. if (short_video_header) 
  188. { // H.263
  189. lIndex = m_pentrdecSet->m_pentrdecDCT->decodeSymbol();
  190. }
  191. else
  192. { // MPEG-4
  193. lIndex = m_pentrdecSet->m_pentrdecDCTIntra->decodeSymbol();
  194. }
  195. // Added for short headers by KPN - END
  196. if (lIndex != TCOEF_ESCAPE) {
  197. if (short_video_header) // Added by KPN [FDS]
  198. { // short header
  199. Bool tempBool = (Bool) bIsLastRun;
  200. decodeInterVLCtableIndex (lIndex, iLevel, iRun, tempBool); 
  201. bIsLastRun = (Int) tempBool;
  202. }
  203. else 
  204. { // MPEG-4
  205. decodeIntraVLCtableIndex (lIndex, iLevel, iRun, bIsLastRun);
  206. }
  207. }
  208. else {
  209. decodeEscape (iLevel, iRun, bIsLastRun, g_rgiLMAXintra, g_rgiRMAXintra, 
  210.   m_pentrdecSet->m_pentrdecDCTIntra, &CVideoObjectDecoder::decodeIntraVLCtableIndex);
  211. }
  212. //fprintf(stderr,"%d %d %d %dn", lIndex,iLevel,iRun,bIsLastRun);
  213. for (Int i = 0; i < iRun; i++) {
  214. rgiCoefQ [rgiZigzag [iCoef]] = 0;
  215. iCoef++;
  216. }
  217. rgiCoefQ [rgiZigzag [iCoef]] = iLevel;
  218. iCoef++;
  219. }
  220. for (Int i = iCoef; i < BLOCK_SQUARE_SIZE; i++) // fill the rest w/ zero
  221. rgiCoefQ [rgiZigzag [i]]  = 0;
  222. }
  223. Void CVideoObjectDecoder::decodeEscape (Int& iLevel, Int& iRun, Int& bIsLastRun, const Int* rgiLMAX, const Int* rgiRMAX, 
  224.    CEntropyDecoder* pentrdec, DECODE_TABLE_INDEX decodeVLCtableIndex)
  225. {
  226. // Modified by Toshiba(1997-11-14)
  227. if (!short_video_header) { // Added bij KPN [FDS]
  228. if (m_pbitstrmIn->getBits (1) == 0) { //vlc; Level+
  229. //if (m_pbitstrmIn->getBits (1) == 1) { //vlc; Level+
  230. // End Toshiba(1997-11-14)
  231. Int iIndex = pentrdec->decodeSymbol();
  232. (this->*decodeVLCtableIndex) (iIndex, iLevel, iRun, bIsLastRun);
  233. //get level back
  234. Int iLevelPlusAbs = abs (iLevel);
  235. Int iLevelAbs = iLevelPlusAbs + rgiLMAX [(iRun & 0x0000003F) + (bIsLastRun << 6)]; //hashing the table
  236. iLevel = sign(iLevel) * iLevelAbs;
  237. }
  238. // Modified Toshiba(1997-11-14)
  239. else if (m_pbitstrmIn->getBits (1) == 0) { //vlc; Run+
  240. //else if (m_pbitstrmIn->getBits (1) == 1) { //vlc; Run+
  241. // End Toshiba(1997-11-14)
  242. Int iIndex = pentrdec->decodeSymbol();
  243. (this->*decodeVLCtableIndex) (iIndex, iLevel, iRun, bIsLastRun);
  244. iRun = iRun + rgiRMAX [(abs(iLevel) & 0x0000001F) + (bIsLastRun << 5)]; //get run back; RMAX tabl incl. + 1 already
  245. }
  246. else { //flc
  247. bIsLastRun = (Bool) m_pbitstrmIn->getBits (1);
  248. iRun = (Int) m_pbitstrmIn->getBits (NUMBITS_ESC_RUN);
  249. assert (iRun < BLOCK_SQUARE_SIZE);
  250. Int iLevelBits = 12; // = m_volmd.nBits;
  251. Int iMarker = m_pbitstrmIn->getBits (1);
  252. assert(iMarker== 1);
  253. iLevel = (Int) m_pbitstrmIn->getBits (iLevelBits);
  254. iMarker = m_pbitstrmIn->getBits (1);
  255. assert(iMarker ==1);
  256. Int iMaxAC = (1<<(iLevelBits-1)) - 1;
  257. assert(iLevel!=iMaxAC+1);
  258. if (iLevel > iMaxAC)
  259. iLevel -= (1<<iLevelBits);
  260. assert(iLevel != 0);
  261. }
  262. } // Escape coding short headers. Added by KPN
  263. else
  264. {
  265. bIsLastRun = (Bool) m_pbitstrmIn->getBits (1);
  266. iRun = (Int) m_pbitstrmIn->getBits (6);
  267. int iLevelIndex = (Int) m_pbitstrmIn->getBits(8);
  268. if (iLevelIndex==0||iLevelIndex==128) 
  269. {
  270. fprintf(stderr,"Short header mode. Levels 0 and 128 are not allowedn");
  271. exit(2);
  272. }
  273. if (iLevelIndex >=0 && iLevelIndex <128) 
  274. {
  275. iLevel=iLevelIndex;
  276. } else 
  277. {
  278. iLevel=iLevelIndex-256;
  279. }
  280. }
  281. }
  282. Void CVideoObjectDecoder::decodeInterTCOEF (Int* rgiCoefQ, Int iCoefStart, Int* rgiZigzag)
  283. {
  284. Bool bIsLastRun = FALSE;
  285. Int  iRun = 0;
  286. Int  iLevel = 0;
  287. Int  iCoef = iCoefStart;
  288. Long lIndex;
  289. while (!bIsLastRun) {
  290. lIndex = m_pentrdecSet->m_pentrdecDCT->decodeSymbol();
  291. if (lIndex != TCOEF_ESCAPE) { // if Huffman
  292. decodeInterVLCtableIndex (lIndex, iLevel, iRun, bIsLastRun);
  293. assert (iRun < BLOCK_SQUARE_SIZE);
  294. }
  295. else
  296. decodeEscape (iLevel, iRun, bIsLastRun, g_rgiLMAXinter, g_rgiRMAXinter, 
  297.   m_pentrdecSet->m_pentrdecDCT, &CVideoObjectDecoder::decodeInterVLCtableIndex);
  298. for (Int i = 0; i < iRun; i++) {
  299. rgiCoefQ [rgiZigzag [iCoef]] = 0;
  300. iCoef++;
  301. }
  302. rgiCoefQ [rgiZigzag [iCoef]] = iLevel;
  303. iCoef++;
  304. }
  305. for (Int i = iCoef; i < BLOCK_SQUARE_SIZE; i++) // fill the rest w/ zero
  306. rgiCoefQ [rgiZigzag [i]]  = 0;
  307. }
  308. Void CVideoObjectDecoder::decodeIntraVLCtableIndex  (Int iIndex, Int& iLevel, Int& iRun, Int& bIsLastRun)
  309. {
  310. static Int iLevelMask = 0x0000001F;
  311. static Int iRunMask = 0x000003E0;
  312. static Int iLastRunMask = 0x00000400;
  313. iLevel = iLevelMask & grgiIntraYAVCLHashingTable [iIndex];
  314. iRun = (iRunMask & grgiIntraYAVCLHashingTable [iIndex]) >> 5;
  315. bIsLastRun = (iLastRunMask  & grgiIntraYAVCLHashingTable [iIndex]) >> 10;
  316. if (m_pentrdecSet->m_pentrdecDCT->bitstream()->getBits (1) == TRUE) // get signbit
  317. iLevel = -iLevel;
  318. assert (iRun < BLOCK_SQUARE_SIZE);
  319. }
  320. Void CVideoObjectDecoder::decodeInterVLCtableIndex (Int   iIndex, Int& iLevel, // return islastrun, run and level  
  321. Int&  iRun, Bool& bIsLastRun)
  322. {
  323. assert (iIndex >= 0 && iIndex < 102);
  324. bIsLastRun = FALSE;
  325. Int iIndexLeft = (Int) iIndex;
  326. if (iIndex >= 58) {
  327. iIndexLeft -= 58;
  328. bIsLastRun = TRUE;
  329. }
  330. iRun = 0;
  331. while (iIndexLeft >= 0) {
  332. if (!bIsLastRun)
  333. iIndexLeft -= grgIfNotLastNumOfLevelAtRun [iRun];
  334. else
  335. iIndexLeft -= grgIfLastNumOfLevelAtRun [iRun];
  336. iRun++;
  337. }
  338. assert (iRun > 0);
  339. iRun--;
  340. if (!bIsLastRun)
  341. iLevel = iIndexLeft + grgIfNotLastNumOfLevelAtRun [iRun] + 1;
  342. else
  343. iLevel = iIndexLeft + grgIfLastNumOfLevelAtRun [iRun] + 1;
  344. assert (iRun >= 0);
  345. if (m_pentrdecSet->m_pentrdecDCT->bitstream()->getBits (1) == TRUE) // get signbit
  346. iLevel = -iLevel;
  347. }
  348. Int CVideoObjectDecoder::decodeIntraDCmpeg (Bool bIsYBlk)
  349. {
  350. Long lSzDiffIntraDC;
  351. if (bIsYBlk)
  352. lSzDiffIntraDC = m_pentrdecSet->m_pentrdecIntraDCy->decodeSymbol();
  353. else 
  354. lSzDiffIntraDC = m_pentrdecSet->m_pentrdecIntraDCc->decodeSymbol();
  355. Int iDiffIntraDC = 0;
  356. if (lSzDiffIntraDC !=0 ) {
  357.     if (lSzDiffIntraDC<=8) { // NBIT
  358. U8 chDiffIntraDC = 
  359. (U8) m_pentrdecSet->m_pentrdecIntraDCy->bitstream()->getBits (lSzDiffIntraDC);
  360. if (!((1 << (lSzDiffIntraDC - 1)) & chDiffIntraDC))
  361. iDiffIntraDC = -1 * ((0x00FF >> (8 - lSzDiffIntraDC)) & (~chDiffIntraDC));
  362. else
  363. iDiffIntraDC = (Int) chDiffIntraDC;
  364.     } else { // NBIT - marker bit inserted after 8 bits
  365. /*
  366. UInt uiDiffIntraDC =
  367. (UInt) m_pentrdecSet->m_pentrdecIntraDCy->bitstream()->getBits (lSzDiffIntraDC+1);
  368. Int iOffset = lSzDiffIntraDC-8;
  369. uiDiffIntraDC = ( uiDiffIntraDC>>(iOffset+1)<<iOffset )
  370.       + ( uiDiffIntraDC & ((1<<iOffset)-1) );
  371. */
  372. UInt uiDiffIntraDC =
  373. (UInt) m_pentrdecSet->m_pentrdecIntraDCy->bitstream()->getBits (lSzDiffIntraDC);
  374. if (!((1 << (lSzDiffIntraDC - 1)) & uiDiffIntraDC))
  375. iDiffIntraDC = -1 * ((0xFFFF >> (16 - lSzDiffIntraDC)) & (~uiDiffIntraDC));
  376. else
  377. iDiffIntraDC = (Int) uiDiffIntraDC;
  378. m_pentrdecSet->m_pentrdecIntraDCy->bitstream()->getBits (1);
  379.     }
  380. }
  381. return iDiffIntraDC;
  382. }
  383. Void CVideoObjectDecoder::inverseDCACPred (const CMBMode* pmbmd, Int iBlkIdx,
  384.    Int* rgiCoefQ, Int iQP,
  385.    Int iDcScaler,
  386.    const BlockMemory blkmPred,
  387.    Int iQpPred)
  388. {
  389. UInt nBits = m_volmd.nBits; // NBIT
  390. Int iDefVal = 1<<(nBits+2); // NBIT
  391. //do DC prediction
  392. if (!short_video_header)
  393. { // Added by KPN for short video headers
  394. if (blkmPred == NULL)
  395. rgiCoefQ [0] += divroundnearest(iDefVal, iDcScaler);
  396. else {
  397. rgiCoefQ [0] += divroundnearest(blkmPred [0], iDcScaler);
  398. // clip range after inverse pred
  399. rgiCoefQ [0] = rgiCoefQ[0] < -2048 ? -2048 : (rgiCoefQ[0] > 2047 ? 2047 : rgiCoefQ[0]);
  400. if (iBlkIdx<(A_BLOCK1 - 1) && pmbmd->m_bACPrediction
  401. || iBlkIdx>=(A_BLOCK1 - 1) && pmbmd->m_bACPredictionAlpha) {
  402. Int i, j;
  403. //do AC prediction
  404. if (pmbmd->m_preddir [iBlkIdx] == HORIZONTAL) {
  405. for (i = 8, j = 8; j < 2 * BLOCK_SIZE - 1; i += 8, j++)
  406. {
  407. rgiCoefQ [i] += (blkmPred == NULL) ? 0 : (iQP == iQpPred) ?
  408.  blkmPred [j] : divroundnearest(blkmPred [j] * iQpPred, iQP);
  409. // clip range after inverse pred
  410. rgiCoefQ [i] = rgiCoefQ[i] < -2048 ? -2048 : (rgiCoefQ[i] > 2047 ? 2047 : rgiCoefQ[i]);
  411. }
  412. }
  413. else if  (pmbmd->m_preddir [iBlkIdx] == VERTICAL) {
  414. //horizontal zigzag scan
  415. for (i = 1; i < BLOCK_SIZE; i++)
  416. {
  417. rgiCoefQ [i] += (blkmPred == NULL) ? 0 : (iQP == iQpPred) ?
  418.  blkmPred [i] : divroundnearest(blkmPred [i] * iQpPred, iQP);
  419. // clip range after inverse pred
  420. rgiCoefQ [i] = rgiCoefQ[i] < -2048 ? -2048 : (rgiCoefQ[i] > 2047 ? 2047 : rgiCoefQ[i]);
  421. }
  422. }
  423. else
  424. assert (FALSE);
  425. }
  426. }
  427. }// End short video headers
  428. }