Microsoft Media Foundation官方文档翻译(13)《Video Interlacing》

官方英文文档链接:https://docs.microsoft.com/en-us/windows/desktop/medfound/video-interlacing

基于05/31/2018

 

In this article

  1. Interlace Information in the Media Type
  2. Interlace Flags on Samples
  3. Recommendations
  4. MPEG-2 Mappings
  5. Single-Field Samples
  6. DirectShow Mappings
  7. Related topics

 

本文介绍 media source 以及 解码器(decoder)如何处理隔行扫描的视频内容。

要正确解码和渲染隔行扫描视频,需要以下信息:

  • 逐行扫描还是隔行扫描。一个视频流里可以包含逐行扫描帧或隔行扫描帧,或者两者都有。

  • 场序。先显示顶场还是先显示底场。

  • 重复第一场。当流是隔行扫描但当前帧是逐行扫描时使用此标志(3:2 pulldown 不懂)。这种情况下,当前场既可以是顶场又可以是底场。

  • 交错或单个场。一个 sample 可以包含单个场也可以包含两个场。如果只包含了单个场,那么 sample 的高就是一帧画面的高的一半,因为一个 sample 只包含了一幅画面一半的行。除非源内容规定,否则建议使用交错。

这些特征都有可能在 sample 之间发生改变。所以视频处理组件需要在正式开始流传输之前了解总体情况。例如如果视频是隔行扫描,增强视频渲染器(EVR)就需要为 去隔行扫描(转化为隔行扫描) 预留内存,如果是逐行扫描则可以进行优化。在处理流程中 去隔行扫描 的步骤会增加处理时间。

关于扫描类型的信息存储在两个地方:

  • 关于流的隔行扫描信息一般存储在 media type 中。

  • 可能随 sample 而变化的信息作为 attribute 存储在了每个 sample 中。

Media Type 中的隔行扫描信息

Media Type 中的 MF_MT_INTERLACE_MODE attribute 描述了一个流从整体来看是什么扫描类型。值是一个 MFVideoInterlaceMode 枚举类型。一个视频的 media type 应该始终包含这个 attribute。

  • 如果一个流中只包含逐行扫描的帧,使用 MFVideoInterlace_Progressive。
  • 如果一个流只包含隔行扫描的帧,而且每个 sample 包含两个交错的场,使用 MFVideoInterlace_FieldInterleavedUpperFirst 或者 MFVideoInterlace_FieldInterleavedLowerFirst。
  • 如果一个流只包含隔行扫描的帧,而且每个 sample 只包含一个场,使用 MFVideoInterlace_FieldSingleUpper 或者 MFVideoInterlace_FieldSingleLower。如果场是在顶场和底场之间来回交错,则使用哪个并不重要。如果格式只包含顶场或者底场,则应设置对应的值。
  • 如果流既包含逐行扫描又包含隔行扫描,或者场也不固定(?),使用 MFVideoInterlace_MixedInterlaceOrProgressive。然后检查每个 sample 的 attribute。

下表总结了这个 attribute.

MF_MT_INTERLACE_MODEInterlaced?SamplesFirst field
MFVideoInterlace_ProgressiveNoProgressive frameNot applicable
MFVideoInterlace_FieldInterleavedUpperFirstYesInterleaved fieldsUpper first
MFVideoInterlace_FieldInterleavedLowerFirstYesInterleaved fieldsLower first
MFVideoInterlace_FieldSingleUpperYesSingle fieldUpper first
MFVideoInterlace_FieldSingleLowerYesSingle fieldLower first
MFVideoInterlace_MixedInterlaceOrProgressiveCan varyInterleaved fields or progressive framesCan vary

 

交错场和单个场不可以混合。要切换的话需要修改 media type。

Interlace Flags on Samples

使用 IMFSample 接口来获取这些信息。

此部分列出的所有的关于隔行扫描的 attribute 都是 bool 类型。事实上这些 attribute 都可以有三种值: TRUE, FALSE, 或者 未设置。如果是 未设置,则会从 media type 中去获取。只要设置了,就会忽略 media type 中的值。有一些标志位的组合和 media type 是无效的。

