(轉載)yuyv(yuv422)轉yuv420p格式

轉自:https://blog.csdn.net/qq_41248872/article/details/83273926

YUYV 屬於YUV4:2:2採樣, 而NV12(也稱YUV420SP)屬於YUV4:2:0採樣,YUV420P也屬於4:2:0採樣。

   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文件所在起始位置。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章