📄 tdeinterlaceyuy2.cpp
字号:
}
}
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 + -