Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-138414

FFmpeg Plugin: Improve usability on different RHI backend configurations

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 6.10.0 Beta1
    • Multimedia
    • None
    • Windows

    Description

      Qt Multimedia now provides the impressive FFmpeg plugin, but after some tests with the QML multimedia components, I found that not all the RHI backend configurations can work  properly.

      QSG_RHI_BACKEND QSG_RHI_PREFER_SOFTWARE_RENDERER FFMpeg Plugin Windows Plugin
      d3d11 0
      d3d12 0
      opengl 0 Crash
      vulkan 0 Crash
      d3d11 1 Dead Lock
      d3d12 1
      opengl 1 Crash
      vulkan 1 Crash

       

      OpenGL HW/SW Backend

      0xC0000005: Access violation reading location 0x00007DF533280000.

      >   Qt6Gui.dll!QOpenGLContext::qt_metacast(const char * _clname) Line 154   C++
          [Inline Frame] ffmpegmediaplugin.dll!Microsoft::WRL::ComPtr<ID3D11Device>::InternalAddRef() Line 223    C++
          [Inline Frame] ffmpegmediaplugin.dll!Microsoft::WRL::ComPtr<ID3D11Device>::{ctor}(ID3D11Device * other) Line 254    C++
          [Inline Frame] ffmpegmediaplugin.dll!?A0x99d1b059::GetD3DDevice(QRhi *) Line 36 C++
          [Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::D3D11TextureConverter::{ctor}(QRhi * rhi) Line 275    C++
          [Inline Frame] ffmpegmediaplugin.dll!std::_Construct_in_place(QFFmpeg::D3D11TextureConverter &) Line 265    C++
          [Inline Frame] ffmpegmediaplugin.dll!std::_Ref_count_obj2<QFFmpeg::D3D11TextureConverter>::{ctor}(QRhi * &&) Line 2092  C++
          ffmpegmediaplugin.dll!std::make_shared<QFFmpeg::D3D11TextureConverter,QRhi *>(QRhi * && <_Args_0>) Line 2765    C++
          [Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::updateBackend::__l2::<lambda_1>::operator()(q20::type_identity<QFFmpeg::D3D11TextureConverter>) Line 110    C++
          [Inline Frame] ffmpegmediaplugin.dll!?A0xa51a8272::applyConverterTypeByPixelFormat(AVPixelFormat) Line 54   C++
          ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::updateBackend(AVPixelFormat fmt) Line 108  C++
          [Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::init(AVFrame &) Line 79 C++
          ffmpegmediaplugin.dll!QFFmpegVideoBuffer::createTexturesFromHwFrame(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 227   C++
          ffmpegmediaplugin.dll!QFFmpegVideoBuffer::mapTextures(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 204 C++
          Qt6Multimedia.dll!QVideoTextureHelper::createTextures(const QVideoFrame & frame, QRhi & rhi, QRhiResourceUpdateBatch & rub, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> oldTextures) Line 872 C++
          Qt6Multimedia.dll!QVideoFrameTexturePool::updateTextures(QRhi & rhi, QRhiResourceUpdateBatch & rub) Line 22 C++
          [Inline Frame] Qt6MultimediaQuick.dll!QSGVideoMaterial::updateTextures(QRhi *) Line 130 C++
          Qt6MultimediaQuick.dll!QSGVideoMaterialRhiShader::updateUniformData(QSGMaterialShader::RenderState & state, QSGMaterial * newMaterial, QSGMaterial * oldMaterial) Line 157  C++
          Qt6Quick.dll!QSGBatchRenderer::Renderer::updateMaterialDynamicData(QSGBatchRenderer::ShaderManagerShader * sms, QSGMaterialShader::RenderState & renderState, QSGMaterial * material, const QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Element * e, int ubufOffset, int ubufRegionSize, char * directUpdatePtr) Line 2953   C++
          Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderMergedBatch(QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Renderer::PreparedRenderBatch * renderBatch) Line 3269 C++
          Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderPass(QSGBatchRenderer::Renderer::RenderPassContext * ctx) Line 3870   C++
          Qt6Quick.dll!QSGBatchRenderer::Renderer::render() Line 3661 C++
          Qt6Quick.dll!QSGRenderer::renderScene() Line 146    C++
          Qt6Quick.dll!QQuickWindowPrivate::renderSceneGraph() Line 692   C++
          Qt6Quick.dll!QSGRenderThread::syncAndRender() Line 781  C++
          Qt6Quick.dll!QSGRenderThread::run() Line 996    C++
          Qt6Core.dll!QThreadPrivate::start(void * arg) Line 189  C++
          kernel32.dll!BaseThreadInitThunk()  Unknown
          ntdll.dll!RtlUserThreadStart()	Unknown
      

      Vulkan HW/SW Backend

       0xC0000005: Access violation reading location 0x00007DF553AA0000.

       	ntdll.dll!LdrpDispatchUserCallTarget()	Unknown
      >	[Inline Frame] ffmpegmediaplugin.dll!Microsoft::WRL::ComPtr<ID3D11Device>::InternalAddRef() Line 223	C++
       	[Inline Frame] ffmpegmediaplugin.dll!Microsoft::WRL::ComPtr<ID3D11Device>::{ctor}(ID3D11Device * other) Line 254	C++
       	[Inline Frame] ffmpegmediaplugin.dll!?A0x99d1b059::GetD3DDevice(QRhi *) Line 36	C++
       	[Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::D3D11TextureConverter::{ctor}(QRhi * rhi) Line 275	C++
       	[Inline Frame] ffmpegmediaplugin.dll!std::_Construct_in_place(QFFmpeg::D3D11TextureConverter &) Line 265	C++
       	[Inline Frame] ffmpegmediaplugin.dll!std::_Ref_count_obj2<QFFmpeg::D3D11TextureConverter>::{ctor}(QRhi * &&) Line 2092	C++
       	ffmpegmediaplugin.dll!std::make_shared<QFFmpeg::D3D11TextureConverter,QRhi *>(QRhi * && <_Args_0>) Line 2765	C++
       	[Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::updateBackend::__l2::<lambda_1>::operator()(q20::type_identity<QFFmpeg::D3D11TextureConverter>) Line 110	C++
       	[Inline Frame] ffmpegmediaplugin.dll!?A0xa51a8272::applyConverterTypeByPixelFormat(AVPixelFormat) Line 54	C++
       	ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::updateBackend(AVPixelFormat fmt) Line 108	C++
       	[Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::init(AVFrame &) Line 79	C++
       	ffmpegmediaplugin.dll!QFFmpegVideoBuffer::createTexturesFromHwFrame(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 227	C++
       	ffmpegmediaplugin.dll!QFFmpegVideoBuffer::mapTextures(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 204	C++
       	Qt6Multimedia.dll!QVideoTextureHelper::createTextures(const QVideoFrame & frame, QRhi & rhi, QRhiResourceUpdateBatch & rub, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> oldTextures) Line 872	C++
       	Qt6Multimedia.dll!QVideoFrameTexturePool::updateTextures(QRhi & rhi, QRhiResourceUpdateBatch & rub) Line 22	C++
       	[Inline Frame] Qt6MultimediaQuick.dll!QSGVideoMaterial::updateTextures(QRhi *) Line 130	C++
       	Qt6MultimediaQuick.dll!QSGVideoMaterialRhiShader::updateUniformData(QSGMaterialShader::RenderState & state, QSGMaterial * newMaterial, QSGMaterial * oldMaterial) Line 157	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::updateMaterialDynamicData(QSGBatchRenderer::ShaderManagerShader * sms, QSGMaterialShader::RenderState & renderState, QSGMaterial * material, const QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Element * e, int ubufOffset, int ubufRegionSize, char * directUpdatePtr) Line 2953	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderMergedBatch(QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Renderer::PreparedRenderBatch * renderBatch) Line 3269	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderPass(QSGBatchRenderer::Renderer::RenderPassContext * ctx) Line 3870	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::render() Line 3661	C++
       	Qt6Quick.dll!QSGRenderer::renderScene() Line 146	C++
       	Qt6Quick.dll!QQuickWindowPrivate::renderSceneGraph() Line 692	C++
       	Qt6Quick.dll!QSGRenderThread::syncAndRender() Line 781	C++
       	Qt6Quick.dll!QSGRenderThread::run() Line 996	C++
       	Qt6Core.dll!QThreadPrivate::start(void * arg) Line 189	C++
       	kernel32.dll!BaseThreadInitThunk()  Unknown
       	ntdll.dll!RtlUserThreadStart()	Unknown
      

      D3D11 SW Backend

      Main Thread

       	ntdll.dll!NtWaitForSingleObject()	Unknown
       	KernelBase.dll!WaitForSingleObjectEx()	Unknown
      >	Qt6Core.dll!QWaitConditionPrivate::wait(QWaitConditionEvent * wce, QDeadlineTimer deadline) Line 79	C++
       	Qt6Core.dll!QWaitCondition::wait(QMutex * mutex, QDeadlineTimer deadline) Line 148	C++
       	Qt6Quick.dll!QSGThreadedRenderLoop::polishAndSync(QSGThreadedRenderLoop::Window * w, bool inExpose) Line 1688	C++
       	Qt6Quick.dll!QSGThreadedRenderLoop::handleUpdateRequest(QQuickWindow * window) Line 1428	C++
       	Qt6Quick.dll!QQuickWindow::event(QEvent * event) Line 1596	C++
       	[Inline Frame] Qt6Core.dll!QCoreApplicationPrivate::notify_helper(QObject *) Line 1281	C++
       	[Inline Frame] Qt6Core.dll!doNotify(QObject *) Line 1210	C++
       	Qt6Core.dll!QCoreApplication::notify(QObject * receiver, QEvent * event) Line 1194	C++
       	Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1109	C++
       	Qt6Gui.dll!QPlatformWindow::deliverUpdateRequest() Line 832	C++
       	Qt6Gui.dll!QPlatformWindow::windowEvent(QEvent * event) Line 477	C++
       	[Inline Frame] qwindows.dll!QWindowsBaseWindow::windowEvent(QEvent *) Line 1436	C++
       	qwindows.dll!QWindowsWindow::windowEvent(QEvent * event) Line 2973	C++
       	[Inline Frame] Qt6Gui.dll!QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(QWindow *) Line 2124	C++
       	Qt6Gui.dll!QGuiApplication::notify(QObject * object, QEvent * event) Line 2036	C++
       	Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1109	C++
       	[Inline Frame] Qt6Core.dll!QCoreApplication::sendEvent(QObject *) Line 1549	C++
       	Qt6Core.dll!QEventDispatcherWin32Private::sendTimerEvent(int timerId) Line 417	C++
       	Qt6Core.dll!QEventDispatcherWin32::event(QEvent * e) Line 911	C++
       	[Inline Frame] Qt6Core.dll!QCoreApplicationPrivate::notify_helper(QObject *) Line 1281	C++
       	[Inline Frame] Qt6Core.dll!doNotify(QObject *) Line 1210	C++
       	Qt6Core.dll!QCoreApplication::notify(QObject * receiver, QEvent * event) Line 1194	C++
       	Qt6Core.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1109	C++
       	[Inline Frame] Qt6Core.dll!QCoreApplication::sendEvent(QObject *) Line 1549	C++
       	Qt6Core.dll!QCoreApplicationPrivate::sendPostedEvents(QObject * receiver, int event_type, QThreadData * data) Line 1889	C++
       	Qt6Gui.dll!QWindowsGuiEventDispatcher::sendPostedEvents() Line 44	C++
       	Qt6Core.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 485	C++
       	Qt6Gui.dll!QWindowsGuiEventDispatcher::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 37	C++
       	[Inline Frame] Qt6Core.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag>) Line 104	C++
       	Qt6Core.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 185	C++
       	Qt6Core.dll!QCoreApplication::exec() Line 1452	C++
       	qml.exe!main(int argc, char * * argv) Line 658	C++
       	[Inline Frame] qml.exe!invoke_main() Line 78	C++
       	qml.exe!__scrt_common_main_seh() Line 288	C++
       	kernel32.dll!BaseThreadInitThunk()	Unknown
       	ntdll.dll!RtlUserThreadStart()	Unknown
      

      QSG Render Thread

       	win32u.dll!NtGdiDdDDIAcquireKeyedMutex2()	Unknown
       	d3d11.dll!NDXGI::CDevice::WaitForGPUSyncObject(struct IDXGIResourceInternal *,class NDXGI::CKMResource *,unsigned __int64,unsigned long,union _D3D11_KEYED_MUTEX_PRIVATE_DATA *)	Unknown
       	d3d11.dll!NDXGI::CDevice::DXGIAcquireSync(struct IDXGIResourceInternal *,class NDXGI::CKMResource *,unsigned __int64,unsigned long)	Unknown
       	d3d11.dll!NDXGI::CResource::AcquireSync(unsigned __int64,unsigned long)	Unknown
      >	[Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureBridge::copyToSharedTex(ID3D11Device * dev, ID3D11DeviceContext * ctx, const Microsoft::WRL::ComPtr<ID3D11Texture2D> &) Line 114	C++
       	ffmpegmediaplugin.dll!QFFmpeg::D3D11TextureConverter::createTextureHandles(AVFrame * frame, std::unique_ptr<QVideoFrameTexturesHandles,std::default_delete<QVideoFrameTexturesHandles>> __formal) Line 317	C++
       	[Inline Frame] ffmpegmediaplugin.dll!QFFmpeg::TextureConverter::createTextureHandles(AVFrame &) Line 100	C++
       	ffmpegmediaplugin.dll!QFFmpegVideoBuffer::createTexturesFromHwFrame(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 238	C++
       	ffmpegmediaplugin.dll!QFFmpegVideoBuffer::mapTextures(QRhi & rhi, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> & oldTextures) Line 204	C++
       	Qt6Multimedia.dll!QVideoTextureHelper::createTextures(const QVideoFrame & frame, QRhi & rhi, QRhiResourceUpdateBatch & rub, std::unique_ptr<QVideoFrameTextures,std::default_delete<QVideoFrameTextures>> oldTextures) Line 872	C++
       	Qt6Multimedia.dll!QVideoFrameTexturePool::updateTextures(QRhi & rhi, QRhiResourceUpdateBatch & rub) Line 22	C++
       	[Inline Frame] Qt6MultimediaQuick.dll!QSGVideoMaterial::updateTextures(QRhi *) Line 130	C++
       	Qt6MultimediaQuick.dll!QSGVideoMaterialRhiShader::updateUniformData(QSGMaterialShader::RenderState & state, QSGMaterial * newMaterial, QSGMaterial * oldMaterial) Line 157	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::updateMaterialDynamicData(QSGBatchRenderer::ShaderManagerShader * sms, QSGMaterialShader::RenderState & renderState, QSGMaterial * material, const QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Element * e, int ubufOffset, int ubufRegionSize, char * directUpdatePtr) Line 2953	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderMergedBatch(QSGBatchRenderer::Batch * batch, QSGBatchRenderer::Renderer::PreparedRenderBatch * renderBatch) Line 3269	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::prepareRenderPass(QSGBatchRenderer::Renderer::RenderPassContext * ctx) Line 3870	C++
       	Qt6Quick.dll!QSGBatchRenderer::Renderer::render() Line 3661	C++
       	Qt6Quick.dll!QSGRenderer::renderScene() Line 146	C++
       	Qt6Quick.dll!QQuickWindowPrivate::renderSceneGraph() Line 692	C++
       	Qt6Quick.dll!QSGRenderThread::syncAndRender() Line 781	C++
       	Qt6Quick.dll!QSGRenderThread::run() Line 996	C++
       	Qt6Core.dll!QThreadPrivate::start(void * arg) Line 189	C++
       	kernel32.dll!BaseThreadInitThunk()	Unknown
       	ntdll.dll!RtlUserThreadStart()	Unknown
      

       

      Tested with different systems (Windows 10/11) and graphic cards (Intel UHD Graphics 770 / GeForce RTX 3090), the results are identical.

      Attachments

        Issue Links

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              qtmultimediateam Qt Multimedia Team
              gpbeta Joshua GPBeta
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:

                Gerrit Reviews

                  There are no open Gerrit changes