在 AVStream 编解码器中处理数据类型协商

初始化设备时,系统提供的设备代理 (Devproxy) 模块将分析驱动程序提供的筛选器描述符。 此外,Devproxy 在相应 MFT 的输入和输出引脚上公开驱动程序支持的数据范围, (媒体基础转换) 。

流式处理开始时,MF 管道和用户模式应用程序使用这些范围与驱动程序执行数据类型协商。

在数据类型协商期间发生以下交互:

  1. Devproxy 检索由微型驱动程序在硬件编解码器筛选器的每个引脚描述符中提供的数据范围。

  2. Devproxy 向驱动程序发出数据交集请求。

  3. Devproxy 向 MF 公开完全形成的类型。

  4. MF 拓扑生成器 (DirectShow 图形生成器的 MF 等效项,) 构造流式处理拓扑。

  5. 在 MF 拓扑生成器确定 Devproxy 输入/输出引脚的数据类型后,它会通过调用微型驱动程序的 AVStrMiniPinSetDataFormat 回调函数来设置引脚上的数据类型。 如果 KS 引脚不存在,Devproxy 将调用 KsCreatePin

若要成功启用数据类型协商,微型驱动程序必须执行以下步骤:

  1. KSPIN_DESCRIPTORDataRanges 成员中为硬件编解码器筛选器中包含的每个公开引脚提供受支持的数据范围列表。 例如:

    const PKSDATARANGE VideoDecoderInputPinDataRanges[8] = {
        (PKSDATARANGE)&H264DataFormat,
        (PKSDATARANGE)&VC_1DataFormat,
        (PKSDATARANGE)&VC_1DataFormatVIH2,
        (PKSDATARANGE)&WMV9DataFormat,
        (PKSDATARANGE)&WMV9DataFormatVIH2,
        (PKSDATARANGE)&DX50DataFormat,
        (PKSDATARANGE)&DX50DataFormatVIH2,
        (PKSDATARANGE)&MPEG2DataFormat
    };
    

    在本例中,指定的区域为包装器类型,例如 KS_DATARANGE_MPEG2_VIDEOKS_DATARANGE_VIDEOKS_DATARANGE_VIDEO2。 在前面列出的代码示例中,每个范围都是类型转换到 KSDATARANGE

    包装器结构的最后一个成员称为格式块结构,例如,KS_DATARANGE_MPEG2_VIDEO。VideoInfoHeader

    支持连续数据范围的驱动程序应在格式块结构中指定最大值。 支持离散数据范围的驱动程序应指定一个数组,该数组包含格式块结构中的离散值。

    如果声称支持给定格式的驱动程序稍后未能通过对该格式的设置格式请求,性能可能会降低。 仅列出你保证支持的格式。

  2. 驱动程序应允许在 KSSTATE_STOP/KSSTATE_RUN 中在引脚上设置媒体类型。 此处无需执行其他操作,只需确保驱动程序不禁止此操作。

  3. 驱动程序应在 KSPIN_DESCRIPTOR_EX 中提供相交处理程序。每个引脚的 IntersectHandler

  4. 微型驱动程序应为 KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT 属性提供处理程序。

  5. 如果设置了输出媒体类型,编码器应根据指定的输出媒体类型使用引脚描述符) 报告可能的输入类型 (。 如果未设置输出媒体类型,编码器不应报告任何输入媒体类型。

  6. 如果设置了输入媒体类型,解码器应根据指定的输入媒体类型报告可能的输出类型。

  7. 如果设置了输入媒体类型,则视频处理器应根据指定的输入媒体类型报告其输出类型。

  8. 驱动程序应支持 ICodecAPI 接口。 然后,用户模式组件可以使用此用户模式接口获取编解码器配置信息。

  9. 在设置编码器期间,首先设置 ICodecAPI 属性,然后设置输出媒体类型。 在此之后,编码器应仅提供它可以在当前配置中支持的输入类型。

  10. ICodecAPI 属性和编解码器 API 媒体类型属性在某些方面重叠,例如配置文件和级别。 在这些情况下,与媒体类型相关的编解码器 API 属性将替代 ICodecAPI 属性。 设置媒体类型后,微型驱动程序不应允许修改这些重叠属性。

  11. 在设置解码器期间,首先设置输入类型。 在此之后,解码器应仅提供其当前输入类型可以支持的输出类型。

  12. 编码器的预期输入应为 4:2:0,至少 NV12 隔行扫描/渐进。 预期的输出是格式为 MPEG2 PS/TS 或 H.264 附件 B 的压缩基本流。

  13. 解码器的预期输入是基本流。 预期的输出是源流的未缩放版本,作为未压缩的 NV12。

  14. AVStream 驱动程序上的引脚应具有彼此独立的状态。 这意味着,当输出引脚保持KSSTATE_STOP状态时,输入引脚可以从KSSTATE_STOP转换到KSSTATE_RUN

  15. 当微型驱动程序收到具有可变数据缓冲区大小的属性 GET 请求时,微型驱动程序应将 NULL 缓冲区解释为所需缓冲区大小的查询。 在这种情况下,驱动程序应在 Irp-IoStatus.Information> 字段中指定所需的长度,并返回STATUS_BUFFER_OVERFLOW。 此外,微型驱动程序应将返回代码设置为警告而不是错误。 例如,使用数据交集处理程序遵循本指南。