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

📄 tdeinterlaceyuy2.cpp

📁 the De-interlace video processing developed with C++ enviroment in Motion adaptive in 3D and Bi-indi
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
		}
		cmkpp += cmk_pitch;
		cmkp += cmk_pitch;
		cmkpn += cmk_pitch;
	}
	for (x=0; x<arraysize; ++x)
	{
		if (cArray[x] > MI) return true;
	}
	return false;
}

void TDeinterlace::subtractFieldsYUY2(PVideoFrame &prv, PVideoFrame &src, PVideoFrame &nxt) 
{
	const unsigned char *prvp = prv->GetReadPtr();
	int prv_pitch = prv->GetPitch();
	const unsigned char *srcp = src->GetReadPtr();
	int src_pitch = src->GetPitch();
	int Width = src->GetRowSize() - 16;
	int Height = src->GetHeight();
	const unsigned char *nxtp = nxt->GetReadPtr();
	const unsigned char *curpf, *curf, *curnf;
	const unsigned char *prvpf, *prvnf, *nxtpf, *nxtnf;
	int nxt_pitch = nxt->GetPitch();
	int prvf_pitch, nxtf_pitch, curf_pitch;
	int x, y, temp, temp2;
	accumP = accumN = 0;
	if (field^order)
	{
		prvf_pitch = src_pitch<<1;
		curf_pitch = src_pitch<<1;
		nxtf_pitch = nxt_pitch<<1;
		prvpf = srcp + ((field == 1 ? 1 : 2)*src_pitch);
		curf = srcp + ((3-field)*src_pitch);
		nxtpf = nxtp + ((field == 1 ? 1 : 2)*nxt_pitch);
	}
	else
	{
		prvf_pitch = prv_pitch<<1;
		curf_pitch = src_pitch<<1;
		nxtf_pitch = src_pitch<<1;
		prvpf = prvp + ((field == 1 ? 1 : 2)*prv_pitch);
		curf = srcp + ((3-field)*src_pitch);
		nxtpf = srcp + ((field == 1 ? 1 : 2)*src_pitch);
	}
	prvnf = prvpf + prvf_pitch;
	curpf = curf - curf_pitch;
	curnf = curf + curf_pitch;
	nxtnf = nxtpf + nxtf_pitch;
	for (y=2; y<Height-2; y+=2)
	{
		for (x=16; x<Width; ++x)
		{
			if (abs(prvpf[x]-nxtpf[x]) > 3 || abs(prvnf[x]-nxtnf[x]) > 3)
			{
				temp = (curpf[x]+(curf[x]<<2)+curnf[x]);
				temp2 = abs(3*(prvpf[x]+prvnf[x])-temp);
				if (temp2 > 23) accumP += temp2;
				temp2 = abs(3*(nxtpf[x]+nxtnf[x])-temp);
				if (temp2 > 23) accumN += temp2;
			}
		}
		prvpf += prvf_pitch;
		prvnf += prvf_pitch;
		curpf += curf_pitch;
		curf += curf_pitch;
		curnf += curf_pitch;
		nxtpf += nxtf_pitch;
		nxtnf += nxtf_pitch;
	}
}

void TDeinterlace::mapColorsYUY2(PVideoFrame &dst, PVideoFrame &mask)
{
	const unsigned char *maskp = mask->GetReadPtr();
	int mask_pitch = mask->GetPitch();
	int Height = mask->GetHeight();
	int Width = mask->GetRowSize();
	unsigned char *dstp = dst->GetWritePtr();
	int dst_pitch = dst->GetPitch();
	int x, y;
	for (y=0; y<Height; ++y)
	{
		for (x=0; x<Width; ++x)
		{
			if (maskp[x] == 10 || maskp[x] == 110) dstp[x] = 0;
			else if (maskp[x] == 20 || maskp[x] == 120) dstp[x] = 51;
			else if (maskp[x] == 30 || maskp[x] == 130) dstp[x] = 102;
			else if (maskp[x] == 40) dstp[x] = 153;
			else if (maskp[x] == 50) dstp[x] = 204;
			else if (maskp[x] == 60) dstp[x] = 255;
		}
		maskp += mask_pitch;
		dstp += dst_pitch;
	}
}

