gboolean async_pending;
gboolean need_async_start;
+ gboolean reconfigure_pending;
GstPlayFlags flags;
static void gst_play_sink_colorbalance_init (gpointer g_iface,
gpointer g_iface_data);
+static gboolean is_raw_pad (GstPad * pad);
+
static void
_do_init_type (GType type)
{
need_text = TRUE;
}
+ if (playsink->video_pad) {
+ playsink->video_pad_raw = is_raw_pad (playsink->video_pad);
+ GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d",
+ playsink->video_pad_raw);
+ }
+
+ if (playsink->audio_pad) {
+ playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad);
+ GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d",
+ playsink->audio_pad_raw);
+ }
+
+
if (((flags & GST_PLAY_FLAG_VIDEO)
|| (flags & GST_PLAY_FLAG_NATIVE_VIDEO)) && playsink->video_pad) {
/* we have video and we are requested to show it */
update_av_offset (playsink);
update_text_offset (playsink);
do_async_done (playsink);
+
+ playsink->reconfigure_pending = FALSE;
+
GST_PLAY_SINK_UNLOCK (playsink);
return TRUE;
video_set_blocked (playsink, TRUE);
audio_set_blocked (playsink, TRUE);
text_set_blocked (playsink, TRUE);
+ playsink->reconfigure_pending = TRUE;
GST_PLAY_SINK_UNLOCK (playsink);
return TRUE;
}
+/* Called with PLAY_SINK_LOCK */
+static gboolean
+gst_play_sink_ready_to_reconfigure_locked (GstPlaySink * playsink)
+{
+ /* We reconfigure when for ALL streams:
+ * * there isn't a pad
+ * * OR the pad is blocked
+ * * OR there are no pending blocks on that pad
+ */
+ if (playsink->reconfigure_pending == FALSE)
+ return FALSE;
+
+ if (playsink->video_pad && !playsink->video_pad_blocked
+ && PENDING_VIDEO_BLOCK (playsink))
+ return FALSE;
+
+ if (playsink->audio_pad && !playsink->audio_pad_blocked
+ && PENDING_AUDIO_BLOCK (playsink))
+ return FALSE;
+
+ if (playsink->text_pad && !playsink->text_pad_blocked
+ && PENDING_TEXT_BLOCK (playsink))
+ return FALSE;
+
+ return TRUE;
+}
+
static GstPadProbeReturn
sinkpad_blocked_cb (GstPad * blockedpad, GstPadProbeInfo * info,
gpointer user_data)
GST_DEBUG_OBJECT (pad, "Text pad blocked");
}
- /* We reconfigure when for ALL streams:
- * * there isn't a pad
- * * OR the pad is blocked
- * * OR there are no pending blocks on that pad
- */
-
- if ((!playsink->video_pad || playsink->video_pad_blocked
- || !PENDING_VIDEO_BLOCK (playsink)) && (!playsink->audio_pad
- || playsink->audio_pad_blocked || !PENDING_AUDIO_BLOCK (playsink))
- && (!playsink->text_pad || playsink->text_pad_blocked
- || !PENDING_TEXT_BLOCK (playsink))) {
+ if (gst_play_sink_ready_to_reconfigure_locked (playsink)) {
GST_DEBUG_OBJECT (playsink, "All pads blocked -- reconfiguring");
- if (playsink->video_pad) {
- playsink->video_pad_raw = is_raw_pad (playsink->video_pad);
- GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d",
- playsink->video_pad_raw);
- }
-
- if (playsink->audio_pad) {
- playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad);
- GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d",
- playsink->audio_pad_raw);
- }
-
gst_play_sink_do_reconfigure (playsink);
video_set_blocked (playsink, FALSE);
res = &pad;
untarget = FALSE;
}
+
GST_PLAY_SINK_UNLOCK (playsink);
if (*res) {
gst_element_remove_pad (GST_ELEMENT_CAST (playsink), *res);
*res = NULL;
}
+
+ GST_PLAY_SINK_LOCK (playsink);
+
+ /* If we have a pending reconfigure, we might have met the conditions
+ * to reconfigure now */
+ if (gst_play_sink_ready_to_reconfigure_locked (playsink)) {
+ GST_DEBUG_OBJECT (playsink,
+ "All pads ready after release -- reconfiguring");
+
+ gst_play_sink_do_reconfigure (playsink);
+
+ video_set_blocked (playsink, FALSE);
+ audio_set_blocked (playsink, FALSE);
+ text_set_blocked (playsink, FALSE);
+ }
+
+ GST_PLAY_SINK_UNLOCK (playsink);
}
static void