• 简体中文
  • 繁体中文
  • English
  • 关于锐目企业资讯产品中心解决方案案例展示技术支持BBS讨论区
       
       
     
  • 电话:020-85652419
  • 传真:020-85652419
  • 地址:广州市天河区棠德南路
    103~117号
  • 使用 8 位 YUV 格式的视频呈现

    时间:2008-07-16 编辑:Gary Sullivan 和 Stephen Estrop

     

    发布日期: 12/9/2004 | 更新日期: 12/9/2004

    Gary Sullivan Stephen Estrop

    Microsoft Digital Media Division

    适用于:

    Microsoft® Windows®, Microsoft DirectShow®

     

    摘要:本文讲述了在 Microsoft Windows 操作系统中呈现视频时推荐使用的 8 YUV 格式。本文讲述了可用于在 YUV 格式和 RGB 格式之间进行转换的技术,还提供了用于对 YUV 格式进行上采样的技术。本文适用于在 Windows 中使用 YUV 视频解码或呈现的所有人员。

     

    简介

     

    在整个视频行业中,定义了很多 YUV 格式。本文讲述的是在 Microsoft® Windows® 操作系统中呈现视频时推荐使用的 8 YUV 格式。鼓励解码器供应商和显示供应商支持本文所讲述的格式。本文不对 YUV 颜色的其他用途(如静止摄影)进行描述。

     

    本文讲述的格式全部使用每个像素位置 8 位的方式来编码 Y 频道(也称为灯光频道),并使用每样例 8 位的方式来编码每个 U V 色度样例。但是,大多数 YUV 格式平均使用的每像素位数都少于 24 位,这是因为它们包含的 U V 样例比 Y 样例要少。本文不讲述带有 10 位和 12 Y 频道的 YUV 格式。

     

    在本文中,U 一词相当于 CbV 一词相当于 Cr

     

    本文包括以下主题:

     

    DirectShow 中标识 YUV 格式讲述了如何描述 Microsoft DirectShow® YUV 格式类型。

    YUV 采样讲述了一些最常用的 YUV 采样技术。

    表面定义讲述了推荐的 YUV 格式。

    颜色空间和色度采样率转换提供了一些在 YUV RGB 格式之间进行转换的指南,以及在不同 YUV 格式之间进行转换的指南。

    其他信息提供了其他信息。

     

     

    DirectShow 中标识 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

     

    DirectShow 中,格式是由一个主类型全局唯一标识符 (GUID) 和一个子类型 GUID 标识的。计算机视频格式的主类型总是 MEDIATYPE_Video。子类型则可以通过将 FOURCC 码与 GUID 进行映射的方式来构造,如下所示:

    XXXXXXXX-0000-0010-8000-00AA00389B71

     

    其中 XXXXXXXX FOURCC 码。因此,YUY2 的子类型 GUID 为:

    32595559-0000-0010-8000-00AA00389B71

     

    很多这样的 GUID 都已经在头文件 Uuids.h 中进行了定义。例如,YUY2 子类型被定义为 MEDIASUBTYPE_YUY2DirectShow 基类库还提供了一个帮助器类 FOURCCMap,该类可用于将 FOURCC 码转换为 GUID 值。FOURCCMap 构造函数采用 FOURCC 码作为输入参数。然后,您可以将 FOURCCMap 对象强制转换为相应的 GUID

    FOURCCMap fccMap(FCC('YUY2'));

    GUID g1 = (GUID)fccMap;

     

    // Equivalent:

    GUID g2 = (GUID)FOURCCMap(FCC('YUY2'));

     

     

    YUV 采样

     

    YUV 的优点之一是,色度频道的采样率可比 Y 频道低,同时不会明显降低视觉质量。有一种表示法可用来描述 U V Y 的采样频率比例,这个表示法称为 A:B:C 表示法:

     

    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 采样不太常用,本文不对其进行详细讨论。

     

    1 显示了 4:4:4 图片中使用的采样网格。灯光样例用叉来表示,色度样例则用圈表示。

     



    1. YUV 4:4:4 样例位置

     

     

    4:2:2 采样的这种主要形式在 ITU-R Recommendation BT.601 中进行了定义。图 2 显示了此标准定义的采样网格。

     



    2. YUV 4:2:2 样例位置

     

     

    4:2:0 采样有两种常见的变化形式。其中一种形式用于 MPEG-2 视频,另一种形式用于 MPEG-1 以及 ITU-T recommendations H.261 H.263。图 3 显示了 MPEG-1 方案中使用的采样网格,图 4 显示了 MPEG-2 方案中使用的采样网格。

     



    3. YUV 4:2:0 样例位置(MPEG-1 方案)

     

     



    4. YUV 4:2:0 样例位置(MPEG-2 方案)

     

     

    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 格式可以分为打包 格式和平面 格式。在打包格式中,YU V 组件存储在一个数组中。像素被组织到了一些巨像素组中,巨像素组的布局取决于格式。在平面格式中,YU V 组件作为三个单独的平面进行存储。

     

    4:4:4 格式,每像素 32

     

    推荐一个 4:4:4 格式,FOURCC 码为 AYUV。这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示。

     



    5. AYUV 内存布局

     

     

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

     

    4:2:2 格式,每像素 16

     

    支持两个 4:2:2 格式,FOURCC 码如下:

     

    YUY2

    UYVY

     

    两个都是打包格式,其中每个巨像素都是编码为四个连续字节的两个像素。这样会使得色度水平下采样乘以系数 2

     

    YUY2

     

    YUY2 格式中,数据可被视为一个不带正负号的 char 值组成的数组,其中第一个字节包含第一个 Y 样例,第二个字节包含第一个 U (Cb) 样例,第三个字节包含第二个 Y 样例,第四个字节包含第一个 V (Cr) 样例,如图 6 所示。

     



    6. YUY2 内存布局

     

     

    如果该图像被看作由两个 little-endian WORD 值组成的数组,则第一个 WORD 在最低有效位 (LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U。第二个 WORD LSB 中包含 Y1,在 MSB 中包含 V

     

    YUY2 是用于 Microsoft DirectX® Video Acceleration (DirectX VA) 的首选 4:2:2 像素格式。预期它会成为支持 4:2:2 视频的 DirectX VA 加速器的中期要求。

     

    UYVY

     

    此格式与 YUY2 相同,只是字节顺序是与之相反的就是说,色度字节和灯光字节是翻转的(图 7)。如果该图像被看作由两个 little-endian WORD 值组成的数组,则第一个 WORD LSB 中包含 U,在 MSB 中包含 Y0,第二个 WORD LSB 中包含 V,在 MSB 中包含 Y1

     



    7. UYVY 内存布局

     

     

    4:2:0 格式,每像素 16

     

    推荐两个 4:2:0 每像素 16 位格式,FOURCC 码如下:

     

    IMC1

    IMC3

     

    两个 FOURCC 码都是平面格式。色度频道在水平方向和垂直方向上都要以系数 2 来进行再次采样。

     

    IMC1

     

    所有 Y 样例都会作为不带正负号的 char 值组成的数组首先显示在内存中。后面跟着所有 V (Cr) 样例,然后是所有 U (Cb) 样例。V U 平面与 Y 平面具有相同的跨距,从而生成如图 8 所示的内存的未使用区域。

     



    8. IMC1 内存布局

     

     

    IMC3

     

    此格式与 IMC1 相同,只是 U V 平面进行了交换:

     



    9. IMC3 内存布局

     

     

    4:2:0 格式,每像素 12

     

    推荐四个 4:2:0 每像素 12 位格式,FOURCC 码如下:

     

    IMC2

    IMC4

    YV12

    NV12

     

    在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数 2 来进行再次采样。

     

    IMC2

     
    
     
    网站首页 | 企业资讯 | 产品中心 | 解决方案 | 案例展示 | 技术支持 | 联系我们 | BBS论坛

    广州锐目数码科技有限公司 版权所有 @ 2006~2008
    粤ICP备08021405号,