USB 视频类扩展单元的设备要求

本部分介绍在设备中实现扩展单元的一些特定要求。 如果不满足这些要求,USB 视频类驱动程序可能无法在扩展单元中正常工作。

描述符

扩展单元描述符必须包含有效的唯一 GUID。 Usbvideo.sys使用此 GUID 公开在相应扩展节点上设置的属性。 应使用Microsoft Windows SDK随附的名为 Guidgen.exe 的工具为扩展单元创建唯一 GUID。

扩展单元属性集 (KSPROPERTY_EXTENSION_UNIT) 的属性标识符对应于 USB 视频类固件公开的类似编号的扩展单元控制 ID。 可以通过 IKsControl 接口使用标准 KSPROPERTY 请求访问扩展单元控件。

扩展单元上的控件(称为扩展单元控件 ID)必须连续从 1 编号到某个最大值 n。 如果有间隙,USB 视频类驱动程序不会公开超出间隙的控件。 USB 视频类驱动程序的当前实现将扩展单元上的控件数限制为 31 个。

使用 Property ID=0 (KSPROPERTY_EXTENSION_UNIT_INFO) 获取扩展单元描述符的一部分,该扩展单元描述符的语法由视频设备规范的通用串行总线设备类定义定义。 此规范可在 USB 实施者论坛 网站上获取。

使用 Property ID=1 和更高属性将请求发送到相应的扩展单元控件。

请注意,KSPROPERTY_EXTENSION_UNIT_CONTROL (属性 ID=1) 不是实际属性。 相反,它表示标识符 1 和更高表示实际的扩展单元控制 ID。

KSPROPERTY_EXTENSION_UNIT_PASS_THROUGH (属性 ID=0xffff) 未实现。

下面的代码示例取自示例扩展单元插件 DLL 中显示的完整示例,演示如何发出KSPROPERTY_EXTENSION_UNIT_INFO请求:

ExtensionProp.Property.Set = PROPSETID_VIDCAP_EXTENSION_UNIT;
    ExtensionProp.Property.Id = KSPROPERTY_EXTENSION_UNIT_INFO;
    ExtensionProp.Property.Flags = KSPROPERTY_TYPE_GET |
                                   KSPROPERTY_TYPE_TOPOLOGY;
    ExtensionProp.NodeId = m_dwNodeId;

    hr = m_pKsControl->KsProperty(
        (PKSPROPERTY) &ExtensionProp,
                  sizeof(ExtensionProp),
        (PVOID) pInfo,
        ulSize,
        &ulBytesReturned);

        return hr;
}

控制请求

根据 USB 视频类规范,设备必须支持针对所有扩展单元控件的GET_CUR、GET_INFO、GET_LEN、GET_MIN、GET_MAX、GET_DEF和GET_RES请求。 如果设备未实现这些功能,则不会向用户模式公开相应的属性。

在设备初始化期间,驱动程序向设备发出以下控制请求:GET_INFO、GET_LEN、GET_MIN和GET_MAX。 如果这些初始请求中的任何一个失败,Usbvideo.sys将禁用特定控件。

GET_INFO返回的值告知驱动程序哪些 GET 和 SET 请求对给定控件有效。 此外,GET_INFO告知驱动程序控件是否为异步控件。 状态中断终结点支持异步请求。