我正在按照以下链接中提供的详细信息创建DirectX 11设备并将其用于渲染:
https://msdn.microsoft.com/en-us/library/windows/desktop/dn643747(v=vs.85).aspx
此示例演示视频窗口中的渲染立方体 但我想使用此示例渲染视频缓冲区。
我有IMFMediaBuffer
从文件中读取视频帧
我想解码此缓冲区,然后使用DirectX 11 API显示它
我可以使用解码器解码此缓冲区,但不知道如何渲染它。
答案 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);
}