Bug 502302 - Crash in Qt version 6.8.2 from QtMultimedia framework with std::default_delete<QFFmpegResampler>::operator().
Summary: Crash in Qt version 6.8.2 from QtMultimedia framework with std::default_delet...
Status: REPORTED
Alias: None
Product: digikam
Classification: Applications
Component: Preview-Video (show other bugs)
Version: 8.6.0
Platform: Fedora RPMs Linux
: NOR crash
Target Milestone: ---
Assignee: Digikam Developers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-04-02 00:27 UTC by Dave Gilbert
Modified: 2025-04-12 11:33 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dave Gilbert 2025-04-02 00:27:43 UTC
SUMMARY

I've seen a couple of digikam crashes recently, I've got a backtrace below showing it's in std::default_delete<QFFmpegResampler>::operator() 

STEPS TO REPRODUCE
(It seems to happen when some of the time)
1.  Take an album with some video files among the images (not sure which format is triggering it)
2.  Open one of the images
3.  Use back and forward arrows to move between the images
4. Run into one of the videos

OBSERVED RESULT
Crash as shown below

EXPECTED RESULT
No crash

SOFTWARE/OS VERSIONS
Linux/KDE Plasma:  Fedora 42 beta, under xfce
digikam-libs-8.6.0-2.fc42.x86_64
digikam-8.6.0-2.fc42.x86_64

digiKam: 8.6.0
KDE Frameworks: 6.12.0
Qt: Using 6.8.2 and built against 6.8.2
Fedora Linux 42 (Adams Prerelease) (Xcb)
Build ABI: x86_64-little_endian-lp64
Kernel: linux 6.14.0-63.fc42.x86_64

ADDITIONAL INFORMATION
The crashing thread is thread 1, all the others seem to be in __syscall_cancel_arch

(gdb) bt full
#0  0x00007f403bf2f45d in std::default_delete<QFFmpegResampler>::operator()
    (this=<optimized out>, __ptr=0x7f3f2caff100, this=<optimized out>, __ptr=<optimized out>) at /usr/include/c++/15/bits/unique_ptr.h:87
#1  std::__uniq_ptr_impl<QFFmpegResampler, std::default_delete<QFFmpegResampler> >::reset
    (this=0x559082db2a30, __p=0x0, this=<optimized out>, __p=<optimized out>) at /usr/include/c++/15/bits/unique_ptr.h:205
        __old_p = 0x7f3f2caff100
        __old_p = <optimized out>
#2  std::unique_ptr<QFFmpegResampler, std::default_delete<QFFmpegResampler> >::reset (this=0x559082db2a30, __p=0x0)
    at /usr/include/c++/15/bits/unique_ptr.h:504
#3  QFFmpeg::AudioRenderer::updateOutputs (this=0x559082db2910, frame=...)
    at /usr/src/debug/qt6-qtmultimedia-6.8.2-1.fc42.x86_64/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegaudiorenderer.cpp:255
#4  QFFmpeg::AudioRenderer::renderInternal (this=0x559082db2910, frame=...)
    at /usr/src/debug/qt6-qtmultimedia-6.8.2-1.fc42.x86_64/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegaudiorenderer.cpp:117
        result = {done = <optimized out>, recheckInterval = std::chrono::duration = { <optimized out>us }}
#5  0x00007f403bf2a25e in QFFmpeg::Renderer::doNextStep (this=0x559082db2910)
    at /usr/src/debug/qt6-qtmultimedia-6.8.2-1.fc42.x86_64/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegrenderer.cpp:168
        frame = {d = {d = <optimized out>}}
        result = {done = <optimized out>, recheckInterval = std::chrono::duration = { <optimized out>us }}
