1*4882a593SmuzhiyunFrom 77af65033203b49b23640f856df964e7a6b5868b Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: =?UTF-8?q?St=C3=A9phane=20Cerveau?= <scerveau@collabora.com> 3*4882a593SmuzhiyunDate: Mon, 9 Aug 2021 15:38:08 +0200 4*4882a593SmuzhiyunSubject: [PATCH 02/11] playbin2: send one about-to-finish per group 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunTo avoid multiple about-to-finish signal, 7*4882a593Smuzhiyundriving the app to drop uris, a group should 8*4882a593Smuzhiyunsignal "about-to-finish" and setup a next uri 9*4882a593Smuzhiyunonly one time. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunFixes #930 12*4882a593Smuzhiyun--- 13*4882a593Smuzhiyun gst/playback/gstplaybin2.c | 11 +++++++++++ 14*4882a593Smuzhiyun 1 file changed, 11 insertions(+) 15*4882a593Smuzhiyun 16*4882a593Smuzhiyundiff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c 17*4882a593Smuzhiyunindex bcbfc20..3a441af 100644 18*4882a593Smuzhiyun--- a/gst/playback/gstplaybin2.c 19*4882a593Smuzhiyun+++ b/gst/playback/gstplaybin2.c 20*4882a593Smuzhiyun@@ -319,6 +319,9 @@ struct _GstSourceGroup 21*4882a593Smuzhiyun GstElement *video_sink; 22*4882a593Smuzhiyun GstElement *text_sink; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun+ /* Avoid multiple about to finish handling */ 25*4882a593Smuzhiyun+ gboolean pending_about_to_finish; 26*4882a593Smuzhiyun+ 27*4882a593Smuzhiyun /* uridecodebins for uri and subtitle uri */ 28*4882a593Smuzhiyun GstElement *uridecodebin; 29*4882a593Smuzhiyun GstElement *suburidecodebin; 30*4882a593Smuzhiyun@@ -3933,6 +3936,12 @@ drained_cb (GstElement * decodebin, GstSourceGroup * group) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun GST_DEBUG_OBJECT (playbin, "about to finish in group %p", group); 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun+ if (group->pending_about_to_finish) { 35*4882a593Smuzhiyun+ GST_DEBUG_OBJECT (playbin, 36*4882a593Smuzhiyun+ "Pending about to finish for group uri %s, do not handle.", group->uri); 37*4882a593Smuzhiyun+ return; 38*4882a593Smuzhiyun+ } 39*4882a593Smuzhiyun+ 40*4882a593Smuzhiyun /* after this call, we should have a next group to activate or we EOS */ 41*4882a593Smuzhiyun g_signal_emit (G_OBJECT (playbin), 42*4882a593Smuzhiyun gst_play_bin_signals[SIGNAL_ABOUT_TO_FINISH], 0, NULL); 43*4882a593Smuzhiyun@@ -3940,6 +3949,7 @@ drained_cb (GstElement * decodebin, GstSourceGroup * group) 44*4882a593Smuzhiyun /* now activate the next group. If the app did not set a uri, this will 45*4882a593Smuzhiyun * fail and we can do EOS */ 46*4882a593Smuzhiyun setup_next_source (playbin, GST_STATE_PAUSED); 47*4882a593Smuzhiyun+ group->pending_about_to_finish = TRUE; 48*4882a593Smuzhiyun } 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Like gst_element_factory_can_sink_any_caps() but doesn't 51*4882a593Smuzhiyun@@ -5515,6 +5525,7 @@ activate_group (GstPlayBin * playbin, GstSourceGroup * group, GstState target) 52*4882a593Smuzhiyun /* allow state changes of the playbin affect the group elements now */ 53*4882a593Smuzhiyun group_set_locked_state_unlocked (playbin, group, FALSE); 54*4882a593Smuzhiyun group->active = TRUE; 55*4882a593Smuzhiyun+ group->pending_about_to_finish = FALSE; 56*4882a593Smuzhiyun GST_SOURCE_GROUP_UNLOCK (group); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun return state_ret; 59*4882a593Smuzhiyun-- 60*4882a593Smuzhiyun2.20.1 61*4882a593Smuzhiyun 62