yuyv(yuv422)转yuv420p格式

版权声明:凡本人原创,转发请注明出处,谢谢! https://blog.csdn.net/qq_41248872/article/details/83273926

YUV422图像是这样的,每个像素采集Y,每隔两个像素采集一次UV:

Packed格式的YUV420是这样的,每个像素采集Y,UV隔行采集,每行是每两个像素采集一次:

代码如下:

unsigned char *yuyv_buf = (unsigned char *)malloc(2*1280*720*sizeof(unsigned char));

unsigned char *yuv420_buf = (unsigned char *)malloc(3*1280*720/2*sizeof(unsigned char));
int yuyv_to_yuv420p(const unsigned char *in, unsigned char *out, unsigned int width, unsigned int height)
{
    unsigned char *y = out;
    unsigned char *u = out + width*height;
    unsigned char *v = out + width*height + width*height/4;

    unsigned int i,j;
    unsigned int base_h;
    unsigned int is_y = 1, is_u = 1;
    unsigned int y_index = 0, u_index = 0, v_index = 0;

    unsigned long yuv422_length = 2 * width * height;

    //序列为YU YV YU YV,一个yuv422帧的长度 width * height * 2 个字节
    //丢弃偶数行 u v
    for(i=0; i<yuv422_length; i+=2)
    {

        *(y+y_index) = *(in+i);

        y_index++;
    
    }

    for(i=0; i<height; i+=2)
    {

        base_h = i*width*2;

        for(j=base_h+1; j<base_h+width*2; j+=2)

        {

            if(is_u)
            {

            *(u+u_index) = *(in+j);

            u_index++;

            is_u = 0;

            }

            else
            {
                *(v+v_index) = *(in+j);
                v_index++;
                is_u = 1;
            }
        }
    }

    return 1;
}

参数in代表yuv422文件所在起始位置,out代表转换后yuv420p文件所在起始位置。

猜你喜欢

转载自blog.csdn.net/qq_41248872/article/details/83273926