首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IMFSourceReader硬件加速

IMFSourceReader硬件加速
EN

Stack Overflow用户
提问于 2020-01-16 04:14:00
回答 1查看 177关注 0票数 1

我正在尝试跟随this,以便用IMFSourceReader加速视频解码。

当我不使用它的时候,一切都是正常的。当我使用它的时候,它不工作。以下是步骤:

创建DirectX 11设备

代码语言:javascript
运行
复制
HRESULT CreateDirectXDevice(IDXGIAdapter1* g, ID3D11Device** device, ID3D11DeviceContext** context)
{
HRESULT hr = S_OK;

// Driver types supported
D3D_DRIVER_TYPE DriverTypes[] =
{
    D3D_DRIVER_TYPE_HARDWARE,
    D3D_DRIVER_TYPE_WARP,
    D3D_DRIVER_TYPE_REFERENCE,
};
UINT NumDriverTypes = ARRAYSIZE(DriverTypes);

// Feature levels supported
D3D_FEATURE_LEVEL FeatureLevels[] =
{
    D3D_FEATURE_LEVEL_11_0,
    D3D_FEATURE_LEVEL_10_1,
    D3D_FEATURE_LEVEL_10_0,
    D3D_FEATURE_LEVEL_9_3,
    D3D_FEATURE_LEVEL_9_2,
    D3D_FEATURE_LEVEL_9_1
};
UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels);

D3D_FEATURE_LEVEL FeatureLevel;

// Create device
for (UINT DriverTypeIndex = 0; DriverTypeIndex < NumDriverTypes; ++DriverTypeIndex)
{
    hr = D3D11CreateDevice(g, DriverTypes[DriverTypeIndex], nullptr, D3D11_CREATE_DEVICE_VIDEO_SUPPORT, FeatureLevels, NumFeatureLevels,
        D3D11_SDK_VERSION, device, &FeatureLevel, context);
    if (SUCCEEDED(hr))
    {
        // Device creation success, no need to loop anymore
        break;
    }
}
return hr;
}

然后,创建源阅读器:

代码语言:javascript
运行
复制
HRESULT CreateSourceReader(const wchar_t* file, IMFSourceReader** r,bool Hw,bool D11)
{
    CComPtr<IMFAttributes> attrs;
    MFCreateAttributes(&attrs, 0);
    if (Hw)
        attrs->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, true);
    if (D11)
    {
            CComPtr<IMFDXGIDeviceManager > rr = 0;
            MFCreateDXGIDeviceManager(&dm9rt, &rr);
            rr->ResetDevice(GenericDirect3DDevice,dm9rt);
            attrs->SetUnknown(MF_SOURCE_READER_D3D_MANAGER,rr);
    }
    auto hr = MFCreateSourceReaderFromURL(f, attrs, r);
    return hr;
}

在那之后,源代码阅读器就不能工作了。当我尝试调整样本的大小时,SetInput()上的IMFTransform resizer崩溃了。当我尝试将样本传递到接收器写入器时,它随机失败,有时返回DXGI_ERROR_DRIVER_INTERNAL_ERROR/图形设备已删除(原因0X887A0020)。

我做错了什么?

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2020-01-16 05:50:43

首先,您对创建带有D3D11_CREATE_DEVICE_DEBUG标志的D3D设备感兴趣,这样您就可以在调试输出中看到与失败相关的提示。

其次,我猜测这个问题的根本原因是您没有使用ID3D11Multithread接口启用多线程保护,例如this

D3DDevMT->SetMultithreadProtected(TRUE);

这是强制性的,因为Media Foundation是重量级的,其性质是多线程的,并且在没有保护的情况下运行,你很快就会遇到腐败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59758927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档