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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*************************************************************************
  2. This software module was originally developed by 
  3. Chuang Gu (chuanggu@microsoft.com), Microsoft Corporation
  4. (date: Auguest, 1997)
  5. and also edited by
  6.     Yoshinori Suzuki (Hitachi, Ltd.)
  7.     Yuichiro Nakaya (Hitachi, Ltd.)
  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 standard> conforming products. 
  20. This copyright notice must be included in all copies or derivative works. 
  21. Copyright (c) 1996, 1997.
  22. Module Name:
  23. spt.cpp
  24. Abstract:
  25. Functions for sprite warping 
  26. Revision History:
  27. Nov. 14, 1997: Fast Affine Warping functions added by Hitachi, Ltd.
  28. Jan. 13, 1999: Code for disallowing zero demoninators in perspective
  29.                        warping added by Hitachi, Ltd.
  30. *************************************************************************/
  31. #include <stdio.h>
  32. #include <math.h>
  33. #include "typeapi.h"
  34. #include "mode.hpp"
  35. #include "vopses.hpp"
  36. #include "codehead.h"
  37. #ifdef __MFC_
  38. #ifdef _DEBUG
  39. #undef THIS_FILE
  40. static char BASED_CODE THIS_FILE[] = __FILE__;
  41. #endif
  42. #define new DEBUG_NEW    
  43. #endif // __MFC_
  44. #define _FOR_GSSP_
  45. Void CVideoObject::warpYA (const CPerspective2D& persp, const CRct& rctWarpedBound, UInt accuracy) 
  46. // warp m_pvopcSptQ's Y and A components to m_pvopcCurrQs
  47. {
  48. assert (m_pvopcCurrQ -> whereY ().includes (rctWarpedBound));
  49. const CU8Image* puciCurrY = m_pvopcCurrQ -> getPlane (Y_PLANE);
  50. #ifdef _FOR_GSSP_
  51. const CU8Image* puciCurrBY = m_pvopcCurrQ -> getPlane (BY_PLANE);
  52. #endif
  53. const CU8Image* puciCurrA = (m_pvopcSptQ -> fAUsage () == EIGHT_BIT)? m_pvopcCurrQ -> getPlane (A_PLANE) : m_pvopcCurrQ -> getPlane (BY_PLANE);
  54. const CU8Image* puciSptY = m_pvopcSptQ -> getPlane (Y_PLANE);
  55. #ifdef _FOR_GSSP_
  56. const CU8Image* puciSptBY = m_pvopcSptQ -> getPlane (BY_PLANE);
  57. #endif
  58. const CU8Image* puciSptA = (m_pvopcSptQ -> fAUsage () == EIGHT_BIT)? m_pvopcSptQ -> getPlane (A_PLANE) : m_pvopcSptQ -> getPlane (BY_PLANE);
  59. const CRct rctSptY = m_pvopcSptQ -> whereY ();
  60. const UInt offsetSlice = m_pvopcCurrQ -> whereY ().width * MB_SIZE;
  61. UInt accuracy1 = accuracy + 1;
  62. PixelC* ppxlcCurrQYSlice = (PixelC*) puciCurrY -> pixels ();
  63. #ifdef _FOR_GSSP_
  64. PixelC* ppxlcCurrQBYSlice = (PixelC*) puciCurrBY -> pixels ();
  65. #endif
  66. PixelC* ppxlcCurrQASlice = (PixelC*) puciCurrA -> pixels ();
  67. memset (ppxlcCurrQYSlice, 0, puciCurrY -> where ().area () * sizeof(PixelC));
  68. #ifdef _FOR_GSSP_
  69. memset (ppxlcCurrQBYSlice, 0, puciCurrBY -> where ().area () * sizeof(PixelC));
  70. #endif
  71. memset (ppxlcCurrQASlice, 0, puciCurrA -> where ().area () * sizeof(PixelC));
  72. ppxlcCurrQYSlice = (PixelC*) puciCurrY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  73. #ifdef _FOR_GSSP_
  74. ppxlcCurrQBYSlice = (PixelC*) puciCurrBY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  75. #endif
  76. ppxlcCurrQASlice = (PixelC*) puciCurrA -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  77. for (Int topMB = rctWarpedBound.top; topMB < rctWarpedBound.bottom; topMB += MB_SIZE) {
  78. PixelC * ppxlcCurrQYBlock = ppxlcCurrQYSlice;
  79. PixelC * ppxlcCurrQABlock = ppxlcCurrQASlice;
  80. PixelC * ppxlcCurrQBYBlock = ppxlcCurrQBYSlice;
  81. for (Int leftMB = rctWarpedBound.left; leftMB < rctWarpedBound.right; leftMB += MB_SIZE) {
  82. UInt offsetLine = m_pvopcCurrQ -> whereY ().width - min(MB_SIZE, rctWarpedBound.right - leftMB);
  83. Bool existOpaguePixelMB = (m_pvopcSptQ -> fAUsage () == RECTANGLE);
  84. Bool existZeroDenomMB = FALSE; 
  85. PixelC * ppxlcCurrQY = ppxlcCurrQYBlock;
  86. PixelC * ppxlcCurrQBY = ppxlcCurrQBYBlock;
  87. PixelC * ppxlcCurrQA = ppxlcCurrQABlock;
  88. for (CoordI y = topMB; y < min(topMB + MB_SIZE, rctWarpedBound.bottom); y++) {
  89. for (CoordI x = leftMB; x < min(leftMB + MB_SIZE, rctWarpedBound.right); x++) {
  90. CSiteWFlag src = persp * (CSite (x, y)); 
  91. if (src.f) {
  92. existZeroDenomMB = TRUE;
  93. continue;
  94. }
  95. CoordD dx = (CoordD)src.s.x / (1 << accuracy1);
  96. CoordD dy = (CoordD)src.s.y / (1 << accuracy1);
  97. CoordI fx = (CoordI) floor (dx);
  98. CoordI fy = (CoordI) floor (dy); 
  99. CoordI cx = (CoordI) ceil (dx);
  100. CoordI cy = (CoordI) ceil (dy);
  101. if (rctSptY.includes (fx, fy) && rctSptY.includes (fx, cy) && rctSptY.includes (cx, fy) && rctSptY.includes (cx, cy)) {
  102. #ifdef _FOR_GSSP_
  103. PixelC pxlcWarpedBY = puciSptBY -> pixel (src.s, accuracy);
  104. if (pxlcWarpedBY >= 128) {
  105. *ppxlcCurrQBY = MPEG4_OPAQUE;
  106. #else
  107. PixelC pxlcWarpedA = puciSptA -> pixel (src.s, accuracy);
  108. if (pxlcWarpedA >= 128) {
  109. *ppxlcCurrQA = MPEG4_OPAQUE;
  110. #endif
  111. existOpaguePixelMB = TRUE;
  112. *ppxlcCurrQY = puciSptY -> pixel (src.s, accuracy);
  113. #ifdef _FOR_GSSP_
  114. if(m_pvopcSptQ -> fAUsage () == EIGHT_BIT)
  115. *ppxlcCurrQA = puciSptA -> pixel (src.s, accuracy);
  116. #endif
  117. }
  118. }
  119. ppxlcCurrQY++;
  120. #ifdef _FOR_GSSP_
  121. ppxlcCurrQBY++;
  122. #endif
  123. ppxlcCurrQA++;
  124. }
  125. ppxlcCurrQY += offsetLine;
  126. #ifdef _FOR_GSSP_
  127. ppxlcCurrQBY += offsetLine;
  128. #endif
  129. ppxlcCurrQA += offsetLine;
  130. }
  131. assert (!(existOpaguePixelMB && existZeroDenomMB));
  132. ppxlcCurrQYBlock += MB_SIZE;
  133. #ifdef _FOR_GSSP_
  134. ppxlcCurrQBYBlock += MB_SIZE;
  135. #endif
  136. ppxlcCurrQABlock += MB_SIZE;
  137. }
  138. ppxlcCurrQYSlice += offsetSlice;
  139. #ifdef _FOR_GSSP_
  140. ppxlcCurrQBYSlice += offsetSlice;
  141. #endif
  142. ppxlcCurrQASlice += offsetSlice;
  143. }
  144. Void CVideoObject::warpUV (const CPerspective2D& persp, const CRct& rctWarpedBound, UInt accuracy) 
  145. // warp m_pvopcSptQ's U and V components to m_pvopcCurrQs
  146. {
  147. assert (m_pvopcCurrQ -> whereUV ().includes (rctWarpedBound));
  148. const CU8Image* puciCurrU = m_pvopcCurrQ -> getPlane (U_PLANE);
  149. const CU8Image* puciCurrV = m_pvopcCurrQ -> getPlane (V_PLANE);
  150. const CU8Image* puciCurrBY = m_pvopcCurrQ -> getPlane (BY_PLANE);
  151. const CU8Image* puciSptU = m_pvopcSptQ -> getPlane (U_PLANE);
  152. const CU8Image* puciSptV = m_pvopcSptQ -> getPlane (V_PLANE);
  153. const CRct rctSptUV = m_pvopcSptQ -> whereUV ();
  154. const UInt offsetSliceUV = m_pvopcCurrQ -> whereUV ().width * BLOCK_SIZE;
  155. const UInt offsetSliceBY = m_pvopcCurrQ -> whereY ().width * MB_SIZE;
  156. const UInt nextRowBY = m_pvopcCurrQ -> whereY ().width;
  157. UInt accuracy1 = accuracy + 1;
  158. PixelC* ppxlcCurrQUSlice = (PixelC*) puciCurrU -> pixels ();
  159. PixelC* ppxlcCurrQVSlice = (PixelC*) puciCurrV -> pixels ();
  160. PixelC pxlcVal = 128;
  161. // not sure if this is needed swinder
  162. if(m_volmd.nBits>8)
  163. pxlcVal = 1<<(m_volmd.nBits - 1);
  164. pxlcmemset (ppxlcCurrQUSlice, pxlcVal, puciCurrU -> where ().area ());
  165. pxlcmemset (ppxlcCurrQVSlice, pxlcVal, puciCurrV -> where ().area ());
  166. ppxlcCurrQUSlice = (PixelC*) puciCurrU -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  167. ppxlcCurrQVSlice = (PixelC*) puciCurrV -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  168. PixelC* ppxlcCurrQBYSlice = (PixelC*) puciCurrBY -> pixels (2 * rctWarpedBound.left, 2 * rctWarpedBound.top);
  169. for (Int topMB = rctWarpedBound.top; topMB < rctWarpedBound.bottom; topMB += BLOCK_SIZE) {
  170. PixelC * ppxlcCurrQUBlock = ppxlcCurrQUSlice;
  171. PixelC * ppxlcCurrQVBlock = ppxlcCurrQVSlice;
  172. PixelC * ppxlcCurrQBYBlock = ppxlcCurrQBYSlice;
  173. for (Int leftMB = rctWarpedBound.left; leftMB < rctWarpedBound.right; leftMB += BLOCK_SIZE) {
  174. PixelC *ppxlcCurrQU = ppxlcCurrQUBlock;
  175. PixelC *ppxlcCurrQV = ppxlcCurrQVBlock;
  176. PixelC *ppxlcCurrQBY = ppxlcCurrQBYBlock;
  177. PixelC *ppxlcCurrQBYNextRow = ppxlcCurrQBYBlock + nextRowBY;
  178. UInt offsetLineUV = m_pvopcCurrQ -> whereUV ().width - min(BLOCK_SIZE, rctWarpedBound.right - leftMB);
  179. UInt offsetLineBY = 2 * (m_pvopcCurrQ -> whereY ().width - min(BLOCK_SIZE, rctWarpedBound.right - leftMB));
  180. Bool existOpaguePixelMBUV = (m_pvopcSptQ -> fAUsage () == RECTANGLE);
  181. Bool existZeroDenomMBUV = FALSE; 
  182. for (CoordI y = topMB; y < min(topMB + BLOCK_SIZE, rctWarpedBound.bottom); y++) {
  183. for (CoordI x = leftMB; x < min(leftMB + BLOCK_SIZE, rctWarpedBound.right); x++) {
  184. CSiteWFlag src = persp * (CSite (x, y)); 
  185. if (src.f) {
  186. existZeroDenomMBUV = TRUE;
  187. continue;
  188. }
  189. CoordD dx = (CoordD)src.s.x / (1 << accuracy1);
  190. CoordD dy = (CoordD)src.s.y / (1 << accuracy1);
  191. CoordI fx = (CoordI) floor (dx);
  192. CoordI fy = (CoordI) floor (dy); 
  193. CoordI cx = (CoordI) ceil (dx);
  194. CoordI cy = (CoordI) ceil (dy);
  195. if (rctSptUV.includes (fx, fy) && rctSptUV.includes (fx, cy) && rctSptUV.includes (cx, fy) && rctSptUV.includes (cx, cy)) {
  196. if (*ppxlcCurrQBY | *(ppxlcCurrQBY + 1) | *ppxlcCurrQBYNextRow | *(ppxlcCurrQBYNextRow+1)) {
  197. existOpaguePixelMBUV = TRUE;
  198. *ppxlcCurrQU = puciSptU -> pixel (src.s, accuracy);
  199. *ppxlcCurrQV = puciSptV -> pixel (src.s, accuracy);
  200. }
  201. }
  202. ppxlcCurrQBY += 2;
  203. ppxlcCurrQBYNextRow += 2;
  204. ppxlcCurrQU++;
  205. ppxlcCurrQV++;
  206. }
  207. ppxlcCurrQBY += offsetLineBY;
  208. ppxlcCurrQBYNextRow += offsetLineBY;
  209. ppxlcCurrQU += offsetLineUV;
  210. ppxlcCurrQV += offsetLineUV;
  211. }
  212. assert (!(existOpaguePixelMBUV && existZeroDenomMBUV));
  213. ppxlcCurrQBYBlock += MB_SIZE;
  214. ppxlcCurrQUBlock += BLOCK_SIZE;
  215. ppxlcCurrQVBlock += BLOCK_SIZE;
  216. }
  217. ppxlcCurrQBYSlice += offsetSliceBY;
  218. ppxlcCurrQUSlice += offsetSliceUV;
  219. ppxlcCurrQVSlice += offsetSliceUV;
  220. }
  221. }  
  222. Void CVideoObject::FastAffineWarp (const CRct& rctWarpedBound, 
  223.                    const CRct& rctWarpedBoundUV, UInt accuracy, UInt pntNum) 
  224. {
  225. assert (m_pvopcCurrQ -> whereY ().includes (rctWarpedBound));
  226. const CU8Image* puciCurrY = m_pvopcCurrQ -> getPlane (Y_PLANE);
  227. #ifdef _FOR_GSSP_
  228. const CU8Image* puciCurrBY = m_pvopcCurrQ -> getPlane (BY_PLANE);
  229. #endif
  230. const CU8Image* puciCurrA = (m_pvopcSptQ -> fAUsage () == EIGHT_BIT)? m_pvopcCurrQ -> getPlane (A_PLANE) : m_pvopcCurrQ -> getPlane (BY_PLANE);
  231. const CU8Image* puciSptY = m_pvopcSptQ -> getPlane (Y_PLANE);
  232. #ifdef _FOR_GSSP_
  233. const CU8Image* puciSptBY = m_pvopcSptQ -> getPlane (BY_PLANE);
  234. #endif
  235. const CU8Image* puciSptA = (m_pvopcSptQ -> fAUsage () == EIGHT_BIT)? m_pvopcSptQ -> getPlane (A_PLANE) : m_pvopcSptQ -> getPlane (BY_PLANE);
  236. const UInt offset = m_pvopcCurrQ -> whereY ().width - rctWarpedBound.width;
  237. PixelC* ppxlcCurrQY = (PixelC*) puciCurrY -> pixels ();
  238. #ifdef _FOR_GSSP_
  239. PixelC* ppxlcCurrQBY = (PixelC*) puciCurrBY -> pixels ();
  240. #endif
  241. PixelC* ppxlcCurrQA = (PixelC*) puciCurrA -> pixels ();
  242. memset (ppxlcCurrQY, 0, puciCurrY -> where ().area () * sizeof(PixelC));
  243. #ifdef _FOR_GSSP_
  244. memset (ppxlcCurrQBY, 0, puciCurrBY -> where ().area () * sizeof(PixelC));
  245. #endif
  246. memset (ppxlcCurrQA, 0, puciCurrA -> where ().area () * sizeof(PixelC));
  247. ppxlcCurrQY = (PixelC*) puciCurrY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  248. #ifdef _FOR_GSSP_
  249. ppxlcCurrQBY = (PixelC*) puciCurrBY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  250. #endif
  251. ppxlcCurrQA = (PixelC*) puciCurrA -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  252. PixelC* ppxlcSptQY = (PixelC*) puciSptY -> pixels ();
  253. #ifdef _FOR_GSSP_
  254. PixelC* ppxlcSptQBY = (PixelC*) puciSptBY -> pixels ();
  255. #endif
  256. PixelC* ppxlcSptQA = (PixelC*) puciSptA -> pixels ();
  257.     Int sprite_left_edge = m_pvopcSptQ -> whereY ().left;
  258.     Int sprite_top_edge = m_pvopcSptQ -> whereY ().top;
  259. ppxlcSptQY = (PixelC*) puciSptY -> pixels (sprite_left_edge, sprite_top_edge);
  260. #ifdef _FOR_GSSP_
  261. ppxlcSptQBY = (PixelC*) puciSptBY -> pixels (sprite_left_edge, sprite_top_edge);
  262. #endif
  263. ppxlcSptQA = (PixelC*) puciSptA -> pixels (sprite_left_edge, sprite_top_edge);
  264. assert (m_pvopcCurrQ -> whereUV ().includes (rctWarpedBoundUV));
  265. const CU8Image* puciCurrU = m_pvopcCurrQ -> getPlane (U_PLANE);
  266. const CU8Image* puciCurrV = m_pvopcCurrQ -> getPlane (V_PLANE);
  267. #ifndef _FOR_GSSP_
  268. const CU8Image* puciCurrBY = m_pvopcCurrQ -> getPlane (BY_PLANE);
  269. #endif
  270. const CU8Image* puciSptU = m_pvopcSptQ -> getPlane (U_PLANE);
  271. const CU8Image* puciSptV = m_pvopcSptQ -> getPlane (V_PLANE);
  272. const UInt offsetUV = m_pvopcCurrQ -> whereUV ().width - rctWarpedBoundUV.width;
  273. const UInt offsetBY = 2 * (m_pvopcCurrQ -> whereY ().width -  rctWarpedBoundUV.width);
  274. PixelC* ppxlcCurrQU = (PixelC*) puciCurrU -> pixels ();
  275. PixelC* ppxlcCurrQV = (PixelC*) puciCurrV -> pixels ();
  276. PixelC pxlcVal = 128;
  277. // not sure if this is needed swinder
  278. if(m_volmd.nBits>8)
  279. pxlcVal = 1<<(m_volmd.nBits - 1);
  280. memset (ppxlcCurrQU, pxlcVal, puciCurrU -> where ().area () * sizeof(PixelC));
  281. memset (ppxlcCurrQV, pxlcVal, puciCurrV -> where ().area () * sizeof(PixelC));
  282. ppxlcCurrQU = (PixelC*) puciCurrU -> pixels (rctWarpedBoundUV.left, rctWarpedBoundUV.top);
  283. ppxlcCurrQV = (PixelC*) puciCurrV -> pixels (rctWarpedBoundUV.left, rctWarpedBoundUV.top);
  284. PixelC* ppxlcSptQU = (PixelC*) puciSptU -> pixels ();
  285. PixelC* ppxlcSptQV = (PixelC*) puciSptV -> pixels ();
  286. ppxlcSptQU = (PixelC*) puciSptU -> pixels (sprite_left_edge/2, sprite_top_edge/2);
  287. ppxlcSptQV = (PixelC*) puciSptV -> pixels (sprite_left_edge/2, sprite_top_edge/2);
  288. UInt accuracy1 = accuracy + 1;
  289.     UInt uiScale = 1 << accuracy1;
  290.     Int a = 0, b = 0, c, d = 0, e = 0, f;
  291.     Int cyy = 0, cxy = 0, dnm_pwr = 0; //wchen: get rid of unreferenced local variable cxx and cyx
  292.     Int width = rctWarpedBound.right - rctWarpedBound.left;
  293.     Int height = rctWarpedBound.bottom - rctWarpedBound.top;
  294.     Int W, H, VW, VH = 0, VWH = 0, vh_pwr, vw_pwr, vwh_pwr = 0;
  295.     Int r_pwr = 3 - accuracy;
  296.     Int r = 1 << r_pwr;
  297.     Int x0p =  (Int)(m_rgstDstQ [0].x * uiScale * r);
  298.     Int y0p =  (Int)(m_rgstDstQ [0].y * uiScale * r);
  299.     Int x1p =  (Int)(m_rgstDstQ [1].x * uiScale * r);
  300.     Int y1p =  (Int)(m_rgstDstQ [1].y * uiScale * r);
  301.     W = width;
  302.     VW = 1;
  303.     vw_pwr = 0;
  304.     while (VW < W) {
  305.         VW <<= 1;
  306.         vw_pwr++;
  307.     }
  308.     Int ex2p = 0, ey2p = 0;
  309.     Int x0 = 0;
  310.     Int y0 = 0;
  311.     Int x1 = W;
  312.     Int y1 = 0;
  313.     Int ex1p = LinearExtrapolation(x0, x1, x0p, x1p, W, VW) + ((x0+VW)<<4);
  314.     Int ey1p = LinearExtrapolation(y0, y1, y0p, y1p, W, VW) + (y0<<4);
  315.     if (pntNum==3) {
  316.          Int x2p =  (Int)(m_rgstDstQ [2].x * uiScale * r);
  317.          Int y2p =  (Int)(m_rgstDstQ [2].y * uiScale * r);
  318.          H = height;
  319.          VH = 1;
  320.          vh_pwr = 0;
  321.          while (VH < H) {
  322.              VH <<= 1;
  323.              vh_pwr++;
  324.          }
  325.          VWH = VW * VH;
  326.          vwh_pwr = vw_pwr + vh_pwr;
  327.          Int x2 = 0;
  328.          Int y2 = H;
  329.          ex2p = LinearExtrapolation(x0, x2, x0p, x2p, H, VH) + (x0<<4);
  330.          ey2p = LinearExtrapolation(y0, y2, y0p, y2p, H, VH) + ((y0+VH)<<4);
  331.          if (vw_pwr<=vh_pwr) {
  332.             VH /= VW;
  333.             VWH /= VW;
  334.             VW=1;
  335.             vh_pwr -= vw_pwr;
  336.             vwh_pwr -= vw_pwr;
  337.             vw_pwr=0;
  338.          }
  339.          else {
  340.             VW /= VH;
  341.             VWH /= VH;
  342.             VH=1;
  343.             vw_pwr -= vh_pwr;
  344.             vwh_pwr -= vh_pwr;
  345.             vh_pwr=0;
  346.          }
  347.          ex2p -= (sprite_left_edge * 16);
  348.          ey2p -= (sprite_top_edge * 16);
  349.      }
  350.      x0p -= (sprite_left_edge * 16);
  351.      y0p -= (sprite_top_edge * 16);
  352.      ex1p -= (sprite_left_edge * 16);
  353.      ey1p -= (sprite_top_edge * 16);
  354.      if (pntNum == 2) {
  355.         a = ex1p - x0p ;
  356.         b = y0p - ey1p ;
  357.         c = x0p * VW;
  358.         d = -b ;
  359.         e = a ;
  360.         f = y0p * VW;
  361.         dnm_pwr = r_pwr + vw_pwr;
  362.         cxy = c + r*VW/2;
  363.         cyy = f + r*VW/2;
  364.      } 
  365.  else if (pntNum == 3) {
  366. a = (ex1p - x0p) * VH;
  367. b = (ex2p - x0p) * VW;
  368. c = x0p * VWH;
  369. d = (ey1p - y0p) * VH;
  370. e = (ey2p - y0p) * VW;
  371. f = y0p * VWH;
  372. dnm_pwr = r_pwr + vwh_pwr;
  373. cxy = c + r*VWH/2;
  374. cyy = f + r*VWH/2;
  375.      }
  376.      Int sprite_width = m_pvopcSptQ -> whereY ().width;
  377.      Int sprite_height = m_pvopcSptQ -> whereY ().bottom
  378.                        - m_pvopcSptQ -> whereY ().top;
  379.      sprite_left_edge *= (1 << accuracy1);
  380.      sprite_top_edge *= (1 << accuracy1);
  381.      Int cxx_i, cxx_f, cyx_i, cyx_f, cxy_i, cxy_f, cyy_i, cyy_f;
  382.      Int a_i, a_f, b_i, b_f, d_i, d_f, e_i, e_f;
  383.      FourSlashes(cxy, 1<<dnm_pwr, &cxy_i, &cxy_f);
  384.      FourSlashes(cyy, 1<<dnm_pwr, &cyy_i, &cyy_f);
  385.      FourSlashes(a, 1<<dnm_pwr, &a_i, &a_f);
  386.      FourSlashes(b, 1<<dnm_pwr, &b_i, &b_f);
  387.      FourSlashes(d, 1<<dnm_pwr, &d_i, &d_f);
  388.      FourSlashes(e, 1<<dnm_pwr, &e_i, &e_f);
  389.      Int fracmask = (1 << dnm_pwr) - 1;
  390.      Int y,x;
  391.      UInt accuracy2 = accuracy1 << 1;
  392. #ifdef _FOR_GSSP_
  393.      PixelC pxlcWarpedBY;
  394. #else
  395.      PixelC pxlcWarpedA;
  396. #endif
  397.      Int rx,ry;
  398.      Int addr_offset;
  399.      Int warpmask = uiScale -1;
  400.      Int bias = 1<<(accuracy2-1);
  401.  for (y = 0; y < height; 
  402.           cxy_i += b_i, cxy_f += b_f, cyy_i += e_i, cyy_f += e_f, y++) {
  403. cxy_i += cxy_f >> dnm_pwr;
  404. cyy_i += cyy_f >> dnm_pwr;
  405. cxy_f &= fracmask;
  406. cyy_f &= fracmask;
  407. for (x = 0, cxx_i = cxy_i, cxx_f = cxy_f, 
  408. cyx_i = cyy_i, cyx_f = cyy_f;
  409. x < width; cxx_i += a_i, cxx_f += a_f, 
  410. cyx_i += d_i, cyx_f += d_f, x++) {
  411. cxx_i += cxx_f >> dnm_pwr;
  412. cyx_i += cyx_f >> dnm_pwr;
  413. cxx_f &= fracmask;
  414. cyx_f &= fracmask;
  415.             if (cxx_i >= EXPANDY_REFVOP && cyx_i >= EXPANDY_REFVOP 
  416.   && cxx_i <= ((sprite_width-1-EXPANDY_REFVOP)<<accuracy1)
  417.   && cyx_i <= ((sprite_height-1-EXPANDY_REFVOP)<<accuracy1)) {
  418. addr_offset = (cyx_i>>accuracy1) * sprite_width + (cxx_i>>accuracy1);
  419. rx = cxx_i & warpmask;
  420. ry = cyx_i & warpmask;
  421. #ifdef _FOR_GSSP_
  422. pxlcWarpedBY = CInterpolatePixelValue ( ppxlcSptQBY, 
  423. #else
  424. pxlcWarpedA = CInterpolatePixelValue ( ppxlcSptQA, 
  425. #endif
  426. addr_offset,sprite_width, rx, ry,
  427. uiScale, bias, accuracy2);
  428. #ifdef _FOR_GSSP_
  429.            if (pxlcWarpedBY >= 128) {
  430.   *ppxlcCurrQBY = MPEG4_OPAQUE;
  431. #else
  432.            if (pxlcWarpedA >= 128) {
  433.   *ppxlcCurrQA = MPEG4_OPAQUE;
  434. #endif
  435.                     *ppxlcCurrQY = CInterpolatePixelValue ( ppxlcSptQY, 
  436. addr_offset, sprite_width, rx, ry,
  437. uiScale, bias, accuracy2);
  438. #ifdef _FOR_GSSP_
  439.                         if(m_pvopcSptQ -> fAUsage () == EIGHT_BIT)
  440.                      *ppxlcCurrQA = CInterpolatePixelValue ( ppxlcSptQA, 
  441. addr_offset, sprite_width, rx, ry,
  442. uiScale, bias, accuracy2);
  443. #endif
  444. }
  445.     }
  446. ppxlcCurrQY++;
  447. #ifdef _FOR_GSSP_
  448. ppxlcCurrQBY++;
  449. #endif
  450. ppxlcCurrQA++;
  451. }
  452. ppxlcCurrQY += offset;
  453. #ifdef _FOR_GSSP_
  454. ppxlcCurrQBY += offset;
  455. #endif
  456. ppxlcCurrQA += offset;
  457.  }
  458. #ifdef _FOR_GSSP_
  459. ppxlcCurrQBY = (PixelC*) puciCurrBY -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  460. PixelC* ppxlcCurrQBYNextRow = ppxlcCurrQBY + puciCurrBY -> where ().width;
  461. #else
  462. ppxlcCurrQA = (PixelC*) puciCurrA -> pixels (rctWarpedBound.left, rctWarpedBound.top);
  463. PixelC* ppxlcCurrQANextRow = ppxlcCurrQA + puciCurrA -> where ().width;
  464. #endif
  465. sprite_left_edge /= 2;
  466. sprite_top_edge /= 2;
  467. width /= 2;
  468. height /= 2;
  469. sprite_width /= 2;
  470. sprite_height /= 2;
  471. if (pntNum == 2) {
  472. c = 2 * x0p * VW - 16*VW ;
  473. f = 2 * y0p * VW - 16*VW ;
  474. cxy = a + b + c + 2*r*VW;
  475. cyy = d + e + f + 2*r*VW;
  476. else if (pntNum == 3) {
  477. c = 2 * x0p * VWH - 16*VWH ;
  478. f = 2 * y0p * VWH - 16*VWH ;
  479. cxy = a + b + c + 2*VWH*r;
  480. cyy = d + e + f + 2*VWH*r;
  481. }
  482. a_f *= 4;
  483. b_f *= 4;
  484. d_f *= 4;
  485. e_f *= 4;
  486. dnm_pwr += 2;
  487. FourSlashes(cxy, 1<<dnm_pwr, &cxy_i, &cxy_f);
  488. FourSlashes(cyy, 1<<dnm_pwr, &cyy_i, &cyy_f);
  489. fracmask = (1 << dnm_pwr) - 1;
  490. for (y = 0; y < height; 
  491. cxy_i+=b_i, cxy_f+=b_f, cyy_i+=e_i, cyy_f+=e_f, y++) {
  492. cxy_i += cxy_f >> dnm_pwr;
  493. cyy_i += cyy_f >> dnm_pwr;
  494. cxy_f &= fracmask;
  495. cyy_f &= fracmask;
  496. for (x = 0, cxx_i = cxy_i, cxx_f = cxy_f, 
  497.                     cyx_i = cyy_i, cyx_f = cyy_f;
  498.                     x < width; cxx_i += a_i, cxx_f += a_f, 
  499.                     cyx_i += d_i, cyx_f += d_f, x++) {
  500. cxx_i += cxx_f >> dnm_pwr;
  501. cyx_i += cyx_f >> dnm_pwr;
  502. cxx_f &= fracmask;
  503. cyx_f &= fracmask;
  504. if ( cxx_i >= EXPANDUV_REFVOP && cyx_i >= EXPANDUV_REFVOP 
  505.   && cxx_i <= ((sprite_width-1-EXPANDUV_REFVOP)<<accuracy1)
  506.   && cyx_i <= ((sprite_height-1-EXPANDUV_REFVOP)<<accuracy1)) {
  507. addr_offset = (cyx_i>>accuracy1) * sprite_width + (cxx_i>>accuracy1);
  508. rx = cxx_i & warpmask;
  509. ry = cyx_i & warpmask;
  510. #ifdef _FOR_GSSP_
  511. if (*ppxlcCurrQBY | *(ppxlcCurrQBY + 1) | *ppxlcCurrQBYNextRow | *(ppxlcCurrQBYNextRow+1)) {
  512. #else
  513. if (*ppxlcCurrQA | *(ppxlcCurrQA + 1) | *ppxlcCurrQANextRow | *(ppxlcCurrQANextRow+1)) {
  514. #endif
  515. *ppxlcCurrQU = CInterpolatePixelValue ( ppxlcSptQU, addr_offset,
  516. sprite_width, rx, ry, uiScale, 
  517. bias, accuracy2); 
  518. *ppxlcCurrQV = CInterpolatePixelValue ( ppxlcSptQV, addr_offset,
  519. sprite_width, rx, ry, uiScale, 
  520. bias, accuracy2); 
  521. }
  522.     }
  523. #ifdef _FOR_GSSP_
  524. ppxlcCurrQBY += 2;
  525. ppxlcCurrQBYNextRow += 2;
  526. #else
  527. ppxlcCurrQA += 2;
  528. ppxlcCurrQANextRow += 2;
  529. #endif
  530. ppxlcCurrQU++;
  531. ppxlcCurrQV++;
  532. }
  533. #ifdef _FOR_GSSP_
  534. ppxlcCurrQBY += offsetBY;
  535. ppxlcCurrQBYNextRow += offsetBY;
  536. #else
  537. ppxlcCurrQA += offsetBY;
  538. ppxlcCurrQANextRow += offsetBY;
  539. #endif
  540. ppxlcCurrQU += offsetUV;
  541. ppxlcCurrQV += offsetUV;
  542. }
  543. }
  544. PixelC CVideoObject:: CInterpolatePixelValue(PixelC* F, Int pos, Int width,
  545.                            Int rx, Int ry, Int wpc, Int bias, Int pow_denom)
  546. {
  547. PixelC* Fp;
  548. Int rxc, ryc;
  549. Int hstep, vstep;
  550. Fp = F + pos;
  551. rxc = wpc - rx;
  552. ryc = wpc - ry;
  553. hstep = rx ? 1 : 0;
  554. vstep = ry ? width : 0;
  555. return ((PixelC) (((ryc * (rxc * *Fp + rx * *(Fp+hstep))
  556.             + ry * (rxc * *(Fp+vstep) + rx * *(Fp+vstep+hstep))) + bias)
  557.             >> pow_denom));
  558. }
  559. Int CVideoObject:: LinearExtrapolation(Int x0, Int x1, Int x0p, Int x1p, Int W, Int VW)
  560. {
  561. Int quot, res, ressum, extrapolated;
  562. FourSlashes(x0p - (x0 << 4), W, &quot, &res);
  563. extrapolated = quot * (W - VW);
  564. FourSlashes(res * (W - VW), W, &quot, &res);
  565. extrapolated += quot;
  566. ressum = res;
  567. FourSlashes(x1p - (x1 << 4), W, &quot, &res);
  568. extrapolated += quot * VW + res;
  569. FourSlashes(res * (VW - W), W, &quot, &res);
  570. extrapolated += quot;
  571. ressum += res;
  572. FourSlashes(ressum, W, &quot, &res);
  573. extrapolated += quot;
  574. if(extrapolated >= 0) {
  575. if(res >= (W+1) / 2)
  576. extrapolated++;
  577. else
  578. if(res > W / 2)
  579. extrapolated++;
  580. return(extrapolated);
  581. }
  582. Void CVideoObject::FourSlashes(Int num, Int denom, Int *quot, Int *res)
  583. {
  584. *quot =  num / denom;
  585. if (*quot * denom == num)
  586. *res = 0;
  587. else 
  588. {
  589. if (num < 0) /* denom is larger than zero */
  590. *quot -= 1;
  591. *res = num - denom * *quot;
  592. }
  593. }
  594. Void CVideoObject::swapRefQ1toSpt ()
  595. {
  596. m_pvopcSptQ = m_pvopcRefQ1;
  597. m_pvopcSptQ -> shift (m_rctSpt.left, m_rctSpt.top); 
  598. #ifdef _FOR_GSSP_
  599. if(m_pvopcSptQ -> fAUsage () == EIGHT_BIT){
  600. CU8Image* puciSptBY = (CU8Image *) m_pvopcSptQ -> getPlane (BY_PLANE);
  601. puciSptBY -> shift (m_rctSpt.left, m_rctSpt.top);
  602. }
  603. #endif
  604. m_pvopcRefQ1 = NULL;
  605. }
  606. Void CVideoObject::changeSizeofCurrQ (CRct rctOrg)
  607. {
  608. delete m_pvopcCurrQ;
  609. rctOrg.expand (EXPANDY_REF_FRAME);
  610. m_pvopcCurrQ = new CVOPU8YUVBA (m_pvopcSptQ -> fAUsage (), rctOrg);
  611. }
  612.  
  613. Bool CVideoObject::SptPieceMB_NOT_HOLE(Int iMBXoffset, Int iMBYoffset, CMBMode* pmbmd) 
  614. //   In a given Sprite object piece, Check whether current macroblock is not a hole and should be coded ?
  615. {
  616. if (m_tPiece < 0)
  617. return TRUE;
  618. else 
  619. {
  620. CMBMode* pmbmdLeft = pmbmd - 1;
  621. Int iMBX =  iMBXoffset + m_iPieceXoffset;
  622. Int iMBY =  iMBYoffset + m_iPieceYoffset;
  623. Int iMBX1 = iMBX -1;
  624. // dshu: [v071] begin of modification
  625. Int iMod = m_rctSpt.width % MB_SIZE;
  626. Int iSptWidth = (iMod > 0) ? m_rctSpt.width + MB_SIZE - iMod : m_rctSpt.width;
  627. Int iNumMBX = iSptWidth / MB_SIZE;   
  628. // dshu: [v071] end of modification
  629. IntraPredDirection* Spreddir = m_rgmbmdSpt[iMBY][iMBX1].m_preddir;
  630. IntraPredDirection* preddir = (*pmbmdLeft).m_preddir;
  631. if (iMBXoffset >0 ) 
  632. if( m_ppPieceMBstatus[iMBY][iMBX1] == NOT_DONE)
  633. {
  634. m_ppPieceMBstatus[iMBY][iMBX1] = PIECE_DONE;
  635. m_rgmbmdSpt[iMBY][iMBX1] = CMBMode (*pmbmdLeft);
  636. m_rgmbmdSprite[iMBX1 + iNumMBX * iMBY] = CMBMode (*pmbmdLeft);  // dshu: [v071]  added to store mbmd array for sprite
  637. memcpy (Spreddir, preddir, 10  * sizeof (IntraPredDirection));
  638. }
  639. else {
  640. *pmbmdLeft = CMBMode (m_rgmbmdSpt[iMBY][iMBX1]);
  641. memcpy (preddir, Spreddir, 10  * sizeof (IntraPredDirection));
  642. }
  643. // dshu: begin of modification
  644. if ( iMBX < (m_rctSptQ.width / MB_SIZE))   
  645. // dshu: end of modification
  646. // if ( iMBX < (m_rctSptExp.width / MB_SIZE))
  647. return ( m_ppPieceMBstatus[iMBY][iMBX] == NOT_DONE) ;
  648. }
  649. return FALSE;
  650. }
  651.  
  652. Bool CVideoObject::SptUpdateMB_NOT_HOLE(Int iMBXoffset, Int iMBYoffset, CMBMode* pmbmd)
  653. //   In a given Sprite update piece, Check whether current macroblock is not a hole and should be coded ?
  654. {
  655. Int iMBX =  iMBXoffset + m_iPieceXoffset;
  656. Int iMBY =  iMBYoffset + m_iPieceYoffset;
  657. Int iMBX1 = iMBX -1;
  658. if ( (iMBXoffset >0 ) && ( m_ppUpdateMBstatus[iMBY][iMBX1] == NOT_DONE))
  659. m_ppUpdateMBstatus[iMBY][iMBX1] = UPDATE_DONE;
  660. *pmbmd = CMBMode (m_rgmbmdSpt[iMBY][iMBX]);
  661. return ( m_ppUpdateMBstatus[iMBY][iMBX] == NOT_DONE) ;
  662. Void CVideoObject::SaveMBmCurrRow (Int iMBYoffset, MacroBlockMemory** rgpmbmCurr)
  663. {
  664. Int iMBX;
  665. Int iMBY =  iMBYoffset + m_iPieceYoffset;
  666. Int iMB, iBlk;
  667. Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6;
  668. Int *Dest;
  669. Int *Src;
  670.   for (iMB = 0; iMB < m_iNumMBX; iMB++) {
  671. iMBX = iMB + m_iPieceXoffset;
  672. for (iBlk = 0; iBlk < nBlk; iBlk++) {
  673. Dest = (m_rgpmbmCurr_Spt[iMBY][iMBX]->rgblkm) [iBlk];
  674. Src = (rgpmbmCurr[iMB]->rgblkm) [iBlk];
  675. memcpy (Dest, Src, ((BLOCK_SIZE << 1) - 1)  * sizeof (Int));
  676. }
  677. }
  678. }
  679.  Void CVideoObject::RestoreMBmCurrRow (Int iMBYoffset, MacroBlockMemory** rgpmbmCurr)
  680. {
  681. Int iMBX;
  682. Int iMBY =  iMBYoffset + m_iPieceYoffset;
  683. Int iMB, iBlk;
  684. Int nBlk = (m_volmd.fAUsage == EIGHT_BIT) ? 10 : 6;
  685. Int *Dest, *Src;
  686.   for (iMB = 0; iMB < m_iNumMBX; iMB++) {
  687. iMBX = iMB + m_iPieceXoffset;
  688. for (iBlk = 0; iBlk < nBlk; iBlk++) {
  689. Src = (m_rgpmbmCurr_Spt[iMBY][iMBX]->rgblkm) [iBlk];
  690. Dest = (rgpmbmCurr[iMB]->rgblkm) [iBlk];
  691. memcpy (Dest, Src, ((BLOCK_SIZE << 1) - 1)  * sizeof (Int));
  692. }
  693. }
  694. }
  695. Void CVideoObject::CopyCurrQToPred (
  696. PixelC* ppxlcQMBY, 
  697. PixelC* ppxlcQMBU, 
  698. PixelC* ppxlcQMBV
  699. )
  700. {
  701. CoordI ix, iy, ic = 0;
  702. for (iy = 0; iy < MB_SIZE; iy++) {
  703. for (ix = 0; ix < MB_SIZE; ix++, ic++) {
  704. m_ppxlcPredMBY [ic] = ppxlcQMBY [ix] ;
  705. }   
  706. ppxlcQMBY += m_iFrameWidthY;
  707. }
  708. ic = 0;
  709. for (iy = 0; iy < BLOCK_SIZE; iy++) {
  710. for (ix = 0; ix < BLOCK_SIZE; ix++, ic++) {
  711. m_ppxlcPredMBU [ic] =  ppxlcQMBU [ix];
  712. m_ppxlcPredMBV [ic] =  ppxlcQMBV [ix];
  713. }
  714. ppxlcQMBU += m_iFrameWidthUV;
  715. ppxlcQMBV += m_iFrameWidthUV;
  716. }
  717. }
  718. //low latency sprite stuff
  719. Void CVideoObject::VOPOverlay (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, Int iscale)
  720. {
  721. float fscaleY = (float) ((iscale == 0) ? 0.0 : 1.0);   //  check whether there is a EXPANDY_REF_FRAME
  722. float fscaleUV = (float) ((iscale == 0) ? 0.0 : 0.5);
  723. CU8Image* uci1 = const_cast<CU8Image*> (pvopc1.getPlane (Y_PLANE)); 
  724. CU8Image* uci2 = const_cast<CU8Image*> (pvopc2.getPlane (Y_PLANE));
  725. Overlay (*uci1, *uci2, fscaleY) ; 
  726. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (U_PLANE)); 
  727. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (U_PLANE));
  728. Overlay (*uci1, *uci2, fscaleUV) ; 
  729. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (V_PLANE)); 
  730. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (V_PLANE));
  731. Overlay (*uci1, *uci2, fscaleUV) ; 
  732. if (m_volmd.fAUsage != RECTANGLE) {
  733. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BY_PLANE)); 
  734. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BY_PLANE));
  735. Overlay (*uci1, *uci2, fscaleY) ; 
  736. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BUV_PLANE)); 
  737. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BUV_PLANE));
  738. Overlay (*uci1, *uci2, fscaleUV) ;
  739. if (m_volmd.fAUsage == EIGHT_BIT) { 
  740. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (A_PLANE)); 
  741. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (A_PLANE));
  742. Overlay (*uci1, *uci2, fscaleY) ; 
  743. }
  744. }
  745. }
  746. Void CVideoObject::Overlay (CU8Image& uci1, CU8Image& uci2, float fscale)
  747. {
  748. CRct r1 = uci1.where ();
  749. CRct r2 = uci2.where (); 
  750. CoordI x = r1.left + (CoordI) (EXPANDY_REF_FRAME * fscale); // copy pixels, skip the guard band
  751. CoordI y = r1.top + (CoordI) (EXPANDY_REF_FRAME * fscale);
  752. Int cbLine = (r1.width- 2 * (Int) (EXPANDY_REF_FRAME * fscale)) * sizeof (PixelC);
  753. PixelC* ppxl = (PixelC*) uci2.pixels (x, y);
  754. const PixelC* ppxlFi = uci1.pixels (x, y);
  755. Int widthCurr = r2.width;
  756. Int widthFi = r1.width;
  757. for (CoordI yi = y; yi < (r1.bottom - EXPANDY_REF_FRAME * fscale); yi++) {
  758. memcpy (ppxl, ppxlFi, cbLine);
  759. ppxl += widthCurr;
  760. ppxlFi += widthFi;
  761. }
  762. }
  763. // dshu: begin of modification
  764. // get from  pvopc2 at (rctPieceY.left,rctPieceY.right)
  765. Void CVideoObject::PieceGet (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, CRct rctPieceY)
  766. {
  767. CRct rctPieceUV = rctPieceY.downSampleBy2 ();
  768. CU8Image* uci1 = const_cast<CU8Image*> (pvopc1.getPlane (Y_PLANE)); 
  769. CU8Image* uci2 = const_cast<CU8Image*> (pvopc2.getPlane (Y_PLANE));
  770. U8iGet(*uci1, *uci2, rctPieceY) ; 
  771. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (U_PLANE)); 
  772. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (U_PLANE));
  773. U8iGet(*uci1, *uci2, rctPieceUV) ; 
  774. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (V_PLANE)); 
  775. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (V_PLANE));
  776. U8iGet(*uci1, *uci2, rctPieceUV) ; 
  777. if (m_volmd.fAUsage != RECTANGLE) {
  778. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BY_PLANE)); 
  779. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BY_PLANE));
  780. U8iGet(*uci1, *uci2, rctPieceY) ; 
  781. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BUV_PLANE)); 
  782. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BUV_PLANE));
  783. U8iGet(*uci1, *uci2, rctPieceUV) ;
  784. if (m_volmd.fAUsage == EIGHT_BIT) { 
  785. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (A_PLANE)); 
  786. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (A_PLANE));
  787. U8iGet(*uci1, *uci2, rctPieceY) ; 
  788. }
  789. }
  790. }
  791.  
  792. Void CVideoObject::U8iGet(CU8Image& uci1, CU8Image& uci2, CRct rctPiece)
  793. {
  794. CRct r1 = uci1.where ();
  795. CRct r2 = uci2.where (); 
  796. CoordI x = rctPiece.left ; 
  797. CoordI y = rctPiece.top ;
  798. Int cbLine = (rctPiece.width) * sizeof (PixelC);
  799. PixelC* ppxl = (PixelC*) uci1.pixels (0, 0);
  800. const PixelC* ppxlFi = uci2.pixels (x, y);
  801. Int widthCurr = r2.width;
  802. Int widthFi = r1.width;
  803. for (CoordI yi = y; yi < rctPiece.bottom; yi++) {
  804. memcpy (ppxl, ppxlFi, cbLine);
  805. ppxl += widthCurr;
  806. ppxlFi += widthFi;
  807. }
  808. }
  809. //  put into pvopc2 at (rctPieceY.left,rctPieceY.right)
  810. Void CVideoObject::PiecePut (CVOPU8YUVBA& pvopc1, CVOPU8YUVBA& pvopc2, CRct rctPieceY)
  811. {
  812. CRct rctPieceUV = rctPieceY.downSampleBy2 ();
  813. CU8Image* uci1 = const_cast<CU8Image*> (pvopc1.getPlane (Y_PLANE)); 
  814. CU8Image* uci2 = const_cast<CU8Image*> (pvopc2.getPlane (Y_PLANE));
  815. U8iPut(*uci1, *uci2, rctPieceY) ; 
  816. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (U_PLANE)); 
  817. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (U_PLANE));
  818. U8iPut(*uci1, *uci2, rctPieceUV) ; 
  819. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (V_PLANE)); 
  820. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (V_PLANE));
  821. U8iPut(*uci1, *uci2, rctPieceUV) ; 
  822. if (m_volmd.fAUsage != RECTANGLE) {
  823. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BY_PLANE)); 
  824. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BY_PLANE));
  825. U8iPut(*uci1, *uci2, rctPieceY) ; 
  826. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (BUV_PLANE)); 
  827. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (BUV_PLANE));
  828. U8iPut(*uci1, *uci2, rctPieceUV) ;
  829. if (m_volmd.fAUsage == EIGHT_BIT) { 
  830. uci1 = const_cast<CU8Image*> (pvopc1.getPlane (A_PLANE)); 
  831. uci2 = const_cast<CU8Image*> (pvopc2.getPlane (A_PLANE));
  832. U8iPut(*uci1, *uci2, rctPieceY) ; 
  833. }
  834. }
  835. }
  836.  
  837. Void CVideoObject::U8iPut(CU8Image& uci1, CU8Image& uci2, CRct rctPiece)
  838. {
  839. CRct r1 = uci1.where ();
  840. CRct r2 = uci2.where (); 
  841. CoordI x = rctPiece.left ; 
  842. CoordI y = rctPiece.top ;
  843. Int cbLine = (rctPiece.width) * sizeof (PixelC);
  844. PixelC* ppxl = (PixelC*) uci2.pixels (x, y);
  845. const PixelC* ppxlFi = uci1.pixels (0, 0);
  846. Int widthCurr = r2.width;
  847. Int widthFi = r1.width;
  848. for (CoordI yi = y; yi < rctPiece.bottom; yi++) {
  849. memcpy (ppxl, ppxlFi, cbLine);
  850. ppxl += widthCurr;
  851. ppxlFi += widthFi;
  852. }
  853. }
  854.  
  855. // dshu: end of modification
  856. // dshu: [v071]  Begin of modification
  857.  
  858. Void CVideoObject::padSprite()
  859. {
  860. m_iNumMBX = m_rctSptQ.width / MB_SIZE; 
  861. m_iNumMBY = m_rctSptQ.height () / MB_SIZE;
  862. Int iMBXleft, iMBXright; 
  863. Int iMBYup, iMBYdown;
  864. CMBMode* pmbmd = m_rgmbmdSprite;
  865. PixelC* ppxlcRefY  = (PixelC*) m_pvopcSptQ->pixelsY () + m_iStartInRefToCurrRctY;
  866. PixelC* ppxlcRefU  = (PixelC*) m_pvopcSptQ->pixelsU () + m_iStartInRefToCurrRctUV;
  867. PixelC* ppxlcRefV  = (PixelC*) m_pvopcSptQ->pixelsV () + m_iStartInRefToCurrRctUV;
  868. PixelC* ppxlcRefBY = (PixelC*) m_pvopcSptQ->pixelsBY () + m_iStartInRefToCurrRctY;
  869. PixelC* ppxlcRefA  = (PixelC*) m_pvopcSptQ->pixelsA () + m_iStartInRefToCurrRctY;
  870. PixelC* ppxlcRefBUV = (PixelC*) m_pvopcSptQ->pixelsBUV () + m_iStartInRefToCurrRctUV;
  871. for (Int iMBY = 0; iMBY < m_iNumMBY; iMBY++){
  872. PixelC* ppxlcRefMBY  = ppxlcRefY;
  873. PixelC* ppxlcRefMBU  = ppxlcRefU;
  874. PixelC* ppxlcRefMBV  = ppxlcRefV;
  875. PixelC* ppxlcRefMBBY = ppxlcRefBY;
  876. PixelC* ppxlcRefMBBUV = ppxlcRefBUV;
  877. PixelC* ppxlcRefMBA  = ppxlcRefA;
  878. iMBYup = iMBY -1;
  879. iMBYdown = iMBY +1;
  880. for (Int iMBX = 0; iMBX < m_iNumMBX; iMBX++)
  881. {
  882. iMBXleft = iMBX -1 ; 
  883. iMBXright = iMBX +1 ;
  884. if((m_volmd.bShapeOnly==FALSE) && (m_ppPieceMBstatus[iMBY][iMBX] == PIECE_DONE))
  885. {
  886. pmbmd->m_bPadded=FALSE;
  887. copySptQShapeYToMb (m_ppxlcCurrMBBY, ppxlcRefMBBY);
  888. downSampleBY (m_ppxlcCurrMBBY, m_ppxlcCurrMBBUV); // downsample original BY now for LPE padding (using original shape)
  889. if (pmbmd->m_rgTranspStatus [0] != ALL)
  890. {
  891. // MC padding
  892. if (pmbmd -> m_rgTranspStatus [0] == PARTIAL)
  893. mcPadCurrMB (ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV,
  894. ppxlcRefMBA);
  895. padNeighborTranspMBs (
  896. iMBX, iMBY,
  897. pmbmd,
  898. ppxlcRefMBY, ppxlcRefMBU, ppxlcRefMBV, ppxlcRefMBA
  899. );
  900. }
  901. else
  902. {
  903. if (iMBX > 0)
  904. {
  905. if ((pmbmd - 1)->m_rgTranspStatus [0] != ALL &&
  906. m_ppPieceMBstatus[iMBY][iMBX-1] == PIECE_DONE)
  907. {
  908.     mcPadCurrMBFromLeft (ppxlcRefMBY, ppxlcRefMBU,
  909.                          ppxlcRefMBV, ppxlcRefMBA);
  910. pmbmd->m_bPadded = TRUE;
  911. }
  912. }
  913. if (iMBY > 0)
  914. {
  915. if ((pmbmd - m_iNumMBX)->m_rgTranspStatus [0] != ALL &&
  916. m_ppPieceMBstatus[iMBY-1][iMBX] == PIECE_DONE)
  917. {
  918. if (!(pmbmd->m_bPadded))
  919. {
  920. mcPadCurrMBFromTop (ppxlcRefMBY, ppxlcRefMBU,
  921.    ppxlcRefMBV, ppxlcRefMBA);
  922. pmbmd->m_bPadded = TRUE;
  923. }
  924. }
  925. else if (!(pmbmd - m_iNumMBX)->m_bPadded)
  926. mcSetTopMBGray (ppxlcRefMBY, ppxlcRefMBU,
  927.    ppxlcRefMBV, ppxlcRefMBA);
  928. }
  929. if(iMBY == m_iNumMBY-1)
  930. {
  931. if(iMBX > 0 && (pmbmd-1)->m_rgTranspStatus [0] == ALL &&
  932. !((pmbmd-1)->m_bPadded))
  933. mcSetLeftMBGray(ppxlcRefMBY, ppxlcRefMBU,
  934. ppxlcRefMBV, ppxlcRefMBA);
  935. if(iMBX == m_iNumMBX-1 && !(pmbmd->m_bPadded))
  936. mcSetCurrMBGray(ppxlcRefMBY, ppxlcRefMBU,
  937. ppxlcRefMBV, ppxlcRefMBA);
  938. }
  939. }
  940. }
  941. ppxlcRefMBA += MB_SIZE;
  942. ppxlcRefMBBY += MB_SIZE;
  943. ppxlcRefMBBUV += BLOCK_SIZE;
  944. pmbmd++;
  945. ppxlcRefMBY += MB_SIZE;
  946. ppxlcRefMBU += BLOCK_SIZE;
  947. ppxlcRefMBV += BLOCK_SIZE;
  948. }
  949. ppxlcRefY += m_iFrameWidthYxMBSize;
  950. ppxlcRefU += m_iFrameWidthUVxBlkSize;
  951. ppxlcRefV += m_iFrameWidthUVxBlkSize;
  952. ppxlcRefBY += m_iFrameWidthYxMBSize;
  953. ppxlcRefA += m_iFrameWidthYxMBSize;
  954. ppxlcRefBUV += m_iFrameWidthUVxBlkSize;
  955. }
  956. m_rctPrevNoExpandY = m_rctSptQ;
  957. m_rctPrevNoExpandUV = m_rctPrevNoExpandY.downSampleBy2 ();
  958. repeatPadYOrA ((PixelC*) m_pvopcSptQ->pixelsY () + m_iOffsetForPadY, m_pvopcSptQ);
  959. repeatPadUV (m_pvopcSptQ);
  960. //reset by in RefQ1 so that no left-over from last frame
  961. if (m_volmd.fAUsage != RECTANGLE)       {
  962. if (m_volmd.fAUsage == EIGHT_BIT)
  963. repeatPadYOrA ((PixelC*) m_pvopcSptQ->pixelsA () + m_iOffsetForPadY, m_pvopcSptQ);
  964. }
  965. }
  966. Void CVideoObject::copySptQShapeYToMb (
  967. PixelC* ppxlcDstMB, const PixelC* ppxlcSrc)
  968. {
  969. for (Int i = 0; i < MB_SIZE; i++) {
  970. memcpy (ppxlcDstMB, ppxlcSrc, MB_SIZE*sizeof(PixelC));
  971. ppxlcSrc += m_iFrameWidthY;
  972. ppxlcDstMB  += MB_SIZE;
  973. }
  974. }
  975. // dshu: [v071] end of modification