#6  0x00007f411035eefa in QtPrivate::QSlotObjectBase::call (this=0x7f3f2c4504d0, r=0x559082db2910, a=0x7f3f5affa110)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qobjectdefs_impl.h:486
#7  doActivate<false> (sender=0x7f3f2cafeea0, signal_index=3, argv=argv@entry=0x7f3f5affa110)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qobject.cpp:4115
        obj = {m_slotObject = std::unique_ptr<QtPrivate::QSlotObjectBase> = {get() = 0x7f3f2c4504d0}}
        receiver = 0x559082db2910
        td = <optimized out>
        receiverInSameThread = <optimized out>
        senderData = {previous = 0x0, receiver = 0x0, sender = 0x7f3f2cafeea0, signal = 3}
        c = 0x7f3f2c53e600
        connections = {d = 0x7f3f2c5a2990}
        list = 0x7f3f2c461290
        inSenderThread = <optimized out>
        highestConnectionId = 1
        signalVector = 0x7f3f2c461240
        currentThreadId = 0x7f3f5affd6c0
--Type <RET> for more, q to quit, c to continue without paging--
        sp = <optimized out>
        signal_spy_set = 0x0
        empty_argv = {0x0}
        senderDeleted = false
#8  0x00007f41103558a9 in QMetaObject::activate
    (sender=<optimized out>, m=m@entry=0x7f4110883060 <QTimer::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7f3f5affa110) at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qobject.cpp:4175
        signal_index = <optimized out>
#9  0x00007f411036ef0d in QTimer::timeout (this=<optimized out>, _t1=...)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/redhat-linux-build/src/corelib/Core_autogen/include/moc_qtimer.cpp:223
        _a = {0x0, 0x7f3f5affa10f}
#10 0x00007f411034f9b5 in QObject::event (this=<optimized out>, e=<optimized out>)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qobject.cpp:1448
#11 0x00007f411143d4ca in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x7f3f2cafeea0, e=0x7f3f5affa2d0)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/widgets/kernel/qapplication.cpp:3296
        consumed = false
        filtered = false
#12 0x00007f41102f549c in QCoreApplication::notifyInternal2 (receiver=0x7f3f2cafeea0, event=0x7f3f5affa2d0)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1172
        selfRequired = <optimized out>
        result = false
        cbdata = {0x7f3f2cafeea0, 0x7f3f5affa2d0, 0x7f3f5affa23f}
        d = <optimized out>
        threadData = 0x5590798e5950
        scopeLevelCounter = {threadData = 0x5590798e5950}
#13 0x00007f41102f56ed in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1612
#14 0x00007f41104b9d78 in QTimerInfoList::activateTimers (this=<optimized out>)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qtimerinfo_unix.cpp:426
        e = {<QEvent> = {_vptr.QEvent = 0x7f4110880c30 <vtable for QTimerEvent+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7f4110700980 <qt_meta_stringdata_ZN6QEventE>, data = 0x7f41107003a0 <qt_meta_data_ZN6QEventE>, static_metacall = 0x0, relatedMetaObjects = 0x0, metaTypes = 0x7f411087b880 <qt_incomplete_metaTypeArray<(anonymous namespace)::qt_meta_tag_ZN6QEventE_t, QtPrivate::TypeAndForceComplete<QEvent::Type, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceComplete<QEvent, std::integral_constant<bool, true> > >>, extradata = 0x0}}, t = 1, m_posted = false, m_spont--Type <RET> for more, q to quit, c to continue without paging--
 = false, m_accept = true, m_unused = false, m_reserved = 0, m_inputEvent = 0, m_pointerEvent = 0, m_singlePointEvent = 0}, m_id = (unknown: 0x80000a3)}
        currentTimerInfo = 0x0
        now = std::chrono::_V2::steady_clock time_point = { 20803354939552ns }
        stillActive = Python Exception <class 'gdb.error'>: value has been optimized out
{__now = <synthetic pointer>}
        it = {i = <optimized out>}
        maxCount = <optimized out>
        n_act = 1
#15 0x00007f41105f69f1 in timerSourceDispatch (source=<optimized out>)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qeventdispatcher_glib.cpp:152
        timerSource = <optimized out>
