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

📄 vop.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return pvopRet;
}

own CVideoObjectPlane* CVideoObjectPlane::warp (const CPerspective2D& persp) const // perspective warp
{
	CSiteD stdLeftTopWarp = (persp * CSiteD (where ().left, where ().top)).s;
	CSiteD stdRightTopWarp = (persp * CSiteD (where ().right, where ().top)).s;
	CSiteD stdLeftBottomWarp = (persp * CSiteD (where ().left, where ().bottom)).s;
	CSiteD stdRightBottomWarp = (persp * CSiteD (where ().right, where ().bottom)).s;
	CRct rctWarp (stdLeftTopWarp, stdRightTopWarp, stdLeftBottomWarp, stdRightBottomWarp);
	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (rctWarp);
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	CPerspective2D perspInv = persp.inverse ();
	for (CoordI y = rctWarp.top; y != rctWarp.bottom; y++) {
		for (CoordI x = rctWarp.left; x != rctWarp.right; x++) {
			CSiteD src = (perspInv * CSiteD (x, y)).s; 
			CoordI fx = (CoordI) floor (src.x); //.5 is for better truncation
			CoordI fy = (CoordI) floor (src.y); //.5 is for better truncation
			CoordI cx = (CoordI) ceil (src.x); //.5 is for better truncation
			CoordI cy = (CoordI) ceil (src.y); //.5 is for better truncation
			if (
				where ().includes (fx, fy) && 
				where ().includes (fx, cy) && 
				where ().includes (cx, fy) && 
				where ().includes (cx, cy)
			)
				*ppxlRet = pixel (src);
			ppxlRet++;
		}
	}
	return pvopRet;
}		 

own CVideoObjectPlane* CVideoObjectPlane::warp (const CPerspective2D& persp, const CRct& rctWarp) const // perspective warp
{
	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (rctWarp);
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	//CPerspective2D perspInv = persp.inverse ();
	for (CoordI y = rctWarp.top; y < rctWarp.bottom; y++) {
		for (CoordI x = rctWarp.left; x < rctWarp.right; x++) {
			CSiteD src = (persp * CSiteD (x, y)).s; 
			CoordI fx = (CoordI) floor (src.x); //.5 is for better truncation
			CoordI fy = (CoordI) floor (src.y); //.5 is for better truncation
			CoordI cx = (CoordI) ceil (src.x); //.5 is for better truncation
			CoordI cy = (CoordI) ceil (src.y); //.5 is for better truncation
			if (
				where ().includes (fx, fy) && 
				where ().includes (fx, cy) && 
				where ().includes (cx, fy) && 
				where ().includes (cx, cy)
			)
				*ppxlRet = pixel (src);
			ppxlRet++;
		}
	}
	return pvopRet;
}		 

own CVideoObjectPlane* CVideoObjectPlane::warp (const CPerspective2D& persp, const CRct& rctWarp, UInt accuracy) const // perspective warp
{
	UInt accuracy1 = accuracy + 1;
	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (rctWarp);
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	for (CoordI y = rctWarp.top; y < rctWarp.bottom; y++) {
		for (CoordI x = rctWarp.left; x < rctWarp.right; x++) {
			CSite src = (persp * (CSite (x, y))).s; 
			CoordI fx = (CoordI) floor ((Double) (src.x >> accuracy1)); 
			CoordI fy = (CoordI) floor ((Double) (src.y >> accuracy1)); 
			CoordI cx = (CoordI) ceil ((Double) (src.x >> accuracy1));
			CoordI cy = (CoordI) ceil ((Double) (src.y >> accuracy1));
			if (
				where ().includes (fx, fy) && 
				where ().includes (fx, cy) && 
				where ().includes (cx, fy) && 
				where ().includes (cx, cy)
			)
			*ppxlRet = pixel (src, accuracy);
			ppxlRet++;
		}
	}
	return pvopRet;
}		 

Void CVideoObjectPlane::multiplyAlpha ()
{
	if (!valid ()) return;
	CPixel* ppxlThis = (CPixel*) pixels ();
	Float inv255 = (Float) 1. / (Float) 255.;
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		Float alpha = inv255 * ppxlThis -> pxlU.rgb.a;
		ppxlThis -> pxlU.rgb.r = (U8) (alpha * ppxlThis -> pxlU.rgb.r + .5);
		ppxlThis -> pxlU.rgb.g = (U8) (alpha * ppxlThis -> pxlU.rgb.g + .5);
		ppxlThis -> pxlU.rgb.b = (U8) (alpha * ppxlThis -> pxlU.rgb.b + .5);
		ppxlThis++;
	}
} 

