spurious assertion failure when chaining state changes
Describe your issue
working on the gstreamer backend for qt, i'm observing this assertion failure:
(tst_qmediaplayerbackend:73853): GStreamer-Base-CRITICAL **: 10:07:08.715: gst_base_src_set_format: assertion 'GST_STATE (src) <= GST_STATE_READY' failed
afaict this happens under the following circumstance:
- pipeline changes state (asynchronously) from NULL->PAUSED
- while this asynchronous state change is happening, a gst_element_get_state of the pipeline to NULL is happening.
i can try to come up with a reduced test case, though at a rather low priority, since i have a workaround for it.
Expected Behavior
No assertion failure
Observed Behavior
Assertion failure
Setup
- Operating System: Ubuntu 24.04
- Device: Computer
- GStreamer Version: 1.24
Steps to reproduce the bug
- Compile QtMultimedia from the
dev
branch with-DFEATURE_gstreamer=ON
and-DQT_BUILD_TESTS=ON
- run the unit test
tst_qmediaplayerbackend
with command line argumentssetSource_changesSourceAndMediaStatus_whenCalledWithValidFile -repeat 100
How reproducible is the bug?
Spurious (due to the asynchronous nature of the issue). Running the test in a loop, i can reproduce it in a couple of times
Solutions you have tried
The issue disappears when waiting for the state change to finish (gst_element_get_state
with a sufficient timeout before gst_element_set_state
)
Downstream ticket
https://bugreports.qt.io/browse/QTBUG-125251
Stack traces:
assertion failure on typefind:sink
thread:
1 g_logv (x86_64) /lib/x86_64-linux-gnu/libglib-2.0.so.0 0x7ffff2d196a1
2 g_log (x86_64) /lib/x86_64-linux-gnu/libglib-2.0.so.0 0x7ffff2d19953
3 gst_base_src_set_format gstbasesrc.c 644 0x7fffea9b4648
4 gst_app_src_start gstappsrc.c 1096 0x7fffeb1b16fa
5 gst_base_src_start gstbasesrc.c 3570 0x7fffea9bfa93
6 gst_base_src_activate_pull gstbasesrc.c 3994 0x7fffea9c0042
7 gst_base_src_activate_mode gstbasesrc.c 4029 0x7fffea9baeab
8 activate_mode_internal gstpad.c 1224 0x7fffe7b07ffe
9 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
10 activate_mode_internal gstpad.c 1192 0x7fffe7b07eeb
11 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
12 gst_ghost_pad_internal_activate_pull_default gstghostpad.c 302 0x7fffe7aebf96
13 gst_ghost_pad_internal_activate_mode_default gstghostpad.c 344 0x7fffe7aebcc6
14 activate_mode_internal gstpad.c 1224 0x7fffe7b07ffe
15 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
16 activate_mode_internal gstpad.c 1192 0x7fffe7b07eeb
17 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
18 gst_type_find_element_activate_src_mode gsttypefindelement.c 1090 0x7fffe9be5705
19 activate_mode_internal gstpad.c 1224 0x7fffe7b07ffe
20 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
21 activate_mode_internal gstpad.c 1192 0x7fffe7b07eeb
22 gst_pad_activate_mode gstpad.c 1329 0x7fffe7b0872f
23 qtdemux_sink_activate qtdemux.c 8591 0x7fffe4e54bb2
24 gst_pad_set_active gstpad.c 1107 0x7fffe7b078f5
25 activate_pads gstelement.c 3189 0x7fffe7ae0bd7
26 gst_iterator_fold gstiterator.c 618 0x7fffe7af97a2
27 iterator_activate_fold_with_resync gstelement.c 3213 0x7fffe7ae0b25
28 gst_element_pads_activate gstelement.c 3258 0x7fffe7ae094b
29 gst_element_change_state_func gstelement.c 3309 0x7fffe7adf0b1
30 gst_qtdemux_change_state qtdemux.c 2681 0x7fffe4e53c3e
31 gst_element_change_state gstelement.c 3101 0x7fffe7adce93
32 gst_element_set_state_func gstelement.c 3055 0x7fffe7adf775
33 gst_element_set_state gstelement.c 2956 0x7fffe7adc512
34 connect_pad gstdecodebin2.c 2576 0x7fffe4f59856
35 analyze_new_pad gstdecodebin2.c 1908 0x7fffe4f565de
36 type_found gstdecodebin2.c 2945 0x7fffe4f54ae5
37 ___lldb_unnamed_symbol145 (x86_64) /lib/x86_64-linux-gnu/libffi.so.8 0x7fffea77ab16
38 ___lldb_unnamed_symbol138 (x86_64) /lib/x86_64-linux-gnu/libffi.so.8 0x7fffea7773ef
39 ffi_call (x86_64) /lib/x86_64-linux-gnu/libffi.so.8 0x7fffea77a0be
40 g_cclosure_marshal_generic (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7b8db2
41 g_closure_invoke (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7b22fa
42 ___lldb_unnamed_symbol1329 (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7e190c
43 ___lldb_unnamed_symbol1162 (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7d2591
44 g_signal_emit_valist (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7d27c1
45 g_signal_emit (x86_64) /lib/x86_64-linux-gnu/libgobject-2.0.so.0 0x7fffea7d2883
46 gst_type_find_element_emit_have_type gsttypefindelement.c 239 0x7fffe9be6d85
47 gst_type_find_element_loop gsttypefindelement.c 1195 0x7fffe9be6272
48 gst_task_func gsttask.c 399 0x7fffe7b65705
49 default_func gsttaskpool.c 70 0x7fffe7b6670a
50 ___lldb_unnamed_symbol2711 (x86_64) /lib/x86_64-linux-gnu/libglib-2.0.so.0 0x7ffff2d48542
51 ___lldb_unnamed_symbol2690 (x86_64) /lib/x86_64-linux-gnu/libglib-2.0.so.0 0x7ffff2d42c82
52 asan_thread_start(void *) (x86_64) /home/tim/build/build-qt6-dev-clang_18_qt_dev-Debug2/qtmultimedia/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend 0x55555563d42d
53 start_thread pthread_create.c 447 0x7fffede9ca94
54 __clone3 clone3.S 78 0x7fffedf29c3c
while the application thread is in:
5 gst_pad_stop_task gstpad.c 6514 0x7fffe7b1bc8a
6 gst_type_find_element_activate_sink_mode gsttypefindelement.c 1288 0x7fffe9be5000
7 activate_mode_internal gstpad.c 1224 0x7fffe7b07ffe
8 gst_pad_set_active gstpad.c 1122 0x7fffe7b07a88
9 activate_pads gstelement.c 3189 0x7fffe7ae0bd7
10 gst_iterator_fold gstiterator.c 618 0x7fffe7af97a2
11 iterator_activate_fold_with_resync gstelement.c 3213 0x7fffe7ae0b25
12 gst_element_pads_activate gstelement.c 3258 0x7fffe7ae094b
13 gst_element_change_state_func gstelement.c 3323 0x7fffe7adf0db
14 gst_type_find_element_change_state gsttypefindelement.c 1353 0x7fffe9be4cfe
15 gst_element_change_state gstelement.c 3101 0x7fffe7adce93
16 gst_element_set_state_func gstelement.c 3055 0x7fffe7adf775
17 gst_element_set_state gstelement.c 2956 0x7fffe7adc512
18 gst_bin_element_set_state gstbin.c 2582 0x7fffe7aa66c9
19 gst_bin_change_state_func gstbin.c 2934 0x7fffe7aa082c
20 gst_decode_bin_change_state gstdecodebin2.c 5500 0x7fffe4f5139c
21 gst_element_change_state gstelement.c 3101 0x7fffe7adce93
22 gst_element_set_state_func gstelement.c 3055 0x7fffe7adf775
23 gst_element_set_state gstelement.c 2956 0x7fffe7adc512
24 gst_bin_element_set_state gstbin.c 2582 0x7fffe7aa66c9
25 gst_bin_change_state_func gstbin.c 2934 0x7fffe7aa082c
26 gst_pipeline_change_state gstpipeline.c 534 0x7fffe7b23e06
27 gst_element_change_state gstelement.c 3101 0x7fffe7adce93
28 gst_element_set_state_func gstelement.c 3055 0x7fffe7adf775
29 gst_element_set_state gstelement.c 2956 0x7fffe7adc512
30 QGstElement::setStateSync(GstState, std::chrono::duration<long, std::ratio<1l, 1000000000l>>) qgst.cpp 949 0x7fffe4cf5ecb
31 QGstreamerMediaPlayer::~QGstreamerMediaPlayer() qgstreamermediaplayer.cpp 154 0x7fffe4d2b879
32 QGstreamerMediaPlayer::~QGstreamerMediaPlayer() qgstreamermediaplayer.cpp 151 0x7fffe4d2bb0d