FFmpeg errors when stopping a screen share
I got the following error messages when stopping a screen share (on Ubuntu 22.04 in a VM):
[Parsed_amix_0 @ 0x55555a331f40] Value 0.000000 for parameter 'inputs' out of range [1 - 32767]
[Parsed_amix_0 @ 0x55555a331f40] Error setting option inputs to value 0.
[AVFilterGraph @ 0x555556fe3c00] Error applying filter options
Moreover, the peer could still see the last shared frame even though the screen sharing was stopped on my end, and attempting to start a new share caused the call to end.
Backtrace for the first error message:
Thread 1 "jami" hit Breakpoint 2, write_number (obj=0x55555a1dbe00, o=0x7fffe9688960 <amix_options>, dst=0x55555a1dbf50, num=0, den=1, intnum=1) at libavutil/opt.c:107
107 av_log(obj, AV_LOG_ERROR, "Value %f for parameter '%s' out of range [%g - %g]\n",
#0 write_number (obj=0x55555a1dbe00, o=0x7fffe9688960 <amix_options>, dst=0x55555a1dbf50, num=0, den=1, intnum=1) at libavutil/opt.c:107
#1 0x00007fffe90c4b7d in set_string_number (obj=obj@entry=0x55555a1dbe00, target_obj=0x55555a1dbf40, o=o@entry=0x7fffe9688960 <amix_options>, val=<optimized out>, val@entry=0x55555a1d5ce0 "0", dst=dst@entry=0x55555a1dbf50) at libavutil/opt.c:323
#2 0x00007fffe90c5289 in av_opt_set (obj=obj@entry=0x55555a1dbe00, name=<optimized out>, val=0x55555a1d5ce0 "0", search_flags=search_flags@entry=1) at libavutil/opt.c:527
#3 0x00007fffe90c5c42 in av_opt_set_dict2 (obj=0x55555a1dbe00, options=options@entry=0x55555a1d5318, search_flags=search_flags@entry=1) at libavutil/opt.c:1753
#4 0x00007fffe87e8acd in avfilter_graph_segment_apply_opts (flags=<optimized out>, seg=<optimized out>) at libavfilter/graphparser.c:603
#5 avfilter_graph_segment_apply_opts (seg=0x55555a1db5c0, flags=<optimized out>) at libavfilter/graphparser.c:585
#6 0x00007fffe87e94d6 in avfilter_graph_segment_apply (seg=0x55555a1db5c0, flags=<optimized out>, inputs=0x7fffffff6d98, outputs=0x7fffffff6da0) at libavfilter/graphparser.c:869
#7 0x00007fffe87e961e in avfilter_graph_parse2 (graph=0x55555a1d6800, filters=<optimized out>, inputs=0x7fffffff6d98, outputs=0x7fffffff6da0) at libavfilter/graphparser.c:148
#8 0x00007fffe81b610b in jami::MediaFilter::initialize(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<jami::MediaStream, std::allocator<jami::MediaStream> > const&) () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#9 0x00007fffe81bf30b in jami::MediaRecorder::setupAudioOutput() () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#10 0x00007fffe81c3718 in jami::MediaRecorder::removeStream(jami::MediaStream const&) () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#11 0x00007fffe81f403d in jami::AudioRtpSession::deinitRecorder() () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#12 0x00007fffe81f435c in jami::AudioRtpSession::~AudioRtpSession() () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#13 0x00007fffe7ef19ba in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#14 0x00007fffe82d4481 in jami::SIPCall::updateAllMediaStreams(std::vector<jami::MediaAttribute, std::allocator<jami::MediaAttribute> > const&, bool) () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#15 0x00007fffe82da2c2 in jami::SIPCall::requestMediaChange(std::vector<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > > const&) () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#16 0x00007fffe7f970f9 in libjami::requestMediaChange(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::allocator<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > > const&) () at /home/liam/jami-client-qt/daemon/src/.libs/libjami.so.0
#17 0x000055555584e7f7 in CallManagerInterface::requestMediaChange(QString const&, QString const&, QList<QMap<QString, QString> > const&) (accountId=..., callId=..., mediaList=<optimized out>, this=<optimized out>) at /home/liam/jami-client-qt/src/libclient/dbus/../qtwrapper/callmanager_wrap.h:411
#18 0x0000555555855a05 in lrc::api::CallModel::removeMedia(QString const&, QString const&, QString const&, bool, bool) (this=this@entry=0x555557552a40, callId=..., mediaType=..., type=..., muteCamera=muteCamera@entry=true, removeAll=removeAll@entry=true) at /home/liam/jami-client-qt/src/libclient/callmodel.cpp:686
#19 0x00005555556c8517 in AvAdapter::stopSharing(QString const&) (this=<optimized out>, source=<optimized out>) at /home/liam/jami-client-qt/src/app/avadapter.cpp:418
Partial explanation: I believe the error messages are due to the fact that I didn't have any microphone set up in the VM I was using, which meant that the MediaRecorder::setupAudioOutput
function called initialize
with an empty peers
list (and therefore FFmpeg's avfilter_graph_parse2
function got called with invalid arguments, hence the errors). Thus we could avoid printing irrelevant error messages by returning early from setupAudioOutput
if peers
is empty. However, I don't currently know why the screen share doesn't stop properly for the receiving peer in this situation.
Update: The problem seems to be ultimately caused by the fact that SIPCall::requestMediaChange
was incorrectly called with an empty media list due to a bug in jami-client-qt.