playsink: Properly mark pending blocked pads
authorEdward Hervey <edward@centricular.com>
Fri, 15 Jan 2016 08:50:29 +0000 (09:50 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Fri, 15 Jan 2016 09:05:58 +0000 (10:05 +0100)
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 :)

gst/playback/gstplaysink.c

index e126d18..202de92 100644 (file)
@@ -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);