1*4882a593SmuzhiyunFrom 14aeb6ae37c0f137d7f3038efc51d25f8f371751 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Tue, 20 Nov 2018 14:51:36 +0800
4*4882a593SmuzhiyunSubject: [PATCH 05/11] playbin3: Fix qt videoplayer cannot change video state
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunChange-Id: I765bbe0caebe333855bd16fdd0843e0257491246
7*4882a593SmuzhiyunSigned-off-by: shine.liu <shine.liu@rock-chips.com>
8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
9*4882a593Smuzhiyun---
10*4882a593Smuzhiyun gst/playback/gstplaybin3.c | 256 ++++++++++++++++++++++++++++++++++++-
11*4882a593Smuzhiyun 1 file changed, 252 insertions(+), 4 deletions(-)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyundiff --git a/gst/playback/gstplaybin3.c b/gst/playback/gstplaybin3.c
14*4882a593Smuzhiyunindex a732160..c22d9db 100644
15*4882a593Smuzhiyun--- a/gst/playback/gstplaybin3.c
16*4882a593Smuzhiyun+++ b/gst/playback/gstplaybin3.c
17*4882a593Smuzhiyun@@ -532,6 +532,16 @@ struct _GstPlayBin3Class
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun   /* get the last video sample and convert it to the given caps */
20*4882a593Smuzhiyun   GstSample *(*convert_sample) (GstPlayBin3 * playbin, GstCaps * caps);
21*4882a593Smuzhiyun+
22*4882a593Smuzhiyun+  /* notify app that number of audio/video/text streams changed */
23*4882a593Smuzhiyun+  void (*video_changed) (GstPlayBin3 * playbin);
24*4882a593Smuzhiyun+  void (*audio_changed) (GstPlayBin3 * playbin);
25*4882a593Smuzhiyun+  void (*text_changed) (GstPlayBin3 * playbin);
26*4882a593Smuzhiyun+
27*4882a593Smuzhiyun+  /* get audio/video/text tags for a stream */
28*4882a593Smuzhiyun+  GstTagList *(*get_video_tags) (GstPlayBin3 * playbin, gint stream);
29*4882a593Smuzhiyun+  GstTagList *(*get_audio_tags) (GstPlayBin3 * playbin, gint stream);
30*4882a593Smuzhiyun+  GstTagList *(*get_text_tags) (GstPlayBin3 * playbin, gint stream);
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* props */
34*4882a593Smuzhiyun@@ -565,6 +575,12 @@ enum
35*4882a593Smuzhiyun   PROP_SUBURI,
36*4882a593Smuzhiyun   PROP_CURRENT_SUBURI,
37*4882a593Smuzhiyun   PROP_FLAGS,
38*4882a593Smuzhiyun+  PROP_N_VIDEO,
39*4882a593Smuzhiyun+  PROP_CURRENT_VIDEO,
40*4882a593Smuzhiyun+  PROP_N_AUDIO,
41*4882a593Smuzhiyun+  PROP_CURRENT_AUDIO,
42*4882a593Smuzhiyun+  PROP_N_TEXT,
43*4882a593Smuzhiyun+  PROP_CURRENT_TEXT,
44*4882a593Smuzhiyun   PROP_SUBTITLE_ENCODING,
45*4882a593Smuzhiyun   PROP_AUDIO_SINK,
46*4882a593Smuzhiyun   PROP_VIDEO_SINK,
47*4882a593Smuzhiyun@@ -597,6 +613,12 @@ enum
48*4882a593Smuzhiyun   SIGNAL_CONVERT_SAMPLE,
49*4882a593Smuzhiyun   SIGNAL_SOURCE_SETUP,
50*4882a593Smuzhiyun   SIGNAL_ELEMENT_SETUP,
51*4882a593Smuzhiyun+  SIGNAL_VIDEO_CHANGED,
52*4882a593Smuzhiyun+  SIGNAL_AUDIO_CHANGED,
53*4882a593Smuzhiyun+  SIGNAL_TEXT_CHANGED,
54*4882a593Smuzhiyun+  SIGNAL_GET_VIDEO_TAGS,
55*4882a593Smuzhiyun+  SIGNAL_GET_AUDIO_TAGS,
56*4882a593Smuzhiyun+  SIGNAL_GET_TEXT_TAGS,
57*4882a593Smuzhiyun   LAST_SIGNAL
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun@@ -621,6 +643,13 @@ static void gst_play_bin3_deep_element_added (GstBin * playbin,
61*4882a593Smuzhiyun static gboolean gst_play_bin3_send_event (GstElement * element,
62*4882a593Smuzhiyun     GstEvent * event);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun+static GstTagList *gst_play_bin3_get_video_tags (GstPlayBin3 * playbin,
65*4882a593Smuzhiyun+    gint stream);
66*4882a593Smuzhiyun+static GstTagList *gst_play_bin3_get_audio_tags (GstPlayBin3 * playbin,
67*4882a593Smuzhiyun+    gint stream);
68*4882a593Smuzhiyun+static GstTagList *gst_play_bin3_get_text_tags (GstPlayBin3 * playbin,
69*4882a593Smuzhiyun+    gint stream);
70*4882a593Smuzhiyun+
71*4882a593Smuzhiyun static GstSample *gst_play_bin3_convert_sample (GstPlayBin3 * playbin,
72*4882a593Smuzhiyun     GstCaps * caps);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun@@ -755,6 +784,36 @@ gst_play_bin3_class_init (GstPlayBin3Class * klass)
75*4882a593Smuzhiyun           GST_TYPE_PLAY_FLAGS, DEFAULT_FLAGS,
76*4882a593Smuzhiyun           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_N_VIDEO,
79*4882a593Smuzhiyun+      g_param_spec_int ("n-video", "Number Video",
80*4882a593Smuzhiyun+          "Total number of video streams", 0, G_MAXINT, 0,
81*4882a593Smuzhiyun+          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
82*4882a593Smuzhiyun+
83*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_CURRENT_VIDEO,
84*4882a593Smuzhiyun+      g_param_spec_int ("current-video", "Current Video",
85*4882a593Smuzhiyun+          "Currently playing video stream (-1 = auto)",
86*4882a593Smuzhiyun+          -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
87*4882a593Smuzhiyun+
88*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_N_AUDIO,
89*4882a593Smuzhiyun+      g_param_spec_int ("n-audio", "Number Audio",
90*4882a593Smuzhiyun+          "Total number of audio streams", 0, G_MAXINT, 0,
91*4882a593Smuzhiyun+          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
92*4882a593Smuzhiyun+
93*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_CURRENT_AUDIO,
94*4882a593Smuzhiyun+      g_param_spec_int ("current-audio", "Current audio",
95*4882a593Smuzhiyun+          "Currently playing audio stream (-1 = auto)",
96*4882a593Smuzhiyun+          -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
97*4882a593Smuzhiyun+
98*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_N_TEXT,
99*4882a593Smuzhiyun+      g_param_spec_int ("n-text", "Number Text",
100*4882a593Smuzhiyun+          "Total number of text streams", 0, G_MAXINT, 0,
101*4882a593Smuzhiyun+          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
102*4882a593Smuzhiyun+
103*4882a593Smuzhiyun+  g_object_class_install_property (gobject_klass, PROP_CURRENT_TEXT,
104*4882a593Smuzhiyun+      g_param_spec_int ("current-text", "Current Text",
105*4882a593Smuzhiyun+          "Currently playing text stream (-1 = auto)",
106*4882a593Smuzhiyun+          -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
107*4882a593Smuzhiyun+
108*4882a593Smuzhiyun   g_object_class_install_property (gobject_klass, PROP_SUBTITLE_ENCODING,
109*4882a593Smuzhiyun       g_param_spec_string ("subtitle-encoding", "subtitle encoding",
110*4882a593Smuzhiyun           "Encoding to assume if input subtitles are not in UTF-8 encoding. "
111*4882a593Smuzhiyun@@ -1024,6 +1083,41 @@ gst_play_bin3_class_init (GstPlayBin3Class * klass)
112*4882a593Smuzhiyun       g_signal_new ("element-setup", G_TYPE_FROM_CLASS (klass),
113*4882a593Smuzhiyun       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_VIDEO_CHANGED] =
116*4882a593Smuzhiyun+      g_signal_new ("video-changed", G_TYPE_FROM_CLASS (klass),
117*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST,
118*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, video_changed), NULL, NULL,
119*4882a593Smuzhiyun+      g_cclosure_marshal_generic, G_TYPE_NONE, 0, G_TYPE_NONE);
120*4882a593Smuzhiyun+
121*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_AUDIO_CHANGED] =
122*4882a593Smuzhiyun+      g_signal_new ("audio-changed", G_TYPE_FROM_CLASS (klass),
123*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST,
124*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, audio_changed), NULL, NULL,
125*4882a593Smuzhiyun+      g_cclosure_marshal_generic, G_TYPE_NONE, 0, G_TYPE_NONE);
126*4882a593Smuzhiyun+
127*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_TEXT_CHANGED] =
128*4882a593Smuzhiyun+      g_signal_new ("text-changed", G_TYPE_FROM_CLASS (klass),
129*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST,
130*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, text_changed), NULL, NULL,
131*4882a593Smuzhiyun+      g_cclosure_marshal_generic, G_TYPE_NONE, 0, G_TYPE_NONE);
132*4882a593Smuzhiyun+
133*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_GET_VIDEO_TAGS] =
134*4882a593Smuzhiyun+      g_signal_new ("get-video-tags", G_TYPE_FROM_CLASS (klass),
135*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
136*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, get_video_tags), NULL, NULL,
137*4882a593Smuzhiyun+      g_cclosure_marshal_generic, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
138*4882a593Smuzhiyun+
139*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_GET_AUDIO_TAGS] =
140*4882a593Smuzhiyun+      g_signal_new ("get-audio-tags", G_TYPE_FROM_CLASS (klass),
141*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
142*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, get_audio_tags), NULL, NULL,
143*4882a593Smuzhiyun+      g_cclosure_marshal_generic, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
144*4882a593Smuzhiyun+
145*4882a593Smuzhiyun+  gst_play_bin3_signals[SIGNAL_GET_TEXT_TAGS] =
146*4882a593Smuzhiyun+      g_signal_new ("get-text-tags", G_TYPE_FROM_CLASS (klass),
147*4882a593Smuzhiyun+      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
148*4882a593Smuzhiyun+      G_STRUCT_OFFSET (GstPlayBin3Class, get_text_tags), NULL, NULL,
149*4882a593Smuzhiyun+      g_cclosure_marshal_generic, GST_TYPE_TAG_LIST, 1, G_TYPE_INT);
150*4882a593Smuzhiyun   /**
151*4882a593Smuzhiyun    * GstPlayBin3::convert-sample
152*4882a593Smuzhiyun    * @playbin: a #GstPlayBin3
153*4882a593Smuzhiyun@@ -1045,6 +1139,10 @@ gst_play_bin3_class_init (GstPlayBin3Class * klass)
154*4882a593Smuzhiyun       G_STRUCT_OFFSET (GstPlayBin3Class, convert_sample), NULL, NULL,
155*4882a593Smuzhiyun       NULL, GST_TYPE_SAMPLE, 1, GST_TYPE_CAPS);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun+  klass->get_video_tags = gst_play_bin3_get_video_tags;
158*4882a593Smuzhiyun+  klass->get_audio_tags = gst_play_bin3_get_audio_tags;
159*4882a593Smuzhiyun+  klass->get_text_tags = gst_play_bin3_get_text_tags;
160*4882a593Smuzhiyun+
161*4882a593Smuzhiyun   klass->convert_sample = gst_play_bin3_convert_sample;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun   gst_element_class_set_static_metadata (gstelement_klass,
164*4882a593Smuzhiyun@@ -1559,6 +1657,72 @@ get_group (GstPlayBin3 * playbin)
165*4882a593Smuzhiyun   return result;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun+static GstTagList *
169*4882a593Smuzhiyun+get_tags (GstPlayBin3 * playbin, gint type, gint stream)
170*4882a593Smuzhiyun+{
171*4882a593Smuzhiyun+  GstTagList *result;
172*4882a593Smuzhiyun+  GPtrArray *channels;
173*4882a593Smuzhiyun+  GstPad *sinkpad;
174*4882a593Smuzhiyun+
175*4882a593Smuzhiyun+  switch (type) {
176*4882a593Smuzhiyun+    case PLAYBIN_STREAM_AUDIO:
177*4882a593Smuzhiyun+      channels = playbin->combiner[PLAYBIN_STREAM_AUDIO].streams;
178*4882a593Smuzhiyun+      break;
179*4882a593Smuzhiyun+    case PLAYBIN_STREAM_VIDEO:
180*4882a593Smuzhiyun+      channels = playbin->combiner[PLAYBIN_STREAM_VIDEO].streams;
181*4882a593Smuzhiyun+      break;
182*4882a593Smuzhiyun+    case PLAYBIN_STREAM_TEXT:
183*4882a593Smuzhiyun+      channels = playbin->combiner[PLAYBIN_STREAM_TEXT].streams;
184*4882a593Smuzhiyun+      break;
185*4882a593Smuzhiyun+    default:
186*4882a593Smuzhiyun+      channels = NULL;
187*4882a593Smuzhiyun+      break;
188*4882a593Smuzhiyun+  }
189*4882a593Smuzhiyun+
190*4882a593Smuzhiyun+  if (!channels || stream >= channels->len)
191*4882a593Smuzhiyun+    return NULL;
192*4882a593Smuzhiyun+
193*4882a593Smuzhiyun+  sinkpad = g_ptr_array_index (channels, stream);
194*4882a593Smuzhiyun+  g_object_get (sinkpad, "tags", &result, NULL);
195*4882a593Smuzhiyun+
196*4882a593Smuzhiyun+  return result;
197*4882a593Smuzhiyun+}
198*4882a593Smuzhiyun+
199*4882a593Smuzhiyun+static GstTagList *
200*4882a593Smuzhiyun+gst_play_bin3_get_video_tags (GstPlayBin3 * playbin, gint stream)
201*4882a593Smuzhiyun+{
202*4882a593Smuzhiyun+  GstTagList *result;
203*4882a593Smuzhiyun+
204*4882a593Smuzhiyun+  GST_PLAY_BIN3_LOCK (playbin);
205*4882a593Smuzhiyun+  result = get_tags (playbin, PLAYBIN_STREAM_VIDEO, stream);
206*4882a593Smuzhiyun+  GST_PLAY_BIN3_UNLOCK (playbin);
207*4882a593Smuzhiyun+
208*4882a593Smuzhiyun+  return result;
209*4882a593Smuzhiyun+}
210*4882a593Smuzhiyun+
211*4882a593Smuzhiyun+static GstTagList *
212*4882a593Smuzhiyun+gst_play_bin3_get_audio_tags (GstPlayBin3 * playbin, gint stream)
213*4882a593Smuzhiyun+{
214*4882a593Smuzhiyun+  GstTagList *result;
215*4882a593Smuzhiyun+
216*4882a593Smuzhiyun+  GST_PLAY_BIN3_LOCK (playbin);
217*4882a593Smuzhiyun+  result = get_tags (playbin, PLAYBIN_STREAM_AUDIO, stream);
218*4882a593Smuzhiyun+  GST_PLAY_BIN3_UNLOCK (playbin);
219*4882a593Smuzhiyun+
220*4882a593Smuzhiyun+  return result;
221*4882a593Smuzhiyun+}
222*4882a593Smuzhiyun+
223*4882a593Smuzhiyun+static GstTagList *
224*4882a593Smuzhiyun+gst_play_bin3_get_text_tags (GstPlayBin3 * playbin, gint stream)
225*4882a593Smuzhiyun+{
226*4882a593Smuzhiyun+  GstTagList *result;
227*4882a593Smuzhiyun+
228*4882a593Smuzhiyun+  GST_PLAY_BIN3_LOCK (playbin);
229*4882a593Smuzhiyun+  result = get_tags (playbin, PLAYBIN_STREAM_TEXT, stream);
230*4882a593Smuzhiyun+  GST_PLAY_BIN3_UNLOCK (playbin);
231*4882a593Smuzhiyun+
232*4882a593Smuzhiyun+  return result;
233*4882a593Smuzhiyun+}
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun static GstSample *
236*4882a593Smuzhiyun gst_play_bin3_convert_sample (GstPlayBin3 * playbin, GstCaps * caps)
237*4882a593Smuzhiyun@@ -1772,6 +1936,15 @@ gst_play_bin3_set_property (GObject * object, guint prop_id,
238*4882a593Smuzhiyun         GST_SOURCE_GROUP_UNLOCK (playbin->curr_group);
239*4882a593Smuzhiyun       }
240*4882a593Smuzhiyun       break;
241*4882a593Smuzhiyun+    case PROP_CURRENT_VIDEO:
242*4882a593Smuzhiyun+      gst_play_bin3_set_current_video_stream (playbin, g_value_get_int (value));
243*4882a593Smuzhiyun+      break;
244*4882a593Smuzhiyun+    case PROP_CURRENT_AUDIO:
245*4882a593Smuzhiyun+      gst_play_bin3_set_current_audio_stream (playbin, g_value_get_int (value));
246*4882a593Smuzhiyun+      break;
247*4882a593Smuzhiyun+    case PROP_CURRENT_TEXT:
248*4882a593Smuzhiyun+      gst_play_bin3_set_current_text_stream (playbin, g_value_get_int (value));
249*4882a593Smuzhiyun+      break;
250*4882a593Smuzhiyun     case PROP_SUBTITLE_ENCODING:
251*4882a593Smuzhiyun       gst_play_bin3_set_encoding (playbin, g_value_get_string (value));
252*4882a593Smuzhiyun       break;
253*4882a593Smuzhiyun@@ -1960,6 +2133,57 @@ gst_play_bin3_get_property (GObject * object, guint prop_id, GValue * value,
254*4882a593Smuzhiyun     case PROP_FLAGS:
255*4882a593Smuzhiyun       g_value_set_flags (value, gst_play_bin3_get_flags (playbin));
256*4882a593Smuzhiyun       break;
257*4882a593Smuzhiyun+    case PROP_N_VIDEO:
258*4882a593Smuzhiyun+    {
259*4882a593Smuzhiyun+      gint n_video;
260*4882a593Smuzhiyun+
261*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
262*4882a593Smuzhiyun+      n_video =
263*4882a593Smuzhiyun+          (playbin->combiner[PLAYBIN_STREAM_VIDEO].streams ? playbin->
264*4882a593Smuzhiyun+          combiner[PLAYBIN_STREAM_VIDEO].streams->len : 0);
265*4882a593Smuzhiyun+      g_value_set_int (value, n_video);
266*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
267*4882a593Smuzhiyun+      break;
268*4882a593Smuzhiyun+    }
269*4882a593Smuzhiyun+    case PROP_CURRENT_VIDEO:
270*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
271*4882a593Smuzhiyun+      g_value_set_int (value, playbin->current_video);
272*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
273*4882a593Smuzhiyun+      break;
274*4882a593Smuzhiyun+    case PROP_N_AUDIO:
275*4882a593Smuzhiyun+    {
276*4882a593Smuzhiyun+      gint n_audio;
277*4882a593Smuzhiyun+
278*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
279*4882a593Smuzhiyun+      n_audio =
280*4882a593Smuzhiyun+          (playbin->combiner[PLAYBIN_STREAM_AUDIO].streams ? playbin->
281*4882a593Smuzhiyun+          combiner[PLAYBIN_STREAM_AUDIO].streams->len : 0);
282*4882a593Smuzhiyun+      g_value_set_int (value, n_audio);
283*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
284*4882a593Smuzhiyun+      break;
285*4882a593Smuzhiyun+    }
286*4882a593Smuzhiyun+    case PROP_CURRENT_AUDIO:
287*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
288*4882a593Smuzhiyun+      g_value_set_int (value, playbin->current_audio);
289*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
290*4882a593Smuzhiyun+      break;
291*4882a593Smuzhiyun+    case PROP_N_TEXT:
292*4882a593Smuzhiyun+    {
293*4882a593Smuzhiyun+      gint n_text;
294*4882a593Smuzhiyun+
295*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
296*4882a593Smuzhiyun+      n_text =
297*4882a593Smuzhiyun+          (playbin->combiner[PLAYBIN_STREAM_TEXT].streams ? playbin->
298*4882a593Smuzhiyun+          combiner[PLAYBIN_STREAM_TEXT].streams->len : 0);
299*4882a593Smuzhiyun+      g_value_set_int (value, n_text);
300*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
301*4882a593Smuzhiyun+      break;
302*4882a593Smuzhiyun+    }
303*4882a593Smuzhiyun+    case PROP_CURRENT_TEXT:
304*4882a593Smuzhiyun+      GST_PLAY_BIN3_LOCK (playbin);
305*4882a593Smuzhiyun+      g_value_set_int (value, playbin->current_text);
306*4882a593Smuzhiyun+      GST_PLAY_BIN3_UNLOCK (playbin);
307*4882a593Smuzhiyun+      break;
308*4882a593Smuzhiyun     case PROP_SUBTITLE_ENCODING:
309*4882a593Smuzhiyun       GST_PLAY_BIN3_LOCK (playbin);
310*4882a593Smuzhiyun       g_value_take_string (value,
311*4882a593Smuzhiyun@@ -2569,9 +2793,7 @@ gst_play_bin3_handle_message (GstBin * bin, GstMessage * msg)
312*4882a593Smuzhiyun       if (target_group)
313*4882a593Smuzhiyun         gst_object_replace ((GstObject **) & target_group->collection,
314*4882a593Smuzhiyun             (GstObject *) collection);
315*4882a593Smuzhiyun-      /* FIXME: Only do the following if it's the current group? */
316*4882a593Smuzhiyun-      if (target_group == playbin->curr_group)
317*4882a593Smuzhiyun-        update_combiner_info (playbin, target_group->collection);
318*4882a593Smuzhiyun+      update_combiner_info (playbin, target_group->collection);
319*4882a593Smuzhiyun       if (pstate)
320*4882a593Smuzhiyun         playbin->do_stream_selections = FALSE;
321*4882a593Smuzhiyun       do_stream_selection (playbin, target_group);
322*4882a593Smuzhiyun@@ -3068,6 +3290,8 @@ pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstSourceGroup * group)
323*4882a593Smuzhiyun   gchar *pad_name;
324*4882a593Smuzhiyun   GstPlayBin3 *playbin = group->playbin;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun+  gboolean changed = FALSE;
327*4882a593Smuzhiyun+
328*4882a593Smuzhiyun   GST_PLAY_BIN3_SHUTDOWN_LOCK (playbin, shutdown);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun   pad_name = gst_object_get_name (GST_OBJECT (pad));
331*4882a593Smuzhiyun@@ -3096,7 +3320,8 @@ pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstSourceGroup * group)
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun   combine = &playbin->combiner[pb_stream_type];
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun-  combiner_control_pad (playbin, combine, pad);
336*4882a593Smuzhiyun+  if (combiner_control_pad (playbin, combine, pad))
337*4882a593Smuzhiyun+    changed = combine->combiner ? TRUE : FALSE;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun   control_source_pad (group, pad, combine->stream_type);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun@@ -3111,6 +3336,29 @@ pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstSourceGroup * group)
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun   GST_PLAY_BIN3_SHUTDOWN_UNLOCK (playbin);
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun+  if (changed) {
346*4882a593Smuzhiyun+    int signal;
347*4882a593Smuzhiyun+
348*4882a593Smuzhiyun+    switch (combine->type) {
349*4882a593Smuzhiyun+      case GST_PLAY_SINK_TYPE_VIDEO:
350*4882a593Smuzhiyun+        signal = SIGNAL_VIDEO_CHANGED;
351*4882a593Smuzhiyun+        break;
352*4882a593Smuzhiyun+      case GST_PLAY_SINK_TYPE_AUDIO:
353*4882a593Smuzhiyun+        signal = SIGNAL_AUDIO_CHANGED;
354*4882a593Smuzhiyun+        break;
355*4882a593Smuzhiyun+      case GST_PLAY_SINK_TYPE_TEXT:
356*4882a593Smuzhiyun+        signal = SIGNAL_TEXT_CHANGED;
357*4882a593Smuzhiyun+        break;
358*4882a593Smuzhiyun+      default:
359*4882a593Smuzhiyun+        signal = -1;
360*4882a593Smuzhiyun+    }
361*4882a593Smuzhiyun+
362*4882a593Smuzhiyun+    if (signal >= 0) {
363*4882a593Smuzhiyun+      g_signal_emit (G_OBJECT (playbin), gst_play_bin3_signals[signal], 0,
364*4882a593Smuzhiyun+          NULL);
365*4882a593Smuzhiyun+    }
366*4882a593Smuzhiyun+  }
367*4882a593Smuzhiyun+
368*4882a593Smuzhiyun   return;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun   /* ERRORS */
371*4882a593Smuzhiyun--
372*4882a593Smuzhiyun2.20.1
373*4882a593Smuzhiyun
374