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

news2025/6/23 7:38:35

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.coloradmin.cn/o/1086307.html

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

相关文章

1600*C. Circle of Monsters(贪心)

Problem - 1334C - Codeforces 解析&#xff1a; 对于某个怪兽&#xff0c;他的耗费为两种情况&#xff0c;要么直接用子弹打&#xff0c;要么被前面的怪兽炸&#xff0c;显然第二种情况耗费更少。 统计出所有怪兽的 max&#xff08;0&#xff0c;a[ i ] - b[ i - 1 ]&#xff…

一句话代码富集分析gost ghost

1.5 ##富集分析---------- #BiocManager::install("gprofiler2") library(gprofiler2) ## We can perform an enrichment analyses with the genes in the complex EnrichmentResults <- gprofiler2::gost(genes_complex, significant TRUE,user_threshold 0.00…

CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Android JNI代码语法解释

文章目录 JNI中的JNIEXPORT、JNIIMPORT和JNICALLJVM如何查找native方法①按照JNI规范的命名规则②调用JNI提供的RegsterNatives函数&#xff0c;将本地函数注册到JVM中示例代码 JNI数据类型JNI字符串的处理①获取字符串②释放字符串③创建字符串④其他字符串处理API JNI中的JNI…

阿里云李腾飞:基于ECS倚天实例的大数据加速最佳实践

云布道师 为了更好地方便各位开发者和用户了解并应用 ECS 倚天实例&#xff0c;由阿里云弹性计算联合基础软件团队 & 平头哥 & 安谋科技&#xff08;arm&#xff09;&#xff0c;共同发起了【倚天实例迁移课程】&#xff0c;本系列课程共计 10 节课程&#xff0c;共分为…

C++学习day6

1.思维导图 2.作业&#xff1a; 编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象…

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…

Outlook导入导出功能灰色,怎么解决

下载安装 Outlook 软件后&#xff0c;登陆账号&#xff0c;然后选择“文件” - “导出”&#xff0c;结果发现“导出”按钮是灰色的&#xff0c;根本无法导出。根据官方说法&#xff1a;由于配置没有完成或者office产品没有正确激活。outlook导出键为灰色原因由于配置没有完成或…

第五篇Android--EditText详解

EditText 字面意思可以编辑的文本。在Android中就是用来接收用户输入的输入框。 1.基本用法 <EditTextandroid:id"id/id_phone_edit"android:layout_width"match_parent"android:layout_height"48dp"android:background"android:color/…

大数据精准营销是从几个维度帮您去筛选准客户?

人工智能和大数据精准营销的存在则可以准确捕捉到消费者最近的心理活动预期&#xff0c;可以根据消费者心理活动准确告诉他&#xff0c;他需要的信息在哪里。由于每个人看到的效果不同&#xff0c;消费者会感觉广告是为他量身打造的。这也就是我们所说的精准营销。 而精准营销…

Elasticsearch 和 Arduino:一起变得更好!

作者&#xff1a;Enrico Zimuel 使用 Arduino IoT 设备与 Elasticsearch 和 Elastic Cloud 进行通信的简单方法 在 Elastic&#xff0c;我们不断寻找简化搜索体验的新方法&#xff0c;并开始关注物联网世界。 来自物联网的数据收集可能非常具有挑战性&#xff0c;尤其是当我们…

【面试经典150 | 哈希表】字母异位词分组

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;排序哈希表方法二&#xff1a;数组作为哈希表的键方法三&#xff1a;字符串作为哈希表的键知识回顾accumulate 写在最后 Tag 【自定义哈希】【哈希表】【数组】 题目来源 49. 字母异位词分组 题目解读 将字符串数组中…

面试全攻略:ElasticSearch分页与MySQL分页的底层逻辑与优化技巧

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我要和大家一起深入探讨一个在技术面试中经常被问到的问题&#xff1a;ElasticSearch中的分页与MySQL中的分页有什么区别&#xff1f;分页是数据库查询中非常常见的操作&#xff0c;但当我们在不同的数据库中执行分页操…

画面清晰如真:OLED透明拼接屏在金华市的画质表现

金华市位于中国浙江省中西部&#xff0c;是中国重要的历史文化名城之一。 金华市拥有悠久的历史和丰富的文化遗产&#xff0c;如古城墙、古建筑和古镇等。 这为OLED透明拼接屏技术的应用提供了丰富的创作素材和展示主题。 金华市的著名景点 义乌国际商贸城&#xff1a;义乌国…

如何开发一款跑酷游戏?

跑酷游戏&#xff08;Parkour Game&#xff09;是一种流行的视频游戏类型&#xff0c;玩家需要在游戏中控制角色进行极限动作、跳跃、爬墙和各种动作&#xff0c;以完成各种挑战和任务。如果你有兴趣开发一款跑酷游戏&#xff0c;以下是一些关键步骤和考虑事项&#xff1a; 游…

职场新人:大公司还是小公司,何去何从?

导言&#xff1a; 对于职场新人来说&#xff0c;选择进入大公司还是小公司是一个重要的决策。大公司通常具有知名度、资源丰富和完善的职业发展路径&#xff0c;而小公司则更加灵活、创新和有机会获得更多的责任。本文将探讨大公司和小公司的优势&#xff0c;并给出一些建议&am…

MySQL下载和安装详细步骤

下载步骤详解 本教程以 MySQL 5.7.29 为例介绍其在 Windows 10 操作系统下的安装和配置过程。 步骤 1)&#xff1a;打开 MySQL 官方网站&#xff08;http://www.mysql.com&#xff09; 步骤 2)&#xff1a;滑到网页底部&#xff0c;点击 DOWNLOADS 列表下的 MySQL Community…

基于SpringBoot的教学辅助平台

目录 前言 一、技术栈 二、系统功能介绍 学生信息管理 教师信息管理 课程信息管理 科目分类管理 班级分类管理 课程作业管理 交流论坛管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理…

一步步教你如何搭建家政小程序+家政管理系统

在当今数字化时代&#xff0c;家政服务行业也需要紧跟潮流&#xff0c;借助互联网技术提升服务品质和效率。而小程序作为一种轻量级应用&#xff0c;能够帮助家政服务公司在推广、预约、评价等方面实现便捷操作&#xff0c;吸引更多客户。本文将介绍如何轻松搭建家政服务行业的…

那些年你不一定会的磁盘、目录、文件操作(c语言版)

一、前言 今天和大家分享的是使用win32api操作磁盘&#xff0c;目录&#xff0c;文件&#xff0c;这里分为三大块&#xff0c;希望能帮到大家。在讲之前还是先给大家看看效果图&#xff0c;如下图&#xff1a; 二、磁盘 获取盘符下的所有文件夹.rar: https://url18.ctfile.co…