AttributeDescription
MFSampleExtension_Interlaced如果是 TRUE,此帧是隔行扫描。FALSE 则为逐行扫描。
如果 media type 中是 MFVideoInterlace_MixedInterlaceOrProgressive,则要对每个 sample 设置这个 attribute。
MFSampleExtension_BottomFieldFirst含义取决于这个 samples 包含交错场还是单个场
  • 交错场:TRUE,底场先。FALSE,顶场先。
  • 单个场:TRUE,这个 sample 包含一个底场。FALSE,这个 sample 包含一个顶场。
当 media type 是 MFVideoInterlace_FieldSingleUpper, MFVideoInterlace_FieldSingleLower, 或 MFVideoInterlace_MixedInterlaceOrProgressive 时,在每个隔行扫描的 sample 上设置这个 attribute。
MFSampleExtension_RepeatFirstFieldTRUE,重复第一场。FALSE,不重复第一场。
MFSampleExtension_SingleFieldTRUE,sample 只包含单个场。FALSE,sample 包含交错的两个场。

 

下表显示了根据 media type,哪些标志位是必需的,可选的或者禁止的。

Media TypeInterlaced FlagBottomFieldFirst FlagRepeatFirstField FlagSingleField Flag
Progressive可选。如果设置,必须是 FALSE不要设置不要设置不要设置
Interleaved fields可选。如果设置,必须是 TRUE可选。如果设置,要和 media type 一致。不要设置可选。如果设置,必须是 FALSE
Single fields可选。如果设置,必须是 TRUE必需不要设置设置为 TRUE.
Mixed必需必需必需可选。如果设置,必须是 FALSE

 

在这里那些可选信息是 media type 已经存在的信息。

例如 media type 是 MFVideoInterlace_Progressive,意味着流中的所有帧都是逐行扫描的。所以你可以将 MFSampleExtension_Interlaced attribute 设为 FALSE,或者不设置。

建议

T此部分包含了对各种类型的一些建议

  1. 所有视频帧都是逐行扫描时
  • 将 media type 设为 MFVideoInterlace_Progressive。

  • 不要设置 MFSampleExtension_Interlaced attribute,或者给每一帧设置为 FALSE

  • 不要设置 MFSampleExtension_BottomFieldFirst, MFSampleExtension_RepeatFirstField, or MFSampleExtension_SingleField attributes。

  1. 全部帧为隔行扫描,优先场相同。Samples 包含交错的两场。
  • Set the media type to MFVideoInterlace_FieldInterleavedUpperFirst or MFVideoInterlace_FieldInterleavedLowerFirst.

  • 不要设置 MFSampleExtension_Interlaced,或者为每一帧设置为 TRUE

  • 不要设置 MFSampleExtension_BottomFieldFirst attribute,或者每一帧都和 media type 设置一样。

  • 不要设置 MFSampleExtension_RepeatFirstField attribute, 或者为每一帧设置为 FALSE

  • Do not set the MFSampleExtension_SingleField attribute,或者为每一帧设置为 FALSE

  1. 视频既包含隔行扫描又包含逐行扫描,with repeated fields a和变化的优先场(例如 DVD 视频)。
  • media type 设为 MFVideoInterlace_MixedInterlaceOrProgressive。

  • 每一帧都要设置 MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirst, 和 MFSampleExtension_RepeatFirstField attributes。

  • 不要设置 MFSampleExtension_SingleField attribute,或者为每一帧设置 FALSE

  1. 视频是隔行扫描,samples 包含单个场。
  • media type 设置为 MFVideoInterlace_FieldSingleUpper 或者 MFVideoInterlace_FieldSingleLower。

  • 为每一帧设置 MFSampleExtension_BottomFieldFirst attribute。

  • 不要设置 MFSampleExtension_Interlaced attribute,或者为每一帧设置, or set it to TRUE

  • 不要设置 MFSampleExtension_RepeatFirstField attribute,或者为每一帧设置 FALSE

  • 不要设置 MFSampleExtension_SingleField attribute,或者为每一帧设置 TRUE

