我正在尝试遵循this,以便使用IMFSourceReader加速视频解码。
当我不使用它时,一切都很好。当我使用它时,它不起作用。步骤如下:
创建DirectX 11设备
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;
}
然后,创建源阅读器:
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;
}
此后,源阅读器不起作用。当我尝试调整样本大小时,IMFTransform调整程序在SetInput()上崩溃。当我尝试将样本传递给接收器写入器时,它随机失败,有时返回DXGI_ERROR_DRIVER_INTERNAL_ERROR / GRAPHICS DEVICE REMOED(原因0X887A0020)。
我在做什么错?
非常感谢。
首先,您有兴趣创建带有D3D11_CREATE_DEVICE_DEBUG
标志的D3D设备,以便可以在调试输出中看到与失败有关的提示。
第二,我猜想这个特定问题的根本原因是您没有使用D3D11_CREATE_DEVICE_DEBUG
接口启用多线程保护,例如,请参见ID3D11Multithread
。
ID3D11Multithread
这是强制性的,因为Media Foundation本身具有多种性质,并且不受保护地运行,因此您很快就会腐败。