#16 idleTimerSourceDispatch (source=<optimized out>) at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qeventdispatcher_glib.cpp:199
        timerSource = <optimized out>
#17 0x00007f410399c5e0 in g_main_dispatch (context=0x7f3f2c001da0) at ../glib/gmain.c:3398
        dispatch = 0x7f41105f69c0 <idleTimerSourceDispatch(GSource*, GSourceFunc, gpointer)>
        prev_source = 0x0
        begin_time_nsec = 20803354939411
        was_in_call = 0
        user_data = 0x0
        callback = 0x0
        cb_funcs = 0x0
        cb_data = 0x0
        need_destroy = <optimized out>
        source = 0x7f3f2c002da0
        current = 0x7f3f2c59d580
        i = 1
#18 g_main_context_dispatch_unlocked (context=0x7f3f2c001da0) at ../glib/gmain.c:4249
#19 0x00007f41039a5708 in g_main_context_iterate_unlocked
    (context=context@entry=0x7f3f2c001da0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4314
        max_priority = 2147483647
        timeout_usec = 18000
        some_ready = 1
        nfds = 1
        allocated_nfds = <optimized out>
--Type <RET> for more, q to quit, c to continue without paging--
        fds = <optimized out>
        begin_time_nsec = <optimized out>
#20 0x00007f41039a58b7 in g_main_context_iteration (context=0x7f3f2c001da0, may_block=1) at ../glib/gmain.c:4379
        retval = <optimized out>
#21 0x00007f41105f6cc3 in QEventDispatcherGlib::processEvents (this=0x7f3f2c53efe0, flags=...)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/kernel/qeventdispatcher_glib.cpp:399
        d = 0x7f3f2c43dac0
        canWait = <optimized out>
        savedFlags = {i = 0}
        result = <optimized out>
#22 0x00007f41103026d3 in QEventLoop::exec (this=this@entry=0x7f3f5affa590, flags=..., flags@entry=...)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/global/qflags.h:34
        d = 0x7f3f2c001000
        threadData = <optimized out>
        locker = {m_mutex = 0x559083c767a8, m_isLocked = false}
        ref = {d = <optimized out>, locker = <optimized out>, exceptionCaught = <optimized out>}
        app = <optimized out>
#23 0x00007f411041eb2f in QThread::exec (this=<optimized out>) at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/thread/qthread.cpp:590
        d = 0x559083c76730
        status = <optimized out>
        locker = {m_mutex = 0x559083c767a8, m_isLocked = false}
        eventLoop = {<QObject> = {_vptr.QObject = 0x7f4110880da8 <vtable for QEventLoop+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, stringdata = 0x7f41107045e0 <qt_meta_stringdata_ZN7QObjectE>, data = 0x7f41107044c0 <qt_meta_data_ZN7QObjectE>, static_metacall = 0x7f411035bbb0 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7f41108828a0 <qt_incomplete_metaTypeArray<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t, QtPrivate::TypeAndForceComplete<QString, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceComplete<QObject, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<QObject*, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<QString const&, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<QObject*, std::integral_constant<bool, false> > >>, extradata = 0x0}}, d_ptr = {d = 0x7f3f2c001000}}, static staticMetaObject = {d = {superdata = {direct = 0x7f411087ca40 <QObject::staticMetaObject>}, stringdata = 0x7f4110701b60 <qt_meta_stringdata_ZN10QEventLoopE>, data = 0x7f4110701a60 <qt_meta_data_ZN10QEventLoopE>, static_metacall = 0x7f41103022a0 <QEventLoop::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7f4110880cc0 <qt_incomplete_metaTypeArray<(anonymous namespace)::qt_meta_tag_ZN10QEventLoopE_t, QtPrivate::TypeAndForceComplete<QFlags<QEventLoop::ProcessEventsFlag>, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceCompl--Type <RET> for more, q to quit, c to continue without paging--
ete<QEventLoop, std::integral_constant<bool, true> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<int, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> >, QtPrivate::TypeAndForceComplete<void, std::integral_constant<bool, false> > >>, extradata = 0x0}}}
        returnCode = <optimized out>