void TDeinterlace::mapMergeYUY2(PVideoFrame &dst, PVideoFrame &mask, 
		PVideoFrame &prv, PVideoFrame &src, PVideoFrame &nxt)
{
	const unsigned char *maskp = mask->GetReadPtr();
	int mask_pitch = mask->GetPitch();
	int Height = mask->GetHeight();
	int Width = mask->GetRowSize();
	unsigned char *dstp = dst->GetWritePtr();
	int dst_pitch = dst->GetPitch();
	const unsigned char *prvp = prv->GetReadPtr();
	int prv_pitch = prv->GetPitch();
	const unsigned char *srcp = src->GetReadPtr();
	int src_pitch = src->GetPitch();
	const unsigned char *nxtp = nxt->GetReadPtr();
	int nxt_pitch = nxt->GetPitch();
	int x, y;
	for (y=0; y<Height; ++y)
	{
		for (x=0; x<Width; ++x)
		{
			if (maskp[x] == 10 || maskp[x] == 110) dstp[x] = srcp[x];
			else if (maskp[x] == 20 || maskp[x] == 120) dstp[x] = prvp[x];
			else if (maskp[x] == 30 || maskp[x] == 130) dstp[x] = nxtp[x];
			else if (maskp[x] == 40) dstp[x] = (srcp[x]+nxtp[x]+1)>>1;
			else if (maskp[x] == 50) dstp[x] = (srcp[x]+prvp[x]+1)>>1;
			else if (maskp[x] == 60) dstp[x] = 255;
		}
		prvp += prv_pitch;
		srcp += src_pitch;
		nxtp += nxt_pitch;
		maskp += mask_pitch;
		dstp += dst_pitch;
	}
}

void TDeinterlace::cubicDeintYUY2(PVideoFrame &dst, PVideoFrame &mask, 
		PVideoFrame &prv, PVideoFrame &src, PVideoFrame &nxt)
{
	const unsigned char *prvp = prv->GetReadPtr();
	int prv_pitch = prv->GetPitch();
	const unsigned char *srcp = src->GetReadPtr();
	int src_pitch = src->GetPitch();
	int src_pitch2 = src_pitch<<1;
	int Width = src->GetRowSize();
	int Height = src->GetHeight();
	const unsigned char *nxtp = nxt->GetReadPtr();
	int nxt_pitch = nxt->GetPitch();
	unsigned char *dstp = dst->GetWritePtr();
	int dst_pitch = dst->GetPitch();
	const unsigned char *maskp = mask->GetReadPtr();
	int mask_pitch = mask->GetPitch();
	const unsigned char *srcpp = srcp - src_pitch;
	const unsigned char *srcppp = srcpp - src_pitch2;
	const unsigned char *srcpn = srcp + src_pitch;
	const unsigned char *srcpnn = srcpn + src_pitch2;
	int x, y;
	for (y=0; y<Height; ++y)
	{
		for (x=0; x<Width; ++x)
		{
			if (maskp[x] == 10 || maskp[x] == 110) dstp[x] = srcp[x];
			else if (maskp[x] == 20 || maskp[x] == 120) dstp[x] = prvp[x];
			else if (maskp[x] == 30 || maskp[x] == 130) dstp[x] = nxtp[x];
			else if (maskp[x] == 40) dstp[x] = (srcp[x]+nxtp[x]+1)>>1;
			else if (maskp[x] == 50) dstp[x] = (srcp[x]+prvp[x]+1)>>1;
			else if (maskp[x] == 60)
			{
				if (y<3 || y>Height-4) dstp[x] = (srcpn[x]+srcpp[x]+1)>>1;
				else dstp[x] = cubicInt(srcppp[x],srcpp[x],srcpn[x],srcpnn[x]);
			}
		}
		prvp += prv_pitch;
		srcppp += src_pitch;
		srcpp += src_pitch;
		srcp += src_pitch;
		srcpn += src_pitch;
		srcpnn += src_pitch;
		nxtp += nxt_pitch;
		maskp += mask_pitch;
		dstp += dst_pitch;
	}
}

