推荐的用于视频渲染的8位YUV格式

推荐的用于视频渲染的8位YUV格式


介绍
整个视频行业定义了许多YUV格式。本文介绍了建议在Windows中进行视频渲染的8位YUV格式。鼓励解码器供应商和显示供应商支持本文介绍的格式。本文不讨论YUV颜色的其他用途,例如静态摄影。

本文介绍的格式均使用每个像素位置8位编码Y通道(也称为亮度通道),并使用每个样本8位编码每个U或V色度样本。但是,大多数YUV格式平均每个像素使用少于24位,因为它们包含的U和V样本少于Y的样本。本文不涉及具有10位或更高Y通道的YUV格式。

备注

出于本文的目的,术语U等于Cb,术语V等于Cr。

本文涵盖以下主题:

YUV采样。描述最常用的YUV采样技术。
表面定义。描述推荐的YUV格式。
色彩空间和色度采样率转换。提供一些在YUV和RGB格式之间进行转换以及在不同YUV格式之间进行转换的准则。
在Media Foundation中识别YUV格式。说明如何在Media Foundation中描述YUV格式类型。
YUV采样
色度通道的采样率可以低于亮度通道,而不会显着降低感知质量。一种称为“ A:B:C”的表示法用于描述相对于Y采样U和V的频率:

4:4:4表示不降低色度通道的采样率。
4:2:2表示2:1水平下采样,没有垂直下采样。每条扫描线每两个U或V样本包含四个Y样本。
4:2:0表示2:1水平下采样,而2:1垂直下采样。
4:1:1表示4:1水平下采样,没有垂直下采样。每条扫描线针对每个U和V样本包含四个Y样本。4:1:1采样比其他格式少见,本文不再详细讨论。
下图显示了如何针对每个下采样率采样色度。亮度样本用十字表示,色度样本用圆圈表示。

ITU-R BT.601建议书定义了4:2:2采样的主要形式。4:2:0采样有两种常见的变体。其中一个用于MPEG-2视频,另一个用于MPEG-1和ITU-T建议H.261和H.263。

与MPEG-1方案相比,在MPEG-2方案和为4:2:2和4:4:4格式定义的采样网格之间进行转换更容易。因此,在Windows中首选MPEG-2方案,并且应将其视为4:2:0格式的默认解释。

表面定义
本节介绍了建议用于视频渲染的8位YUV格式。这些分为以下几类:

4:4:4格式,每像素32位
4:2:2格式,每像素16位
4:2:0格式,每像素16位
4:2:0格式,每像素12位
首先,您应该了解以下概念,以便理解以下内容:

表面起源。对于本文所述的YUV格式,原点(0,0)始终是曲面的左上角。
大步走。表面的步幅(有时称为间距)是表面的宽度(以字节为单位)。给定左上角的曲面原点,步幅始终为正。
对齐方式。表面的对齐方式由图形显示驱动程序决定。表面必须始终是DWORD对齐的;也就是说,确保曲面内的各个线起源于32位(DWORD)边界。但是,根据硬件的需要,对齐方式可以大于32位。
压缩格式与平面格式。YUV格式分为打包格式和平面格式。以压缩格式,Y,U和V分量存储在单个阵列中。像素被组织为一组宏像素,这些宏像素的布局取决于格式。在平面格式中,Y,U和V分量存储为三个单独的平面。
本文介绍的每种YUV格式都有一个分配的FOURCC代码。FOURCC代码是32位无符号整数,是通过串联四个ASCII字符创建的。

4:4:4(32 bpp)
紫外线
4:2:2(16 bpp)
YUY2
尤维
4:2:0(16 bpp)
IMC1
IMC3
4:2:0(12 bpp)
IMC2
IMC4
YV12
NV12
4:4:4格式,每像素32位
紫外线
建议使用4:4:4单一格式,并使用FOURCC代码AYUV。这是打包格式,其中每个像素编码为四个连续字节,按照下图所示的顺序排列。

