微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IMFMediaBuffer 上的 QueryInterface 到 IMFDXGIBuffer 返回 E_NOINTERFACE

如何解决IMFMediaBuffer 上的 QueryInterface 到 IMFDXGIBuffer 返回 E_NOINTERFACE

我有一个函数,它接受一个 IMFSample 指针作为参数。我能够成功将其转换为 IMFMediaBuffer 对象。但是,当我为 QueryInterface 对象上的 IMFdxgiBuffer 调用 IMFMediaBuffer 时,返回的 HRESULTE_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 举报,一经查实,本站将立刻删除。