使用 Direct3D 呈现器目标

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

定义了 Direct3D 呈现目标的多个媒体子类型,以便与 VMR-7 和 VMR-9 一起使用。 当上游筛选器建议与这些子类型之一的连接时,它会向 VMR 指示将在 Direct3D 呈现目标上执行呈现。 对于 VMR-7,这是 DirectX 7 Direct3D 呈现目标,对于 VMR-9,这是 DirectX 9 Direct3D 呈现目标。 如果 VMR 处于混合模式,该表面也将是 Direct3D 纹理图面。 如果 VMR 未处于混合模式,则图面将是常规 Direct3D 图面。 仅当 VMR 处于混合模式时,才支持 ARGB 像素格式。 呈现器目标子类型为:

VMR-7 VMR-9
MEDIASUBTYPE_RGB32_D3D_DX7_RT MEDIASUBTYPE_RGB32_D3D_DX9_RT
MEDIASUBTYPE_RGB16_D3D_DX7_RT MEDIASUBTYPE_RGB16_D3D_DX9_RT
MEDIASUBTYPE_ARGB32_D3D_DX7_RT MEDIASUBTYPE_ARGB32_D3D_DX9_RT
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT MEDIASUBTYPE_ARGB4444_D3D_DX9_RT
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT MEDIASUBTYPE_ARGB1555_D3D_DX9_RT

 

这些类型在头文件 uuids.h 中定义。 MEDIASUBTYPE_RGB32媒体类型为 RGBx888 格式,MEDIASUBTYPE_RGB16媒体类型为 RGB565 格式。 有关这些像素格式的详细信息,请参阅 DirectX 图形文档。

请求未锁定的 Surface

锁定和解锁 DirectDraw 图面是计算成本高昂的操作。 使用 Direct3D 呈现目标媒体子类型时,上游筛选器需要解锁图面,以便它可以使用图形硬件在它们上运行。 为了避免不必要的锁定解锁操作,VMR 支持 IMemAllocator::GetBuffer 方法上的新标志,AM_GBF_NODDSURFACELOCK,该标志指示 VMR 在将示例传递到上游筛选器之前不要锁定 DirectDraw 图面。 使用此标志时,对 IMediaSample::GetPointer 的调用将失败,因为没有锁定的指针。 若要获取对 DirectDraw 图面的访问权限,筛选器必须在返回的 IMediaSample 对象上调用 QueryInterface 并请求 IVMRSurface 接口。 显然,上游筛选器必须确保在将示例释放回可用列表时不会锁定表面。