YUV422转换YUV420应用实例

来源:互联网 发布:如何访问mpp数据库 编辑:程序博客网 时间:2024/05/01 15:35

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


我们在上一篇中通过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<width; i=i+4){*(y + (index_y++)) = *(in + width * j + i);*(y + (index_y++)) = *(in + width * j + i + 2);if(j%2 == 0){*(u + (index_u++)) = *(in + width * j + i + 1);*(v + (index_v++)) = *(in + width * j + i + 3);}}}}
    在我的工程代码中,我使用的是v4l2 采集JPEG数据格式,然后再将JPEG格式转换YUV422格式,最后再将YUV422转换为YUV420,转换后的数据下过入下图,

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

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


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



0 0
原创粉丝点击