标记为A的字节包含alpha值。

4:2:2格式,每像素16位
建议使用两种4:2:2格式,并使用以下FOURCC代码:

YUY2
尤维
两者都是打包格式,其中每个宏像素是被编码为四个连续字节的两个像素。这导致色度的水平下采样达到两倍。

YUY2
在YUY2格式中,数据可以视为无符号char值的数组,其中第一个字节包含第一个Y样本,第二个字节包含第一个U(Cb)样本,第三个字节包含第二个Y样本,并且第四字节包含第一个V(Cr)样本,如下图所示。

如果将图像寻址为低字节序WORD值的数组,则第一个WORD在最低有效位(LSB)中包含第一个Y样本,在最高有效位(MSB)中包含第一个U(Cb)样本。第二个WORD在LSB中包含第二个Y样本,在MSB中包含第一个V(Cr)样本。

YUY2是Microsoft DirectX视频加速(DirectX VA)首选的4:2:2像素格式。对于支持4:2:2视频的DirectX VA加速器,这有望成为中期需求。

尤维
此格式与YUY2格式相同,除了字节顺序相反(即色度和亮度字节被翻转)之外(图4)。如果将图像寻址为两个小尾数WORD值的数组,则第一个WORD在LSB中包含U,在MSB中包含Y0,第二个WORD在LSB中包含V,在MSB中包含Y1。

4:2:0格式,每像素16位
建议使用两种4:2:0每像素16位(bpp)格式,并带有以下FOURCC代码:

IMC1
IMC3
这两种YUV格式均为平面格式。在水平和垂直方向上,色度通道均按两倍进行二次采样。

IMC1
所有Y个样本首先作为无符号char值数组出现在内存中。接下来是所有V(Cr)样本,然后是所有U(Cb)样本。V和U平面具有与Y平面相同的跨度,从而导致未使用的内存区域,如图5所示。U和V平面必须从16条线的倍数的内存边界开始。图5显示了352 x 240视频帧的U和V的原点。U和V平面的起始地址计算如下:

句法

复制中
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
其中pY是指向内存阵列起始位置的字节指针,如下图所示。

IMC3
该格式与IMC1相同,除了U和V平面已交换,如下图所示。

4:2:0格式,每像素12位
建议使用4:2:0 12-bpp格式,并带有以下FOURCC代码:

IMC2
IMC4
YV12
NV12
在所有这些格式中,色度通道在水平和垂直方向上均以两倍进行二次采样。

IMC2
此格式与IMC1相同,除了以下区别:V(Cr)和U(Cb)线在半跨边界处交织。换句话说,色度区域中的每条全跨步线均以V采样线开始,然后是从下一个半跨步边界开始的U采样线(图7)。这种布局比IMC1更有效地利用了地址空间。它将色度地址空间减少了一半,因此总地址空间减少了25%。在4:2:0格式中,IMC2是仅次于NV12的第二好的格式。下图说明了此过程。

IMC4
该格式与IMC2相同,除了U(Cb)和V(Cr)线被交换,如下图所示。

YV12
所有Y个样本首先作为无符号char值数组出现在内存中。所有V(Cr)样本紧随其后。V平面的步幅是Y平面的步幅的一半;V平面包含的线条是Y平面的一半。V平面之后紧跟所有U(Cb)样本,其步幅和行数与V平面相同,如下图所示。

NV12
所有Y个样本首先以偶数行的无符号char值数组形式出现在内存中。Y平面后面紧跟一个无符号char值数组,其中包含打包的U(Cb)和V(Cr)样本。当组合的UV数组被寻址为低端WORD值数组时,LSB包含U值,而MSB包含V值。NV12是DirectX VA首选的4:2:0像素格式。对于支持4:2:0视频的DirectX VA加速器,这有望成为中期需求。下图显示了Y平面以及包含打包的U和V样本的数组。

