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

📄 yuv2yuv.c

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
							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 + -