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