色彩空间和色度采样率转换
本节提供了在YUV和RGB之间进行转换以及在某些不同的YUV格式之间进行转换的准则。在本节中,我们考虑两种RGB编码方案:8位计算机RGB(也称为sRGB或“全尺寸” RGB)和演播室视频RGB或“具有头部和趾部空间的RGB”。这些定义如下:

计算机RGB对红色,绿色和蓝色的每个样本使用8位。黑色由R = G = B = 0表示,白色由R = G = B = 255表示。
Studio视频RGB对红色,绿色和蓝色的每个样本都使用一定数量的N,其中N为8或更大。Studio视频RGB使用与计算机RGB不同的缩放因子,并且具有偏移量。黑色由R = G = B = 16 * 2 ^(N-8)表示,而白色由R = G = B = 235 * 2 ^(N-8)表示。但是,实际值可能会超出此范围。
Studio Video RGB是Windows中视频的首选RGB定义,而计算机RGB是非视频应用程序的首选RGB定义。在RGB的任何一种形式中,色度坐标均如ITU-R BT.709中为RGB颜色基色的定义所指定。R,G和B的(x,y)坐标分别为(0.64,0.33),(0.30,0.60)和(0.15,0.06)。参考白色是D65,坐标为(0.3127,0.3290)。标称伽玛为1 / 0.45(约2.2),精确伽玛在ITU-R BT.709中详细定义。

RGB和4:4:4 YUV之间的转换

我们首先描述RGB和4:4:4 YUV之间的转换。要将4:2:0或4:2:2 YUV转换为RGB,建议将YUV数据转换为4:4:4 YUV,然后从4:4:4 YUV转换为RGB。AYUV格式为4:4:4格式,每个Y,U和V样本都使用8位。在某些应用中,YUV还可以使用每个样本8位以上的位来定义。

已经为数字视频定义了两种主要的RGB YUV转换。两者均基于称为ITU-R BT.709建议书的规范。第一次转换是在BT.709中为50 Hz使用定义的较旧的YUV形式。它与ITU-R BT.601建议书中指定的关系相同,也以旧名称CCIR 601闻名。对于标准清晰度电视分辨率(720 x 576)和较低分辨率,应将其视为首选YUV格式。视频。它的特征在于两个常数Kr和Kb的值:

句法

复制中
Kr = 0.299
Kb = 0.114
第二种转换是在BT.709中为60 Hz使用定义的更新的YUV格式,对于SDTV以上的视频分辨率,应将其视为首选格式。这两个常数的值不同:

句法

复制中
Kr = 0.2126
Kb = 0.0722
从RGB到YUV的转换从以下开始定义:

句法

复制中
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
然后按以下方式获得YUV值:

句法

复制中
Y = floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112
(R-L) / ((1-Kr)*S) + 128) + 0.5))
哪里

M是每个YUV样本的位数(M> = 8)。
Z是黑电平变量。对于计算机RGB,Z等于0。对于演播室视频RGB,Z等于16 * 2 ^(N-8),其中N是每个RGB样本的位数(N> = 8)。
S是缩放变量。对于计算机RGB,S等于255。对于演播室视频RGB,S等于219 * 2 ^(N-8)。
函数floor(x)返回小于或等于x的最大整数。函数clip3(x,y,z)定义如下:

句法

复制中
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
备注

clip3应该作为函数而不是预处理器宏来实现;否则将对参数进行多次求值。

Y样本代表亮度,U和V样本分别代表向蓝色和红色的颜色偏差。Y的标称范围是16 * 2 ^(M-8)至235 * 2 ^(M-8)。黑色表示为16 * 2 ^(M-8),白色表示为235 * 2 ^(M-8)。U和V的标称范围为16 * 2 ^(M-8)至240 * 2 ^(M-8),值128 * 2 ^(M-8)表示中性色度。但是,实际值可能不在这些范围内。

对于演播室视频RGB形式的输入数据,需要进行裁剪操作,以将U和V值保持在0到(2 ^ M)-1的范围内。如果输入是计算机RGB,则不需要剪辑操作,因为转换公式不能产生超出此范围的值。

