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

📄 vop.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			}			Int val = (Int) ((beta + alpha - alpha * beta) * 255. + .5f);			ppxlThisX -> pxlU.rgb.a = (U8) checkrange (val, 0, 255);			ppxlThisX++;			ppxlVop++;		}		ppxlThisY += widthCurr;	}}Void CVideoObjectPlane::setPlane (const CFloatImage& fi, RGBA pxlCom){	if (!valid ()) return;	assert (where () == fi.where ());	CPixel* ppxlVop = (CPixel*) pixels ();	const PixelF* ppxlFi = fi.pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++) {		Int value = checkrange ((Int) (*ppxlFi + .5), 0, 255);		ppxlVop -> pxlU.color [pxlCom] = (U8) value;		ppxlVop++;		ppxlFi++;	}}Void CVideoObjectPlane::setPlane (const CIntImage& ii, RGBA pxlCom){	if (!valid ()) return;	assert (where () == ii.where ());	CPixel* ppxlVop = (CPixel*) pixels ();	const PixelI* ppxli = ii.pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++) {		Int value = checkrange (*ppxli, 0, 255);		ppxlVop -> pxlU.color [pxlCom] = (U8) value;		ppxlVop++;		ppxli++;	}}Void CVideoObjectPlane::setPlane (const CU8Image& ci, RGBA pxlCom){	if (!valid ()) return;	assert (where () == ci.where ());	CPixel* ppxlVop = (CPixel*) pixels ();	const PixelC* ppxlc = ci.pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++) {		Int value = checkrange (*ppxlc, 0U, 255U);		ppxlVop -> pxlU.color [pxlCom] = (U8) value;		ppxlVop++;		ppxlc++;	}}Void CVideoObjectPlane::getDownSampledPlane(CFloatImage &fiDst,Int iPlane,Int iSx,Int iSy){	Int iDstWidth = fiDst.where().width;	Int iDstHeight = fiDst.where().height();	Int iSrcWidth = where().width;	Int iSrcHeight = where().height();	PixelF *ppxlfDst = (PixelF *)fiDst.pixels();	const CPixel *ppxlSrc = pixels();	assert(iDstWidth == iSrcWidth/iSx && iDstHeight == iSrcHeight/iSy);	Int iSrcStep = iSrcWidth*iSy;	Int iX,iY,iXX;	for(iY=0;iY<iDstHeight;iY++,ppxlSrc+=iSrcStep)		for(iX=0,iXX=0;iX<iDstWidth;iX++,iXX+=iSx)			*ppxlfDst++ = ppxlSrc[iXX].pxlU.color[iPlane];}Void CVideoObjectPlane::setUpSampledPlane(const CFloatImage &fiSrc,Int iPlane,Int iSx,Int iSy){	Int iSrcWidth = fiSrc.where().width;	Int iSrcHeight = fiSrc.where().height();	Int iDstWidth = where().width;	Int iDstHeight = where().height();	const PixelF *ppxlfSrc = fiSrc.pixels();	CPixel *ppxlDst = (CPixel *)pixels();	assert(iSrcWidth == iDstWidth/iSx && iSrcHeight == iDstHeight/iSy);	Int iCx,iCy,iXX,iX,iY;	for(iCy=0,iY=0;iY<iDstHeight;iY++)	{		for(iCx=0,iXX=iX=0;iX<iDstWidth;iX++,ppxlDst++)		{			ppxlDst->pxlU.color[iPlane] =				checkrange ((Int) (ppxlfSrc[iXX] + .5), 0, 255);			iCx++;			if(iCx==iSx)			{				iXX++;				iCx=0;			}		}		iCy++;		if(iCy==iSy)		{			ppxlfSrc+=iSrcWidth;			iCy=0;		}	}}Void CVideoObjectPlane::getDownSampledPlane(CIntImage &iiDst,Int iPlane,Int iSx,Int iSy){	Int iDstWidth = iiDst.where().width;	Int iDstHeight = iiDst.where().height();	Int iSrcWidth = where().width;	Int iSrcHeight = where().height();	PixelI *ppxliDst = (PixelI *)iiDst.pixels();	const CPixel *ppxlSrc = pixels();	assert(iDstWidth == iSrcWidth/iSx && iDstHeight == iSrcHeight/iSy);	Int iSrcStep = iSrcWidth*iSy;	Int iX,iY,iXX;	for(iY=0;iY<iDstHeight;iY++,ppxlSrc+=iSrcStep)		for(iX=0,iXX=0;iX<iDstWidth;iX++,iXX+=iSx)			*ppxliDst++ = ppxlSrc[iXX].pxlU.color[iPlane];}Void CVideoObjectPlane::setUpSampledPlane(const CIntImage &iiSrc,Int iPlane,Int iSx,Int iSy){	Int iSrcWidth = iiSrc.where().width;	Int iSrcHeight = iiSrc.where().height();	Int iDstWidth = where().width;	Int iDstHeight = where().height();	const PixelI *ppxliSrc = iiSrc.pixels();	CPixel *ppxlDst = (CPixel *)pixels();	assert(iSrcWidth == iDstWidth/iSx && iSrcHeight == iDstHeight/iSy);	Int iCx,iCy,iXX,iX,iY,iVal;	for(iCy=0,iY=0;iY<iDstHeight;iY++)	{		for(iCx=0,iXX=iX=0;iX<iDstWidth;iX++,ppxlDst++)		{			iVal=ppxliSrc[iXX];			ppxlDst->pxlU.color[iPlane] = ( (iVal>255) ? 255 : ((iVal<0)?0:iVal) );			iCx++;			if(iCx==iSx)			{				iXX++;				iCx=0;			}		}		iCy++;		if(iCy==iSy)		{			ppxliSrc+=iSrcWidth;			iCy=0;		}	}}Void CVideoObjectPlane::rgbToYUV () // transform from rgb to yuv{	if (!valid ()) return;	CPixel* ppxl = (CPixel*) pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++) {		Int y = (Int) ((Double) (0.257 * ppxl -> pxlU.rgb.r + 0.504 * ppxl -> pxlU.rgb.g + 0.098 * ppxl -> pxlU.rgb.b + 16) + .5);		Int cb = (Int) ((Double) (0.439 * ppxl -> pxlU.rgb.r - 0.368 * ppxl -> pxlU.rgb.g - 0.071 * ppxl -> pxlU.rgb.b + 128) + .5);		Int cr = (Int) ((Double) (-0.148 * ppxl -> pxlU.rgb.r - 0.291 * ppxl -> pxlU.rgb.g + 0.439 * ppxl -> pxlU.rgb.b + 128) + .5);		ppxl -> pxlU.yuv.y = (U8) y;		ppxl -> pxlU.yuv.u = (U8) cr;		ppxl -> pxlU.yuv.v = (U8) cb;		ppxl++;	}}Void CVideoObjectPlane::yuvToRGB () // transform from yuv to rgb{	if (!valid ()) return;	CPixel* ppxl = (CPixel*) pixels ();	UInt area = where ().area ();	for (UInt ip = 0; ip < area; ip++) {		Double var = 1.164 * (ppxl -> pxlU.yuv.y - 16);		Int r = (Int) ((Double) (var + 1.596 * (ppxl -> pxlU.yuv.v - 128)) + .5);		Int g = (Int) ((Double) (var - 0.813 * (ppxl -> pxlU.yuv.v - 128) - 0.391 * (ppxl -> pxlU.yuv.u - 128)) + .5);		Int b = (Int) ((Double) (var + 2.018 * (ppxl -> pxlU.yuv.u - 128)) + .5);		ppxl -> pxlU.rgb.r = (U8) checkrange (r, 0, 255);		ppxl -> pxlU.rgb.g = (U8) checkrange (g, 0, 255);		ppxl -> pxlU.rgb.b = (U8) checkrange (b, 0, 255);		ppxl++;	}}own CVideoObjectPlane* CVideoObjectPlane::operator * (const CTransform& tf) const{	CVideoObjectPlane* pvopRet = tf.transform_apply (*this);	return pvopRet; }own CVideoObjectPlane* CVideoObjectPlane::operator - (const CVideoObjectPlane& vop) const{	// make the difference in the intersection area	if (!valid () || !vop.valid ()) return NULL;	CRct rctSrc = vop.where ();	CRct rctDes = where ();	CRct rctInt = rctSrc;	rctInt.clip (rctDes);	CVideoObjectPlane* pvopDiff = new CVideoObjectPlane (rctInt);	UInt offsetSrc = rctSrc.width - rctInt.width;	UInt offsetDes = rctDes.width - rctInt.width;	CPixel* ppxlRet = (CPixel*) pvopDiff -> pixels ();	CPixel* ppxlDes = (CPixel*) pixels (rctInt.left, rctInt.top);	CPixel* ppxlSrc = (CPixel*) vop.pixels (rctInt.left, rctInt.top);	for (CoordI j = rctInt.top; j < rctInt.bottom; j++) { 		for (CoordI i = rctInt.left; i < rctInt.right; i++)	{			ppxlRet -> pxlU.rgb.r = (U8) checkrange (ppxlDes -> pxlU.rgb.r - ppxlSrc -> pxlU.rgb.r + 128, 0, 255);			ppxlRet -> pxlU.rgb.g = (U8) checkrange (ppxlDes -> pxlU.rgb.g - ppxlSrc -> pxlU.rgb.g + 128, 0, 255);			ppxlRet -> pxlU.rgb.b = (U8) checkrange (ppxlDes -> pxlU.rgb.b - ppxlSrc -> pxlU.rgb.b + 128, 0, 255);			ppxlRet -> pxlU.rgb.a = (ppxlDes -> pxlU.rgb.a == ppxlSrc -> pxlU.rgb.a) ? opaqueValue : transpValue;			ppxlRet++;			ppxlDes++;			ppxlSrc++;		}		ppxlDes += offsetDes;		ppxlSrc += offsetSrc;	}	return pvopDiff;}Void CVideoObjectPlane::vdlDump (const Char* fileName, CPixel ppxlFalse) const{	if (!valid ()) return;	FILE* pf = fopen (fileName, "wb");	// write overhead	putc ('V', pf);	putc ('M', pf);	CoordI cord = (CoordI) where ().left;	fwrite (&cord, sizeof (CoordI), 1, pf);	cord = (CoordI) where ().top;	fwrite (&cord, sizeof (CoordI), 1, pf);	cord = (CoordI) where ().right;	fwrite (&cord, sizeof (CoordI), 1, pf);	cord = (CoordI) where ().bottom;	fwrite (&cord, sizeof (CoordI), 1, pf);	// dump the actual data	UInt area = where ().area ();	const CPixel* ppxl = pixels ();	for (UInt ip = 0; ip < area; ip++, ppxl++) {		CPixel pp = *ppxl;		if (ppxl -> pxlU.rgb.a == transpValue) {			pp.pxlU.rgb.r = ppxlFalse.pxlU.rgb.r;			pp.pxlU.rgb.g = ppxlFalse.pxlU.rgb.g;			pp.pxlU.rgb.b = ppxlFalse.pxlU.rgb.b;		}		fwrite (&pp, sizeof (CPixel), 1, pf);	}	fclose (pf);}Void CVideoObjectPlane::vdlByteDump (const Char* fileName, CPixel ppxlFalse) const{	if (!valid ()) return;	FILE* pf = fopen (fileName, "wb");	// write overhead	putc ('V', pf);	putc ('B', pf);	int left, top, right, bottom;	left = where ().left;	top = where ().top;	right = where ().right;	bottom = where ().bottom;	U8 byte1, byte2;	byte1 = (left>0)? 128:0;	left = abs (left);	byte1 += left / 256;	byte2 =  left % 256;	putc (byte1,pf);	putc (byte2,pf);	byte1 = (top>0)? 128:0;	top = abs (top);	byte1 += top / 256;	byte2 = top % 256;	putc (byte1, pf);	putc (byte2, pf);	byte1 = (right>0)? 128:0;	right = abs (right);	byte1 += right / 256;	byte2 =  right % 256;	putc(byte1,pf);	putc(byte2,pf);	byte1 = (bottom>0)? 128:0;	bottom = abs (bottom);	byte1 += bottom / 256;	byte2 =  bottom % 256;	putc(byte1,pf);	putc(byte2,pf);	// dump the actual data	UInt area = where ().area ();	const CPixel* ppxl = pixels ();	for (UInt ip = 0; ip < area; ip++, ppxl++) {		CPixel pp = *ppxl;		if (ppxl -> pxlU.rgb.a == transpValue) {			pp.pxlU.rgb.r = ppxlFalse.pxlU.rgb.r;			pp.pxlU.rgb.g = ppxlFalse.pxlU.rgb.g;			pp.pxlU.rgb.b = ppxlFalse.pxlU.rgb.b;		}		fwrite (&pp, sizeof (CPixel), 1, pf);	}	fclose (pf);}Void CVideoObjectPlane::dump (FILE* pfFile, ChromType chrType) const{	if (!valid ()) return;	Int iWidth = where ().width, iHeight = where ().height ();	Int iUVWidth = iWidth, iUVHeight = iHeight;	UInt uiXSubsample = 1, uiYSubsample = 1;	if (chrType == FOUR_TWO_TWO)	{		uiXSubsample = 2;		iUVWidth = (iWidth + 1) / uiXSubsample;	}	else if (chrType == FOUR_TWO_ZERO)	{		uiXSubsample = 2;		uiYSubsample = 2;		iUVWidth = (iWidth + 1) / uiXSubsample;		iUVHeight = (iHeight + 1) / uiYSubsample;	}	UInt iUVArea = iUVWidth * iUVHeight;	UInt area = where ().area ();	// allocate mem for buffers	U8* pchyBuffer = new U8 [area];	U8* pchuBuffer = new U8 [iUVArea];	U8* pchvBuffer = new U8 [iUVArea];	U8* pchyBuffer0 = pchyBuffer;	U8* pchuBuffer0 = pchuBuffer;	U8* pchvBuffer0 = pchvBuffer;	// assign buffers to a vframe	const CPixel* p = pixels ();	for (CoordI y = 0; y < iHeight; y++) {							if ((y % uiYSubsample) == 1) { 			pchuBuffer -= iUVWidth; 			pchvBuffer -= iUVWidth;			}		for (CoordI x = 0; x < iWidth; x++) {							if ((x % uiXSubsample) == 0)	{				*pchuBuffer = p -> pxlU.yuv.u;				*pchvBuffer = p -> pxlU.yuv.v;						pchuBuffer++;				pchvBuffer++;			}			*pchyBuffer++ = p -> pxlU.yuv.y;			p++;		}	}	// write data from a file	Int size = fwrite (pchyBuffer0, sizeof (U8), area, pfFile);	assert (size != 0);	size = (Int) fwrite (pchuBuffer0, sizeof (U8), iUVArea, pfFile);	assert (size != 0);	size = (Int) fwrite (pchvBuffer0, sizeof (U8), iUVArea, pfFile);	assert (size != 0);	delete [] pchyBuffer0;	delete [] pchuBuffer0;	delete [] pchvBuffer0;}Void CVideoObjectPlane::dumpAlpha (FILE* pfFile) const{						  	if (!valid ()) return;	UInt area = where ().area ();	const CPixel* ppxl = pixels ();	for (UInt ip = 0; ip < area; ip++, ppxl++)		putc (ppxl -> pxlU.rgb.a, pfFile);}Void CVideoObjectPlane::dumpAbekas (FILE* pfFile) const{	//dump in YCbCr but interlaced as per Abekas machine	assert (valid ());	Int iWidth = where ().width, iHeight = where ().height ();	assert (iWidth == 720);	assert (iHeight == 486);		//ccir 601	UInt uiXSubsample = 2;	//always has to be FOUR_TWO_TWO)	const CPixel* p = pixels ();	for (CoordI y = 0; y < iHeight; y++) {							for (CoordI x = 0; x < iWidth; x++) {			if (x % uiXSubsample == 0)	{				putc(p -> pxlU.yuv.u, pfFile);				putc(p -> pxlU.yuv.y, pfFile);			}			else {				putc(p -> pxlU.yuv.v, pfFile);				putc(p -> pxlU.yuv.y, pfFile);			}			p++;		}	}}

⌨️ 快捷键说明

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