summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@centricular.com>2016-01-15 09:50:29 +0100
committerTim-Philipp Müller <tim@centricular.com>2016-01-16 21:59:51 +0000
commit3bc67006d4075f5bcbaa7de68230c8b0f551d44a (patch)
tree2b702d2f2f5c918d6c6332d1a40649952359e6ac
parentb3d2160144dafec616b375f2d049182ac21d7f82 (diff)
downloadgstreamer-plugins-base-3bc67006d4075f5bcbaa7de68230c8b0f551d44a.tar.gz
playsink: Properly mark pending blocked pads
When blocking input pads, we also need to properly set the appropriate pending flag. Without this, when switching stream types after initial configuration (like going from Audio+Video to Audio+Video+Sub) playsink would never wait for *all* input streams to be blocked (it would just wait for the new input pad (text in this case) to be blocked). Since the reconfiguration might introduce unlinking/relinking of elements, we need to ensure that *ALL* input streams are blocked. Failure to do so would result in having some input streams pushing data to inactive elements (returning GST_FLOW_FLUSHING) or unlinked pads (returning GST_FLOW_NOT_LINKED). A later optimization could involve only blocking the input pads that might be involved in reconfiguration. But better be safe than sorry for now :)
-rw-r--r--gst/playback/gstplaysink.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
index c2308678c..765cf7ee5 100644
--- a/gst/playback/gstplaysink.c
+++ b/gst/playback/gstplaysink.c
@@ -4155,7 +4155,7 @@ video_set_blocked (GstPlaySink * playsink, gboolean blocked)
gst_pad_remove_probe (((GstPlayVisChain *) playsink->vischain)->
blockpad, playsink->vis_pad_block_id);
playsink->vis_pad_block_id = 0;
-
+ PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_VIDEO);
playsink->video_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -4183,6 +4183,7 @@ audio_set_blocked (GstPlaySink * playsink, gboolean blocked)
blockpad, playsink->vis_pad_block_id);
playsink->vis_pad_block_id = 0;
+ PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_AUDIO);
playsink->audio_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);
@@ -4215,6 +4216,7 @@ text_set_blocked (GstPlaySink * playsink, gboolean blocked)
blockpad, playsink->vis_pad_block_id);
playsink->vis_pad_block_id = 0;
+ PENDING_FLAG_SET (playsink, GST_PLAY_SINK_TYPE_TEXT);
playsink->text_block_id =
gst_pad_add_probe (opad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
sinkpad_blocked_cb, playsink, NULL);