YUY2ToI420
1.接口定义:
// Convert YUY2 to I420.
LIBYUV_API
int YUY2ToI420(const uint8* src_yuy2, int src_stride_yuy2,
uint8* dst_y, int dst_stride_y,
uint8* dst_u, int dst_stride_u,
uint8* dst_v, int dst_stride_v,
int width, int height);
2.实际使用
首先弄清楚两种图片格式的存储格式:
YUV格式在存储上存在两类布局:
Packed:把相邻的几个像素打包起来;比如把水平方向2个像素打包到一个DWORD
Plannar:方式相反;Y分量和UV分量完全分开来保存
YUY2和YV12是最常用的两个代表。
YUY2是packed方式的。水平方向两个像素打包到一个DWORD,并且UV采样率只有Y的一半,这符合人的视觉特征能有效的压缩数据,具体布局为[Y0, U0,Y1,V0]。 这种格式常见于MPEG1的解码器。
YV12则常见于H.264的解码器,它属于plannar方式。对于一个MxN大小的视频来说,数据布局为[Y:M x N] [V:M/2 x N/2] [U:M/2 x N/2]. 也就是说UV的采样率在水平和垂直方向上都只有Y的一半。
i420_image = (uint8*)malloc(image->width * image->height * 1.5);
uint8* i420_image_y_ptr = i420_image;
uint8* i420_image_u_ptr = i420_image_y_ptr + (image->width * image->height);
uint8* i420_image_v_ptr = i420_image_u_ptr + (int)(image->width * image->height * 0.25);
libyuv::YUY2ToI420((const uint8*)image->data, image->bytes_per_line, //image->bytes_per_line为422一行的字节数
i420_image_y_ptr, image->width,
i420_image_u_ptr, (image->width >> 1),
i420_image_v_ptr, (image->width >> 1),
image->width, image->height);