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
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/
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
Problem should be fixed in Qt-6.8.3, I think we can close here. Maik
Since qt 6.8.3 is release few days ago, i will update soon all bundles accordingly. Gilles
(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.
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
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
Dave, do you seen my previous comment ?
(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.