YUV422转换YUV420应用实例

    在上一篇文章中JPEG编码学习—JPEG数据转YUV数据应用实例 已经可以将v4l2 采集到的JPEG数据转换为YUV422格式,但是我们有时候需要使用其他格式的数据,比如用YUV420作为H264的输入数据格式。做数据格式转换,首先需要明白各种数据类型的采样分布格式。如下图:

YUV422转换YUV420应用实例_第1张图片

我们在上一篇中通过JPEG解码转换过来的是YUYV数据格式(YUV422),他的数据分布是:


现在我们需要把YUYV数据格式转换为YUV420Plane模式。根据上面的两张图片我们可以知道,YUYV是交叉分布存储的,它是每两个Y公用一组UV。YUV420它是顺序存储的,它是每4个Y与共用一组UV分量。要实现YUYV装换为YUV420,那么需要把YUYV中的Y分量全部读取,然后隔行读取UV分量。这里一定要注意,这里是需要分行的,如果不分行,随意的组合Y,U,V三个分量,那么形成的画面是会花屏的。下面是我写的转换函数。

void yuyv_to_yuv420P(char *in, char*out,int width,int height) 
{
	char *p_in, *p_out, *y, *u, *v;
	int index_y, index_u, index_v;
	int i, j, in_len;

	y = out;
	u = out + (width * height);
	v = out + (width * height * 5/4);

	index_y = 0;
	index_u = 0;
	index_v = 0;
	for(j=0; j< height*2; j++)
	{
		for(i=0; i
    在我的工程代码中,我使用的是v4l2 采集JPEG数据格式,然后再将JPEG格式转换YUV422格式,最后再将YUV422转换为YUV420,转换后的数据下过入下图,

YUV422转换YUV420应用实例_第2张图片看到画面左边的图片显示是正常的,右边的画面颜色有问题,应该是UV分量与左边的一样。出现这样的问题,应该是在转换的时候,我们有丢弃一行数据的UV分量造成的。别问我为什么需要这么折腾把数据装换这么多次,最后弄到数据失真。其实我只是想验证这样的转换是否可行和实际的效果是如何。

工程代码可以在这里下载:YUV422转换为YUV420数据格式


本文参考:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html



你可能感兴趣的:(视频编码,v4l2与h264视频编码应用)