⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuvai.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_piiBY -> overlay (*vopi.getPlane (BY_PLANE));
	m_piiBUV -> overlay (*vopi.getPlane (BUV_PLANE));
	overlayMB (m_piiY, vopi.getPlane (Y_PLANE), vopi.getPlane (BY_PLANE));
	overlayMB (m_piiU, vopi.getPlane (U_PLANE), vopi.getPlane (BUV_PLANE));
	overlayMB (m_piiV, vopi.getPlane (V_PLANE), vopi.getPlane (BUV_PLANE));
	if (m_fAUsage == EIGHT_BIT)
		overlayMB (m_piiA, vopi.getPlane (A_PLANE), vopi.getPlane (BY_PLANE));
}

Void CVOPIntYUVBA::overlayBY (const CIntImage& iiBY)
{
	if (!iiBY.valid ()) return;
	m_piiBY -> overlay (iiBY);
}

/*
own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CAffine2D& aff) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	CVideoObjectPlane* pvopWarp = pvop -> warp (aff);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
	delete pvop;
	delete pvopWarp;
	return pvopfRet;
}


own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CAffine2D& aff, const CRct& rctWarp) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	CVideoObjectPlane* pvopWarp = pvop -> warp (aff, rctWarp);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
	delete pvop;
	delete pvopWarp;
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	CVideoObjectPlane* pvopWarp = pvop -> warp (persp);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
	delete pvop;
	delete pvopWarp;
	return pvopfRet;
}


own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp, const CRct& rctWarp) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	CVideoObjectPlane* pvopWarp = pvop -> warp (persp, rctWarp);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
	delete pvop;
	delete pvopWarp;
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::warp (const CPerspective2D& persp, const CRct& rctWarp, UInt accuracy) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	CVideoObjectPlane* pvopWarp = pvop -> warp (persp, rctWarp, accuracy);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*pvopWarp, m_fAUsage);
	delete pvop;
	delete pvopWarp;
	return pvopfRet;
}
*/

own CVOPIntYUVBA* CVOPIntYUVBA::warpYUV (const CPerspective2D& persp, const CRct& rctWarp, UInt accuracy) const
{
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (RECTANGLE, rctWarp);
	CIntImage* piiwarpedY = (CIntImage*) getPlane (Y_PLANE) -> warp (persp, rctWarp, accuracy);
	pvopfRet -> setPlane (piiwarpedY, Y_PLANE, FALSE);
	delete piiwarpedY;

	CIntImage* piiUZoom = (CIntImage*) getPlane (U_PLANE) -> zoomup (2, 2);
	CIntImage* piiUZoomWarp = piiUZoom -> warp (persp, rctWarp, accuracy);
	delete piiUZoom;
	CIntImage* piiUWarped = piiUZoomWarp -> decimate (2, 2);
	delete piiUZoomWarp;
	pvopfRet -> setPlane (piiUWarped, U_PLANE, FALSE);
	delete piiUWarped;

	CIntImage* piiVZoom = (CIntImage*) getPlane (V_PLANE) -> zoomup (2, 2);
	CIntImage* piiVZoomWarp = piiVZoom -> warp (persp, rctWarp, accuracy);
	delete piiVZoom;
	CIntImage* piiVWarp = piiVZoomWarp -> decimate (2, 2);
	delete piiVZoomWarp;
	pvopfRet -> setPlane (piiVWarp, V_PLANE, FALSE);	
	delete piiVWarp;
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::warpYUV (const CPerspective2D& persp, const CRct& rctWarp) const
{
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (RECTANGLE, rctWarp);
	CIntImage* piiwarpedY = getPlane (Y_PLANE) -> warp (persp, rctWarp);
	pvopfRet -> setPlane (piiwarpedY, Y_PLANE, FALSE);
	delete piiwarpedY;

	CIntImage* piiUZoom = getPlane (U_PLANE) -> zoomup (2, 2);
	CIntImage* piiUZoomWarp = piiUZoom -> warp (persp, rctWarp);
	delete piiUZoom;
	CIntImage* piiUWarped = piiUZoomWarp -> decimate (2, 2);
	delete piiUZoomWarp;
	pvopfRet -> setPlane (piiUWarped, U_PLANE, FALSE);
	delete piiUWarped;

	CIntImage* piiVZoom = getPlane (V_PLANE) -> zoomup (2, 2);
	CIntImage* piiVZoomWarp = piiVZoom -> warp (persp, rctWarp);
	delete piiVZoom;
	CIntImage* piiVWarp = piiVZoomWarp -> decimate (2, 2);
	delete piiVZoomWarp;
	pvopfRet -> setPlane (piiVWarp, V_PLANE, FALSE);	
	delete piiVWarp;
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::downsampleForSpatialScalability () const
{
	//only handle CIF->QCIF for RECTANGULAR VOP
	assert (m_fAUsage == RECTANGLE);
	//CRct rctDown = whereY ();
	assert (whereY().left == 0 && whereY().top == 0);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage);
	assert (pvopfRet != NULL);
	pvopfRet -> m_piiY = m_piiY->downsampleForSpatialScalability ();
	pvopfRet -> m_piiU = m_piiU->downsampleForSpatialScalability ();
	pvopfRet -> m_piiV = m_piiV->downsampleForSpatialScalability ();
	pvopfRet -> m_piiBY = new CIntImage (pvopfRet->whereY (), opaqueValue);
	pvopfRet -> m_piiBUV = new CIntImage (pvopfRet->whereUV (), opaqueValue);
	return pvopfRet;
}
own CVOPIntYUVBA* CVOPIntYUVBA::upsampleForSpatialScalability () const
{
	//only handle QCIF->CIF for RECTANGULAR VOP
	assert (m_fAUsage == RECTANGLE);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage);
	assert (pvopfRet != NULL);
	pvopfRet -> m_piiY = m_piiY->upsampleForSpatialScalability ();
	pvopfRet -> m_piiU = m_piiU->upsampleForSpatialScalability ();
	pvopfRet -> m_piiV = m_piiV->upsampleForSpatialScalability ();
	pvopfRet -> m_piiBY = new CIntImage (pvopfRet->whereY (), opaqueValue);
	pvopfRet -> m_piiBUV = new CIntImage (pvopfRet->whereUV (), opaqueValue);
	return pvopfRet;
}

