实现编解码器 MFT

本主题提供有关将解码器或编码器实现为媒体基础转换 (MFT) 的一些准则。

编码器

编码器格式协商

以下过程用于初始化编码器:

  1. 查询 MFT 以获取 ICodecAPI 接口。
  2. 调用 ICodecAPI::SetValue 以设置编码属性。
  3. 调用 IMFTransform::SetOutputType 以设置编码格式。
  4. 调用 IMFTransform::GetInputAvailableType 以获取兼容输入类型的列表。 (可能会跳过此步骤。)
  5. 调用 IMFTransform::SetInputType 以设置未压缩的输入格式。

在步骤 3 中设置输出类型后, GetInputAvailableType 方法必须返回与当前输出类型兼容的输入类型列表。 换句话说, 此时由 GetInputAvailableType 返回的任何类型都必须对 SetInputType 有效。

对于解码器,类型设置的顺序将相反:首先设置输入类型,然后设置输出类型。 设置输入类型后, IMFTransform::GetOutputAvailableType 方法必须返回可传递给 IMFTransform::SetOutputType 方法的类型列表。

编码器和解码器应支持 NV12 作为常见的未压缩格式。 这可确保管道组件可以通过最少的颜色空间转换进行互操作。 当然,也可以支持其他格式。

解码器

Transcode-Only解码器

某些解码器针对转码 (解码进行了优化,然后重新编码流) ,不适合在播放期间使用。

如果解码器 MFT 仅用于转码,请在注册 MFT 时设置 MFT_ENUM_FLAG_TRANSCODE_ONLY 标志。 (请参阅 MFTRegister.)

默认情况下, MFTEnumEx 函数不返回转码解码器。 若要枚举转码解码器,请调用 MFTEnumEx 并在 Flags 参数中设置 MFT_ENUM_FLAG_TRANSCODE_ONLY 标志。 在 MFTEnumEx 函数中使用时,此标志同时枚举转码解码器和其他解码器。

MFTRegister MFT_ENUM_FLAG_TRANSCODE_ONLY MFTEnumEx MFT_ENUM_FLAG_TRANSCODE_ONLY MFT 是否枚举?
1 1
1 0
0 1
0 0

 

Telecine 属性

媒体源可能会将以下电视电影属性附加到它提供的媒体样本。

属性 说明
MFSampleExtension_RepeatFirstField 等效于 RFF) 标志 (“重复第一个字段”。
MFSampleExtension_BottomFieldFirst TFF) 标志 (“top field first”的反面。

 

这些标志为增强的视频呈现器 (EVR) 执行去隔行处理时提供提示。 解码器应将这些标志复制到输出样本,使其到达 EVR,从而将这些标志传播到下游。

编写自定义 MFT