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

流媒体/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: March, 1996)
  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. yuva.hpp
  24. Abstract:
  25. YUVA (4:2:0) VOP 
  26. Revision History:
  27. *************************************************************************/
  28. #include "typeapi.h"
  29. #ifdef __MFC_
  30. #ifdef _DEBUG
  31. #undef THIS_FILE
  32. static char BASED_CODE THIS_FILE[] = __FILE__;
  33. #endif
  34. #define new DEBUG_NEW    
  35. #endif // __MFC_
  36. CVOPIntYUVBA::~CVOPIntYUVBA ()
  37. {
  38. delete m_piiY;
  39. delete m_piiU;
  40. delete m_piiV;
  41. delete m_piiBY;
  42. delete m_piiBUV;
  43. delete m_piiA;
  44. }
  45. Void CVOPIntYUVBA::constructFromVOPF (const CVOPIntYUVBA& vopi, const CRct& rc)
  46. {
  47. if (rc.valid ()) {
  48. CRct rY = (rc.valid ()) ? rc : vopi.whereY ();
  49. CRct rUV = rY / 2;
  50. m_piiY = new CIntImage (*vopi.getPlane (Y_PLANE), rY);
  51. m_piiU = new CIntImage (*vopi.getPlane (U_PLANE), rUV);
  52. m_piiV = new CIntImage (*vopi.getPlane (V_PLANE), rUV);
  53. m_piiBY = new CIntImage (*vopi.getPlane (BY_PLANE), rY);
  54. m_piiBUV = new CIntImage (*vopi.getPlane (BUV_PLANE), rUV);
  55. if (m_fAUsage == EIGHT_BIT) {
  56. m_piiA = new CIntImage (*vopi.getPlane (A_PLANE), rY);
  57. assert (m_piiA != NULL);
  58. }
  59. }
  60. else {
  61. m_piiY = new CIntImage (*vopi.getPlane (Y_PLANE));
  62. m_piiU = new CIntImage (*vopi.getPlane (U_PLANE));
  63. m_piiV = new CIntImage (*vopi.getPlane (V_PLANE));
  64. m_piiBY = new CIntImage (*vopi.getPlane (BY_PLANE));
  65. m_piiBUV = new CIntImage (*vopi.getPlane (BUV_PLANE));
  66. if (m_fAUsage == EIGHT_BIT) {
  67. m_piiA = new CIntImage (*vopi.getPlane (A_PLANE));
  68. assert (m_piiA != NULL);
  69. }
  70. }
  71. assert (m_piiY != NULL);
  72. assert (m_piiU != NULL);
  73. assert (m_piiV != NULL);
  74. assert (m_piiBY != NULL);
  75. assert (m_piiBUV != NULL);
  76. }
  77. CVOPIntYUVBA::CVOPIntYUVBA (const CVOPIntYUVBA& vopi, AlphaUsage fAUsage, const CRct& rc) : 
  78. m_fAUsage (fAUsage), m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  79. {
  80. constructFromVOPF (vopi, rc);
  81. }
  82. CVOPIntYUVBA::CVOPIntYUVBA (const CVOPIntYUVBA& vopi, const CRct& rc) : 
  83. m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  84. {
  85. m_fAUsage = vopi.fAUsage ();
  86. constructFromVOPF (vopi, rc);
  87. }
  88. CVOPIntYUVBA::CVOPIntYUVBA (const CVideoObjectPlane& vop, AlphaUsage fAUsage, const CRct& rc) : 
  89. m_fAUsage (fAUsage), m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  90. {
  91. CRct r = (rc.valid ()) ? rc : vop.where ();
  92. m_piiY = new CIntImage (r);
  93. CIntImage* piiU = new CIntImage (r);
  94. CIntImage* piiV = new CIntImage (r);
  95. m_piiBY = new CIntImage (r);
  96. if (m_fAUsage == EIGHT_BIT)
  97. m_piiA = new CIntImage (r);
  98. if (r == vop.where ()) { // faster operation if these two has the same rects
  99. PixelI* ppxlfY = (PixelI*) m_piiY -> pixels ();
  100. PixelI* ppxlfU = (PixelI*) piiU -> pixels ();
  101. PixelI* ppxlfV = (PixelI*) piiV -> pixels ();
  102. PixelI* ppxlfB = (PixelI*) m_piiBY -> pixels ();
  103. const CPixel* ppxl = vop.pixels ();
  104. UInt area = vop.where ().area ();
  105. UInt ip;
  106. for (ip = 0; ip < area; ip++, ppxl++, ppxlfY++, ppxlfU++, ppxlfV++, ppxlfB++) {
  107. *ppxlfY = ppxl -> pxlU.yuv.y;
  108. *ppxlfU = ppxl -> pxlU.yuv.u;
  109. *ppxlfV = ppxl -> pxlU.yuv.v;
  110. *ppxlfB = (ppxl -> pxlU.yuv.a == transpValue) ? 0 : 255;
  111. }
  112. if (m_fAUsage == EIGHT_BIT) {
  113. ppxl = vop.pixels ();
  114. PixelI* ppxlfA = (PixelI*) m_piiA -> pixels ();
  115. for (ip = 0; ip < area; ip++, ppxl++, ppxlfA++)
  116. *ppxlfA = ppxl -> pxlU.yuv.a;
  117. }
  118. }
  119. else {
  120. for (CoordI y = r.top; y < r.bottom; y++) {
  121. PixelI* ppxlfY = (PixelI*) m_piiY -> pixels (r.left, y);
  122. PixelI* ppxlfU = (PixelI*) piiU -> pixels (r.left, y);
  123. PixelI* ppxlfV = (PixelI*) piiV -> pixels (r.left, y);
  124. PixelI* ppxlfB = (PixelI*) m_piiBY -> pixels (r.left, y);
  125. const CPixel* ppxl = vop.pixels (r.left, y);
  126. for (CoordI x = r.left; x < r.right; x++, ppxl++, ppxlfY++, ppxlfU++, ppxlfV++, ppxlfB++) {
  127. *ppxlfY = ppxl -> pxlU.yuv.y;
  128. *ppxlfU = ppxl -> pxlU.yuv.u;
  129. *ppxlfV = ppxl -> pxlU.yuv.v;
  130. *ppxlfB++ = (ppxl -> pxlU.yuv.a == transpValue) ? 0 : 255;
  131. }
  132. if (m_fAUsage == EIGHT_BIT) {
  133. ppxl = vop.pixels ();
  134. PixelI* ppxlfA = (PixelI*) m_piiA -> pixels ();
  135. for (CoordI x = r.left; x < r.right; x++, ppxl++, ppxlfA++)
  136. *ppxlfA = ppxl -> pxlU.yuv.a;
  137. }
  138. }
  139. }
  140. CRct rctBoxY = m_piiBY -> whereVisible ();
  141. if (rctBoxY.left % 2 != 0)
  142. rctBoxY.left--;
  143. if (rctBoxY.top % 2 != 0)
  144. rctBoxY.top--;
  145. m_piiBY -> where (rctBoxY);
  146. m_piiY -> where (rctBoxY);
  147. if (m_fAUsage == EIGHT_BIT)
  148. m_piiA -> where (rctBoxY);
  149. piiU -> where (rctBoxY);
  150. piiV -> where (rctBoxY);
  151. m_piiU = piiU -> decimate (2, 2);
  152. delete piiU;
  153. m_piiV = piiV -> decimate (2, 2);
  154. delete piiV;
  155. m_piiBUV = m_piiBY -> decimateBinaryShape (2, 2); //conservative decimation
  156. }
  157. CVOPIntYUVBA::CVOPIntYUVBA (AlphaUsage fAUsage, const CRct& rc) :
  158. m_fAUsage (fAUsage), m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  159. {
  160. CRct rcY = rc;
  161. CRct rcUV = rc / 2;
  162. m_piiY = new CIntImage (rcY);
  163. assert (m_piiY != NULL);
  164. m_piiU = new CIntImage (rcUV);
  165. assert (m_piiU != NULL);
  166. m_piiV = new CIntImage (rcUV);
  167. assert (m_piiV != NULL);
  168. m_piiBY = new CIntImage (rcY);
  169. assert (m_piiBY != NULL);
  170. m_piiBUV = new CIntImage (rcUV);
  171. assert (m_piiBUV != NULL);
  172. if (m_fAUsage == EIGHT_BIT) {
  173. m_piiA = new CIntImage (rcY);
  174. assert (m_piiA != NULL);
  175. }
  176. }
  177. CVOPIntYUVBA::CVOPIntYUVBA (AlphaUsage fAUsage, const CRct& rcY, const CRct& rcUV) :
  178. m_fAUsage (fAUsage), m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  179. {
  180. m_piiY = new CIntImage (rcY);
  181. assert (m_piiY != NULL);
  182. m_piiU = new CIntImage (rcUV);
  183. assert (m_piiU != NULL);
  184. m_piiV = new CIntImage (rcUV);
  185. assert (m_piiV != NULL);
  186. m_piiBY = new CIntImage (rcY);
  187. assert (m_piiBY != NULL);
  188. m_piiBUV = new CIntImage (rcUV);
  189. assert (m_piiBUV != NULL);
  190. if (m_fAUsage == EIGHT_BIT) {
  191. m_piiA = new CIntImage (rcY);
  192. assert (m_piiA != NULL);
  193. }
  194. }
  195. CVOPIntYUVBA::CVOPIntYUVBA (AlphaUsage fAUsage) : 
  196. m_fAUsage (fAUsage), m_piiY (NULL), m_piiU (NULL), m_piiV (NULL), m_piiBY (NULL), m_piiBUV (NULL), m_piiA (NULL)
  197. {
  198. }
  199. const CIntImage* CVOPIntYUVBA::getPlane (PlaneType plnType) const
  200. {
  201. if (plnType == Y_PLANE) return m_piiY;
  202. else if (plnType == U_PLANE) return m_piiU;
  203. else if (plnType == V_PLANE) return m_piiV;
  204. else if (plnType == BY_PLANE) return m_piiBY;
  205. else if (plnType == BUV_PLANE) return m_piiBUV;
  206. else if (plnType == A_PLANE) return m_piiA;
  207. else return NULL;
  208. }
  209. Void CVOPIntYUVBA::where (const CRct& rct)
  210. {
  211. whereY (rct);
  212. CRct rctUV = rct / 2;
  213. whereUV (rctUV);
  214. }
  215. Void CVOPIntYUVBA::whereY (const CRct& rct)
  216. {
  217. m_piiY -> where (rct);
  218. m_piiBY -> where (rct);
  219. if (m_fAUsage == EIGHT_BIT)
  220. m_piiA -> where (rct);
  221. }
  222. Void CVOPIntYUVBA::whereUV (const CRct& rct)
  223. {
  224. m_piiU -> where (rct);
  225. m_piiV -> where (rct);
  226. m_piiBUV -> where (rct);
  227. }
  228. Void CVOPIntYUVBA::setPlane (const CIntImage* pii, PlaneType plnType, Bool bBUV)
  229. {
  230. if (pii == NULL)
  231. return;
  232. if (plnType == Y_PLANE) {
  233. delete m_piiY;
  234. m_piiY = new CIntImage (*pii);
  235. }
  236. else if (plnType == U_PLANE) {
  237. delete m_piiU;
  238. m_piiU = new CIntImage (*pii);
  239. }
  240. else if (plnType == V_PLANE) {
  241. delete m_piiV;
  242. m_piiV = new CIntImage (*pii);
  243. }
  244. else if (plnType == BY_PLANE) {
  245. delete m_piiBY;
  246. m_piiBY = new CIntImage (*pii);
  247. if (bBUV) {
  248. delete m_piiBUV;
  249. m_piiBUV = m_piiBY -> decimate (2, 2);
  250. m_piiBUV -> setRect (whereUV ());
  251. }
  252. }
  253. else if (plnType == BUV_PLANE) {
  254. delete m_piiBUV;
  255. m_piiBUV = new CIntImage (*pii);
  256. }
  257. else if (plnType == A_PLANE) {
  258. delete m_piiA;
  259. m_piiA = new CIntImage (*pii);
  260. }
  261. else assert (FALSE);
  262. }
  263. Void CVOPIntYUVBA::cropOnAlpha ()
  264. {
  265. m_piiBY -> cropOnAlpha ();
  266. m_piiBUV -> cropOnAlpha ();
  267. m_piiY -> where (m_piiBY -> where ());
  268. m_piiU -> where (m_piiBUV -> where ());
  269. m_piiV -> where (m_piiBUV -> where ());
  270. if (m_fAUsage == EIGHT_BIT)
  271. m_piiA -> where (m_piiBY -> where ());
  272. }
  273. Void overlayMB (CIntImage* piiBig, const CIntImage* piiSmall, const CIntImage* piiMskSmall)
  274. {
  275. if (piiSmall == NULL)
  276. return;
  277. PixelI* ppxlfBig = (PixelI*) piiBig -> pixels (piiSmall -> where ().left, piiSmall -> where ().top);
  278. Int unit = piiSmall -> where ().width;
  279. Int skipBig = piiBig -> where ().width - unit;
  280. const PixelI* ppxlfSmall = piiSmall -> pixels ();
  281. const PixelI* ppxlfMsk = piiMskSmall -> pixels ();
  282. for (Int i = 0; i < unit; i++) {
  283. for (Int j = 0; j < unit; j++) {
  284. *ppxlfBig = *ppxlfSmall;
  285. ppxlfBig++;
  286. ppxlfSmall++;
  287. ppxlfMsk++;
  288. }
  289. ppxlfBig += skipBig;
  290. }
  291. }
  292. Void CVOPIntYUVBA::overlay (const CVOPIntYUVBA& vopi)
  293. {
  294. if (!vopi.valid ()) return;
  295. m_piiBY -> overlay (*vopi.getPlane (BY_PLANE));
  296. m_piiBUV -> overlay (*vopi.getPlane (BUV_PLANE));
  297. overlayMB (m_piiY, vopi.getPlane (Y_PLANE), vopi.getPlane (BY_PLANE));
  298. overlayMB (m_piiU, vopi.getPlane (U_PLANE), vopi.getPlane (BUV_PLANE));
  299. overlayMB (m_piiV, vopi.getPlane (V_PLANE), vopi.getPlane (BUV_PLANE));
  300. if (m_fAUsage == EIGHT_BIT)
  301. overlayMB (m_piiA, vopi.getPlane (A_PLANE), vopi.getPlane (BY_PLANE));
  302. }
  303. Void CVOPIntYUVBA::overlayBY (const CIntImage& iiBY)
  304. {
  305. if (!iiBY.valid ()) return;
  306. m_piiBY -> overlay (iiBY);
  307. }
  308. /*
  309. own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CAffine2D& aff) const
  310. {
  311. CVideoObjectPlane* pvop = pvopYUV ();
  312. CVideoObjectPlane* pvopWarp = pvop -> warp (aff);
  313. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
  314. delete pvop;
  315. delete pvopWarp;
  316. return pvopfRet;
  317. }
  318. own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CAffine2D& aff, const CRct& rctWarp) const
  319. {
  320. CVideoObjectPlane* pvop = pvopYUV ();
  321. CVideoObjectPlane* pvopWarp = pvop -> warp (aff, rctWarp);
  322. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
  323. delete pvop;
  324. delete pvopWarp;
  325. return pvopfRet;
  326. }
  327. own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp) const
  328. {
  329. CVideoObjectPlane* pvop = pvopYUV ();
  330. CVideoObjectPlane* pvopWarp = pvop -> warp (persp);
  331. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
  332. delete pvop;
  333. delete pvopWarp;
  334. return pvopfRet;
  335. }
  336. own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp, const CRct& rctWarp) const
  337. {
  338. CVideoObjectPlane* pvop = pvopYUV ();
  339. CVideoObjectPlane* pvopWarp = pvop -> warp (persp, rctWarp);
  340. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
  341. delete pvop;
  342. delete pvopWarp;
  343. return pvopfRet;
  344. }
  345. own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp, const CRct& rctWarp, UInt accuracy) const
  346. {
  347. CVideoObjectPlane* pvop = pvopYUV ();
  348. CVideoObjectPlane* pvopWarp = pvop -> warp (persp, rctWarp, accuracy);
  349. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
  350. delete pvop;
  351. delete pvopWarp;
  352. return pvopfRet;
  353. }
  354. */
  355. own CVOPIntYUVBA* CVOPIntYUVBA::warpYUV (const CPerspective2D& persp, const CRct& rctWarp, UInt accuracy) const
  356. {
  357. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (RECTANGLE, rctWarp);
  358. CIntImage* piiwarpedY = (CIntImage*) getPlane (Y_PLANE) -> warp (persp, rctWarp, accuracy);
  359. pvopfRet -> setPlane (piiwarpedY, Y_PLANE, FALSE);
  360. delete piiwarpedY;
  361. CIntImage* piiUZoom = (CIntImage*) getPlane (U_PLANE) -> zoomup (2, 2);
  362. CIntImage* piiUZoomWarp = piiUZoom -> warp (persp, rctWarp, accuracy);
  363. delete piiUZoom;
  364. CIntImage* piiUWarped = piiUZoomWarp -> decimate (2, 2);
  365. delete piiUZoomWarp;
  366. pvopfRet -> setPlane (piiUWarped, U_PLANE, FALSE);
  367. delete piiUWarped;
  368. CIntImage* piiVZoom = (CIntImage*) getPlane (V_PLANE) -> zoomup (2, 2);
  369. CIntImage* piiVZoomWarp = piiVZoom -> warp (persp, rctWarp, accuracy);
  370. delete piiVZoom;
  371. CIntImage* piiVWarp = piiVZoomWarp -> decimate (2, 2);
  372. delete piiVZoomWarp;
  373. pvopfRet -> setPlane (piiVWarp, V_PLANE, FALSE);
  374. delete piiVWarp;
  375. return pvopfRet;
  376. }
  377. own CVOPIntYUVBA* CVOPIntYUVBA::warpYUV (const CPerspective2D& persp, const CRct& rctWarp) const
  378. {
  379. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (RECTANGLE, rctWarp);
  380. CIntImage* piiwarpedY = getPlane (Y_PLANE) -> warp (persp, rctWarp);
  381. pvopfRet -> setPlane (piiwarpedY, Y_PLANE, FALSE);
  382. delete piiwarpedY;
  383. CIntImage* piiUZoom = getPlane (U_PLANE) -> zoomup (2, 2);
  384. CIntImage* piiUZoomWarp = piiUZoom -> warp (persp, rctWarp);
  385. delete piiUZoom;
  386. CIntImage* piiUWarped = piiUZoomWarp -> decimate (2, 2);
  387. delete piiUZoomWarp;
  388. pvopfRet -> setPlane (piiUWarped, U_PLANE, FALSE);
  389. delete piiUWarped;
  390. CIntImage* piiVZoom = getPlane (V_PLANE) -> zoomup (2, 2);
  391. CIntImage* piiVZoomWarp = piiVZoom -> warp (persp, rctWarp);
  392. delete piiVZoom;
  393. CIntImage* piiVWarp = piiVZoomWarp -> decimate (2, 2);
  394. delete piiVZoomWarp;
  395. pvopfRet -> setPlane (piiVWarp, V_PLANE, FALSE);
  396. delete piiVWarp;
  397. return pvopfRet;
  398. }
  399. own CVOPIntYUVBA* CVOPIntYUVBA::downsampleForSpatialScalability () const
  400. {
  401. //only handle CIF->QCIF for RECTANGULAR VOP
  402. assert (m_fAUsage == RECTANGLE);
  403. //CRct rctDown = whereY ();
  404. assert (whereY().left == 0 && whereY().top == 0);
  405. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage);
  406. assert (pvopfRet != NULL);
  407. pvopfRet -> m_piiY = m_piiY->downsampleForSpatialScalability ();
  408. pvopfRet -> m_piiU = m_piiU->downsampleForSpatialScalability ();
  409. pvopfRet -> m_piiV = m_piiV->downsampleForSpatialScalability ();
  410. pvopfRet -> m_piiBY = new CIntImage (pvopfRet->whereY (), opaqueValue);
  411. pvopfRet -> m_piiBUV = new CIntImage (pvopfRet->whereUV (), opaqueValue);
  412. return pvopfRet;
  413. }
  414. own CVOPIntYUVBA* CVOPIntYUVBA::upsampleForSpatialScalability () const
  415. {
  416. //only handle QCIF->CIF for RECTANGULAR VOP
  417. assert (m_fAUsage == RECTANGLE);
  418. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage);
  419. assert (pvopfRet != NULL);
  420. pvopfRet -> m_piiY = m_piiY->upsampleForSpatialScalability ();
  421. pvopfRet -> m_piiU = m_piiU->upsampleForSpatialScalability ();
  422. pvopfRet -> m_piiV = m_piiV->upsampleForSpatialScalability ();
  423. pvopfRet -> m_piiBY = new CIntImage (pvopfRet->whereY (), opaqueValue);
  424. pvopfRet -> m_piiBUV = new CIntImage (pvopfRet->whereUV (), opaqueValue);
  425. return pvopfRet;
  426. }
  427. /*
  428. Void CVOPIntYUVBA::vdlDump (const Char* fileName, CPixel ppxlFalse) const
  429. {
  430. CVideoObjectPlane* pvop = pvopYUV ();
  431. pvop -> vdlDump (fileName, ppxlFalse);
  432. delete pvop;
  433. }
  434. */
  435. own Double* CVOPIntYUVBA::mse (const CVOPIntYUVBA& vopi) const
  436. {
  437. assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
  438. Double* rgdblMeanSquareError = new Double [4]; // mean square
  439. CIntImage* piiBOr = new CIntImage (*m_piiBY);
  440. piiBOr -> orIi (*vopi.getPlane (BY_PLANE));
  441. CIntImage* piiExp0 = new CIntImage (*m_piiY, piiBOr -> where ());
  442. CIntImage* piiExp1 = new CIntImage (*vopi.getPlane (Y_PLANE), piiBOr -> where ());
  443. rgdblMeanSquareError [0] = piiExp1 -> mse (*piiExp0, *piiBOr);
  444. delete piiExp0;
  445. delete piiExp1;
  446. if (fAUsage () == EIGHT_BIT) {
  447. piiExp0 = new CIntImage (*m_piiA, piiBOr -> where ());
  448. piiExp1 = new CIntImage (*vopi.getPlane (A_PLANE), piiBOr -> where ());
  449. rgdblMeanSquareError [3] = piiExp1 -> mse (*piiExp0, *piiBOr);
  450. delete piiExp0;
  451. delete piiExp1;
  452. }
  453. delete piiBOr;
  454. piiBOr = new CIntImage (*m_piiBUV);
  455. piiBOr -> orIi (*vopi.getPlane (BUV_PLANE));
  456. piiExp0 = new CIntImage (*m_piiU, piiBOr -> where ());
  457. piiExp1 = new CIntImage (*vopi.getPlane (U_PLANE), piiBOr -> where ());
  458. rgdblMeanSquareError [1] = piiExp1 -> mse (*piiExp0, *piiBOr);
  459. delete piiExp0;
  460. delete piiExp1;
  461. piiExp0 = new CIntImage (*m_piiV, piiBOr -> where ());
  462. piiExp1 = new CIntImage (*vopi.getPlane (V_PLANE), piiBOr -> where ());
  463. rgdblMeanSquareError [2] = piiExp1 -> mse (*piiExp0, *piiBOr);
  464. delete piiExp0;
  465. delete piiExp1;
  466. delete piiBOr;
  467. return rgdblMeanSquareError;
  468. }
  469. own Double* CVOPIntYUVBA::snr (const CVOPIntYUVBA& vopi) const
  470. {
  471. assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
  472. Double* psnr = new Double [4]; // mean square
  473. CIntImage* piiBOr = new CIntImage (*m_piiBY);
  474. piiBOr -> orIi (*vopi.getPlane (BY_PLANE));
  475. CIntImage* piiExp0 = new CIntImage (*m_piiY, piiBOr -> where ());
  476. CIntImage* piiExp1 = new CIntImage (*vopi.getPlane (Y_PLANE), piiBOr -> where ());
  477. psnr [0] = piiExp1 -> snr (*piiExp0, *piiBOr);
  478. delete piiExp0;
  479. delete piiExp1;
  480. if (fAUsage () == EIGHT_BIT) {
  481. piiExp0 = new CIntImage (*m_piiA, piiBOr -> where ());
  482. piiExp1 = new CIntImage (*vopi.getPlane (A_PLANE), piiBOr -> where ());
  483. psnr [3] = piiExp1 -> snr (*piiExp0, *piiBOr);
  484. delete piiExp0;
  485. delete piiExp1;
  486. }
  487. delete piiBOr;
  488. piiBOr = new CIntImage (*m_piiBUV);
  489. piiBOr -> orIi (*vopi.getPlane (BUV_PLANE));
  490. piiExp0 = new CIntImage (*m_piiU, piiBOr -> where ());
  491. piiExp1 = new CIntImage (*vopi.getPlane (U_PLANE), piiBOr -> where ());
  492. psnr [1] = piiExp1 -> snr (*piiExp0, *piiBOr);
  493. delete piiExp0;
  494. delete piiExp1;
  495. piiExp0 = new CIntImage (*m_piiV, piiBOr -> where ());
  496. piiExp1 = new CIntImage (*vopi.getPlane (V_PLANE), piiBOr -> where ());
  497. psnr [2] = piiExp1 -> snr (*piiExp0, *piiBOr);
  498. delete piiExp0;
  499. delete piiExp1;
  500. delete piiBOr;
  501. return psnr;
  502. }
  503. own CVOPIntYUVBA* CVOPIntYUVBA::operator + (const CVOPIntYUVBA& vopi) const
  504. {
  505. assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
  506. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
  507. assert (pvopfRet != NULL);
  508. delete pvopfRet -> m_piiY;
  509. pvopfRet -> m_piiY = *m_piiY + *vopi.getPlane (Y_PLANE);
  510. delete pvopfRet -> m_piiU;
  511. pvopfRet -> m_piiU = *m_piiU + *vopi.getPlane (U_PLANE);
  512. delete pvopfRet -> m_piiV;
  513. pvopfRet -> m_piiV = *m_piiV + *vopi.getPlane (V_PLANE);
  514. delete pvopfRet -> m_piiA;
  515. pvopfRet -> m_piiA = *m_piiA + *vopi.getPlane (A_PLANE);
  516. delete pvopfRet -> m_piiBY;
  517. pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
  518. delete pvopfRet -> m_piiBUV;
  519. pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
  520. return pvopfRet;
  521. }
  522. own CVOPIntYUVBA* CVOPIntYUVBA::operator - (const CVOPIntYUVBA& vopi) const
  523. {
  524. assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
  525. // CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
  526. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage, whereY ());
  527. assert (pvopfRet != NULL);
  528. delete pvopfRet -> m_piiY;
  529. pvopfRet -> m_piiY = *m_piiY - *vopi.getPlane (Y_PLANE);
  530. delete pvopfRet -> m_piiU;
  531. pvopfRet -> m_piiU = *m_piiU - *vopi.getPlane (U_PLANE);
  532. delete pvopfRet -> m_piiV;
  533. pvopfRet -> m_piiV = *m_piiV - *vopi.getPlane (V_PLANE);
  534. delete pvopfRet -> m_piiA;
  535. pvopfRet -> m_piiA = *m_piiA - *vopi.getPlane (A_PLANE);
  536. delete pvopfRet -> m_piiBY;
  537. pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
  538. delete pvopfRet -> m_piiBUV;
  539. pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
  540. return pvopfRet;
  541. }
  542. own CVOPIntYUVBA* CVOPIntYUVBA::operator * (Int vl) const
  543. {
  544. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*this);
  545. assert (pvopfRet != NULL);
  546. delete pvopfRet -> m_piiY;
  547. pvopfRet -> m_piiY = *m_piiY * vl;
  548. delete pvopfRet -> m_piiU;
  549. pvopfRet -> m_piiU = *m_piiU * vl;
  550. delete pvopfRet -> m_piiV;
  551. pvopfRet -> m_piiV = *m_piiV * vl;
  552. delete pvopfRet -> m_piiA;
  553. pvopfRet -> m_piiA = *m_piiA * vl;
  554. delete pvopfRet -> m_piiBY;
  555. pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is unchanged
  556. delete pvopfRet -> m_piiBUV;
  557. pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is unchanged
  558. return pvopfRet;
  559. }
  560. own CVOPIntYUVBA* CVOPIntYUVBA::operator / (Int vl) const
  561. {
  562. assert (vl != .0f);
  563. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*this);
  564. assert (pvopfRet != NULL);
  565. delete pvopfRet -> m_piiY;
  566. pvopfRet -> m_piiY = *m_piiY / vl;
  567. delete pvopfRet -> m_piiU;
  568. pvopfRet -> m_piiU = *m_piiU / vl;
  569. delete pvopfRet -> m_piiV;
  570. pvopfRet -> m_piiV = *m_piiV / vl;
  571. delete pvopfRet -> m_piiA;
  572. pvopfRet -> m_piiA = *m_piiA / vl;
  573. delete pvopfRet -> m_piiBY;
  574. pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is unchanged
  575. delete pvopfRet -> m_piiBUV;
  576. pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is unchanged
  577. return pvopfRet;
  578. }
  579. own CVOPIntYUVBA* CVOPIntYUVBA::average (const CVOPIntYUVBA& vopi) const
  580. {
  581. assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
  582. // CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
  583. CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage, whereY ());
  584. assert (pvopfRet != NULL);
  585. delete pvopfRet -> m_piiY;
  586. pvopfRet -> m_piiY = m_piiY -> average (*vopi.getPlane (Y_PLANE));
  587. delete pvopfRet -> m_piiU;
  588. pvopfRet -> m_piiU = m_piiU -> average (*vopi.getPlane (U_PLANE));
  589. delete pvopfRet -> m_piiV;
  590. pvopfRet -> m_piiV = m_piiV -> average (*vopi.getPlane (V_PLANE));
  591. delete pvopfRet -> m_piiA;
  592. pvopfRet -> m_piiA = m_piiA -> average (*vopi.getPlane (A_PLANE));
  593. delete pvopfRet -> m_piiBY;
  594. pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
  595. delete pvopfRet -> m_piiBUV;
  596. pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
  597. return pvopfRet;
  598. }