void TDeinterlace::ELADeintYUY2(PVideoFrame &dst, PVideoFrame &mask, 
		PVideoFrame &prv, PVideoFrame &src, PVideoFrame &nxt)
{
	const unsigned char *prvp = prv->GetReadPtr();
	int prv_pitch = prv->GetPitch();
	const unsigned char *srcp = src->GetReadPtr();
	int src_pitch = src->GetPitch();
	int Width = src->GetRowSize();
	int Height = src->GetHeight();
	const unsigned char *nxtp = nxt->GetReadPtr();
	int nxt_pitch = nxt->GetPitch();
	unsigned char *dstp = dst->GetWritePtr();
	int dst_pitch = dst->GetPitch();
	const unsigned char *maskp = mask->GetReadPtr();
	int mask_pitch = mask->GetPitch();
	const unsigned char *srcpp = srcp - src_pitch;
	const unsigned char *srcpn = srcp + src_pitch;
	int x, y, val, stop, u, inc, min, temp1, temp2, shft, minf, maxf, s1, s2;
	for (y=0; y<Height; ++y)
	{
		for (x=0; x<Width; ++x)
		{
			if (maskp[x] == 10 || maskp[x] == 110) dstp[x] = srcp[x];
			else if (maskp[x] == 20 || maskp[x] == 120) dstp[x] = prvp[x];
			else if (maskp[x] == 30 || maskp[x] == 130) dstp[x] = nxtp[x];
			else if (maskp[x] == 40) dstp[x] = (srcp[x]+nxtp[x]+1)>>1;
			else if (maskp[x] == 50) dstp[x] = (srcp[x]+prvp[x]+1)>>1;
			else if (maskp[x] == 60)
			{
				if (x&1)
				{
					if (x < 8 || x > Width-9 || (abs(srcpp[x]-srcpn[x]) < 10 &&
						abs(srcpp[x-8]-srcpp[x+8]) < 10 && abs(srcpn[x-8]-srcpn[x+8]) < 10)) 
					{
						dstp[x] = (srcpp[x]+srcpn[x]+1)>>1;
						continue;
					}
					stop = min(x-4,min(16,Width-5-x));
					inc = 4;
					shft = 3;
				}
				else
				{
					if (x < 4 || x > Width-5 || (abs(srcpp[x]-srcpn[x]) < 10 &&
						abs(srcpp[x-4]-srcpp[x+4]) < 10 && abs(srcpn[x-4]-srcpn[x+4]) < 10)) 
					{
						dstp[x] = (srcpp[x]+srcpn[x]+1)>>1;
						continue;
					}
					stop = min(x-2,min(16,Width-3-x));
					inc = shft = 2;
				}
				minf = min(srcpp[x],srcpn[x])-2;
				maxf = max(srcpp[x],srcpn[x])+2;
				val = (srcpp[x]+srcpn[x]+1)>>1;
				for (min=450, u=0; u<=stop; u+=inc) 
				{
					s1 = srcpp[x+(u>>shft)*inc]+srcpp[x+((u+inc)>>shft)*inc];
					s2 = srcpn[x-(u>>shft)*inc]+srcpn[x-((u+inc)>>shft)*inc];
					temp1 = abs(s1-s2) + abs(srcpp[x-inc]-srcpn[x-inc-u]) +
						(abs(srcpp[x]-srcpn[x-u])<<1) + abs(srcpp[x+inc]-srcpn[x+inc-u]) +
						abs(srcpn[x-inc]-srcpp[x-inc+u]) + (abs(srcpn[x]-srcpp[x+u])<<1) +
						abs(srcpn[x+inc]-srcpp[x+inc+u]);
					temp2 = (s1+s2+2)>>2;
					if (temp1 < min && temp2 >= minf && temp2 <= maxf)
					{
						min = temp1;
						val = temp2;
					}
					s1 = srcpp[x-(u>>shft)*inc]+srcpp[x-((u+inc)>>shft)*inc];
					s2 = srcpn[x+(u>>shft)*inc]+srcpn[x+((u+inc)>>shft)*inc];
					temp1 = abs(s1-s2) + abs(srcpp[x-inc]-srcpn[x-inc+u]) + 
						(abs(srcpp[x]-srcpn[x+u])<<1) + abs(srcpp[x+inc]-srcpn[x+inc+u]) +
						abs(srcpn[x-inc]-srcpp[x-inc-u]) + (abs(srcpn[x]-srcpp[x-u])<<1) +
						abs(srcpn[x+inc]-srcpp[x+inc-u]);
					temp2 = (s1+s2+2)>>2;
					if (temp1 < min && temp2 >= minf && temp2 <= maxf)
					{
						min = temp1;
						val = temp2;
					}
				}
				dstp[x] = val;
			}
		}
		prvp += prv_pitch;
		srcpp += src_pitch;
		srcp += src_pitch;
		srcpn += src_pitch;
		nxtp += nxt_pitch;
		maskp += mask_pitch;
		dstp += dst_pitch;
	}
}

