gst-launch: go back down to GST_STATE_NULL in one step.

Going through each state on the way back down to GST_STATE_NULL
can cause deadlocks, for example:

gst-launch-1.0 audiotestsrc ! valve drop=true ! autoaudiosink

ctrl + C

Hangs forever when going to PAUSED, because the "final" state is
ASYNC, and the sink blocks waiting for a preroll buffer.

Going straight to NULL addresses this issue, and also helps
making teardown faster when piping sparse streams to a
sync sink.
This commit is contained in:
Mathieu Duponchelle 2020-04-01 15:41:49 +02:00
parent e906197c62
commit c682579c5e

View file

@ -1160,7 +1160,6 @@ main (int argc, char *argv[])
loop = g_main_loop_new (NULL, FALSE);
if (!savefile) {
GstState state, pending;
GstStateChangeReturn ret;
GstBus *bus;
@ -1263,22 +1262,10 @@ main (int argc, char *argv[])
}
}
PRINT (_("Setting pipeline to PAUSED ...\n"));
gst_element_set_state (pipeline, GST_STATE_PAUSED);
if (last_launch_code == LEC_NO_ERROR)
gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
/* iterate mainloop to process pending stuff */
while (g_main_context_iteration (NULL, FALSE));
/* No need to see all those pad caps going to NULL etc., it's just noise */
if (deep_notify_id != 0)
g_signal_handler_disconnect (pipeline, deep_notify_id);
PRINT (_("Setting pipeline to READY ...\n"));
gst_element_set_state (pipeline, GST_STATE_READY);
gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
#if 0
if (check_index) {
print_index_stats (index_stats);