大多数视频都是这些情况之一。

MPEG-2 Mappings

对于 MPEG-2 内容,查看下表来将 MPEG-2 flags 转换为 Media Foundation sample attributes。

picture_structure

ValueSample Attribute
frameMFSampleExtension_SingleField = FALSE
top_fieldMFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = FALSE
bottom_fieldMFSampleExtension_SingleField = TRUE
MFSampleExtension_BottomFieldFirst = TRUE

 

progressive_frame

ValueSample Attribute
0MFSampleExtension_Interlaced = TRUE
1MFSampleExtension_Interlaced = FALSE

 

top_field_first

ValueSample Attribute
0MFSampleExtension_BottomFieldFirst = TRUE
1MFSampleExtension_BottomFieldFirst = FALSE

 

repeat_first_field

ValueSample Attribute
0MFSampleExtension_RepeatFirstField = FALSE
1MFSampleExtension_RepeatFirstField = TRUE

 

Single-Field Samples

如果 media type 是 MFVideoInterlace_FieldSingleUpper 或者 MFVideoInterlace_FieldSingleLower,表示每个 sample 包含单个场。然而 media type 描述的是完整的一帧。那就是说,每个 buffer 只包含了 media type 中行数的一半。例如,如果 media type 中描述视频分辨率是 720 × 480,每场包含 240 行,那就是每个 buffer 只包含 240 行像素。如果要写一个组件接受含有单个场的 sample,则在访问 buffer 的时候需要注意一下。

同样的规则也适用于几何光圈(?geometric aperture) (MF_MT_GEOMETRIC_APERTURE attribute) 和最小显示光圈(?minimum display aperture) (MF_MT_MINIMUM_DISPLAY_APERTURE attribute)。这些区域是对整个帧来说的,而不是单个场。

DirectShow Mappings

在 DirectShow 中,每个 sample 的隔行扫描信息包含在 AM_SAMPLE2_PROPERTIES 结构的 dwTypeSpecificFlags 成员变量里。下表展示了与 mediafoundation 的对应关系。

DirectShow sample flagMedia Foundation sample attribute
AM_VIDEO_FLAG_INTERLEAVED_FRAMEMFSampleExtension_SingleField = FALSE.
AM_VIDEO_FLAG_FIELD1MFSampleExtension_Interlaced = TRUE.
MFSampleExtension_SingleField = TRUE.
MFSampleExtension_BottomFieldFirst = FALSE.
AM_VIDEO_FLAG_FIELD2MFSampleExtension_Interlaced = TRUE.
MFSampleExtension_SingleField = TRUE.
MFSampleExtension_BottomFieldFirst = TRUE.
AM_VIDEO_FLAG_WEAVEMFSampleExtension_Interlaced = FALSE. (此标志指示驱动程序不应 去隔行扫描)
AM_VIDEO_FLAG_FIELD1FIRSTMFSampleExtension_BottomFieldFirst = FALSE. If the content is interlaced and the AM_VIDEO_FLAG_FIELD1FIRST flag is not present, set this attribute to TRUE.
AM_VIDEO_FLAG_REPEAT_FIELDMFSampleExtension_RepeatFirstField = TRUE. If the AM_VIDEO_FLAG_REPEAT_FIELD flag is not present, set this attribute to FALSE.

 

If the DirectShow sample does not contain sample flags, use the value of dwInterlaceFlags from the VIDEOINFOHEADER2 structure:

DirectShow interlace flagMedia Foundation sample attribute
AMINTERLACE_IsInterlacedMFSampleExtension_Interlaced = TRUE.
AMINTERLACE_1FieldPerSampleMFSampleExtension_SingleField = TRUE.
AMINTERLACE_Field1FirstMFSampleExtension_BottomFieldFirst = FALSE.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值