void TDeinterlace::kernelDeintYUY2(PVideoFrame &dst, PVideoFrame &mask, 
		PVideoFrame &prv, PVideoFrame &src, PVideoFrame &nxt)
{
	const unsigned char *prvp = prv->GetReadPtr();
	int prv_pitch = prv->GetPitch();
	int prv_pitch2 = prv_pitch<<1;
	const unsigned char *srcp = src->GetReadPtr();
	int src_pitch = src->GetPitch();
	int src_pitch2 = src_pitch<<1;
	int Width = src->GetRowSize();
	int Height = src->GetHeight();
	const unsigned char *nxtp = nxt->GetReadPtr();
	int nxt_pitch = nxt->GetPitch();
	int nxt_pitch2 = nxt_pitch<<1;
	unsigned char *dstp = dst->GetWritePtr();
	int dst_pitch = dst->GetPitch();
	const unsigned char *maskp = mask->GetReadPtr();
	int mask_pitch = mask->GetPitch();
	const unsigned char *srcpp = srcp - src_pitch;
	const unsigned char *srcppp = srcpp - src_pitch2;
	const unsigned char *srcpn = srcp + src_pitch;
	const unsigned char *srcpnn = srcpn + src_pitch2;
	const unsigned char *kerc, *kerp, *kerpp, *kern, *kernn;
	int ker_pitch, x, y, temp;
	if (accumP <= accumN)
	{
		if (field^order)
		{
			ker_pitch = src_pitch;
			kerpp = srcp - (src_pitch2<<1);
			kerp = srcp - src_pitch2;
			kerc = srcp;
			kern = srcp + src_pitch2;
			kernn = srcp + (src_pitch2<<1);
		}
		else
		{
			ker_pitch = prv_pitch;
			kerpp = prvp - (prv_pitch2<<1);
			kerp = prvp - prv_pitch2;
			kerc = prvp;
			kern = prvp + prv_pitch2;
			kernn = prvp + (prv_pitch2<<1);
		}
	}
	else
	{
		if (field^order)
		{
			ker_pitch = nxt_pitch;
			kerpp = nxtp - (nxt_pitch2<<1);
			kerp = nxtp - nxt_pitch2;
			kerc = nxtp;
			kern = nxtp + nxt_pitch2;
			kernn = nxtp + (nxt_pitch2<<1);
		}
		else
		{
			ker_pitch = src_pitch;
			kerpp = srcp - (src_pitch2<<1);
			kerp = srcp - src_pitch2;
			kerc = srcp;
			kern = srcp + src_pitch2;
			kernn = srcp + (src_pitch2<<1);
		}
	}
	for (y=0; y<Height; ++y)
	{
		for (x=0; x<Width; ++x)
		{
			if (maskp[x] == 10 || maskp[x] == 110) dstp[x] = srcp[x];
			else if (maskp[x] == 20 || maskp[x] == 120) dstp[x] = prvp[x];
			else if (maskp[x] == 30 || maskp[x] == 130) dstp[x] = nxtp[x];
			else if (maskp[x] == 40) dstp[x] = (srcp[x]+nxtp[x]+1)>>1;
			else if (maskp[x] == 50) dstp[x] = (srcp[x]+prvp[x]+1)>>1;
			else if (maskp[x] == 60)
			{
				if (sharp && y>3 && y<Height-4)
				{
					temp = (int)((0.526*(srcpp[x]+srcpn[x]) + 
								  0.170*(kerc[x]) - 
								  0.116*(kerp[x]+kern[x]) - 
								  0.026*(srcppp[x]+srcpnn[x]) + 
								  0.031*(kerpp[x] + kernn[x])) + 0.5f);
					if (temp > 255) dstp[x] = 255;
					else if (temp < 0) dstp[x] = 0;

⌨️ 快捷键说明

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