YUV422转换YUV420应用实例

news/2025/1/12 18:46:14/

    在上一篇文章中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

------------------------------------------2022.08.21------------------------------------------

该博客将停止更新 

新的文章内容和附件工程文件

请到 liwen01 博客首页信息查询

------------------------------------------2022.08.21------------------------------------------


http://www.ppmy.cn/news/121757.html

相关文章

YUV420 总结 (YU12、YV12、NV12 和 NV21)

YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间。最常见的格式为 YUV420分为两种&#xff1a;YUV420P和YUV420SP。 YUV420P YUV420P 为 plane平面模式&#xff0c;Y, U, V分量处于不同平面&#xff0c;即在 ffmpeg 中数据存放在 3 个数组中。 其可再细分为 Y…

YUV422/YUV420

YUV三种数据格式占用空间计算:YUV444 > YUV444 1920*1080 > 1920*1080个Y1920*1080个U1920*1080个V 1920*1080*3 YUV420 > YUV411 1920*1080 > 1920*1080个Y1920*1080个U/41920*1080个V/4 1920*1080*3/2 YUV422 > YUV422 1920*1080 > 1920*1080个Y1920*…

9.Ansible Conditions介绍

Ansible条件语句 1)上面的例子在不同的机器上安装nginx&#xff0c;不同的操作系统风格使用不同的软件包管理器&#xff61;debian使用APT, Red Hat使用Yum, 但这是两个独立的Playbook,您必须为各自的服务器使用正确的剧本&#xff61; 可以使用条件语句&#xff0c;将这两个P…

YUV420数据格式详解

YUV简介 YUV格式有两大类&#xff1a;planar和packed。 对于planar的YUV格式&#xff0c;先连续存储所有像素点的Y&#xff0c;紧接着存储所有像素点的U&#xff0c;随后是所有像素点的V。 对于packed的YUV格式&#xff0c;每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

RV1126/RV1109:Camera Driver

平台:RV1126/RV1109 Linux(Kernel-4.19) 一:Camera驱动目录 Linux Kernel-4.19 |--arch/arm/boot/dts DTS配置文件 |-- drivers/phy/rockchip |-- phy-rockchip-mipi-rx.c mipi dphy驱动 |-- drivers/media …

YV12,I420,YUV420P的区别

YV12和I420的区别 一般来说&#xff0c;直接采集到的视频数据是RGB24的格式&#xff0c;RGB24一帧的大小size&#xff1d;widthheigth3 Byte&#xff0c;RGB32的size&#xff1d;widthheigth4&#xff0c;如果是I420&#xff08;即YUV标准格式4&#xff1a;2&#xff1a;0&…

I420、YV12、NV12、NV21等常见的YUV420存储格式

今天要讲的&#xff0c;主流的采样格式YUV420&#xff0c;它的存储格式通常就有四种&#xff1a;I420、YV12、NV12、NV21。 1. I420、YV12、NV12、NV21的存储格式 简单来讲&#xff0c;它们的存储格式分别为&#xff1a;I420&#xff1a; YYYYYYYYUUVV YV12&#xff1a;YYYYY…

YUV420SP/YUV420P

YUV420SP&#xff1a; sp&#xff08;semi-Planar二维平面&#xff09;指的是YUV不是3个平面而是分成2个平面。Y数据一个平面&#xff0c;UV数据合用一个平面。UV平面的数据格式是UVUVUV... YUV420P&#xff1a; 420P是先把U存放完后&#xff0c;再存放V&#xff0c;也就是说…