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