视频交错
本主题介绍媒体源和解码器应如何处理交错视频内容。
若要正确解码和呈现交错视频,需要以下信息:
渐进式或交错式。 视频流可以包含渐进式帧、交错帧或两者混合。
字段控制。 字段占位描述哪个字段首先出现,上字段或下字段。
重复第一个字段。 当帧是渐进式但流交错时,此标志在 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 接口获取或设置这些属性。
本节中列出的所有交错属性都具有布尔值。 实际上,每个属性都可以有三个值: TRUE、 FALSE 或未设置。 如果未设置属性,则该值取自媒体类型。 如果设置了属性,该值将替代媒体类型。 标志和媒体类型的某些组合无效。
Attribute | 说明 |
---|---|
MFSampleExtension_Interlaced | 如果 为 TRUE,则帧交错。 如果 为 FALSE,则帧为渐进式。 如果媒体类型为MFVideoInterlace_MixedInterlaceOrProgressive,请对每个样本设置此属性。 |
MFSampleExtension_BottomFieldFirst | 此标志的含义取决于示例是包含交错字段还是单个字段。
|
MFSampleExtension_RepeatFirstField | 如果 为 TRUE,则重复第一个字段。 如果 设置为 FALSE 或未设置,则不重复第一个字段。 |
MFSampleExtension_SingleField | 如果 为 TRUE,则示例包含单个字段。 如果 为 FALSE,则示例包含交错字段。 |
下表根据媒体类型显示了哪些标志是必需的、可选或禁止的。
介质类型 | 交错标志 | BottomFieldFirst 标志 | RepeatFirstField 标志 | SingleField 标志 |
---|---|---|---|---|
渐进式 | 选;如果已设置,则必须为 FALSE。 | 不设置。 | 不设置。 | 不设置。 |
交错字段 | 选;如果已设置,则必须为 TRUE。 | 选;如果已设置,则必须与媒体类型匹配。 | 不设置。 | 选;如果已设置,则必须为 FALSE。 |
单个字段 | 选;如果已设置,则必须为 TRUE。 | 必需。 | 不设置。 | 设置为 TRUE。 |
Mixed | 必需。 | 必需。 | 必需。 | 选;如果已设置,则必须为 FALSE。 |
在 属性为可选的情况下,媒体类型已定义信息。 设置属性以匹配是有效的,但不是必需的。
例如,如果媒体类型为MFVideoInterlace_Progressive,则表示流中的所有帧都是渐进式的。 因此,可以将 MFSampleExtension_Interlaced 属性设置为 FALSE,或将属性保留为未设置。
建议
本部分包含针对各种类型的内容的建议。
- 视频都是渐进式帧。
将媒体类型设置为MFVideoInterlace_Progressive。
不要设置 MFSampleExtension_Interlaced 属性,或在每个帧上将其设置为 FALSE 。
请勿设置 MFSampleExtension_BottomFieldFirst、 MFSampleExtension_RepeatFirstField或 MFSampleExtension_SingleField 属性。
- 视频是具有相同字段优势的所有交错字段。 示例包含交错字段。
将媒体类型设置为MFVideoInterlace_FieldInterleavedUpperFirst或MFVideoInterlace_FieldInterleavedLowerFirst。
不要设置 MFSampleExtension_Interlaced 属性,或在每个帧上将其设置为 TRUE 。
不要设置 MFSampleExtension_BottomFieldFirst 属性,也不设置每个帧的值以匹配媒体类型。
不要设置 MFSampleExtension_RepeatFirstField 属性,或在每个帧上将其设置为 FALSE 。
不要设置 MFSampleExtension_SingleField 属性,或在每个帧上将其设置为 FALSE 。
- 视频包含交错帧和渐进帧的混合,具有重复字段和不同的场控制 (例如 DVD 视频) 。
将媒体类型设置为MFVideoInterlace_MixedInterlaceOrProgressive。
在每个帧上,设置 MFSampleExtension_Interlaced、 MFSampleExtension_BottomFieldFirst和 MFSampleExtension_RepeatFirstField 属性。
不要设置 MFSampleExtension_SingleField 属性,或在每个帧上将其设置为 FALSE 。
- 视频是交错的,样本包含单个字段。
将媒体类型设置为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。 |
相关主题