视频编解码(七)之FOURCC和YUV关系简介

2023-10-13 08:45

本文主要是介绍视频编解码(七)之FOURCC和YUV关系简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FOURCC是4字节代码,是一个codec中对压缩格式、颜色、像素格式等的标识。按一个字节8bit,FOURCC通常占4字节32bit。

FOURCC is short for “four character code” - an identifier for a video codec, compression format, color or pixel format used in media files.

A character in this context is a 1 byte/8 bit value, thus a FOURCC always takes up exatly 32 bits/4 bytes in a file.

Another way to write FOURCC is 4CC (4 as in “four” character code).

libva中有一个VA_FOURCC的宏定义:

#define VA_FOURCC(ch0, ch1, ch2, ch3) \((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 ))

然后virglrenderer中在判断format时就使用到该VA_FOURCC宏:可以看出FOURCC是一个32bit(4字节)的变量,其中存储的时NV12这样的ASCII字符,所以FOURCC中的四个字符必须是ASCII字符表内所包含的字符

static enum pipe_format pipe_format_from_va_fourcc(unsigned format)
{switch(format) {case VA_FOURCC('N','V','1','2'):return PIPE_FORMAT_NV12;case VA_FOURCC('P','0','1','0'):return PIPE_FORMAT_P010;case VA_FOURCC('P','0','1','6'):return PIPE_FORMAT_P016;case VA_FOURCC('I','4','2','0'):return PIPE_FORMAT_IYUV;case VA_FOURCC('Y','V','1','2'):return PIPE_FORMAT_YV12;case VA_FOURCC('Y','U','Y','V'):case VA_FOURCC('Y','U','Y','2'):return PIPE_FORMAT_YUYV;case VA_FOURCC('U','Y','V','Y'):return PIPE_FORMAT_UYVY;case VA_FOURCC('B','G','R','A'):return PIPE_FORMAT_B8G8R8A8_UNORM;case VA_FOURCC('R','G','B','A'):return PIPE_FORMAT_R8G8B8A8_UNORM;case VA_FOURCC('B','G','R','X'):return PIPE_FORMAT_B8G8R8X8_UNORM;case VA_FOURCC('R','G','B','X'):return PIPE_FORMAT_R8G8B8X8_UNORM;default:return PIPE_FORMAT_NONE;}
}

YUV pixel formats

YUV pixel formats有两种方式,packed formats 和 planer formats。

  • Packed formats:Y, U(Cb), V(Cr) 三个采样值是打包在一个macropixels,存放在一个数组内。

  • Planer formats:Y,U,V分别存放在三个数组内,最终的image是该三个planes的fusing(定影熔合)而成。

Packed YUV Formats

FOURCC,16进制bits/pixel
UYVY0x5956595516YUV 4:2:2 (Y sample at every pixel, U and V sampled at every second pixel horizontally on each line). A macropixel contains 2 pixels in 1 u_int32
YUV20x3259555916YUV 4:2:2 as for UYVY but with different component ordering within the u_int32 macropixel
YVYU0x5559565916YUV 4:2:2 as for UYVY but with different component ordering within the u_int32 macropixel
Y42T0x5432345916Format as for UYVY but the lsb of each Y component is used to signal pixel transparency
YUVP0x5056555924?YCbCr 4:2:2 extended precision 10-bits per component in Y0U0Y1V0 order. Registered by Rich Ehlers of Evans & Sutherland

V0,Y3,U0的理解:

In the diagrams below, the numerical suffix attached to each Y, U or V sample indicates the sampling position across the image line, so, for example, V0 indicates the leftmost V sample and Yn indicates the Y sample at the (n+1)th pixel from the left.

U0表示最左边的U采样,Un表示从U0的像素位置起(包含)数第(n+1)个像素pixel中的U采样。

UYVY

UYVY可能是最流行的4:2:2格式的一种了,通常是MPEG codecs第二个常用格式(第一个常用格式是YV12)。

Y422和UYNV通常也是指UYVY格式。16bits/pixel

