【发布时间】:2021-08-22 23:02:06
【问题描述】:
我有一个函数将IMFSample 指针作为参数。我能够成功地将其转换为 IMFMediaBuffer 对象。但是,当我为 IMFMediaBuffer 对象上的 IMFDXGIBuffer 调用 QueryInterface 时,返回的 HRESULT 是 E_NOINTERFACE。
这是发生这种情况的方法的一个非常基本的版本(作为参考,真正的功能基于 Microsoft 的 DX11VideoRenderer 项目中的 CPresenter::ProcessFrame 方法)。
HRESULT TPresenter::ProcessFrame(IMFMediaType* pCurrentType, IMFSample* pSample, UINT32* punInterlaceMode, BOOL* pbDeviceChanged, IMFSample** ppOutputSample)
{
TObject::ThreadLock();
// Code to Check Shutdown and pointers
*pbDeviceChanged = FALSE;
DWORD cBuffers = 0;
HRESULT res = pSample->GetBufferCount(&cBuffers);
if (FAILED(res))
{
TObject::ThreadRelease();
return res;
}
IMFMediaBuffer* pBuffer = nullptr;
IMFMediaBuffer* pEVBuffer = nullptr;
if (1 == cBuffers)
{
res = pSample->GetBufferByIndex(0, &pBuffer);
}
else
res = pSample->ConvertToContiguousBuffer(&pBuffer);
// Code to Check Interlace mode
// Code to get the Device and Device Context for Direct3D
IMFDXGIBuffer* mfdxgiBuff = nullptr;
ID3D11Texture2D* d3dText = nullptr;
UINT resourceIndex = 0;
res = pBuffer.QueryInterface<IMFDXGIBuffer>(&mfdxgiBuff); // Currently returns E_NOINTERFACE
if (SUCCEEDED(res))
res = mfdxgiBuff->QueryInterface<ID3D11Texture2D>(&d3dText);
if (SUCCEEDED(res))
res = mfdxgiBuff->GetSubresourceIndex(&resourceIndex);
if (FAILED(res))
{
ThreadRelease();
return res;
}
// Continues on
}
操作系统:Windows 10 家庭版(20H2 版)
VS:社区 2019(版本 16.10.0)
我所看到的与从IMFMediaBuffer 获取IMFDXGIBuffer 相关的每个资源都在说要使用QueryInterface 方法。媒体基金会是否有可能更新了有关此程序的要求(我们必须这样做的新方法)?或者有什么我应该告诉媒体基金会的,这样当提供这些样本时,IMFDXGIBuffer 是可用的?
【问题讨论】:
标签: c++ visual-c++ com ms-media-foundation direct3d11