这些是没有近似值的精确公式。本文档中的所有内容均源自这些公式。本节介绍以下转换:

将RGB888转换为YUV 4:4:4
将8位YUV转换为RGB888
将4:2:0 YUV转换为4:2:2 YUV
将4:2:2 YUV转换为4:4:4 YUV
将4:2:0 YUV转换为4:4:4 YUV
将RGB888转换为YUV 4:4:4
对于计算机RGB输入和8位BT.601 YUV输出,我们相信上一节中给出的公式可以通过以下方式合理地近似:

句法

复制中
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
这些公式使用要求不超过8位(无符号)精度的系数产生8位结果。中间结果将需要高达16位的精度。

将8位YUV转换为RGB888
从原始的RGB到YUV公式,可以得出BT.601的以下关系。

句法

复制中
Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
因此,给出:

句法

复制中
C = Y - 16
D = U - 128
E = V - 128
将YUV转换为RGB的公式可以推导如下:

句法

复制中
R = clip( round( 1.164383 * C + 1.596027 * E ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C + 2.017232 * D ) )
其中clip()表示削波到[0…255]的范围。我们认为这些公式可以通过以下方式合理地近似:

句法

复制中
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
这些公式使用某些系数需要超过8位的精度才能生成每个8位结果,而中间结果将需要超过16位的精度。

要将4:2:0或4:2:2 YUV转换为RGB,建议将YUV数据转换为4:4:4 YUV,然后从4:4:4 YUV转换为RGB。以下各节介绍了一些将4:2:0和4:2:2格式转换为4:4:4的方法。

将4:2:0 YUV转换为4:2:2 YUV
将4:2:0 YUV转换为4:2:2 YUV需要垂直上变频两倍。本节介绍了执行上转换的示例方法。该方法假定视频图像是逐行扫描的。

备注

4:2:0到4:2:2隔行扫描转换过程存在非典型问题,难以实现。本文不解决将隔行扫描从4:2:0转换为4:2:2的问题。

假设输入色度样本的每个垂直线是一个Cin[]范围从0到N-1的数组。输出图像上相应的垂直线将是一个Cout[]范围从0到2N-1 的数组。要转换每个垂直线,请执行以下操作处理:

句法

复制中
Cout[0] = Cin[0];
Cout[1] = clip((9 * (Cin[0] + Cin[1]) - (Cin[0] + Cin[2]) + 8) >> 4);
Cout[2] = Cin[1];
Cout[3] = clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);
Cout[4] = Cin[2]
Cout[5] = clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);

Cout[2i] = Cin[i]
Cout[2
i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);

Cout[2N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);
Cout[2
N-2] = Cin[N-1];
Cout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);
其中clip()表示裁剪到[0…255]的范围。

备注

用于处理边缘的方程式可以在数学上简化。它们以这种形式显示,以说明图片边缘的夹持效果。

实际上,该方法通过对四个相邻像素上的曲线进行插值来计算每个缺失值,并向两个最近像素的值加权(图11)。在本示例中使用的特定插值方法使用称为Catmull-Rom插值(也称为三次卷积插值)的众所周知的方法在半整数位置生成缺失样本。

在信号处理方面,理想情况下,垂直上变频应包括相移补偿,以解决4:2:0采样线位置和输出位置之间的半像素垂直偏移(相对于输出4:2:2采样网格)。每隔4:2:2采样线的位置。但是,引入此偏移量将增加生成样本所需的处理量,并使无法从上采样的4:2:2图像重建原始4:2:0样本。也将不可能直接将视频解码为4:2:2的表面,然后将这些表面用作参考图像以对流中的后续图像进行解码。因此,此处提供的方法未考虑样品的精确垂直对齐。