Void CVideoObjectPlane::multiplyBiAlpha ()
{
	if (!valid ()) return;
	CPixel* ppxlThis = (CPixel*) pixels ();
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		if (ppxlThis -> pxlU.rgb.a == 0) {
			ppxlThis -> pxlU.rgb.r = 0;
			ppxlThis -> pxlU.rgb.g = 0;
			ppxlThis -> pxlU.rgb.b = 0;
		}
		ppxlThis++;
	}
} 

Void CVideoObjectPlane::unmultiplyAlpha ()
{
	if (!valid ()) return;
	CPixel* ppxlThis = (CPixel*) pixels ();
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		if (ppxlThis->pxlU.rgb.a != 0)	{			
			Float invAlpha = (Float) (255 / ppxlThis -> pxlU.rgb.a);
			ppxlThis -> pxlU.rgb.r = (U8) checkrange (invAlpha * ppxlThis -> pxlU.rgb.r + 0.5f, 0.0F, 255.0F);
			ppxlThis -> pxlU.rgb.g = (U8) checkrange (invAlpha * ppxlThis -> pxlU.rgb.g + 0.5f, 0.0F, 255.0F);
			ppxlThis -> pxlU.rgb.b = (U8) checkrange (invAlpha * ppxlThis -> pxlU.rgb.b + 0.5f, 0.0F, 255.0F);
		}
		ppxlThis++;
	}
} 

Void CVideoObjectPlane::thresholdAlpha (U8 uThresh)
{
	CPixel* ppxlThis = (CPixel*) pixels ();
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		ppxlThis -> pxlU.rgb.a = (ppxlThis -> pxlU.rgb.a > uThresh) ? opaqueValue : transpValue;
		ppxlThis++;
	}
} 


Void CVideoObjectPlane::thresholdRGB (U8 uThresh)
{
	CPixel* ppxlThis = (CPixel*) pixels ();
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		if (ppxlThis -> pxlU.rgb.r < uThresh && ppxlThis -> pxlU.rgb.g < uThresh && ppxlThis -> pxlU.rgb.b	< uThresh) {
			ppxlThis -> pxlU.rgb.r = 0;
			ppxlThis -> pxlU.rgb.g = 0;
			ppxlThis -> pxlU.rgb.b = 0;
		}
		ppxlThis++;
	}
} 


Void CVideoObjectPlane::cropOnAlpha ()
{
	CoordI left = where ().right - 1;
	CoordI top = where ().bottom - 1;
	CoordI right = where ().left;
	CoordI bottom = where ().top;
	const CPixel* ppxlThis = pixels ();
	for (CoordI y = where ().top; y < where ().bottom; y++) {
		for (CoordI x = where ().left; x < where ().right; x++) {
			if (ppxlThis -> pxlU.rgb.a != transpValue) {
				left = min (left, x);
				top = min (top, y);
				right = max (right, x);
				bottom = max (bottom, y);
			}
			ppxlThis++;
		}
	}
	right++;
	bottom++;
	where (CRct (left, top, right, bottom));
} 


own CVideoObjectPlane* CVideoObjectPlane::decimate (UInt rateX, UInt rateY) const
{
	const CoordI left = where ().left / (CoordI) rateX;
	const CoordI top = where ().top / (CoordI)  rateY;
	const CoordI right = 
		(where ().right >= 0) ? (where ().right + (CoordI) rateX - 1) / (CoordI) rateX :
		(where ().right - (CoordI) rateX + 1) / (CoordI) rateX;
	const CoordI bottom = 
		(where ().bottom >= 0) ? (where ().bottom + (CoordI) rateX - 1) / (CoordI) rateY :
		(where ().bottom - (CoordI) rateX + 1) / (CoordI) rateY;	

	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (CRct (left, top, right, bottom), opaquePixel);
	CPixel* pret = (CPixel*) pvopRet -> pixels ();
	const CPixel* pori = pixels ();
	Int skipY = rateY * where ().width;
	for (CoordI y = top; y != bottom; y++)
	{
		const CPixel* pvf = pori;
		for (CoordI x = left; x != right; x++)
		{
			*pret++ = *pvf;
			pvf += rateX;
		} 
		pori += skipY;
	}
	return pvopRet;
}

