视频交错

本主题介绍媒体源和解码器应如何处理交错视频内容。

若要正确解码和呈现交错视频,需要以下信息:

  • 渐进式或交错式。 视频流可以包含渐进式帧、交错帧或两者混合。

  • 字段控制。 字段占位描述哪个字段首先出现,上字段或下字段。

  • 重复第一个字段。 当帧是渐进式但流交错时,此标志在 3:2 下拉中使用。 在此上下文中,第一个字段可以是上下字段。

  • 交错字段或单个字段。 示例可以包含单个字段或两个交错字段。 如果样本包含单个字段,则样本高度为帧高度的一半,因为样本只包含帧扫描线的一半。 除非源内容的特征另有规定,否则建议使用交错字段。

这些特征中的任何一个都可以从一个样本更改为下一个样本。 但是,视频组件需要在流式处理开始之前了解整体内容。 例如,如果视频是隔行扫描的,则增强的视频呈现器 (EVR) 需要保留视频内存以用于取消隔行扫描。 另一方面,如果视频完全是渐进式帧,则 EVR 可以优化呈现管道。 向管道添加去交错步骤会增加呈现延迟。

有关交错的信息存储在两个位置:

  • 有关流中交错的常规信息放置在媒体类型中。 有关媒体类型的详细信息,请参阅 媒体类型

  • 可以随每个样本更改的信息作为属性放置在样本上。 有关示例的详细信息,请参阅 媒体示例

媒体类型中的交错信息

媒体类型上的 MF_MT_INTERLACE_MODE 属性描述如何将流作为一个整体进行交错。 此属性的值是 MFVideoInterlaceMode 枚举的成员。 视频媒体类型应始终具有此属性。

  • 如果流仅包含没有交错帧的渐进式帧,请使用 MFVideoInterlace_Progressive。
  • 如果流仅包含交错帧,并且每个样本包含两个交错字段,请使用MFVideoInterlace_FieldInterleavedUpperFirst或MFVideoInterlace_FieldInterleavedLowerFirst。
  • 如果流仅包含交错帧,并且每个样本包含单个字段,请使用MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower。 如果字段在上限和下限之间交替,则使用这两个值中的哪一个并不重要。 如果格式仅包含上部字段或低位字段,则设置与内容对应的值。
  • 如果流包含交错帧和渐进帧的混合,或者如果场控制切换,请将媒体类型设置为MFVideoInterlace_MixedInterlaceOrProgressive。 使用示例属性来描述每个帧。

下表汇总了此属性。

MF_MT_INTERLACE_MODE 交错? 示例 第一个“值” 字段
MFVideoInterlace_Progressive 渐进式帧 不适用
MFVideoInterlace_FieldInterleavedUpperFirst 交错字段 上部第一
MFVideoInterlace_FieldInterleavedLowerFirst 交错字段 下部第一
MFVideoInterlace_FieldSingleUpper 单个字段 上部第一
MFVideoInterlace_FieldSingleLower 单个字段 下部第一
MFVideoInterlace_MixedInterlaceOrProgressive 可能有所不同 交错字段或渐进式帧 可能有所不同

 

交错字段和单个字段不能混合。 从一个切换到另一个需要更改媒体类型。

示例上的交错标志

可以使用示例属性指示可从一个示例更改为下一个示例的信息。 使用 IMFSample 接口获取或设置这些属性。

本节中列出的所有交错属性都具有布尔值。 实际上,每个属性都可以有三个值: TRUEFALSE 或未设置。 如果未设置属性,则该值取自媒体类型。 如果设置了属性,该值将替代媒体类型。 标志和媒体类型的某些组合无效。

Attribute 说明
MFSampleExtension_Interlaced 如果 为 TRUE,则帧交错。 如果 为 FALSE,则帧为渐进式。
如果媒体类型为MFVideoInterlace_MixedInterlaceOrProgressive,请对每个样本设置此属性。
MFSampleExtension_BottomFieldFirst 此标志的含义取决于示例是包含交错字段还是单个字段。
  • 交错字段:如果 为 TRUE,则第一个为下部字段。 如果 为 FALSE,则上部字段为第一个。
  • 单个字段:如果 为 TRUE,则示例包含较低的字段。 如果 为 FALSE,则示例包含一个上部字段。
如果媒体类型为MFVideoInterlace_FieldSingleUpper、MFVideoInterlace_FieldSingleLower或MFVideoInterlace_MixedInterlaceOrProgressive,请在每个隔行扫描样本上设置此属性。
MFSampleExtension_RepeatFirstField 如果 为 TRUE,则重复第一个字段。 如果 设置为 FALSE 或未设置,则不重复第一个字段。
MFSampleExtension_SingleField 如果 为 TRUE,则示例包含单个字段。 如果 为 FALSE,则示例包含交错字段。

 

下表根据媒体类型显示了哪些标志是必需的、可选或禁止的。

介质类型 交错标志 BottomFieldFirst 标志 RepeatFirstField 标志 SingleField 标志
渐进式 选;如果已设置,则必须为 FALSE 不设置。 不设置。 不设置。
交错字段 选;如果已设置,则必须为 TRUE 选;如果已设置,则必须与媒体类型匹配。 不设置。 选;如果已设置,则必须为 FALSE
单个字段 选;如果已设置,则必须为 TRUE 必需。 不设置。 设置为 TRUE
Mixed 必需。 必需。 必需。 选;如果已设置,则必须为 FALSE

 

在 属性为可选的情况下,媒体类型已定义信息。 设置属性以匹配是有效的,但不是必需的。

例如,如果媒体类型为MFVideoInterlace_Progressive,则表示流中的所有帧都是渐进式的。 因此,可以将 MFSampleExtension_Interlaced 属性设置为 FALSE,或将属性保留为未设置。

建议

本部分包含针对各种类型的内容的建议。

  1. 视频都是渐进式帧。
  • 将媒体类型设置为MFVideoInterlace_Progressive。

  • 不要设置 MFSampleExtension_Interlaced 属性,或在每个帧上将其设置为 FALSE

  • 请勿设置 MFSampleExtension_BottomFieldFirstMFSampleExtension_RepeatFirstFieldMFSampleExtension_SingleField 属性。

  1. 视频是具有相同字段优势的所有交错字段。 示例包含交错字段。
  • 将媒体类型设置为MFVideoInterlace_FieldInterleavedUpperFirst或MFVideoInterlace_FieldInterleavedLowerFirst。

  • 不要设置 MFSampleExtension_Interlaced 属性,或在每个帧上将其设置为 TRUE

  • 不要设置 MFSampleExtension_BottomFieldFirst 属性,也不设置每个帧的值以匹配媒体类型。

  • 不要设置 MFSampleExtension_RepeatFirstField 属性,或在每个帧上将其设置为 FALSE

  • 不要设置 MFSampleExtension_SingleField 属性,或在每个帧上将其设置为 FALSE

  1. 视频包含交错帧和渐进帧的混合,具有重复字段和不同的场控制 (例如 DVD 视频) 。
  • 将媒体类型设置为MFVideoInterlace_MixedInterlaceOrProgressive。

  • 在每个帧上,设置 MFSampleExtension_InterlacedMFSampleExtension_BottomFieldFirstMFSampleExtension_RepeatFirstField 属性。

  • 不要设置 MFSampleExtension_SingleField 属性,或在每个帧上将其设置为 FALSE

  1. 视频是交错的,样本包含单个字段。
  • 将媒体类型设置为MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower。

  • 在每个帧上,设置 MFSampleExtension_BottomFieldFirst 属性。

  • 不要设置 MFSampleExtension_Interlaced 属性,或在每个帧上将其设置为 TRUE

  • 不要设置 MFSampleExtension_RepeatFirstField 属性,或在每个帧上将其设置为 FALSE

  • 不要设置 MFSampleExtension_SingleField 属性,或在每个帧上将其设置为 TRUE

大多数视频内容属于以下类别之一。

MPEG-2 映射

对于 MPEG-2 内容,请使用以下映射将 MPEG-2 标志转换为媒体基础示例属性。

picture_structure

示例属性
框架 MFSampleExtension_SingleField =
top_field MFSampleExtension_SingleField =
MFSampleExtension_BottomFieldFirst =
bottom_field MFSampleExtension_SingleField =
MFSampleExtension_BottomFieldFirst =

 

progressive_frame

示例属性
0 MFSampleExtension_Interlaced =
1 MFSampleExtension_Interlaced =

 

top_field_first

示例属性
0 MFSampleExtension_BottomFieldFirst =
1 MFSampleExtension_BottomFieldFirst =

 

repeat_first_field

示例属性
0 = MFSampleExtension_RepeatFirstField
1 = MFSampleExtension_RepeatFirstField

 

Single-Field示例

如果媒体类型为MFVideoInterlace_FieldSingleUpper或MFVideoInterlace_FieldSingleLower,则表示每个样本包含单个字段。 但是,媒体类型描述整个帧。 因此,每个缓冲区只包含媒体类型中给定的字段行数的一半。 例如,如果媒体类型将视频描述为 720 × 480,则每个字段包含 240 个扫描行,因此每个缓冲区仅包含 240 行像素。 如果编写接受具有单字段样本的媒体类型的组件,则必须在访问缓冲区中的数据时考虑这一事实。

同一规则适用于几何光圈 (MF_MT_GEOMETRIC_APERTURE 属性) 和最小显示孔径 (MF_MT_MINIMUM_DISPLAY_APERTURE 属性) 。 这些区域是按整个帧而不是单个字段指定的。

DirectShow 映射

在 DirectShow 中,每个样本的交错信息包含在 AM_SAMPLE2_PROPERTIES 结构的 dwTypeSpecificFlags 成员中。 下表显示了媒体基础的等效属性。

DirectShow 示例标志 媒体基础示例属性
AM_VIDEO_FLAG_INTERLEAVED_FRAME MFSampleExtension_SingleField = FALSE
AM_VIDEO_FLAG_FIELD1 MFSampleExtension_Interlaced = TRUE
MFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = FALSE
AM_VIDEO_FLAG_FIELD2 MFSampleExtension_Interlaced = TRUE
MFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = TRUE
AM_VIDEO_FLAG_WEAVE MFSampleExtension_Interlaced = FALSE。 (此标志指示驱动程序不应将两个字段取消交错。)
AM_VIDEO_FLAG_FIELD1FIRST MFSampleExtension_BottomFieldFirst = FALSE。 如果内容交错且AM_VIDEO_FLAG_FIELD1FIRST标志不存在,请将此属性设置为 TRUE
AM_VIDEO_FLAG_REPEAT_FIELD = MFSampleExtension_RepeatFirstFieldTRUE。 如果AM_VIDEO_FLAG_REPEAT_FIELD标志不存在,请将此属性设置为 FALSE

 

如果 DirectShow 示例不包含示例标志,请使用 VIDEOINFOHEADER2 结构中的 dwInterlaceFlags 值:

DirectShow 交错标志 媒体基础示例属性
AMINTERLACE_IsInterlaced MFSampleExtension_Interlaced = TRUE
AMINTERLACE_1FieldPerSample MFSampleExtension_SingleField = TRUE
AMINTERLACE_Field1First MFSampleExtension_BottomFieldFirst = FALSE

 

视频媒体类型

媒体类型