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

📄 vop.cpp

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 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.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 + -