Void CVideoObjectPlane::falseColor (CPixel pxl)
{
	CPixel* ppxl = m_ppxl;
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		if (ppxl -> pxlU.rgb.a == transpValue) {
			ppxl -> pxlU.rgb.r = pxl.pxlU.rgb.r;
			ppxl -> pxlU.rgb.g = pxl.pxlU.rgb.g;
			ppxl -> pxlU.rgb.b = pxl.pxlU.rgb.b;
		}
		ppxl++;
	}
}

Void CVideoObjectPlane::falseColor (U8 r, U8 g, U8 b)
{
	CPixel* ppxl = m_ppxl;
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		if (ppxl -> pxlU.rgb.a == transpValue) {
			ppxl -> pxlU.rgb.r = r;
			ppxl -> pxlU.rgb.g = g;
			ppxl -> pxlU.rgb.b = b;
		}
		ppxl++;
	}
}

own CVideoObjectPlane* CVideoObjectPlane::zoomup (UInt rateX, UInt rateY) const
{
	const CoordI left = where ().left * rateX;
	const CoordI top = where ().top * rateY;
	const CoordI right = where ().right * rateX;
	const CoordI bottom = where ().bottom * rateY;

	CVideoObjectPlane* retVf = new CVideoObjectPlane (CRct (left, top, right, bottom), opaquePixel);
	CPixel* pret = (CPixel*) retVf -> pixels ();
	for (CoordI y = top; y != bottom; y++)
	{
		for (CoordI x = left; x != right; x++)
		{
			*pret++ = pixel ((CoordI) (x / rateX), (CoordI)  (y / rateY));
		}
	}
	return retVf;
}


own CVideoObjectPlane* CVideoObjectPlane::expand (UInt rateX, UInt rateY) const
{
	const CoordI left = where ().left; // left-top coordinate remain the same
	const CoordI top = where ().top;
	const CoordI right = left + where ().width * rateX;
	const CoordI bottom = top + where ().height () * rateY;

	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (CRct (left, top, right, bottom), transpPixel);
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	const CPixel* ppxlThis = pixels ();
	for (CoordI y = top; y != bottom; y++) {
		for (CoordI x = left; x != right; x++) {
			if (x % rateX == 0 && y % rateY == 0) 
				*ppxlRet++ = *ppxlThis++;
			else
				*ppxlRet++ = CPixel (0, 0, 0, opaqueValue);
		}
	}
	return pvopRet;
}


inline CPixel averageP (const CPixel& p1, const CPixel& p2)
{
	return CPixel (
		(p1.pxlU.rgb.r + p2.pxlU.rgb.r + 1) >> 1,
		(p1.pxlU.rgb.g + p2.pxlU.rgb.g + 1) >> 1,
		(p1.pxlU.rgb.b + p2.pxlU.rgb.b + 1) >> 1,
		p1.pxlU.rgb.a
	);
}


own CVideoObjectPlane* CVideoObjectPlane::biInterpolate () const
{
	const CoordI left = where ().left; // left-top coordinate remain the same
	const CoordI top = where ().top;
	const CoordI right = left + where ().width * 2;
	const CoordI bottom = top + where ().height () * 2;
	const CoordI width = right - left;

	CoordI x, y;
	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (CRct (left, top, right, bottom), opaquePixel);
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	const CPixel* ppxl = pixels ();
	const CoordI right1 = right - 2;
	for (y = top; y < bottom; y += 2) { // x-direction interpolation
		for (x = left; x < right1; x += 2) {
			*ppxlRet++ = *ppxl++;
			*ppxlRet++ = averageP (*ppxl, *(ppxl - 1));
		}
		*ppxlRet++ = *ppxl;
		*ppxlRet++ = *ppxl++; // the last pixel of every row do not need average
		ppxlRet += width;
	}
	ppxlRet = (CPixel*) pvopRet -> pixels ();
	ppxlRet += width; // start from the second row
	const CoordI width2 = width << 1;
	const CoordI bottom1 = bottom - 1;
	for (x = left; x < right; x++) { // y-direction interpolation
		CPixel* ppxlRett = ppxlRet++;
		for (y = top + 1; y < bottom1; y += 2) {
			*ppxlRett = averageP (*(ppxlRett - width), *(ppxlRett + width));
			ppxlRett += width2;
		}
		*ppxlRett = *(ppxlRett - width); // the last pixel of every column do not need average
	}
	return pvopRet;
}

