使用DirectX 11 API渲染“IMFMediaBuffer”

时间:2017-04-17 08:43:29

标签: directx-11 ms-media-foundation

我正在按照以下链接中提供的详细信息创建DirectX 11设备并将其用于渲染:
https://msdn.microsoft.com/en-us/library/windows/desktop/dn643747(v=vs.85).aspx

此示例演示视频窗口中的渲染立方体 但我想使用此示例渲染视频缓冲区。

我有IMFMediaBuffer从文件中读取视频帧 我想解码此缓冲区,然后使用DirectX 11 API显示它 我可以使用解码器解码此缓冲区,但不知道如何渲染它。

1 个答案:

答案 0 :(得分:1)

通过QueryInterface从您的IMFMediaBuffer获取IMFDXGIBuffer接口:https://msdn.microsoft.com/en-us/library/windows/desktop/hh447901(v=vs.85).aspx。使用GetResource访问由此媒体缓冲区包装的ID3D11Texture2D。使用GetSubresourceIndex存储子资源索引。使用ID3D11DeviceContext :: CopySubresourceRegion(https://msdn.microsoft.com/en-us/library/windows/desktop/ff476394(v=vs.85).aspx),通过将存储的子资源索引指定为SrcSubresource参数,将获得的ID3D11Texture2D作为pSrcResource参数复制到设备的交换链(在pDstResource中设置)。拨打交换链的当前(1)。

CopySubresourceRegion(pSwapChain, 0, 0, 0, 0, pTexture2D, index, NULL);

注意:您应该通过IMFDXGIDeviceManager将相同的D3D11设备设置到解码器,以便工作。

更多详情:

ComPtr<IMFMediaBuffer> buffer;
CHK(sample->GetBufferByIndex(0, &buffer));

// Get the MF DXGI buffer
ComPtr<IMFDXGIBuffer> dxgiBuffer;
if (FAILED(buffer.As(&dxgiBuffer)))
{
    ComPtr<ID3D11Texture2D> texture;
    unsigned int subresource;
    CHK(dxgiBuffer->GetResource(IID_PPV_ARGS(&texture)));
    CHK(dxgiBuffer->GetSubresourceIndex(&subresource));

    ComPtr<ID3D11Device> device;
    ComPtr<ID3D11DeviceContext> context;
    texture->GetDevice(&device);
    device->GetImmediateContext(&context);

    context->CopySubresourceRegion(m_pSwapChain, 0, 0, 0, 0, texture.Get(), subresource, nullptr);
}