1. 程式人生 > >yuyv(yuv422)轉yuv420p格式

yuyv(yuv422)轉yuv420p格式

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檔案所在起始位置。