DX11VideoRenderer线程安全吗?

时间:2018-05-10 01:04:25

标签: directx directx-11 ms-media-foundation hardware-acceleration dxva

我正在使用Microsoft示例 DX11VideoRenderer 在Windows 10中呈现实时视频。当我只运行一个流时,视频看起来很棒。但是,当我运行超过4或5个流时,其各自窗口中的某些视频会间歇性地消隐。效果可以仅在每个视频窗口的一部分或全部上。

此外,我在日志文件中从此函数调用中得到一些间歇性错误:

hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );

返回的错误是: E_INVALIDARG一个或多个参数无效0x80070057

我只在我的代码中使用 DX11VideoRenderer Presenter.cpp display.cpp 模块。来源位于: DirectX video rendering sample

我在这个阶段最初的怀疑是DXVideoRenderer可能不是线程安全的。我发现了有关多线程的信息:Introduction to Multithreading in Direct3D 11表明:

  

虽然使用设备上下文(ID3D11DeviceContext)不是线程安全的,但使用Direct3D 11设备(ID3D11Device)是线程安全的。

但似乎因为我为每个窗口使用了 CPresenter 类的单独实例,所以 ID3D11DeviceContext 不应该是线程安全的问题,因为每个window应该有自己的 ID3D11DeviceContext 实例。

有没有人对此DX11VideoRenderer软件示例有任何经验或想法,以及可能导致此问题的原因?

谢谢!

-UPDATE -

我只能通过一个窗口复制问题,因此它不再是一个线程问题。如果我多次手动调整窗口大小,我有时可以让窗口中的视频闪烁。发生这种情况时,我在日志中看到,对VideoProcessorBlt()的同一函数调用失败并返回相同的返回码 E_INVALIDARG

1 个答案:

答案 0 :(得分:1)

如果我多次手动调整窗口大小,有时可以使窗口中的视频闪烁。发生这种情况时,我在日志中看到对VideoProcessorBlt()的相同函数调用因相同的返回码E_INVALIDARG而失败。

Microsoft未记录此行为。

问题与DirectX9相同,但在VideoProcessBltHD之后,IDirect3DDevice9 :: Present会发生错误。 HRESULT代码为0x88760872,而未记录0x88760872。

因此,调整窗口大小时,可能会发生错误。

请参见H264Dxva2Decoder

在Dxva2Renderer.cpp中,检查是否有HANDLE_DIRECTX_ERROR_UNDOCUMENTED。

我选择的策略是在播放时暂停视频(请参阅WindowsFormProc和WM_ENTERSIZEMOVE / WM_SYSCOMMAND), 而且,这可以避免闪烁。

这样做,错误消失了。

PS:通常可以安全地忽略此错误。

我认为这个错误只是在告诉您,调整窗口大小时,底层API难以将DirectX演示文稿与您的HWND同步,而HWND会迅速改变大小。