@junshengy
I’ve successfully implemented HLS streaming, but I’m encountering a specific bug that occurs with both decodebin and souphttprc/hlsdemux. The behavior is identical in both cases.
I’m working with problematic HLS sources that frequently experience disconnections. To handle this, I implemented logic where if no data is received in the deq_queue buffer for 1 minute, nvurisrcbin sets rtsp_info.attempt_exceeded = TRUE
, triggering the source removal process.
This solution works well in most cases, but there’s a particular scenario where hlsdemux gets stuck in the playing state, causing issues throughout the pipeline. Through debugging, I identified the problematic section in gst-nvmultiurisrcbincreator.cpp:
GstStateChangeReturn state_return = GST_STATE_CHANGE_FAILURE;
if (GST_IS_BIN (sourceInfo->uribin)
&& (state_return =
gst_element_set_state (GST_ELEMENT (sourceInfo->uribin),
GST_STATE_NULL)) == GST_STATE_CHANGE_FAILURE) {
GST_WARNING_OBJECT (nvmultiurisrcbinCreator->nvmultiurisrcbin,
"Failed to set stop source-id:%u", sourceInfo->config->source_id);
return FALSE;
}
The issue occurs when the logic determines the source doesn’t exist due to this failure, but it doesn’t properly remove the source, leaving the states in an inconsistent condition. Subsequently, each source gradually stops working until the pipeline completely freezes.
I need a solution that prevents the pipeline from freezing. I’ve tried several approaches, including:
- Implementing 3 retry attempts with 1-second intervals
- Attempting to disconnect all pads and stop
- Various other disconnection strategies
However, none of these attempts have been successful in resolving the issue. The pipeline still ends up freezing eventually.
Full Log:
3:04:30.520629537 1 0x7f5b200047d0 INFO task gsttask.c:368:gst_task_func:<dec_que:src> Task going to paused
3:04:30.520649227 1 0x555b99919ac0 INFO GST_EVENT gstevent.c:582:gst_event_new_flush_stop: creating flush stop 0
3:04:30.520692218 1 0x555b99919ac0 INFO GST_ELEMENT_PADS gstpad.c:2137:gst_pad_unlink: unlinking dsnvurisrcbin1:vsrc_0(0x7f5a24013eb0) and src_bin_muxer:sink_1(0x7f5a24015140)
3:04:30.520710838 1 0x555b99919ac0 INFO GST_ELEMENT_PADS gstpad.c:2192:gst_pad_unlink: unlinked dsnvurisrcbin1:vsrc_0 and src_bin_muxer:sink_1
3:04:30.520739788 1 0x555b99919ac0 INFO GST_PARENTAGE gstbin.c:1803:gst_bin_remove_func:<uri-source_creator> removed child "dsnvurisrcbin1"
3:04:30.520801829 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<src_cap_filter_nvvidconv> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.520812649 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<src_cap_filter_nvvidconv> completed state change to PAUSED
3:04:30.520823479 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<src_cap_filter_nvvidconv> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.520848019 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<nvvidconv> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.520858289 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<nvvidconv> completed state change to PAUSED
3:04:30.520867799 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<nvvidconv> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.520879089 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<dsnvurisrcbin1> child 'nvvidconv' changed state to 3(PAUSED) successfully
3:04:30.520889369 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<nvurisrc_bin_queue> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.520898189 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<nvurisrc_bin_queue> completed state change to PAUSED
3:04:30.520907429 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<nvurisrc_bin_queue> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.520918539 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<dsnvurisrcbin1> child 'nvurisrc_bin_queue' changed state to 3(PAUSED) successfully
3:04:30.520928869 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<decodebin> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.520944930 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<nvv4l2decoder1> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.520955070 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<nvv4l2decoder1> completed state change to PAUSED
3:04:30.520983720 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<nvv4l2decoder1> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.520996250 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'nvv4l2decoder1' changed state to 3(PAUSED) successfully
3:04:30.521006620 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<capsfilter1> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521015460 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<capsfilter1> completed state change to PAUSED
3:04:30.521024650 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<capsfilter1> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521035630 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'capsfilter1' changed state to 3(PAUSED) successfully
3:04:30.521045970 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<h264parse1> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521055020 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<h264parse1> completed state change to PAUSED
3:04:30.521064390 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<h264parse1> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521075331 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'h264parse1' changed state to 3(PAUSED) successfully
3:04:30.521085321 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<multiqueue1> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521094311 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<multiqueue1> completed state change to PAUSED
3:04:30.521103501 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<multiqueue1> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521114281 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'multiqueue1' changed state to 3(PAUSED) successfully
3:04:30.521124351 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<tsdemux1> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521133351 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<tsdemux1> completed state change to PAUSED
3:04:30.521142521 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<tsdemux1> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521153551 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'tsdemux1' changed state to 3(PAUSED) successfully
3:04:30.521163671 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<typefind> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521172531 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<typefind> completed state change to PAUSED
3:04:30.521181171 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<typefind> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521192151 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<decodebin> child 'typefind' changed state to 3(PAUSED) successfully
3:04:30.521202251 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<decodebin> completed state change to PAUSED
3:04:30.521221242 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<decodebin> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521232922 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<dsnvurisrcbin1> child 'decodebin' changed state to 3(PAUSED) successfully
3:04:30.521242922 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<dec_que> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521251662 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2806:gst_element_continue_state:<dec_que> completed state change to PAUSED
3:04:30.521261652 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2706:_priv_gst_element_state_changed:<dec_que> notifying about state-changed PLAYING to PAUSED (VOID_PENDING pending)
3:04:30.521272552 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2928:gst_bin_change_state_func:<dsnvurisrcbin1> child 'dec_que' changed state to 3(PAUSED) successfully
3:04:30.521283062 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2479:gst_bin_element_set_state:<hlsdemux> current PLAYING pending VOID_PENDING, desired next PAUSED
3:04:30.521295362 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2944:gst_bin_change_state_func:<hlsdemux> child 'srcbin-src_0' failed to go to state 3(PAUSED)
3:04:30.521304062 1 0x555b99919ac0 INFO GST_STATES gstelement.c:3091:gst_element_change_state:<hlsdemux> have FAILURE change_state return
3:04:30.521313112 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2678:gst_element_abort_state:<hlsdemux> aborting state from PLAYING to PAUSED
3:04:30.521322762 1 0x555b99919ac0 INFO GST_STATES gstbin.c:2944:gst_bin_change_state_func:<dsnvurisrcbin1> child 'hlsdemux' failed to go to state 3(PAUSED)
3:04:30.521331402 1 0x555b99919ac0 INFO GST_STATES gstelement.c:3091:gst_element_change_state:<dsnvurisrcbin1> have FAILURE change_state return
3:04:30.521339892 1 0x555b99919ac0 INFO GST_STATES gstelement.c:2678:gst_element_abort_state:<dsnvurisrcbin1> aborting state from PLAYING to NULL
3:04:30.521348912 1 0x555b99919ac0 WARN default gst-nvmultiurisrcbincreator.cpp:1223:s_nvmultiurisrcbincreator_remove_source_impl:<uri-source_creator> Failed to set stop source-id:1
3:04:30.521357743 1 0x555b99919ac0 WARN nvmultiurisrcbin gstdsnvmultiurisrcbin.cpp:1514:gst_ds_nvmultiurisrc_bin_handle_message:<uri-source> Failed to remove sensor; the sensor might have gotten removed already
I’m currently testing gst_element_abort_state(hlsdemux);
… shotgun debugging.