视频编解码(七)之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各自自己的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react–antd 实现TreeSelect树形选择组件,实现点开一层调一次接口

效果图: 注意: 当选择“否”&#xff0c;开始调接口&#xff0c;不要把点击调接口写在TreeSelect组件上&#xff0c;这样会导致问题出现&#xff0c;没有层级了 部分代码:

MYSQL的事务原理

事务基础 事务概念 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务特性 原子性&#xff08;Atomicity&#xff09…

实际开发中常用的Git操作

文章目录 前言基础知识集中式版本控制 - SVN分布式版本控制 - Git常用的Linux命令Git工作区域 Git 常用命令获取Git仓库添加/提交/推送/删除/回退文件查看信息Git分支Git标签Gitk&#xff1a;一个排查Git问题的工具 前言 git是用C语言开发的&#xff0c;以追求最高的性能。git…

mysql面试题44:MySQL数据库cpu飙升的话,要怎么处理?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL数据库cpu飙升的话,要怎么处理呢? 当MySQL数据库的CPU使用率飙升时,可能表示数据库负载过重或存在性能问题。以下是处理MySQL数据库CPU飙…

TongWeb8的启、停功能场景说明

前言&#xff1a; TongWeb8除了正常的startserver.sh、stopserver.sh启停功能外&#xff0c;还有开机自启、宕机重启、定时重启、内存溢出重启、禁止非法退出等功能&#xff0c;以适应不同场景&#xff0c;保证应用系统的可靠性。 场景一&#xff1a;开机自启 前提条件&#…

Linux友人帐之网络配置与网络传输

一、相关概念 IP地址 IP地址&#xff08;Internet Protocol Address&#xff09;是用于唯一标识和定位计算机网络中设备&#xff08;如计算机、服务器、路由器等&#xff09;的数字标识。在互联网中&#xff0c;IP地址是用来进行网络通信和数据传输的基础。 IP地址由32位或128…

Kotlin函数作为参数指向不同逻辑

Kotlin函数作为参数指向不同逻辑 fun sum(): (Int, Int) -> Int {return { a, b -> (a b) } }fun multiplication(): (Int, Int) -> Int {return { a, b -> (a * b) } }fun main(args: Array<String>) {var math: (Int, Int) -> Intmath sum()println(m…

正点原子嵌入式linux驱动开发——Linux内核顶层Makefile详解

之前的几篇学习笔记重点讲解了如何移植uboot到STM32MP157开发板上&#xff0c;从本章就开始学习如何移植Linux内核。 同uboot一样&#xff0c;在具体移植之前&#xff0c;先来学习一下Linux内核的顶层Makefile文件&#xff0c;因为顶层 Makefile控制着Linux内核的编译流程。 L…

JRebel在IDEA中实现热部署 (JRebel实用版)

JRebel简介&#xff1a; JRebel是与应用程序服务器集成的JVM Java代理&#xff0c;可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中&#xff0c;JRebel特别不依赖任何IDE或开发工具&#xff08;除编译器外&#xff09;。但是&…

jvm--对象实例化及直接内存

文章目录 1. 创建对象2. 对象内存布局3. 对象的访问定位4. 直接内存&#xff08;Direct Memory&#xff09; 1. 创建对象 创建对象的方式&#xff1a; new最常见的方式、Xxx 的静态方法&#xff08;单例模式&#xff09;&#xff0c;XxxBuilder/XxxFactory 的静态方法Class 的…

Unity基础课程之物理引擎6-关于物理材质的使用和理解

每个物体都有着不同的摩擦力。光滑的冰面摩擦力很小&#xff0c;而地毯表面的摩擦力则很大。另外每种材料也有着不同的弹性&#xff0c;橡皮表面的弹性大&#xff0c;硬质地面的弹性小。在Unity中这些现象都符合日常的理念。虽然从原理上讲&#xff0c;物体的摩擦力和弹性有着更…

2023全国大学生软件测试大赛开发者测试练习题99分答案(ScapegoatTree2023)

2023全国大学生软件测试大赛开发者测试练习题99分答案(ScapegoatTree2023) 题目详情题解代码(直接全部复制到test类中即可)提示:该题只需要分支覆盖得分即可,不需要变异得分 题目详情 题解代码(直接全部复制到test类中即可) package net.mooctest;import static org.…

数据结构—顺序表

目录 1.线性表 2.顺序表概念 3.实现顺序表 (1)声明结构体 (2)初始化 (3)打印数据 (4) 销毁 (5)尾插&头插 尾插 判断是否扩容 头插 (6)尾删&头删 尾删 头删 (7)指定位置插入元素 (8)删除指定位置元素 (9)查找指定元素位置 (10)修改指定位置元素 完整版…

RustDay03——记录刷完Rust100题

刷了两三天Rust&#xff0c;终于把Rust100题刷完了&#xff0c;小小记录一下 明天白天的时候重开账户开题写答案

gpio内部结构(一)

一&#xff0c;GPIO内部结构 1&#xff0c;保护二极管 * 引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。 * 当引脚电压高于 VDD_FT 或 VDD 时&#xff0c;上方的二极管导通吸收这个高电压。 * 当引脚电压低于 VSS 时&#xff0c;下方的二极管导通&…

如何在edge浏览器中给PDF添加文字批注

我用的edge浏览器是目前最新版的&#xff08;一般自动更新到最新版&#xff09; 最近&#xff0c;我喜欢用edge浏览器查看PDF&#xff0c;节省电脑资源&#xff0c;快捷且方便。 但edge对PDF的标注种类较少&#xff0c;主要是划线和涂色&#xff0c;文字批注功能尚未出现在工具…

查看和分析 IIS 日志文件以增强 Web 服务器安全性

Microsoft IIS服务器&#xff0c;无论是Web还是FTP&#xff0c;对于企业来说都是必不可少的。但是&#xff0c;IT 安全管理员的工作并不止于部署 IIS 服务器。部署后&#xff0c;管理员必须采取安全措施来保护这些服务器&#xff0c;监控 IIS 服务器安全性的一种行之有效的方法…

Exposure Normalization and Compensation for Multiple-Exposure Correction 论文阅读笔记

这是CVPR2022的一篇曝光校正的文章&#xff0c;是中科大的。一作作者按同样的思路&#xff08;现有方法加一个自己设计的即插即用模块以提高性能的思路&#xff09;在CVPR2023也发了一篇文章&#xff0c;名字是Learning Sample Relationship for Exposure Correction。 文章的…

Sentinel Dashboard 接入 Nacos 动态数据源 Zuul 接入 Sentinel 实战

背景 Sentinel Dashboard 默认将限流、熔断等规则保存在内存中&#xff0c;然后同步给连接 Dashboard 的客户端&#xff0c;客户端也是保存在内存中。 那么如果当 Sentinel Dashboard 异常重启&#xff0c;那么之前配置的规则将全部丢失&#xff0c;需要重新进行配置。 其中&a…

二叉搜索树--查询节点-力扣 700 题

例题细节讲过(二叉搜索树的基础操作-CSDN博客)&#xff0c;下面给出递归实现 public TreeNode searchBST(TreeNode node, int val) {if(node null) {return null;}if(val < node.val) {return searchBST(node.left, val);} else if(node.val < val) {return searchBST(…