如果您从使用H.261,H.263或MPEG-1视频中定义的采样网格的4:2:0视频开始,则输出4:2:2色度采样的相位也会偏移一半。像素相对于亮度采样网格上的间隔的水平偏移(相对于4:2:2色度采样网格上的间隔的四分之一像素偏移)。但是,MPEG-2格式的4:2:0视频可能更常在PC上使用,因此不会出现此问题。此外,在相当高的图片分辨率下,这种区分可能不会对视觉造成损害。尝试纠正此问题将产生针对垂直相位偏移讨论的同类问题。

将4:2:2 YUV转换为4:4:4 YUV
将4:2:2 YUV转换为4:4:4 YUV需要水平上变频两倍。先前描述的用于垂直上转换的方法也可以应用于水平上转换。对于MPEG-2和ITU-R BT.601视频,此方法将产生具有正确相位对齐的样本。

将4:2:0 YUV转换为4:4:4 YUV
要将4:2:0 YUV转换为4:4:4 YUV,您可以简单地遵循上述两种方法。将4:2:0图像转换为4:2:2,然后将4:2:2图像转换为4:4:4。您还可以切换两个上转换过程的顺序,因为操作顺序与结果的视觉质量无关紧要。

其他YUV格式
其他一些不太常见的YUV格式包括:

AI44是一种已标准化的YUV格式,每个样本8位。每个样本在4个最高有效位(MSB)中包含一个索引,在4个最低有效位(LSB)中包含一个alpha值。索引引用YUV调色板条目的数组,必须在该格式的媒体类型中定义。此格式主要用于子图片图像。
NV11是4:1:1平面格式,每个像素12位。Y样本首先出现在内存中。在Y平面后面紧跟一个打包的U(Cb)和V(Cr)样本数组。当组合的UV数组被寻址为小尾数WORD值数组时,U样本包含在每个WORD的LSB中,而V样本包含在MSB中。(尽管色度采样不同,但此内存布局与NV12相似。)
Y41P是一种4:1:1压缩格式,其中U和V每四个像素水平采样一次。每个宏像素在三个字节中包含8个像素,并具有以下字节布局:U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
Y41T与Y41P相同,除了每个Y样本的最低有效位指定色度键(0 =透明,1 =不透明)。
Y42T与UYVY相同,除了每个Y样本的最低有效位指定色度键(0 =透明,1 =不透明)。
YVYU等效于YUYV,只是交换了U和V样本。
在Media Foundation中识别YUV格式
本文介绍的每种YUV格式都有一个分配的FOURCC代码。FOURCC代码是32位无符号整数,是通过串联四个ASCII字符创建的。

有各种C / C ++宏,可以更轻松地在源代码中声明FOURCC值。例如,MAKEFOURCC宏在Mmsystem.h中声明,而FCC宏在Aviriff.h中声明。如下使用它们:

句法

复制中
DWORD fccYUY2 = MAKEFOURCC(‘Y’,‘U’,‘Y’,‘2’);
DWORD fccYUY2 = FCC(‘YUY2’);
您还可以简单地通过反转字符顺序将FOURCC代码直接声明为字符串文字。例如:

句法

复制中
DWORD fccYUY2 = ‘2YUY’; // Declares the FOURCC ‘YUY2’
必须反转顺序,因为Windows操作系统使用Little-endian体系结构。‘Y’= 0x59,‘U’= 0x55,‘2’= 0x32,因此’2YUY’为0x32595559。

在Media Foundation中,格式由主要类型GUID和子类型GUID标识。计算机视频格式的主要类型始终是MFMediaType_Video。可以通过将FOURCC代码映射到GUID来构造子类型,如下所示:

句法

复制中
XXXXXXXX-0000-0010-8000-00AA00389B71
XXXXXXXXFOURCC代码在哪里。因此,YUY2的子类型GUID为:

句法

复制中
32595559-0000-0010-8000-00AA00389B71
最常见的YUV格式GUID的常量在头文件mfapi.h中定义。有关这些常量的列表,请参见Video Subtype GUIDs。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值