DirectX Surface Buffer

DirectX 图面缓冲区对象是管理 Direct3D 图面的媒体缓冲区。 若要创建此对象的实例,请调用 MFCreateDXSurfaceBuffer 并传入指向 DirectX 图面的指针。 DirectX 图面缓冲区公开以下接口:

可通过多种方式从缓冲区对象访问图面内存:

如果基础图面不可锁定,LockLock2D 可能会失败。 DirectX 图面缓冲区主要实现这两种方法,这些方法主要用于不用于 Direct3D 图面的组件。

增强的视频呈现器(EVR)在未为 DirectX 视频加速(DXVA)配置解码器时创建 DirectX 表面缓冲区。 有关详细信息,请参阅 IMFVideoSampleAllocator

获取 Direct3D Surface

若要从视频示例获取 Direct3D 图面,请执行以下作:

  1. 调用 IMFSample::GetBufferByIndex 索引值为零。
  2. 调用 MFGetService 并指定 MR_BUFFER_SERVICE 服务标识符。

以下代码显示了以下步骤:

HRESULT GetD3DSurfaceFromSample(IMFSample *pSample, IDirect3DSurface9 **ppSurface)
{
    *ppSurface = NULL;

    IMFMediaBuffer *pBuffer = NULL;

    HRESULT hr = pSample->GetBufferByIndex(0, &pBuffer);
    if (SUCCEEDED(hr))
    {
        hr = MFGetService(pBuffer, MR_BUFFER_SERVICE, IID_PPV_ARGS(ppSurface));
        pBuffer->Release();
    }

    return hr;
}

媒体缓冲区

视频示例