own CVideoObjectPlane* CVideoObjectPlane::biInterpolate (UInt accuracy) const
{
	const CoordI left = where ().left * accuracy;
	const CoordI top = where ().top * accuracy;
	const CoordI right = where ().right * accuracy;
	const CoordI bottom = where ().bottom * accuracy;

	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (CRct (left, top, right, bottom));
	CPixel* ppxlRet = (CPixel*) pvopRet -> pixels ();
	for (CoordI y = top; y < bottom; y++) { // x-direction interpolation
		for (CoordI x = left; x < right; x++) {
			*ppxlRet = pixel (x, y, accuracy);
			ppxlRet++;
		}
	}
	return pvopRet;
}


own CVideoObjectPlane* CVideoObjectPlane::biInterpolate (const CRct& r) const
{
	CVideoObjectPlane* pvopRet = new CVideoObjectPlane (r, opaquePixel);
	for (CoordI x = r.left; x < r.right; x++)
	for (CoordI y = r.top; y < r.bottom; y++) {
		CoordD dx = (Double) ((where ().right - 1 - where ().left) / (Double) (r.right  - 1 - r.left)) * (x - r.left) + where ().left;
		CoordD dy = (Double) ((where ().bottom - 1 - where ().top) / (Double) (r.bottom - 1 - r.top)) * (y - r.top) + where ().top;
		CPixel result = pixel (dx, dy);
		pvopRet -> pixel (x, y, result); 
	}
	return pvopRet;
}

own CFloatImage* CVideoObjectPlane::plane (RGBA pxlCom) const
{
	if (!valid ()) return NULL;
	CFloatImage* pfiRet = new CFloatImage (where ());
	const CPixel* ppxlVop = pixels ();
	PixelF* ppxlRet = (PixelF*) pfiRet -> pixels ();
	UInt area = where ().area ();
	for (UInt ip = 0; ip < area; ip++) {
		*ppxlRet = (PixelF) ppxlVop -> pxlU.color [pxlCom];
		ppxlRet++;
		ppxlVop++;
	}
	return pfiRet;
}

Void CVideoObjectPlane::lightChange (Int rShift, Int gShift, Int bShift)
{
	CPixel* ppix = (CPixel*) pixels ();
	UInt area = where ().area ();
	for (UInt i = 0; i < area; i++) {
		ppix -> pxlU.rgb.r = (U8) checkrange (rShift + ppix -> pxlU.rgb.r, 0, 255);
		ppix -> pxlU.rgb.g = (U8) checkrange (gShift + ppix -> pxlU.rgb.g, 0, 255);
		ppix -> pxlU.rgb.b = (U8) checkrange (bShift + ppix -> pxlU.rgb.b, 0, 255);
		ppix++;
	}
}	

Void CVideoObjectPlane::overlay (const CVideoObjectPlane& vop)
{
	if (!valid () || !vop.valid () || vop.where ().empty ()) return;
	CRct r = m_rc; 
	r.include (vop.m_rc); // overlay is defined on union of rects
	where (r); 
	if (!valid ()) return; 
	assert (vop.m_ppxl != NULL); 
	CRct rctVop = vop.m_rc;
	Float inv255 = 1.0f / 255.0f;

	const CPixel* ppxlVop = vop.pixels (); 
	CPixel* ppxlThisY = (CPixel*) pixels (rctVop.left, rctVop.top);
	Int widthCurr = where ().width;
	for (CoordI y = rctVop.top; y < rctVop.bottom; y++) { // loop through VOP CRct
		CPixel* ppxlThisX = ppxlThisY;
		for (CoordI x = rctVop.left; x < rctVop.right; x++) {
			Float beta = inv255 * (Float) ppxlVop -> pxlU.rgb.a;
			Float alpha = inv255 * (Float) ppxlThisX -> pxlU.rgb.a;
			for (UInt ip = 0; ip < 3; ip++) {
				Int value = (Int) (
					beta * (Float) ppxlVop -> pxlU.color [ip] + 
					alpha * (Float) ppxlThisX -> pxlU.color [ip] - 
					alpha * beta * (Float) ppxlThisX -> pxlU.color [ip] + .5f
				);
				ppxlThisX -> pxlU.color [ip] = (U8) checkrange (value, 0, 255);

⌨️ 快捷键说明

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