如何解决IMFMediaBuffer 上的 QueryInterface 到 IMFDXGIBuffer 返回 E_NOINTERFACE
我有一个函数,它接受一个 IMFSample
指针作为参数。我能够成功将其转换为 IMFMediaBuffer
对象。但是,当我为 QueryInterface
对象上的 IMFdxgiBuffer
调用 IMFMediaBuffer
时,返回的 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)
我所见过的所有与从 IMFdxgiBuffer
获取 IMFMediaBuffer
相关的资源都说要使用 QueryInterface
方法。媒体基金会是否有可能更新了有关此程序的要求(我们必须采用的新方法)?或者我应该告诉媒体基金会什么,以便在提供这些样本后,IMFdxgiBuffer
可用?
解决方法
您看到的是设计行为。
一些缓冲区由系统内存支持,其他缓冲区由 D3D11 2D 纹理支持。您假设输入是一个纹理,而实际上它是一个普通的内存缓冲区。
您需要一个单独的代码路径来处理这种情况(或者您可能有一个额外的转换,包括可能的第三方转换,将数据上传到视频内存并确保样本由纹理支持)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。