/*
Void CVOPIntYUVBA::vdlDump (const Char* fileName, CPixel ppxlFalse) const
{
	CVideoObjectPlane* pvop = pvopYUV ();
	pvop -> vdlDump (fileName, ppxlFalse);
	delete pvop;
}
*/

own Double* CVOPIntYUVBA::mse (const CVOPIntYUVBA& vopi) const
{
	assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
	Double* rgdblMeanSquareError = new Double [4]; // mean square
	CIntImage* piiBOr = new CIntImage (*m_piiBY);
	piiBOr -> orIi (*vopi.getPlane (BY_PLANE));
	CIntImage* piiExp0 = new CIntImage (*m_piiY, piiBOr -> where ());
	CIntImage* piiExp1 = new CIntImage (*vopi.getPlane (Y_PLANE), piiBOr -> where ());
	rgdblMeanSquareError [0] = piiExp1 -> mse (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;
	if (fAUsage () == EIGHT_BIT) {
		piiExp0 = new CIntImage (*m_piiA, piiBOr -> where ());
		piiExp1 = new CIntImage (*vopi.getPlane (A_PLANE), piiBOr -> where ());
		rgdblMeanSquareError [3] = piiExp1 -> mse (*piiExp0, *piiBOr);
		delete piiExp0;
		delete piiExp1;
	}
	delete piiBOr;
	piiBOr = new CIntImage (*m_piiBUV);
	piiBOr -> orIi (*vopi.getPlane (BUV_PLANE));
	piiExp0 = new CIntImage (*m_piiU, piiBOr -> where ());
	piiExp1 = new CIntImage (*vopi.getPlane (U_PLANE), piiBOr -> where ());
	rgdblMeanSquareError [1] = piiExp1 -> mse (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;

	piiExp0 = new CIntImage (*m_piiV, piiBOr -> where ());
	piiExp1 = new CIntImage (*vopi.getPlane (V_PLANE), piiBOr -> where ());
	rgdblMeanSquareError [2] = piiExp1 -> mse (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;
	delete piiBOr;
	return rgdblMeanSquareError;
}

own Double* CVOPIntYUVBA::snr (const CVOPIntYUVBA& vopi) const
{
	assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
	Double* psnr = new Double [4]; // mean square
	CIntImage* piiBOr = new CIntImage (*m_piiBY);
	piiBOr -> orIi (*vopi.getPlane (BY_PLANE));
	CIntImage* piiExp0 = new CIntImage (*m_piiY, piiBOr -> where ());
	CIntImage* piiExp1 = new CIntImage (*vopi.getPlane (Y_PLANE), piiBOr -> where ());
	psnr [0] = piiExp1 -> snr (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;
	if (fAUsage () == EIGHT_BIT) {
		piiExp0 = new CIntImage (*m_piiA, piiBOr -> where ());
		piiExp1 = new CIntImage (*vopi.getPlane (A_PLANE), piiBOr -> where ());
		psnr [3] = piiExp1 -> snr (*piiExp0, *piiBOr);
		delete piiExp0;
		delete piiExp1;
	}
	delete piiBOr;
	piiBOr = new CIntImage (*m_piiBUV);
	piiBOr -> orIi (*vopi.getPlane (BUV_PLANE));
	piiExp0 = new CIntImage (*m_piiU, piiBOr -> where ());
	piiExp1 = new CIntImage (*vopi.getPlane (U_PLANE), piiBOr -> where ());
	psnr [1] = piiExp1 -> snr (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;

	piiExp0 = new CIntImage (*m_piiV, piiBOr -> where ());
	piiExp1 = new CIntImage (*vopi.getPlane (V_PLANE), piiBOr -> where ());
	psnr [2] = piiExp1 -> snr (*piiExp0, *piiBOr);
	delete piiExp0;
	delete piiExp1;
	delete piiBOr;
	return psnr;
}

own CVOPIntYUVBA* CVOPIntYUVBA::operator + (const CVOPIntYUVBA& vopi) const
{
	assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
	assert (pvopfRet != NULL);
	delete pvopfRet -> m_piiY;
	pvopfRet -> m_piiY = *m_piiY + *vopi.getPlane (Y_PLANE);
	delete pvopfRet -> m_piiU;
	pvopfRet -> m_piiU = *m_piiU + *vopi.getPlane (U_PLANE);
	delete pvopfRet -> m_piiV;
	pvopfRet -> m_piiV = *m_piiV + *vopi.getPlane (V_PLANE);
	delete pvopfRet -> m_piiA;
	pvopfRet -> m_piiA = *m_piiA + *vopi.getPlane (A_PLANE);
	delete pvopfRet -> m_piiBY;
	pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
	delete pvopfRet -> m_piiBUV;
	pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::operator - (const CVOPIntYUVBA& vopi) const
{
	assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
//	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage, whereY ());
	assert (pvopfRet != NULL);
	delete pvopfRet -> m_piiY;
	pvopfRet -> m_piiY = *m_piiY - *vopi.getPlane (Y_PLANE);
	delete pvopfRet -> m_piiU;
	pvopfRet -> m_piiU = *m_piiU - *vopi.getPlane (U_PLANE);
	delete pvopfRet -> m_piiV;
	pvopfRet -> m_piiV = *m_piiV - *vopi.getPlane (V_PLANE);
	delete pvopfRet -> m_piiA;
	pvopfRet -> m_piiA = *m_piiA - *vopi.getPlane (A_PLANE);
	delete pvopfRet -> m_piiBY;
	pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
	delete pvopfRet -> m_piiBUV;
	pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::operator * (Int vl) const
{
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*this);
	assert (pvopfRet != NULL);
	delete pvopfRet -> m_piiY;
	pvopfRet -> m_piiY = *m_piiY * vl;
	delete pvopfRet -> m_piiU;
	pvopfRet -> m_piiU = *m_piiU * vl;
	delete pvopfRet -> m_piiV;
	pvopfRet -> m_piiV = *m_piiV * vl;
	delete pvopfRet -> m_piiA;
	pvopfRet -> m_piiA = *m_piiA * vl;
	delete pvopfRet -> m_piiBY;
	pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is unchanged
	delete pvopfRet -> m_piiBUV;
	pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is unchanged
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::operator / (Int vl) const
{
	assert (vl != .0f);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (*this);
	assert (pvopfRet != NULL);
	delete pvopfRet -> m_piiY;
	pvopfRet -> m_piiY = *m_piiY / vl;
	delete pvopfRet -> m_piiU;
	pvopfRet -> m_piiU = *m_piiU / vl;
	delete pvopfRet -> m_piiV;
	pvopfRet -> m_piiV = *m_piiV / vl;
	delete pvopfRet -> m_piiA;
	pvopfRet -> m_piiA = *m_piiA / vl;
	delete pvopfRet -> m_piiBY;
	pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is unchanged
	delete pvopfRet -> m_piiBUV;
	pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is unchanged
	return pvopfRet;
}

own CVOPIntYUVBA* CVOPIntYUVBA::average (const CVOPIntYUVBA& vopi) const
{
	assert (whereY () == vopi.whereY () && whereUV () == vopi.whereUV ());
//	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (whereY (), m_fAUsage);
	CVOPIntYUVBA* pvopfRet = new CVOPIntYUVBA (m_fAUsage, whereY ());
	assert (pvopfRet != NULL);
	delete pvopfRet -> m_piiY;
	pvopfRet -> m_piiY = m_piiY -> average (*vopi.getPlane (Y_PLANE));
	delete pvopfRet -> m_piiU;
	pvopfRet -> m_piiU = m_piiU -> average (*vopi.getPlane (U_PLANE));
	delete pvopfRet -> m_piiV;
	pvopfRet -> m_piiV = m_piiV -> average (*vopi.getPlane (V_PLANE));
	delete pvopfRet -> m_piiA;
	pvopfRet -> m_piiA = m_piiA -> average (*vopi.getPlane (A_PLANE));
	delete pvopfRet -> m_piiBY;
	pvopfRet -> m_piiBY = new CIntImage (*m_piiBY); // alpha is defined as the first one
	delete pvopfRet -> m_piiBUV;
	pvopfRet -> m_piiBUV = new CIntImage (*m_piiBUV); // alpha is defined as the first one
	return pvopfRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -