视频交错

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

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

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

  • 字段控制。 字段控制性描述哪些字段首先显示、上部字段或下部字段。

  • 重复第一个字段。 此标志在 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或未设置。 如果未设置属性,则该值取自媒体类型。 如果设置了属性,该值将替代媒体类型。 标志和媒体类型的某些组合无效。

属性 描述
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
混合 必填。 必填。 必填。 自选;如果已设置,则必须 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 标志转换为 Media Foundation 示例属性。

picture_structure

价值 示例属性
框架 MFSampleExtension_SingleField = FALSE
top_field MFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = FALSE
bottom_field MFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = TRUE

 

progressive_frame

价值 示例属性
0 MFSampleExtension_Interlaced = TRUE
1 MFSampleExtension_Interlaced = FALSE

 

top_field_first

价值 示例属性
0 MFSampleExtension_BottomFieldFirst = TRUE
1 MFSampleExtension_BottomFieldFirst = FALSE

 

repeat_first_field

价值 示例属性
0 MFSampleExtension_RepeatFirstField = FALSE
1 MFSampleExtension_RepeatFirstField = TRUE

 

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 示例标志 Media Foundation 示例属性
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_RepeatFirstField = TRUE。 如果AM_VIDEO_FLAG_REPEAT_FIELD标志不存在,请将此属性设置为 FALSE

 

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

DirectShow 交错标志 Media Foundation 示例属性
AMINTERLACE_IsInterlaced MFSampleExtension_Interlaced = TRUE
AMINTERLACE_1FieldPerSample MFSampleExtension_SingleField = TRUE
AMINTERLACE_Field1First MFSampleExtension_BottomFieldFirst = FALSE

 

视频媒体类型

媒体类型