1*4882a593SmuzhiyunFrom 2faeb4dccb5828dfa1d98fb1a4bad188537bed3f Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Mon, 3 Oct 2022 15:07:33 +0800 4*4882a593SmuzhiyunSubject: [PATCH 4/4] gst-launch: Fix random hang when EOS 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThere's a race between the async initial pause and initial play. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunWhen the async pausing message arrives later than the playing one, the 9*4882a593Smuzhiyungstbin's state machine would be confused. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 12*4882a593Smuzhiyun--- 13*4882a593Smuzhiyun tools/gst-launch.c | 12 ++++++++++++ 14*4882a593Smuzhiyun 1 file changed, 12 insertions(+) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyundiff --git a/tools/gst-launch.c b/tools/gst-launch.c 17*4882a593Smuzhiyunindex 7d93993..fc3aa16 100644 18*4882a593Smuzhiyun--- a/tools/gst-launch.c 19*4882a593Smuzhiyun+++ b/tools/gst-launch.c 20*4882a593Smuzhiyun@@ -82,6 +82,7 @@ static gboolean eos_on_shutdown = FALSE; 21*4882a593Smuzhiyun static gchar **exclude_args = NULL; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* pipeline status */ 24*4882a593Smuzhiyun+static gboolean pending_async_done = FALSE; 25*4882a593Smuzhiyun static gboolean is_live = FALSE; 26*4882a593Smuzhiyun static gboolean buffering = FALSE; 27*4882a593Smuzhiyun static LaunchExitCode last_launch_code = LEC_NO_ERROR; 28*4882a593Smuzhiyun@@ -741,12 +742,22 @@ bus_handler (GstBus * bus, GstMessage * message, gpointer data) 29*4882a593Smuzhiyun PRINT (_("Prerolled, waiting for progress to finish...\n")); 30*4882a593Smuzhiyun break; 31*4882a593Smuzhiyun } 32*4882a593Smuzhiyun+ if (pending_async_done) { 33*4882a593Smuzhiyun+ PRINT (_("Prerolled, waiting for async message to finish...\n")); 34*4882a593Smuzhiyun+ break; 35*4882a593Smuzhiyun+ } 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun do_initial_play (pipeline); 38*4882a593Smuzhiyun } 39*4882a593Smuzhiyun /* else not an interesting message */ 40*4882a593Smuzhiyun break; 41*4882a593Smuzhiyun } 42*4882a593Smuzhiyun+ case GST_MESSAGE_ASYNC_DONE: 43*4882a593Smuzhiyun+ { 44*4882a593Smuzhiyun+ if (target_state == GST_STATE_PAUSED) 45*4882a593Smuzhiyun+ do_initial_play (pipeline); 46*4882a593Smuzhiyun+ break; 47*4882a593Smuzhiyun+ } 48*4882a593Smuzhiyun case GST_MESSAGE_BUFFERING:{ 49*4882a593Smuzhiyun gint percent; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun@@ -1279,6 +1290,7 @@ real_main (int argc, char *argv[]) 52*4882a593Smuzhiyun break; 53*4882a593Smuzhiyun case GST_STATE_CHANGE_ASYNC: 54*4882a593Smuzhiyun PRINT (_("Pipeline is PREROLLING ...\n")); 55*4882a593Smuzhiyun+ pending_async_done = TRUE; 56*4882a593Smuzhiyun break; 57*4882a593Smuzhiyun default: 58*4882a593Smuzhiyun break; 59*4882a593Smuzhiyun-- 60*4882a593Smuzhiyun2.20.1 61*4882a593Smuzhiyun 62