#24 0x00007f41104bb6d0 in operator() (__closure=<optimized out>) at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/thread/qthread_unix.cpp:375
#25 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=<optimized out>)
    at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/thread/qthread_unix.cpp:311
#26 QThreadPrivate::start (arg=0x55908035ed20) at /usr/src/debug/qt6-qtbase-6.8.2-3.fc42.x86_64/src/corelib/thread/qthread_unix.cpp:339
        __clframe = {__cancel_routine = <optimized out>, __cancel_arg = 0x55908035ed20, __do_it = 1, __cancel_type = <optimized out>}
        thr = 0x55908035ed20
        data = <optimized out>
#27 0x00007f410fc7e324 in start_thread (arg=<optimized out>) at pthread_create.c:448
        ret = <optimized out>
        pd = <optimized out>
        out = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {139910086383296, 3791760048067575670, 0, 140729691197408, 139917414359104, 139910086383296, 3791760048090644342, 3775041078443376502}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#28 0x00007f410fd01cfc in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
Comment 1 caulier.gilles 2025-04-02 01:50:41 UTC
Definitively the whole backtrace of the crash appears in QtMultimedia source code, not digiKam.

Which ffmpeg version is used in the background ?

I recommend to report this problem in the Qt bugzilla :

https://bugreports.qt.io/projects/
Comment 2 Maik Qualmann 2025-04-02 06:29:22 UTC
The crash is already known in Qt.

https://bugreports.qt.io/browse/QTBUG-130386

 I'll take another look, but I'm pretty sure we're not changing the media source during the play() function.

Maik
Comment 3 Maik Qualmann 2025-04-02 06:33:28 UTC
Problem should be fixed in Qt-6.8.3, I think we can close here.

Maik
Comment 4 caulier.gilles 2025-04-02 07:43:20 UTC
Since qt 6.8.3 is release few days ago, i will update soon all bundles accordingly.

Gilles
Comment 5 Dave Gilbert 2025-04-02 11:14:18 UTC
(In reply to Maik Qualmann from comment #2)
> The crash is already known in Qt.
> 
> https://bugreports.qt.io/browse/QTBUG-130386
> 
>  I'll take another look, but I'm pretty sure we're not changing the media
> source during the play() function.
> 
> Maik

Thanks for finding that Maik;  I guess that type of thing fits with my reproducer - I may have been quickly flicking past the video as I was going through the images.
Comment 6 caulier.gilles 2025-04-03 02:51:19 UTC
For the AppImage, Qt 6.9.0 can be used : https://doc-snapshots.qt.io/qt6-6.9/whatsnew69.html
Q: i upgrade to 6.8.3 or i switch directly to 6.9.0?

Macports : have already Qt 6.8.3

VCPKG : Still Qt 6.8.2 (6.8.3 PR : https://github.com/microsoft/vcpkg/pull/44659)

Gilles
Comment 7 caulier.gilles 2025-04-03 16:14:42 UTC
Hi Dave,

The new AppImage bundle 8.7.0 pre-release for Linux based on Qt 6.8.3 will be online in one hour (20:00 Paris time) at usual place :

https://files.kde.org/digikam/

Let's me here if the problem remain.

Best regards

Gilles Caulier
Comment 8 caulier.gilles 2025-04-12 06:46:19 UTC
Dave, do you seen my previous comment ?
Comment 9 Dave Gilbert 2025-04-12 11:33:45 UTC
(In reply to caulier.gilles from comment #8)
> Dave, do you seen my previous comment ?

I did, but since I'm running Fedora's packaged version of everything, switching to AppImage would be changing lots of things at once.