📄 yuv2yuv.c
字号:
s1 = ((unsigned int)s[j] + (unsigned int)s[j+1] + (unsigned int)s2[j] + (unsigned int)s2[j+1] + 2)>>2;
v1 = ((unsigned int)v[j] + (unsigned int)v[j+1] + (unsigned int)v2[j] + (unsigned int)v2[j+1] + 2)>>2;
d[j] = _vvtab[s1];
d[j + dest_uv_offs] = _uutab[v1];
}
s1 =((unsigned int)s[j]+ (unsigned int)s2[j] + 1) >> 1;
v1 = ((unsigned int)v[j] + (unsigned int)v2[j] + 1) >> 1;
d[j] = _vvtab[s1];
d[j + dest_uv_offs] = _uutab[v1];
}
break;
}
s += uPitch;
v += vPitch;
d += dest_pitch/2;
}
} else {
/* adjust hue: */
for (i = 0; i < dest_dy/2; i ++) {
if((i+1) < dest_dy/2) {
s2 = s+uPitch;
v2 = v+vPitch;
} else {
s2 = s;
v2 = v;
}
/* convert pixels: */
switch(OddPattern)
{
case(0):
for (j = 0; j < dest_dx/2; j ++) {
register unsigned v1 = v[j], u1 = s[j];
d[j] = _CLIP(8,_vvtab[v1] + _vutab[u1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[u1] + _uvtab[v1]);
}
break;
case(1):
{
register unsigned s1, v1;
for (j = 0; j < dest_dx/2 -1; j ++) {
s1 = ((unsigned int)s[j] + (unsigned int)s[j+1] + 1)>>1;
v1 = ((unsigned int)v[j] + (unsigned int)v[j+1] + 1)>>1;
d[j] = _CLIP(8,_vvtab[v1] + _vutab[s1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[s1] + _uvtab[v1]);
}
v1 = v[j];
s1 = s[j];
d[j] = _CLIP(8,_vvtab[v1] + _vutab[s1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[s1] + _uvtab[v1]);
}
break;
case(2):
for (j = 0; j < dest_dx/2; j ++) {
register unsigned s1 = ((unsigned int)s[j] + (unsigned int)s2[j] + 1)>>1;
register unsigned v1 = ((unsigned int)v[j] + (unsigned int)v2[j] + 1)>>1;
d[j] = _CLIP(8,_vvtab[v1] + _vutab[s1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[s1] + _uvtab[v1]);
}
break;
case(3):
{
register unsigned s1, v1;
for (j = 0; j < dest_dx/2 -1; j ++) {
s1 =((unsigned int)s[j] + (unsigned int)s[j+1] + (unsigned int)s2[j] + (unsigned int)s2[j+1] + 2)>>2;
v1 =((unsigned int)v[j] + (unsigned int)v[j+1] + (unsigned int)v2[j] + (unsigned int)v2[j+1] + 2)>>2;
d[j] = _CLIP(8,_vvtab[v1] + _vutab[s1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[s1] + _uvtab[v1]);
}
s1 = ((unsigned int)s[j]+ (unsigned int)s2[j] + 1)>>1;
v1 = ((unsigned int)v[j] + (unsigned int)v2[j] + 1) >> 1;
d[j] = _CLIP(8,_vvtab[v1] + _vutab[s1]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[s1] + _uvtab[v1]);
}
break;
}
s += uPitch;
v += vPitch;
d += dest_pitch/2;
}
}
}
return 0;
}
/* conversion is not supported */
return -1;
}
/*
* I420toI420() converter:
*/
int I420toI420 (unsigned char *dest_ptr, int dest_width, int dest_height,
int dest_pitch, int dest_x, int dest_y, int dest_dx, int dest_dy,
unsigned char *src_ptr, int src_width, int src_height, int src_pitch,
int src_x, int src_y, int src_dx, int src_dy)
{
#if 1
unsigned char *pU = src_ptr+src_height*src_pitch,
*pV = pU + src_height*src_pitch/4;
return I420toI420x(dest_ptr, dest_width, dest_height, dest_pitch, dest_x, dest_y, dest_dx, dest_dy,
src_ptr, pU, pV,
src_width, src_height, src_pitch, src_pitch/2, src_pitch/2,
src_x, src_y, src_dx, src_dy);
#else
/* scale factors: */
int scale_x, scale_y;
/* check arguments: */
if (!chk_args (dest_ptr, dest_width, dest_height, dest_pitch,
dest_x, dest_y, dest_dx, dest_dy, src_ptr, src_width, src_height,
src_pitch, src_x, src_y, src_dx, src_dy, &scale_x, &scale_y))
return -1;
/* remove odd destination pixels: */
if (!adjust_range (&dest_x, &dest_dx, &src_x, &src_dx, scale_x) ||
!adjust_range (&dest_y, &dest_dy, &src_y, &src_dy, scale_y))
return 0;
/* check if we have matching chroma components: */
if ((src_x & 1) || (src_y & 1))
return -1; /* can't shift chromas */
/* check if bottop-up images: */
if (dest_pitch <= 0 || src_pitch <= 0)
return -1; /* not supported for this format */
/* check if 1:1 scale: */
if (scale_x == 1 && scale_y == 1) {
/* check if no color adjustmenst: */
if (!(is_alpha | is_beta | is_gamma | is_kappa)) {
/* no color adjustments: */
unsigned char *s, *d;
int src_uv_offs, dest_uv_offs;
register int i;
/* copy Y plane: */
s = src_ptr + src_x + src_y * src_pitch;
d = dest_ptr + dest_x + dest_y * dest_pitch;
for (i = 0; i < dest_dy; i ++) {
memcpy (d, s, dest_dx); /* Flawfinder: ignore */
s += src_pitch;
d += dest_pitch;
}
/* get Cr/Cb offsets: */
src_uv_offs = src_height * src_pitch / 4;
dest_uv_offs = dest_height * dest_pitch / 4;
/* copy Cr/Cb planes: */
s = (src_ptr + src_height * src_pitch) + src_x/2 + src_y/2 * src_pitch/2;
d = (dest_ptr + dest_height * dest_pitch) + dest_x/2 + dest_y/2 * dest_pitch/2;
for (i = 0; i < dest_dy/2; i ++) {
memcpy (d, s, dest_dx/2); /* Flawfinder: ignore */
memcpy (d + dest_uv_offs, s + src_uv_offs, dest_dx/2); /* Flawfinder: ignore */
s += src_pitch/2;
d += dest_pitch/2;
}
} else {
/* adjust colors: */
unsigned char *s, *d;
int src_uv_offs, dest_uv_offs;
register int i, j;
/* convert Y plane: */
s = src_ptr + src_x + src_y * src_pitch;
d = dest_ptr + dest_x + dest_y * dest_pitch;
for (i = 0; i < dest_dy; i ++) {
/* convert pixels: */
for (j = 0; j < dest_dx; j ++)
d[j] = _yytab[s[j]];
s += src_pitch;
d += dest_pitch;
}
/* get Cr/Cb offsets: */
src_uv_offs = src_height * src_pitch / 4;
dest_uv_offs = dest_height * dest_pitch / 4;
/* get chroma pointers: */
s = (src_ptr + src_height * src_pitch) + src_x/2 + src_y/2 * src_pitch/2;
d = (dest_ptr + dest_height * dest_pitch) + dest_x/2 + dest_y/2 * dest_pitch/2;
/* check if no hue adjustment: */
if (!is_alpha) {
/* no chroma rotation: */
for (i = 0; i < dest_dy/2; i ++) {
/* convert pixels: */
for (j = 0; j < dest_dx/2; j ++) {
d[j] = _vvtab[s[j]];
d[j + dest_uv_offs] = _uutab[s[j + src_uv_offs]];
}
s += src_pitch/2;
d += dest_pitch/2;
}
} else {
/* adjust hue: */
for (i = 0; i < dest_dy/2; i ++) {
/* convert pixels: */
for (j = 0; j < dest_dx/2; j ++) {
register unsigned v = s[j], u = s[j + src_uv_offs];
d[j] = _CLIP(8,_vvtab[v] + _vutab[u]);
d[j + dest_uv_offs] = _CLIP(8,_uutab[u] + _uvtab[v]);
}
s += src_pitch/2;
d += dest_pitch/2;
}
}
}
return 0;
}
/* conversion is not supported */
return -1;
#endif
}
int I420toYV12x (unsigned char *dest_ptr, int dest_width, int dest_height,
int dest_pitch, int dest_x, int dest_y, int dest_dx, int dest_dy,
unsigned char *pY, unsigned char *pU, unsigned char *pV,
int src_width, int src_height, int yPitch, int uPitch, int vPitch,
int src_x, int src_y, int src_dx, int src_dy)
{
/* scale factors: */
int scale_x, scale_y;
/* check arguments: */
if (!chk_args (dest_ptr, dest_width, dest_height, dest_pitch,
dest_x, dest_y, dest_dx, dest_dy, pY, src_width, src_height,
yPitch, src_x, src_y, src_dx, src_dy, &scale_x, &scale_y))
return -1;
/* remove odd destination pixels: */
if (!adjust_range (&dest_x, &dest_dx, &src_x, &src_dx, scale_x) ||
!adjust_range (&dest_y, &dest_dy, &src_y, &src_dy, scale_y))
return 0;
/* check if we have matching chroma components: */
if ((src_x & 1) || (src_y & 1))
return -1; /* can't shift chromas */
/* check if bottop-up images: */
if (dest_pitch <= 0 || yPitch <= 0)
return -1; /* not supported for this format */
/* check if 1:1 scale: */
if (scale_x == 1 && scale_y == 1) {
/* check if no color adjustments: */
if (!(is_alpha | is_beta | is_gamma | is_kappa)) {
/* no color adjustments: */
unsigned char *sy, *su, *sv, *d;
int dest_uv_offs;
register int i;
/* copy Y plane: */
sy = pY + src_x + src_y * yPitch;
d = dest_ptr + dest_x + dest_y * dest_pitch;
for (i = 0; i < dest_dy; i ++) {
memcpy (d, sy, dest_dx); /* Flawfinder: ignore */
sy += yPitch;
d += dest_pitch;
}
/* get Cr/Cb offsets: */
dest_uv_offs = dest_height * dest_pitch / 4;
/* copy Cr/Cb planes: */
su = pU + src_x/2 + src_y/2 * uPitch;
sv = pV + src_x/2 + src_y/2 * vPitch;
d = (dest_ptr + dest_height * dest_pitch) + dest_x/2 + dest_y/2 * dest_pitch/2;
for (i = 0; i < dest_dy/2; i ++) {
memcpy (d, sv, dest_dx/2); /* Flawfinder: ignore */
memcpy (d + dest_uv_offs, su, dest_dx/2); /* Flawfinder: ignore */
su += uPitch;
sv += vPitch;
d += dest_pitch/2;
}
} else {
/* adjust colors: */
unsigned char *sy, *su, *sv, *d;
int dest_uv_offs;
register int i, j;
/* convert Y plane: */
sy = pY + src_x + src_y * yPitch;
d = dest_ptr + dest_x + dest_y * dest_pitch;
for (i = 0; i < dest_dy; i ++) {
/* convert pixels: */
for (j = 0; j < dest_dx; j ++)
d[j] = _yytab[sy[j]];
sy += yPitch;
d += dest_pitch;
}
/* get Cr/Cb offsets: */
dest_uv_offs = dest_height * dest_pitch / 4;
/* get chroma pointers: */
su = pU + src_x/2 + src_y/2 * uPitch;
sv = pV + src_x/2 + src_y/2 * vPitch;
d = (dest_ptr + dest_height * dest_pitch) + dest_x/2 + dest_y/2 * dest_pitch/2;
/* check if no hue adjustment: */
if (!is_alpha) {
/* no chroma rotation: */
for (i = 0; i < dest_dy/2; i ++) {
/* convert pixels: */
for (j = 0; j < dest_dx/2; j ++) {
d[j] = _vvtab[sv[j]];
d[j + dest_uv_offs] = _uutab[su[j]];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -