yuyv(yuv422)轉yuv420p格式
阿新 • • 發佈:2018-11-01
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檔案所在起始位置。