HorizontalVertical
Y Sample Period11
V Sample Period21
U Sample Period21
在这里插入图片描述

这个地方的扫描间隔和排列到底该如何理解?我的理解是

UYUV的每个像素是16bits,一个macropixels包含2个pixels是32bits。

Y的水平采样是每个pixel中都一个,V的水平采样是每2个pixel中才有一个,U的水平采样也是每2个pixel中有一个;

Y的垂直采样是每个pixel中有一个,V的垂直采样是每个pixel中有一个,U的垂直采样也是每个pixel中有一个。

所以其采样排列应该是如下:我这每行就写4个pixel就换行作示意理解用,实际采样时应该每行有weight个像素

U0, Y0, V0, Y1 U2, Y2, V2, Y3

U4, Y4, V4, Y5 U6, Y6, V6, Y7

... ...

与UYVV等同性质的formats有: IUYV HDYC UYNV Y422

UYVY的子类formats有: YUY2 YVYU Y42T

YUY2

YUY2是4:2:2的一种格式,其与UYVY很类似,只在macropixels中的构成有所不同。

HorizontalVertical
Y Sample Period11
V Sample Period21
U Sample Period21

在这里插入图片描述

按照我上面对UYVY的分析理解,也可以画一个YUY2的排列:

Y0, U0, Y1, V0 Y2, U2, Y3, V2

Y4, U4, Y5, V4 Y6, U6, Y7, V6

... ...

与YUY2同样的formats有:YUYV,YUNV

YUY2的子类formats有:YUVP

YVYU

YVYU其实和YUY2很类似,不同之处也是在于macropixels中的排列不同。

HorizontalVertical
Y Sample Period11
V Sample Period21
U Sample Period21

在这里插入图片描述

我还是按照自己的理解来写一遍排列:

Y0, V0, Y1, U0 Y2, V2, Y3, U2

Y4, V4, Y5, U5 Y6, V6, Y7, U6

... ...

Y42T

This format is identical to UYVY except for the fact that the least significant bit of each Y component forms a chromakey channel. If this bit is set, the YUV image pixel is displayed, if cleared, the pixel is transparent (and the underlying graphics pixel is shown).

YUVP

This is another format similar to YUY2 and it’s aliases. The difference here is that each Y, U and V samples is 10 bits rather than 8. I am still waiting to hear how the samples are packed - is a macropixel just 5 bytes long with all the samples packed together or is there more to it than this?

Planer YUV Formats

Planer formats:Y,U,V分别存放在三个数组内,最终的image是该三个planes的fusing(定影熔合)而成。

FOURCC,16进制bits/pixel
NV120x3231564E128-bit Y plane followed by an interleaved U/V plane with 2x2 subsampling
NV210x3132564E12As NV12 with U and V reversed in the interleaved plane
YV120x32315659128 bit Y plane followed by 8 bit 2x2 subsampled V and U planes
I420
HorizontalVertical
Y Sample Period11
V Sample Period22
U Sample Period22

I420格式特征如下:

  • Y luma plane排在前面,然后是U chroma plane,最后是V chroma plane

  • Y在水平和垂直放行都是每个pixel都采样一次,U和V在水平方向和垂直方向都是每2个pixel中才出现一次,也就是2x2的pixels中,U和V各采样一次,这样算下来2x2的pixels中,Y采样4次,U和V个采样一次

  • 所以2x2的pixels中,总bits数=4 x 8 + 8 + 8 = 48bits,一共是2x2=4个pixels,所以每个pixels的bits平均就是12bits

YV12

YV12和I420极其类似,YV12这里的YV指的是plane的顺序,Y plane在前,接着V plane,最后U plane,12指的12bits/pixel。

HorizontalVertical
Y Sample Period11
V Sample Period22
U Sample Period22

所以,按照这个间隔我们来画一个采样排列:

在这里插入图片描述

相当于每2x2 pixels中采样了4个Y分量,1个V分量和1个U分量,然后Y luma plane是一个plane,V chroma plane是一个plane, U chroma plane也是一个plane。

