MediaDemuxer: can lock on disconnect
Scenario
- Plug a camera
- Show it in media settings
- Unplug
Expected scenario
- The UI should not freeze
Current result
sometimes, the UI is freezing, blocking on destroying the video input.
Backtrace
Thread 1 (Thread 0x7fffe2a99d40 (LWP 2929030) "jami-qt"):
#0 0x00007fffeda179d7 in __pthread_clockjoin_ex () at /lib64/libpthread.so.0
#1 0x00007fffedffd687 in std::thread::join() () at /lib64/libstdc++.so.6
#2 0x00007fffec773cbb in jami::video::VideoInput::~VideoInput() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#3 0x00007fffec4cae2a in DRing::stopCamera() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#4 0x00007ffff7d17752 in VideoManagerInterface::stopCamera() (this=<optimized out>) at /home/amarok/Projects/jami/lrc/src/qtwrapper/videomanager_wrap.h:184
#5 0x00007ffff7d1cad0 in lrc::api::AVModel::setDeviceSettings(lrc::api::video::Settings&) (this=0x1496890, settings=...) at /home/amarok/Projects/jami/lrc/src/avmodel.cpp:293
#6 0x000000000049d42d in SettingsAdapter::set_Video_Settings_Rate_And_Resolution(QString const&, double, QString const&) (this=0xffb380, deviceId=..., rate=30, resolution=...) at /home/amarok/Projects/jami/client-qt/src/settingsadapter.cpp:193
#7 0x0000000000434c41 in SettingsAdapter::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=_o@entry=0xffb380, _c=_c@entry=QMetaObject::InvokeMetaMethod, _id=_id@entry=17, _a=_a@entry=0x7fffffff2710) at /home/amarok/Projects/jami/client-qt/build-local/jami-qt_autogen/UVLADIE3JM/moc_settingsadapter.cpp:708
#8 0x00000000004385ee in SettingsAdapter::qt_metacall(QMetaObject::Call, int, void**) (this=0xffb380, _c=QMetaObject::InvokeMetaMethod, _id=17, _a=0x7fffffff2710) at /home/amarok/Projects/jami/client-qt/build-local/jami-qt_autogen/UVLADIE3JM/moc_settingsadapter.cpp:969
#9 0x00007fffeeb08cf5 in QQmlObjectOrGadget::metacall(QMetaObject::Call, int, void**) const () at /lib64/libQt5Qml.so.5
#10 0x00007fffeea11149 in CallPrecise(QQmlObjectOrGadget const&, QQmlPropertyData const&, QV4::ExecutionEngine*, QV4::CallData*, QMetaObject::Call) () at /lib64/libQt5Qml.so.5
#11 0x00007fffeea123f7 in QV4::QObjectMethod::callInternal(QV4::Value const*, QV4::Value const*, int) const () at /lib64/libQt5Qml.so.5
#12 0x00007fffeea38cce in QV4::Runtime::CallPropertyLookup::call(QV4::ExecutionEngine*, QV4::Value const&, unsigned int, QV4::Value*, int) () at /lib64/libQt5Qml.so.5
#13 0x00007fff4014bb4e in ()
#14 0x00007fffffff2d40 in ()
#15 0x0000000000000010 in ()
#16 0x00007fff4014b000 in ()
#17 0x00007fff4014bb8b in ()
#18 0x000000000088d800 in ()
#19 0x00007fffeea2ceba in QV4::Moth::VME::exec(QV4::CppStackFrame*, QV4::ExecutionEngine*) [clone .part.0] () at /lib64/libQt5Qml.so.5
#20 0x00007fffee9d7d48 in QV4::ArrowFunction::virtualCall(QV4::FunctionObject const*, QV4::Value const*, QV4::Value const*, int) () at /lib64/libQt5Qml.so.5
#21 0x00007fffeea3cc46 in QV4::Runtime::CallQmlContextPropertyLookup::call(QV4::ExecutionEngine*, unsigned int, QV4::Value*, int) () at /lib64/libQt5Qml.so.5
#22 0x00007fff40148084 in ()
#23 0x00007fffffff3010 in ()
#24 0x0000000000000000 in ()
Thread 224 (Thread 0x7ffcceffd640 (LWP 2929321) "jami-qt"):
#0 0x00007fffedcf35db in ioctl () at /lib64/libc.so.6
#1 0x00007fffec9c4759 in mmap_read_frame (pkt=0x7ffc6401f2c0, ctx=0x7ffc64002200) at libavdevice/v4l2.c:505
#2 v4l2_read_packet (ctx=0x7ffc64002200, pkt=0x7ffc6401f2c0) at libavdevice/v4l2.c:992
#3 0x00007fffeca222c2 in ff_read_packet (s=s@entry=0x7ffc64002200, pkt=pkt@entry=0x7ffc6401f2c0) at libavformat/utils.c:843
#4 0x00007fffeca22c3b in read_frame_internal (s=s@entry=0x7ffc64002200, pkt=0x7ffc6401f2c0) at libavformat/utils.c:1546
#5 0x00007fffeca23938 in av_read_frame (s=0x7ffc64002200, pkt=0x7ffc6401f2c0) at libavformat/utils.c:1750
#6 0x00007fffec413fa7 in jami::MediaDemuxer::decode() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#7 0x00007fffec76f6a9 in jami::video::VideoInput::captureFrame() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#8 0x00007fffec774bcb in jami::video::VideoInput::process() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#9 0x00007fffec32602d in jami::ThreadLoop::mainloop(std::thread::id&, std::function<bool ()>, std::function<void ()>, std::function<void ()>) () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#10 0x00007fffec326758 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (jami::ThreadLoop::*)(std::thread::id&, std::function<bool ()>, std::function<void ()>, std::function<void ()>), jami::ThreadLoop*, std::reference_wrapper<std::thread::id>, std::function<bool ()>, std::function<void ()>, std::function<void ()> > > >::_M_run() () at /home/amarok/Projects/jami/daemon/src/.libs/libring.so.0
#11 0x00007fffedffd444 in execute_native_thread_routine () at /lib64/libstdc++.so.6
#12 0x00007fffeda163f9 in start_thread () at /lib64/libpthread.so.0
#13 0x00007fffedcfcb53 in clone () at /lib64/libc.so.6
av_read_frame can block forever, causing the VideoInput to wait.