1*4882a593SmuzhiyunFrom c193043d8bc9731674d2a055d5b3ce97c3e33ff2 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/14] 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 | 252 +++++++++++++++++++++++++++++++++++++ 11*4882a593Smuzhiyun 1 file changed, 252 insertions(+) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/gst/playback/gstplaybin3.c b/gst/playback/gstplaybin3.c 14*4882a593Smuzhiyunindex 46eb478..f059474 100644 15*4882a593Smuzhiyun--- a/gst/playback/gstplaybin3.c 16*4882a593Smuzhiyun+++ b/gst/playback/gstplaybin3.c 17*4882a593Smuzhiyun@@ -388,6 +388,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@@ -421,6 +431,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@@ -454,6 +470,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@@ -473,6 +495,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@@ -610,6 +639,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@@ -893,6 +952,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@@ -914,6 +1008,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@@ -1232,6 +1330,73 @@ gst_play_bin3_set_flags (GstPlayBin3 * playbin, GstPlayFlags flags) 165*4882a593Smuzhiyun "use-buffering", ((flags & GST_PLAY_FLAG_BUFFERING) != 0), NULL); 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 { 238*4882a593Smuzhiyun@@ -1435,6 +1600,15 @@ gst_play_bin3_set_property (GObject * object, guint prop_id, 239*4882a593Smuzhiyun case PROP_FLAGS: 240*4882a593Smuzhiyun gst_play_bin3_set_flags (playbin, g_value_get_flags (value)); 241*4882a593Smuzhiyun break; 242*4882a593Smuzhiyun+ case PROP_CURRENT_VIDEO: 243*4882a593Smuzhiyun+ gst_play_bin3_set_current_video_stream (playbin, g_value_get_int (value)); 244*4882a593Smuzhiyun+ break; 245*4882a593Smuzhiyun+ case PROP_CURRENT_AUDIO: 246*4882a593Smuzhiyun+ gst_play_bin3_set_current_audio_stream (playbin, g_value_get_int (value)); 247*4882a593Smuzhiyun+ break; 248*4882a593Smuzhiyun+ case PROP_CURRENT_TEXT: 249*4882a593Smuzhiyun+ gst_play_bin3_set_current_text_stream (playbin, g_value_get_int (value)); 250*4882a593Smuzhiyun+ break; 251*4882a593Smuzhiyun case PROP_SUBTITLE_ENCODING: 252*4882a593Smuzhiyun gst_play_bin3_set_encoding (playbin, g_value_get_string (value)); 253*4882a593Smuzhiyun break; 254*4882a593Smuzhiyun@@ -1595,6 +1769,57 @@ gst_play_bin3_get_property (GObject * object, guint prop_id, GValue * value, 255*4882a593Smuzhiyun case PROP_FLAGS: 256*4882a593Smuzhiyun g_value_set_flags (value, gst_play_sink_get_flags (playbin->playsink)); 257*4882a593Smuzhiyun break; 258*4882a593Smuzhiyun+ case PROP_N_VIDEO: 259*4882a593Smuzhiyun+ { 260*4882a593Smuzhiyun+ gint n_video; 261*4882a593Smuzhiyun+ 262*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 263*4882a593Smuzhiyun+ n_video = 264*4882a593Smuzhiyun+ (playbin->combiner[PLAYBIN_STREAM_VIDEO].streams ? playbin-> 265*4882a593Smuzhiyun+ combiner[PLAYBIN_STREAM_VIDEO].streams->len : 0); 266*4882a593Smuzhiyun+ g_value_set_int (value, n_video); 267*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 268*4882a593Smuzhiyun+ break; 269*4882a593Smuzhiyun+ } 270*4882a593Smuzhiyun+ case PROP_CURRENT_VIDEO: 271*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 272*4882a593Smuzhiyun+ g_value_set_int (value, playbin->current_video); 273*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 274*4882a593Smuzhiyun+ break; 275*4882a593Smuzhiyun+ case PROP_N_AUDIO: 276*4882a593Smuzhiyun+ { 277*4882a593Smuzhiyun+ gint n_audio; 278*4882a593Smuzhiyun+ 279*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 280*4882a593Smuzhiyun+ n_audio = 281*4882a593Smuzhiyun+ (playbin->combiner[PLAYBIN_STREAM_AUDIO].streams ? playbin-> 282*4882a593Smuzhiyun+ combiner[PLAYBIN_STREAM_AUDIO].streams->len : 0); 283*4882a593Smuzhiyun+ g_value_set_int (value, n_audio); 284*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 285*4882a593Smuzhiyun+ break; 286*4882a593Smuzhiyun+ } 287*4882a593Smuzhiyun+ case PROP_CURRENT_AUDIO: 288*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 289*4882a593Smuzhiyun+ g_value_set_int (value, playbin->current_audio); 290*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 291*4882a593Smuzhiyun+ break; 292*4882a593Smuzhiyun+ case PROP_N_TEXT: 293*4882a593Smuzhiyun+ { 294*4882a593Smuzhiyun+ gint n_text; 295*4882a593Smuzhiyun+ 296*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 297*4882a593Smuzhiyun+ n_text = 298*4882a593Smuzhiyun+ (playbin->combiner[PLAYBIN_STREAM_TEXT].streams ? playbin-> 299*4882a593Smuzhiyun+ combiner[PLAYBIN_STREAM_TEXT].streams->len : 0); 300*4882a593Smuzhiyun+ g_value_set_int (value, n_text); 301*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 302*4882a593Smuzhiyun+ break; 303*4882a593Smuzhiyun+ } 304*4882a593Smuzhiyun+ case PROP_CURRENT_TEXT: 305*4882a593Smuzhiyun+ GST_PLAY_BIN3_LOCK (playbin); 306*4882a593Smuzhiyun+ g_value_set_int (value, playbin->current_text); 307*4882a593Smuzhiyun+ GST_PLAY_BIN3_UNLOCK (playbin); 308*4882a593Smuzhiyun+ break; 309*4882a593Smuzhiyun case PROP_SUBTITLE_ENCODING: 310*4882a593Smuzhiyun GST_PLAY_BIN3_LOCK (playbin); 311*4882a593Smuzhiyun g_value_take_string (value, 312*4882a593Smuzhiyun@@ -2429,6 +2654,7 @@ pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstPlayBin3 * playbin) 313*4882a593Smuzhiyun gchar *pad_name; 314*4882a593Smuzhiyun GstPad *combine_pad; 315*4882a593Smuzhiyun GstStreamType selected, active, cur; 316*4882a593Smuzhiyun+ gboolean changed = FALSE; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun pad_name = gst_object_get_name (GST_OBJECT (pad)); 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun@@ -2476,10 +2702,36 @@ pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstPlayBin3 * playbin) 321*4882a593Smuzhiyun } 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun combine_pad = combiner_control_pad (playbin, combine, pad); 324*4882a593Smuzhiyun+ if (combine_pad) 325*4882a593Smuzhiyun+ changed = combine->combiner ? TRUE : FALSE; 326*4882a593Smuzhiyun+ 327*4882a593Smuzhiyun control_source_pad (playbin, pad, combine_pad, combine->stream_type); 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun GST_PLAY_BIN3_UNLOCK (playbin); 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun+ if (changed) { 332*4882a593Smuzhiyun+ int signal; 333*4882a593Smuzhiyun+ 334*4882a593Smuzhiyun+ switch (combine->stream_type) { 335*4882a593Smuzhiyun+ case GST_STREAM_TYPE_VIDEO: 336*4882a593Smuzhiyun+ signal = SIGNAL_VIDEO_CHANGED; 337*4882a593Smuzhiyun+ break; 338*4882a593Smuzhiyun+ case GST_STREAM_TYPE_AUDIO: 339*4882a593Smuzhiyun+ signal = SIGNAL_AUDIO_CHANGED; 340*4882a593Smuzhiyun+ break; 341*4882a593Smuzhiyun+ case GST_STREAM_TYPE_TEXT: 342*4882a593Smuzhiyun+ signal = SIGNAL_TEXT_CHANGED; 343*4882a593Smuzhiyun+ break; 344*4882a593Smuzhiyun+ default: 345*4882a593Smuzhiyun+ signal = -1; 346*4882a593Smuzhiyun+ } 347*4882a593Smuzhiyun+ 348*4882a593Smuzhiyun+ if (signal >= 0) { 349*4882a593Smuzhiyun+ g_signal_emit (G_OBJECT (playbin), gst_play_bin3_signals[signal], 0, 350*4882a593Smuzhiyun+ NULL); 351*4882a593Smuzhiyun+ } 352*4882a593Smuzhiyun+ } 353*4882a593Smuzhiyun+ 354*4882a593Smuzhiyun return; 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun /* ERRORS */ 357*4882a593Smuzhiyun-- 358*4882a593Smuzhiyun2.20.1 359*4882a593Smuzhiyun 360