把上面这3个plane示意图在内存字节序中的排序顺一下就是:

在这里插入图片描述

NV12

NV12也和I420相似,不同的是Y plane在前,然后是U/V交叉的plane。

NV12中chroma plane也是水平和垂直方向都每2个pixel采样,所以2x2个pixel中有4个Y,各一个U和V,其也是12bits/pixel。

HorizontalVertical
Y Sample Period11
V Sample Period22
U Sample Period22

还是按照我的理解根据这个间隔来画个采样排列:

在这里插入图片描述

把Y plane和 U/V plane在内存中的分布就是:

在这里插入图片描述

NV21

NV21和NV12其实一样,不同之处在于U和V的顺序,NV21中先是V再是U。

排列汇总如下:

在这里插入图片描述

libva中FOURCC和YUV

FOURCCPixel formatvalueYUVbit-depthbpp
VA_FOURCC_NV12planer(2 plane)0x3231564E4:2:08-bit12bpp
VA_FOURCC_NV21planer(2 plane)0x3132564E4:2:08-bit12bpp
VA_FOURCC_RGBApacked0x41424752
8-bit32bpp
VA_FOURCC_UYVYpacked0x595659554:2:28-bit16bpp
VA_FOURCC_YUY2packed0x325955594:2:28-bit16bpp
VA_FOURCC_YV12planer(3 plane)0x323156594:2:08-bit12bpp
VA_FOURCC_I420planer(3 plane)0x303234494:2:08-bit12bpp
VA_FOURCC_444Pplaner(3 plane)0x503434344:4:48-bit24bpp
VA_FOURCC_P010planer(2 plane)0x303130504:2:010-bit15bpp
VA_FOURCC_P012planer(2 plane)0x323130504:2:012-bit18bpp
VA_FOURCC_P016planer(2 plane)0x363130504:2:016-bit24bpp

这里的value的计算方法是通过VA_FOURCC()宏定义计算出来的,比如NV12的ASCII字符算下来就是0x3231564E。

libva中定义了一些VAConfigAttributeRTFormat值:

AttributrevalueYUVbit-depth
VA_RT_FORMAT_YUV4200x000000014:2:08-bit
VA_RT_FORMAT_YUV4220x000000024:2:28-bit
VA_RT_FORMAT_YUV4440x000000044:4:48-bit
VA_RT_FORMAT_YUV4110x000000084:1:18-bit
VA_RT_FORMAT_YUV4000x00000010Greyscale8-bit
VA_RT_FORMAT_YUV420_100x000001004:2:010-bit
VA_RT_FORMAT_YUV422_100x000002004:2:210-bit
VA_RT_FORMAT_YUV444_100x000004004:4:410-bit
VA_RT_FORMAT_YUV420_120x000010004:2:012-bit
VA_RT_FORMAT_YUV422_120x000020004:2:212-bit
VA_RT_FORMAT_YUV444_120x000040004:4:412-bit

VA_RT_FORMAT_RGB160x00010000Packed RGB16bpp
VA_RT_FORMAT_RGB320x00020000Packed RGB32bpp
VA_RT_FORMAT_RGBP0x00100000Planer RGB8bit per sample
VA_RT_FORMAT_RGB32_100x00200000Planer RGB32bpp

VA_RT_FORMAT_RGB32_10BPP已被VA_RT_FORMAT_RGB32_10代替
VA_RT_FORMAT_YUV420_10BPP已被VA_RT_FORMAT_YUV420_10代替

那么VAProfile中hevc的main10这里的10的含义是10bit-depth还是10bpp呢?

根据mesa和libva以及virglrenderer中的代码看,VAProfileHEVCMain10中的10是代表10bit-depth,不过VAProfileHEVCMain10只是一个入口,其下面具体的处理还需要看mesa或virglrenderer各自自己的处理。

这篇关于视频编解码(七)之FOURCC和YUV关系简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202059

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室