首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DX11VideoRenderer线程安全吗?

DX11VideoRenderer线程安全吗?
EN

Stack Overflow用户
提问于 2018-05-10 01:04:24
回答 1查看 600关注 0票数 0

我使用微软的示例DX11VideoRenderer在Windows 10中渲染实时视频。当我只运行一个流时,视频看起来很棒。然而,当我运行超过4或5个流时,它们各自窗口中的一些视频开始断断续续地消失。这种效果可以只覆盖每个视频窗口的一部分或全部。

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

代码语言:javascript
复制
hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );

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

在我的代码中,我只使用DX11VideoRendererPresenter.cppdisplay.cpp模块。源位于:DirectX视频渲染示例

在这个阶段,我最初的怀疑是DXVideoRenderer可能不是线程安全的。我发现了有关多线程的信息:Direct3D 11多线程介绍,它声明:

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

但是,由于我对每个窗口使用了单独的CPresenter类实例,因此不应该存在线程安全问题,因为每个窗口都应该有自己的ID3D11DeviceContext.实例

有没有人对这个DX11VideoRenderer软件示例有任何经验或想法,以及是什么导致了这个问题?

谢谢!

-更新-

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-27 19:41:57

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

Microsoft没有记录这种行为。

DirectX9的问题也是一样的,但是错误发生在IDirect3DDevice9:Present中,就在VideoProcessBltHD之后。HRESULT代码为0x88760872,未记录0x88760872。

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

请参见H264Dxva2Decoder

在Dxva2Renderer.cpp中,检查HANDLE_DIRECTX_ERROR_UNDOCUMENTED。

我选择的策略是暂停播放视频(参见WindowsFormProc和WM_ENTERSIZEMOVE/WM_SYSCOMMAND),这也避免了闪烁。

这样做,错误就消失了。

PS:通常,这个错误可以被安全地忽略。

我认为这个错误只是告诉您,当窗口调整大小时,底层API很难将DirectX表示与您的HWND同步,而HWND的大小变化很快。

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

https://stackoverflow.com/questions/50264068

复制
相关文章

相似问题

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