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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Ming-Chieh Lee (mingcl@microsoft.com), Microsoft Corporation
  4. Simon Winder (swinder@microsoft.com), Microsoft Corporation
  5. (date: June, 1997)
  6. and edited by
  7.         Wei Wu (weiwu@stallion.risc.rockwell.com) Rockwell Science Center
  8. in the course of development of the MPEG-4 Video (ISO/IEC 14496-2). 
  9. This software module is an implementation of a part of one or more MPEG-4 Video tools 
  10. as specified by the MPEG-4 Video. 
  11. ISO/IEC gives users of the MPEG-4 Video free license to this software module or modifications 
  12. thereof for use in hardware or software products claiming conformance to the MPEG-4 Video. 
  13. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. 
  14. The original developer of this software module and his/her company, 
  15. the subsequent editors and their companies, 
  16. and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. 
  17. Copyright is not released for non MPEG-4 Video conforming products. 
  18. Microsoft retains full right to use the code for his/her own purpose, 
  19. assign or donate the code to a third party and to inhibit third parties from using the code for non MPEG-4 Video conforming products. 
  20. This copyright notice must be included in all copies or derivative works. 
  21. Copyright (c) 1996, 1997.
  22. Module Name:
  23. mcPad.cpp
  24. Abstract:
  25. MB Padding (for motion estimation and compensation).
  26. Revision History:
  27.         May. 9   1998:  add field based MC padding  by Hyundai Electronics
  28.                                   Cheol-Soo Park (cspark@super5.hyundai.co.kr)
  29. *************************************************************************/
  30. #include "typeapi.h"
  31. #include "codehead.h"
  32. #include "mode.hpp"
  33. #include "vopses.hpp"
  34. // size of image for ppxlcAlphaBase is (uiBlkSize X uiBlkSize)
  35. #define invalidColour -1
  36. // Added for field based MC padding by Hyundai(1998-5-9)
  37. #define MB_FIELDY       1
  38. #define MB_FIELDC       3
  39. // End of Hyundai(1998-5-9)
  40. Void CVideoObject::mcPadCurrMB (
  41. PixelC* ppxlcRefMBY, 
  42. PixelC* ppxlcRefMBU, PixelC* ppxlcRefMBV,
  43. PixelC* ppxlcRefMBA 
  44. )
  45. {
  46. mcPadCurr (ppxlcRefMBY, m_ppxlcCurrMBBY, MB_SIZE, m_iFrameWidthY);
  47. mcPadCurr (ppxlcRefMBU, m_ppxlcCurrMBBUV, BLOCK_SIZE, m_iFrameWidthUV);
  48. mcPadCurr (ppxlcRefMBV, m_ppxlcCurrMBBUV, BLOCK_SIZE, m_iFrameWidthUV);
  49. if (m_volmd.fAUsage == EIGHT_BIT)
  50. mcPadCurr (ppxlcRefMBA, m_ppxlcCurrMBBY, MB_SIZE, m_iFrameWidthY);
  51. }
  52. Void CVideoObject::mcPadCurr (
  53. PixelC *ppxlcTextureBase, // (uiStride X ???)
  54. const PixelC *ppxlcAlphaBase, // uiBlkSize X uiBlkSize
  55. UInt uiBlkSize, UInt uiStride
  56. )
  57. {
  58. Int iUnit = sizeof(PixelC); // NBIT: memcpy
  59. CoordI iX,iY,iJ,iLeftX = 0;
  60. Bool bEmptyRow = FALSE;
  61. Bool bInVop;
  62. Int iLeftColour;
  63. PixelC *ppxlcTexture = ppxlcTextureBase;
  64. const PixelC *ppxlcAlpha = ppxlcAlphaBase;
  65. for (iY=0; iY < (CoordI) uiBlkSize; iY++, ppxlcTexture+=uiStride)
  66.     {
  67. bInVop = TRUE;
  68. iLeftColour = invalidColour;
  69. m_pbEmptyRowArray[iY]=0;
  70. for(iX=0;iX<(CoordI)uiBlkSize;iX++,ppxlcAlpha++)
  71. {
  72. if(bInVop==TRUE && *ppxlcAlpha==transpValue)
  73.     {
  74. // start of stripe or left border 
  75. bInVop=FALSE;
  76. iLeftX=iX;
  77. if(iX>0)
  78. iLeftColour=ppxlcTexture[iLeftX-1];
  79.     }
  80. else if(bInVop==FALSE && *ppxlcAlpha!=transpValue)
  81.     {
  82. // end of stripe not right border 
  83. bInVop=TRUE;
  84. if(iLeftColour==invalidColour)
  85. iLeftColour=ppxlcTexture[iX];
  86. else
  87. iLeftColour=(iLeftColour+ppxlcTexture[iX]+1)>>1;
  88. // fill stripe 
  89. for(iJ=iLeftX;iJ<iX;iJ++)
  90. ppxlcTexture[iJ]=(PixelC)iLeftColour;
  91.     }
  92. }
  93.         if(bInVop==FALSE)
  94. {
  95. // end of stripe at right border 
  96. if(iLeftX==0)
  97. {
  98. // blank stripe so mark
  99. m_pbEmptyRowArray[iY]=TRUE;
  100. bEmptyRow=TRUE;
  101. }
  102. else
  103.         {
  104. // fill trailing stripe 
  105.             for(iJ=iLeftX;iJ<iX;iJ++)
  106. ppxlcTexture[iJ]=(PixelC)iLeftColour;       
  107.         }
  108.       }
  109.     }
  110. // fill remaining holes 
  111. if(bEmptyRow)
  112. {
  113. ppxlcTexture=ppxlcTextureBase;
  114. PixelC *ppxlcUpperRow = NULL;
  115. for(iY=0;iY<(CoordI)uiBlkSize;iY++,ppxlcTexture+=uiStride)
  116. if(!m_pbEmptyRowArray[iY])
  117. ppxlcUpperRow = ppxlcTexture;
  118. else
  119. {
  120. // empty row, find lower row
  121. PixelC *ppxlcLowerRow = ppxlcTexture+uiStride;
  122. CoordI iYY;
  123. for(iYY=iY+1;iYY<(CoordI)uiBlkSize;iYY++,ppxlcLowerRow+=uiStride)
  124. if(!m_pbEmptyRowArray[iYY])
  125. break;
  126. if(iYY<(CoordI)uiBlkSize)
  127. {
  128. if(ppxlcUpperRow==NULL)
  129. {
  130. // just lower row
  131. for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=uiStride)
  132. memcpy(ppxlcTexture,ppxlcLowerRow,uiBlkSize*iUnit);
  133. }
  134. else
  135. {
  136. // lower row, upper row
  137. for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=uiStride)
  138. for(iX=0;iX<(CoordI)uiBlkSize;iX++)
  139. ppxlcTexture[iX]=
  140. (ppxlcUpperRow[iX]+ppxlcLowerRow[iX]+1)>>1;
  141. }
  142. }
  143. else
  144. {
  145. // just upper row
  146. assert(ppxlcUpperRow!=NULL);
  147. for(iYY=iY;iYY<(CoordI)uiBlkSize;iYY++,ppxlcTexture+=uiStride)
  148. memcpy(ppxlcTexture,ppxlcUpperRow,uiBlkSize*iUnit);
  149. }
  150. iY=iYY-1;
  151. ppxlcTexture -= uiStride;
  152. }
  153. }
  154. }
  155. Void CVideoObject::padNeighborTranspMBs (
  156. CoordI xb, CoordI yb,
  157. CMBMode* pmbmd,
  158. PixelC* ppxlcY, PixelC* ppxlcU, PixelC* ppxlcV, PixelC *ppxlcA
  159. )
  160. {
  161. if (xb > 0) {
  162. if ((pmbmd - 1)->m_rgTranspStatus [0] == ALL) {
  163. if (!((pmbmd - 1)->m_bPadded)) {
  164. mcPadLeftMB (ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  165. (pmbmd - 1)->m_bPadded = TRUE;
  166. }
  167. }
  168. }
  169. if (yb > 0) {
  170. if ((pmbmd - m_iNumMBX)->m_rgTranspStatus [0] == ALL) {
  171. if (!((pmbmd - m_iNumMBX)->m_bPadded)) {
  172. mcPadTopMB (ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  173. (pmbmd - m_iNumMBX)->m_bPadded = TRUE;
  174. }
  175. }
  176. }
  177. }
  178. Void CVideoObject::padCurrAndTopTranspMBFromNeighbor (
  179. CoordI xb, CoordI yb,
  180. CMBMode* pmbmd,
  181. PixelC* ppxlcY, PixelC* ppxlcU, PixelC* ppxlcV, PixelC* ppxlcA
  182. )
  183. {
  184. if (xb > 0) {
  185. if ((pmbmd - 1)->m_rgTranspStatus [0] != ALL) {
  186. mcPadCurrMBFromLeft (ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  187. pmbmd->m_bPadded = TRUE;
  188. }
  189. }
  190. if (yb > 0) {
  191. if ((pmbmd - m_iNumMBX)->m_rgTranspStatus [0] != ALL) {
  192. if (!(pmbmd->m_bPadded)) {
  193. mcPadCurrMBFromTop (ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  194. pmbmd->m_bPadded = TRUE;
  195. }
  196. }
  197. else
  198. if (!(pmbmd - m_iNumMBX)->m_bPadded)
  199. mcSetTopMBGray (ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  200. }
  201. if(yb == m_iNumMBY-1)
  202. {
  203. if(xb > 0 && (pmbmd-1)->m_rgTranspStatus [0] == ALL && !((pmbmd-1)->m_bPadded))
  204. mcSetLeftMBGray(ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  205. if(xb == m_iNumMBX-1 && !(pmbmd->m_bPadded))
  206. mcSetCurrMBGray(ppxlcY, ppxlcU, ppxlcV, ppxlcA);
  207. }
  208. }
  209. Void CVideoObject::mcPadLeftMB (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  210. {
  211. UInt iy;
  212. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  213. pxlcmemset (ppxlcMBY - MB_SIZE, *ppxlcMBY, MB_SIZE);
  214. pxlcmemset (ppxlcMBU - BLOCK_SIZE, *ppxlcMBU, BLOCK_SIZE);
  215. pxlcmemset (ppxlcMBV - BLOCK_SIZE, *ppxlcMBV, BLOCK_SIZE);
  216. ppxlcMBY += m_iFrameWidthY;
  217. ppxlcMBU += m_iFrameWidthUV;
  218. ppxlcMBV += m_iFrameWidthUV;
  219. pxlcmemset (ppxlcMBY - MB_SIZE, *ppxlcMBY, MB_SIZE);
  220. ppxlcMBY += m_iFrameWidthY;
  221. }
  222. if(m_volmd.fAUsage == EIGHT_BIT)
  223. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  224. pxlcmemset (ppxlcMBA - MB_SIZE, *ppxlcMBA, MB_SIZE);
  225. ppxlcMBA += m_iFrameWidthY;
  226. pxlcmemset (ppxlcMBA - MB_SIZE, *ppxlcMBA, MB_SIZE);
  227. ppxlcMBA += m_iFrameWidthY;
  228. }
  229. }
  230. Void CVideoObject::mcPadTopMB (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  231. {
  232. UInt ix, iy;
  233. for (ix = 0; ix < MB_SIZE; ix++) {
  234. PixelC* ppxlcYCol = ppxlcMBY;
  235. for (iy = 0; iy < MB_SIZE; iy++) {
  236. ppxlcYCol -= m_iFrameWidthY;
  237. *ppxlcYCol = *ppxlcMBY;
  238. }
  239. ppxlcMBY++;
  240. }
  241. for (ix = 0; ix < BLOCK_SIZE; ix++) {
  242. PixelC* ppxlcUCol = ppxlcMBU;
  243. PixelC* ppxlcVCol = ppxlcMBV;
  244. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  245. ppxlcUCol -= m_iFrameWidthUV;
  246. ppxlcVCol -= m_iFrameWidthUV;
  247. *ppxlcUCol = *ppxlcMBU;
  248. *ppxlcVCol = *ppxlcMBV;
  249. }
  250. ppxlcMBU++;
  251. ppxlcMBV++;
  252. }
  253. if(m_volmd.fAUsage == EIGHT_BIT)
  254. for (ix = 0; ix < MB_SIZE; ix++) {
  255. PixelC* ppxlcACol = ppxlcMBA;
  256. for (iy = 0; iy < MB_SIZE; iy++) {
  257. ppxlcACol -= m_iFrameWidthY;
  258. *ppxlcACol = *ppxlcMBA;
  259. }
  260. ppxlcMBA++;
  261. }
  262. }
  263. Void CVideoObject::mcPadCurrMBFromLeft (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  264. {
  265. UInt iy;
  266. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  267. pxlcmemset (ppxlcMBY, *(ppxlcMBY - 1), MB_SIZE);
  268. pxlcmemset (ppxlcMBU, *(ppxlcMBU - 1), BLOCK_SIZE);
  269. pxlcmemset (ppxlcMBV, *(ppxlcMBV - 1), BLOCK_SIZE);
  270. ppxlcMBY += m_iFrameWidthY;
  271. ppxlcMBU += m_iFrameWidthUV;
  272. ppxlcMBV += m_iFrameWidthUV;
  273. pxlcmemset (ppxlcMBY, *(ppxlcMBY - 1), MB_SIZE);
  274. ppxlcMBY += m_iFrameWidthY;
  275. }
  276. if(m_volmd.fAUsage == EIGHT_BIT)
  277. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  278. pxlcmemset (ppxlcMBA, *(ppxlcMBA - 1), MB_SIZE);
  279. ppxlcMBA += m_iFrameWidthY;
  280. pxlcmemset (ppxlcMBA, *(ppxlcMBA - 1), MB_SIZE);
  281. ppxlcMBA += m_iFrameWidthY;
  282. }
  283. }
  284. Void CVideoObject::mcPadCurrMBFromTop (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  285. {
  286. UInt ix, iy;
  287. for (ix = 0; ix < MB_SIZE; ix++) {
  288. PixelC* ppxlcYCol = ppxlcMBY;
  289. PixelC pxlcY = *(ppxlcMBY - m_iFrameWidthY);
  290. for (iy = 0; iy < MB_SIZE; iy++) {
  291. *ppxlcYCol = pxlcY;
  292. ppxlcYCol += m_iFrameWidthY;
  293. }
  294. ppxlcMBY++;
  295. }
  296. for (ix = 0; ix < BLOCK_SIZE; ix++) {
  297. PixelC* ppxlcUCol = ppxlcMBU;
  298. PixelC* ppxlcVCol = ppxlcMBV;
  299. PixelC pxlcU = *(ppxlcMBU - m_iFrameWidthUV);
  300. PixelC pxlcV = *(ppxlcMBV - m_iFrameWidthUV);
  301. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  302. *ppxlcUCol = pxlcU;
  303. *ppxlcVCol = pxlcV;
  304. ppxlcUCol += m_iFrameWidthUV;
  305. ppxlcVCol += m_iFrameWidthUV;
  306. }
  307. ppxlcMBU++;
  308. ppxlcMBV++;
  309. }
  310. if(m_volmd.fAUsage == EIGHT_BIT)
  311. for (ix = 0; ix < MB_SIZE; ix++) {
  312. PixelC* ppxlcACol = ppxlcMBA;
  313. PixelC pxlcA = *(ppxlcMBA - m_iFrameWidthY);
  314. for (iy = 0; iy < MB_SIZE; iy++) {
  315. *ppxlcACol = pxlcA;
  316. ppxlcACol += m_iFrameWidthY;
  317. }
  318. ppxlcMBA++;
  319. }
  320. }
  321. Void CVideoObject::mcSetTopMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  322. {
  323. PixelC pxlcGrayVal = 128;
  324. if(m_volmd.bNot8Bit)
  325. pxlcGrayVal = 1<<(m_volmd.nBits-1);
  326. UInt iy;
  327. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  328. ppxlcMBY -= m_iFrameWidthY;
  329. ppxlcMBU -= m_iFrameWidthUV;
  330. ppxlcMBV -= m_iFrameWidthUV;
  331. pxlcmemset (ppxlcMBY, pxlcGrayVal, MB_SIZE);
  332. pxlcmemset (ppxlcMBU, pxlcGrayVal, BLOCK_SIZE);
  333. pxlcmemset (ppxlcMBV, pxlcGrayVal, BLOCK_SIZE);
  334. ppxlcMBY -= m_iFrameWidthY;
  335. pxlcmemset (ppxlcMBY, pxlcGrayVal, MB_SIZE);
  336. }
  337. if(m_volmd.fAUsage == EIGHT_BIT)
  338. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  339. ppxlcMBA -= m_iFrameWidthY;
  340. pxlcmemset (ppxlcMBA, pxlcGrayVal, MB_SIZE);
  341. ppxlcMBA -= m_iFrameWidthY;
  342. pxlcmemset (ppxlcMBA, pxlcGrayVal, MB_SIZE);
  343. }
  344. }
  345. Void CVideoObject::mcSetLeftMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  346. {
  347. mcSetCurrMBGray(
  348. ppxlcMBY-MB_SIZE,
  349. ppxlcMBU-BLOCK_SIZE,
  350. ppxlcMBV-BLOCK_SIZE,
  351. (m_volmd.fAUsage == EIGHT_BIT) ? ppxlcMBA-MB_SIZE : (PixelC *)NULL
  352. );
  353. }
  354. Void CVideoObject::mcSetCurrMBGray (PixelC* ppxlcMBY, PixelC* ppxlcMBU, PixelC* ppxlcMBV, PixelC* ppxlcMBA)
  355. {
  356. PixelC pxlcGrayVal = 128;
  357. if(m_volmd.bNot8Bit)
  358. pxlcGrayVal = 1<<(m_volmd.nBits-1);
  359. UInt iy;
  360. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  361. pxlcmemset (ppxlcMBY, pxlcGrayVal, MB_SIZE);
  362. pxlcmemset (ppxlcMBU, pxlcGrayVal, BLOCK_SIZE);
  363. pxlcmemset (ppxlcMBV, pxlcGrayVal, BLOCK_SIZE);
  364. ppxlcMBY += m_iFrameWidthY;
  365. ppxlcMBU += m_iFrameWidthUV;
  366. ppxlcMBV += m_iFrameWidthUV;
  367. pxlcmemset (ppxlcMBY, pxlcGrayVal, MB_SIZE);
  368. ppxlcMBY += m_iFrameWidthY;
  369. }
  370. if(m_volmd.fAUsage == EIGHT_BIT)
  371. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  372. pxlcmemset (ppxlcMBA, pxlcGrayVal, MB_SIZE);
  373. ppxlcMBA += m_iFrameWidthY;
  374. pxlcmemset (ppxlcMBA, pxlcGrayVal, MB_SIZE);
  375. ppxlcMBA += m_iFrameWidthY;
  376. }
  377. }
  378. // Added for field based MC padding by Hyundai(1998-5-9)
  379. Void CVideoObject::fieldBasedMCPadding (CMBMode* pmbmd, CVOPU8YUVBA* pvopcCurrQ)
  380. {
  381.         Int     iMBX, iMBY;
  382.         PixelC* ppxlcCurrY  = (PixelC*) pvopcCurrQ->pixelsY () + m_iStartInRefToCurrRctY;
  383.         PixelC* ppxlcCurrU  = (PixelC*) pvopcCurrQ->pixelsU () + m_iStartInRefToCurrRctUV;
  384.         PixelC* ppxlcCurrV  = (PixelC*) pvopcCurrQ->pixelsV () + m_iStartInRefToCurrRctUV;
  385.         PixelC* ppxlcCurrBY = (PixelC*) pvopcCurrQ->pixelsBY () + m_iStartInRefToCurrRctY;
  386.         PixelC* ppxlcCurrBUV = (PixelC*) pvopcCurrQ->pixelsBUV () + m_iStartInRefToCurrRctUV;
  387. // 12.22.98 begin of changes
  388. PixelC* ppxlcCurrA = NULL;
  389. if (m_volmd.fAUsage == EIGHT_BIT) {
  390. ppxlcCurrA = (PixelC*) pvopcCurrQ->pixelsA () + m_iStartInRefToCurrRctY;
  391. // 12.22.98 end of changes
  392.         for (iMBY = 0; iMBY < m_iNumMBY; iMBY++) {
  393.                 PixelC* ppxlcCurrMBY  = ppxlcCurrY;
  394.                 PixelC* ppxlcCurrMBU  = ppxlcCurrU;
  395.                 PixelC* ppxlcCurrMBV  = ppxlcCurrV;
  396.                 PixelC* ppxlcCurrMBBY = ppxlcCurrBY;
  397.                 PixelC* ppxlcCurrMBBUV = ppxlcCurrBUV;
  398. PixelC* ppxlcCurrMBA = NULL;
  399. // 12.22.98 begin of changes
  400. if (m_volmd.fAUsage == EIGHT_BIT)
  401. ppxlcCurrMBA  = ppxlcCurrA; 
  402. // 12.22.98 end of changes
  403.                 for (iMBX = 0; iMBX < m_iNumMBX; iMBX++) {
  404. memset(pmbmd->m_rgbFieldPadded, 0, 5*sizeof(Bool));
  405.                     fieldBasedDownSampleBY (ppxlcCurrMBBY, ppxlcCurrMBBUV);
  406.                     decideFieldTransparencyStatus (pmbmd, ppxlcCurrMBBY, ppxlcCurrMBBUV);
  407.                     mcPadCurrAndNeighborsMBFields (iMBX, iMBY, pmbmd, ppxlcCurrMBY, ppxlcCurrMBU, ppxlcCurrMBV, ppxlcCurrMBBY, ppxlcCurrMBBUV,ppxlcCurrMBA);
  408.                     ppxlcCurrMBY += MB_SIZE;
  409.                     ppxlcCurrMBU += BLOCK_SIZE;
  410.                     ppxlcCurrMBV += BLOCK_SIZE;
  411.                     ppxlcCurrMBBY += MB_SIZE;
  412.                     ppxlcCurrMBBUV += BLOCK_SIZE;
  413. // 12.22.98 begin of changes
  414. if (m_volmd.fAUsage == EIGHT_BIT)
  415. ppxlcCurrMBA  += MB_SIZE; 
  416. // 12.22.98 end of changes
  417.                     pmbmd++;
  418.                 }
  419.                 ppxlcCurrY += m_iFrameWidthYxMBSize;
  420.                 ppxlcCurrU += m_iFrameWidthUVxBlkSize;
  421.                 ppxlcCurrV += m_iFrameWidthUVxBlkSize;
  422.                 ppxlcCurrBY += m_iFrameWidthYxMBSize;
  423.                 ppxlcCurrBUV += m_iFrameWidthUVxBlkSize;
  424. // 12.22.98 begin of changes
  425. if (m_volmd.fAUsage == EIGHT_BIT)
  426. ppxlcCurrA  += m_iFrameWidthYxMBSize; 
  427. // 12.22.98 end of changes
  428.         }
  429. }
  430. Void CVideoObject::mcPadCurrAndNeighborsMBFields (
  431.         Int     iMBX,
  432.         Int     iMBY,
  433.         CMBMode *pmbmd,
  434.         PixelC* ppxlcRefMBY,
  435.         PixelC* ppxlcRefMBU,
  436.         PixelC* ppxlcRefMBV,
  437.         PixelC* ppxlcRefMBBY,
  438.         PixelC* ppxlcRefMBBUV,
  439. PixelC* ppxlcRefMBA
  440. )
  441. {
  442. // 2.9.99 begin of changes.  X. Chen, 
  443. if (m_volmd.fAUsage == EIGHT_BIT) 
  444. mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDY, ppxlcRefMBY, ppxlcRefMBA, ppxlcRefMBBY, MB_SIZE, m_iFrameWidthY);
  445. else
  446. // 2.9.99 end of changes
  447.         mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDY, ppxlcRefMBY, NULL, ppxlcRefMBBY, MB_SIZE, m_iFrameWidthY);
  448.         mcPadFieldsCurr (iMBX, iMBY, pmbmd, MB_FIELDC, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBBUV, BLOCK_SIZE, m_iFrameWidthUV);
  449. }
  450. Void CVideoObject::mcPadFieldsCurr (
  451.         Int     iMBX,
  452.         Int     iMBY,
  453.         CMBMode *pmbmd,
  454.         Int     mode,
  455.         PixelC  *ppxlcCurrMB1,
  456.         PixelC  *ppxlcCurrMB2,
  457.         PixelC  *ppxlcCurrMBB,
  458.         Int     uiBlkXSize,
  459.         Int     uiStride
  460. )
  461. {
  462.         PixelC  *ppxlcCurrTopField1 = ppxlcCurrMB1,
  463.                 *ppxlcCurrBotField1 = ppxlcCurrMB1 + uiStride,
  464.                 *ppxlcCurrTopField2 = ((ppxlcCurrMB2) ? ppxlcCurrMB2 : NULL),
  465.                 *ppxlcCurrBotField2 = ((ppxlcCurrMB2) ? ppxlcCurrMB2 + uiStride : NULL),
  466.                 *ppxlcCurrTopFieldB = ppxlcCurrMBB,
  467.                 *ppxlcCurrBotFieldB = ppxlcCurrMBB + uiStride;
  468.  
  469.         if (pmbmd->m_rgFieldTranspStatus [mode] != ALL) {       // Top Field MC Padding
  470.                 if (pmbmd->m_rgFieldTranspStatus [mode] == PARTIAL) {
  471.                         mcPadOneField (ppxlcCurrTopField1, ppxlcCurrTopFieldB, uiBlkXSize, uiStride);
  472.                         if (ppxlcCurrTopField2)
  473.                                 mcPadOneField (ppxlcCurrTopField2, ppxlcCurrTopFieldB, uiBlkXSize, uiStride);
  474.                 }
  475.                 padNeighborTranspMBFields (iMBX, iMBY, pmbmd, mode, ppxlcCurrTopField1, ppxlcCurrTopField2, uiBlkXSize, uiStride);
  476.         } else  padCurrAndTopTranspMBFieldsFromNeighbor (iMBX, iMBY, pmbmd, mode, ppxlcCurrTopField1, ppxlcCurrTopField2, uiBlkXSize, uiStride);
  477.         if (pmbmd->m_rgFieldTranspStatus [mode+1] != ALL) {     // Bottom Field MC Padding
  478.                 if (pmbmd->m_rgFieldTranspStatus [mode+1] == PARTIAL) {
  479.                         mcPadOneField (ppxlcCurrBotField1, ppxlcCurrBotFieldB, uiBlkXSize, uiStride);
  480.                         if (ppxlcCurrBotField2)
  481.                                 mcPadOneField (ppxlcCurrBotField2, ppxlcCurrBotFieldB, uiBlkXSize, uiStride);
  482.                 }
  483.                 padNeighborTranspMBFields (iMBX, iMBY, pmbmd, mode+1, ppxlcCurrBotField1, ppxlcCurrBotField2, uiBlkXSize, uiStride);
  484.         } else  padCurrAndTopTranspMBFieldsFromNeighbor (iMBX, iMBY, pmbmd, mode+1, ppxlcCurrBotField1, ppxlcCurrBotField2, uiBlkXSize, uiStride);
  485. }
  486. Void CVideoObject::mcPadOneField (
  487.         PixelC          *ppxlcTextureBase,
  488.         const PixelC    *ppxlcAlphaBase,
  489.         Int             uiBlkXSize,
  490.         Int             uiStride
  491. )
  492. {
  493.         Int     iUnit = sizeof(PixelC);
  494.         Int     uiBlkYSize = uiBlkXSize/2;
  495.         Int     iFieldSkip = 2*uiStride;
  496.         CoordI  iX,iY,iJ,iLeftX = 0;
  497.         Bool    bEmptyRow = FALSE;
  498.         Bool    bInVop;
  499.         Int     iLeftColour;
  500.          
  501.  
  502.         PixelC  *ppxlcTexture = ppxlcTextureBase;
  503.         for (iY=0;iY<(CoordI)uiBlkYSize;iY++, ppxlcTexture+=iFieldSkip) {
  504.                 bInVop = TRUE;
  505.                 iLeftColour = invalidColour;
  506.                 m_pbEmptyRowArray[iY]=0;
  507.                 const PixelC *ppxlcAlpha = ppxlcAlphaBase;
  508.                 for(iX=0;iX<(CoordI)uiBlkXSize;iX++,ppxlcAlpha++) {
  509.                         if(bInVop==TRUE && *ppxlcAlpha==transpValue) {
  510.                                 bInVop=FALSE;
  511.                                 iLeftX=iX;
  512.                                 if(iX>0)
  513.                                         iLeftColour=ppxlcTexture[iLeftX-1];
  514.                         }
  515.                         else if(bInVop==FALSE && *ppxlcAlpha!=transpValue) {
  516.                                 bInVop=TRUE;
  517.                                 if(iLeftColour==invalidColour)
  518.                                         iLeftColour=ppxlcTexture[iX];
  519.                                 else    iLeftColour=(iLeftColour+ppxlcTexture[iX]+1)>>1;
  520.                                 for(iJ=iLeftX;iJ<iX;iJ++)
  521.                                         ppxlcTexture[iJ]=(PixelC)iLeftColour;
  522.                         }                 
  523.                 }
  524.                 ppxlcAlphaBase += iFieldSkip;
  525.                 if(bInVop==FALSE) {
  526.                         if(iLeftX==0) {
  527.                                 m_pbEmptyRowArray[iY]=TRUE;
  528.                                 bEmptyRow=TRUE;
  529.                         }
  530.                         else {
  531.                                 for(iJ=iLeftX;iJ<iX;iJ++)
  532.                                         ppxlcTexture[iJ]=(PixelC)iLeftColour;
  533.                         }                 
  534.                 }
  535.         }
  536.         if(bEmptyRow) {
  537.                 ppxlcTexture=ppxlcTextureBase;
  538.                 PixelC  *ppxlcUpperRow = NULL;
  539.                 for(iY=0;iY<(CoordI)uiBlkYSize;iY++,ppxlcTexture+=iFieldSkip)
  540.                         if(!m_pbEmptyRowArray[iY])
  541.                                 ppxlcUpperRow = ppxlcTexture;
  542.                         else {
  543.                                 PixelC *ppxlcLowerRow = ppxlcTexture+iFieldSkip;
  544.                                 CoordI iYY;
  545.                                 for(iYY=iY+1;iYY<(CoordI)uiBlkYSize;iYY++,ppxlcLowerRow+=iFieldSkip)
  546.                                         if(!m_pbEmptyRowArray[iYY])
  547.                                                 break;
  548.                                 if(iYY<(CoordI)uiBlkYSize) {
  549.                                         if(ppxlcUpperRow==NULL) {
  550.                                                 for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=iFieldSkip)
  551.                                                         memcpy(ppxlcTexture,ppxlcLowerRow,uiBlkXSize*iUnit);
  552.                                         }
  553.                                         else {
  554.                                                 for(;ppxlcTexture<ppxlcLowerRow;ppxlcTexture+=iFieldSkip)
  555.                                                         for(iX=0;iX<(CoordI)uiBlkXSize;iX++)
  556.                                                                 ppxlcTexture[iX]= (ppxlcUpperRow[iX]+ppxlcLowerRow[iX]+1)>>1;
  557.                                         }
  558.                                 }         
  559.                                 else {
  560.                                         assert(ppxlcUpperRow!=NULL);
  561.                                         for(iYY=iY;iYY<(CoordI)uiBlkYSize;iYY++,ppxlcTexture+=iFieldSkip)
  562.                                                 memcpy(ppxlcTexture,ppxlcUpperRow,uiBlkXSize*iUnit);
  563.                                 }
  564.                                 iY=iYY-1;
  565.                                 ppxlcTexture -= iFieldSkip;
  566.                         }
  567.         }
  568. }
  569. Void CVideoObject::padNeighborTranspMBFields (
  570.         CoordI  xb,
  571.         CoordI  yb,
  572.         CMBMode *pmbmd,
  573.         Int     mode,
  574.         PixelC  *ppxlcMBField1,
  575.         PixelC  *ppxlcMBField2,
  576.         Int     uiBlkXSize,
  577.         Int     uiStride
  578. )
  579. {
  580.         CMBMode* pmbmdLeft = pmbmd - 1;
  581.         CMBMode* pmbmdAbov = pmbmd - m_iNumMBX;
  582.  
  583.         if (xb > 0) {
  584.                 if (pmbmdLeft->m_rgFieldTranspStatus [mode] == ALL)
  585.                         if (!(pmbmdLeft->m_rgbFieldPadded [mode])) {
  586.                                 mcPadLeftMBFields (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  587.                                 pmbmdLeft->m_rgbFieldPadded[mode] = TRUE;
  588.                         }
  589.         }
  590.         if (yb > 0) {
  591.                 if (pmbmdAbov->m_rgFieldTranspStatus [mode] == ALL)
  592.                         if (!(pmbmdAbov->m_rgbFieldPadded [mode])) {
  593.                                 mcPadTopMBFields (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  594.                                 pmbmdAbov->m_rgbFieldPadded[mode] = TRUE;
  595.                         }
  596.         }        
  597. }
  598. Void CVideoObject::padCurrAndTopTranspMBFieldsFromNeighbor (
  599.         CoordI  xb,
  600.         CoordI  yb,
  601.         CMBMode *pmbmd,
  602.         Int     mode,
  603.         PixelC* ppxlcMBField1,
  604.         PixelC* ppxlcMBField2,
  605.         Int     uiBlkXSize,
  606.         Int     uiStride
  607. )
  608. {
  609.         CMBMode* pmbmdLeft = pmbmd - 1;
  610.         CMBMode* pmbmdAbov = pmbmd - m_iNumMBX;
  611.  
  612.         if (xb > 0) {
  613.                 if (pmbmdLeft->m_rgFieldTranspStatus [mode] != ALL) {
  614.                         mcPadCurrMBFieldsFromLeft (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  615.                         pmbmd->m_rgbFieldPadded [mode] = TRUE;
  616.                 }
  617.         }
  618.         if (yb > 0) {
  619.                 if (pmbmdAbov->m_rgFieldTranspStatus [mode] != ALL) {
  620.                         if (!(pmbmd->m_rgbFieldPadded [mode])) {
  621.                                 mcPadCurrMBFieldsFromTop (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  622.                                 pmbmd->m_rgbFieldPadded [mode] = TRUE;
  623.                         }
  624.                 } else {
  625.                         if (!(pmbmdAbov->m_rgbFieldPadded [mode]))
  626.                                 mcSetTopMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  627.                 }
  628.         }
  629.         if(yb == m_iNumMBY-1) {
  630.                 if(xb > 0 && pmbmdLeft->m_rgFieldTranspStatus [mode] == ALL && !(pmbmdLeft->m_rgbFieldPadded [mode]))
  631.                         mcSetLeftMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  632.                 if(xb == m_iNumMBX-1 && !(pmbmd->m_rgbFieldPadded [mode]))
  633.                         mcSetCurrMBFieldsGray (ppxlcMBField1, ppxlcMBField2, uiBlkXSize, uiStride);
  634.         }
  635. }
  636. Void CVideoObject::mcPadLeftMBFields (
  637.         PixelC* ppxlcMBField1,
  638.         PixelC* ppxlcMBField2,
  639.         Int     uiBlkXSize,
  640.         Int     uiStride
  641. )
  642. {
  643.         UInt    iy, uiBlkYSize = uiBlkXSize/2;
  644.  
  645.         for (iy = 0; iy < uiBlkYSize; iy++) {
  646.                 pxlcmemset (ppxlcMBField1 - uiBlkXSize, *ppxlcMBField1, uiBlkXSize);
  647.                 ppxlcMBField1 += 2*uiStride;
  648.         }
  649.         if (!ppxlcMBField2) return;
  650.         for (iy = 0; iy < uiBlkYSize; iy++) {
  651.                 pxlcmemset (ppxlcMBField2 - uiBlkXSize, *ppxlcMBField2, uiBlkXSize);
  652.                 ppxlcMBField2 += 2*uiStride;
  653.         }
  654. }
  655.  
  656. Void CVideoObject::mcPadTopMBFields (
  657.         PixelC* ppxlcMBField1,
  658.         PixelC* ppxlcMBField2,
  659.         Int     iBlkXSize,
  660.         Int     iStride
  661. )
  662. {
  663.         Int    ix, iy, iBlkYSize = iBlkXSize/2;
  664.  
  665.         for (ix = 0; ix < iBlkXSize; ix++) {
  666.                 PixelC* ppxlcYCol = ppxlcMBField1;
  667.                 for (iy = 0; iy < iBlkYSize; iy++) {
  668.                         ppxlcYCol -= 2*iStride;
  669.                         *ppxlcYCol = *ppxlcMBField1;
  670.                 }
  671.                 ppxlcMBField1++;
  672.         }
  673.         if (!ppxlcMBField2) return;
  674.         for (ix = 0; ix < iBlkXSize; ix++) {
  675.                 PixelC* ppxlcACol = ppxlcMBField2;
  676.                 for (iy = 0; iy < iBlkYSize; iy++) {
  677.                         ppxlcACol -= 2*iStride;
  678.                         *ppxlcACol = *ppxlcMBField2;
  679.                 }
  680.                 ppxlcMBField2++;
  681.         }
  682. }
  683. Void CVideoObject::mcPadCurrMBFieldsFromLeft (
  684.         PixelC* ppxlcMBField1,
  685.         PixelC* ppxlcMBField2,
  686.         Int     uiBlkXSize,
  687.         Int     uiStride)
  688. {
  689.         UInt iy, uiBlkYSize = uiBlkXSize/2;
  690.         for (iy = 0; iy < uiBlkYSize; iy++) {
  691.                 pxlcmemset (ppxlcMBField1, *(ppxlcMBField1 - 1), uiBlkXSize);
  692.                 ppxlcMBField1 += 2*uiStride;
  693.         }
  694.         if (!ppxlcMBField2) return;
  695.         for (iy = 0; iy < uiBlkYSize; iy++) {
  696.                 pxlcmemset (ppxlcMBField2, *(ppxlcMBField2 - 1), uiBlkXSize);
  697.                 ppxlcMBField2 += 2*uiStride;
  698.         }
  699. }
  700.  
  701. Void CVideoObject::mcPadCurrMBFieldsFromTop (
  702.         PixelC* ppxlcMBField1,
  703.         PixelC* ppxlcMBField2,
  704.         Int     iBlkXSize,
  705.         Int     iStride)
  706. {
  707.         Int    ix, iy, iBlkYSize = iBlkXSize/2;
  708.         PixelC  *ppxlcSrcMBField = ppxlcMBField1-2*iStride;
  709.         for (ix = 0; ix < iBlkXSize; ix++) {
  710.                 PixelC* ppxlcDstMBField = ppxlcSrcMBField;
  711.                 for (iy = 0; iy < iBlkYSize; iy++) {
  712.                         ppxlcDstMBField += 2*iStride;
  713.                         *ppxlcDstMBField = *ppxlcSrcMBField;
  714.                 }
  715.                 ppxlcSrcMBField++;
  716.         }
  717.         if(!ppxlcMBField2) return;
  718.         ppxlcSrcMBField = ppxlcMBField2-2*iStride;
  719.         for (ix = 0; ix < iBlkXSize; ix++) {
  720.                 PixelC* ppxlcDstMBField = ppxlcSrcMBField;
  721.                 for (iy = 0; iy < iBlkYSize; iy++) {
  722.                         ppxlcDstMBField += 2*iStride;
  723.                         *ppxlcDstMBField = *ppxlcSrcMBField;
  724.                 }
  725.                 ppxlcSrcMBField++;
  726.         }
  727. }
  728. Void CVideoObject::mcSetTopMBFieldsGray (
  729.         PixelC* ppxlcMBField1,
  730.         PixelC* ppxlcMBField2,
  731.         Int     uiBlkXSize,
  732.         Int     uiStride
  733. )
  734. {
  735.         UInt    iy, uiBlkYSize = uiBlkXSize/2;
  736. PixelC pxlcGrayVal = 128;
  737. if(m_volmd.bNot8Bit)
  738. pxlcGrayVal = 1<<(m_volmd.nBits-1);
  739.         ppxlcMBField1 -= 2*uiStride;
  740.         for (iy = 0; iy < uiBlkYSize; iy++) {
  741.                 pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
  742.                 ppxlcMBField1 -= 2*uiStride;
  743.         }
  744.         if (!ppxlcMBField2) return;
  745.         ppxlcMBField2 -= 2*uiStride;
  746.         for (iy = 0; iy < uiBlkYSize; iy++) {
  747.                 pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
  748.                 ppxlcMBField2 -= 2*uiStride;
  749.         }
  750. }
  751.  
  752. Void CVideoObject::mcSetLeftMBFieldsGray (
  753.         PixelC* ppxlcMBField1,
  754.         PixelC* ppxlcMBField2,
  755.         Int     uiBlkXSize,
  756.         Int     uiStride)
  757. {
  758.         UInt    iy, uiBlkYSize = uiBlkXSize/2;
  759. PixelC pxlcGrayVal = 128;
  760. if(m_volmd.bNot8Bit)
  761. pxlcGrayVal = 1<<(m_volmd.nBits-1);
  762. ppxlcMBField1 = ppxlcMBField1-uiBlkXSize;
  763.         for (iy = 0; iy < uiBlkYSize; iy++) {
  764.                 pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
  765.                 ppxlcMBField1 += 2*uiStride;
  766.         }
  767.         if (!ppxlcMBField2) return;
  768. ppxlcMBField2 = ppxlcMBField2-uiBlkXSize;
  769.         for (iy = 0; iy < uiBlkYSize; iy++) {
  770.                 pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
  771.                 ppxlcMBField2 += 2*uiStride;
  772.         }
  773. }
  774.  
  775. Void CVideoObject::mcSetCurrMBFieldsGray (
  776.         PixelC* ppxlcMBField1,
  777.         PixelC* ppxlcMBField2,
  778.         Int     uiBlkXSize,
  779.         Int     uiStride)
  780. {
  781.         UInt    iy, uiBlkYSize = uiBlkXSize/2;
  782. PixelC pxlcGrayVal = 128;
  783. if(m_volmd.bNot8Bit)
  784. pxlcGrayVal = 1<<(m_volmd.nBits-1);
  785.         for (iy = 0; iy < uiBlkYSize; iy++) {
  786.                 pxlcmemset (ppxlcMBField1, pxlcGrayVal, uiBlkXSize);
  787.                 ppxlcMBField1 += 2*uiStride;
  788.         }
  789.         if (!ppxlcMBField2) return;
  790.         for (iy = 0; iy < uiBlkYSize; iy++) {
  791.                 pxlcmemset (ppxlcMBField2, pxlcGrayVal, uiBlkXSize);
  792.                 ppxlcMBField2 += 2*uiStride;
  793.         }
  794. }
  795.  
  796. // End of HYUNDAI(1998-5-9)