GstPad *srcpad; /* Timeline source pad */
GstPad *playsinkpad;
GstPad *encodebinpad;
+ GstPad *blocked_pad;
} OutputChain;
G_DEFINE_TYPE (GESTimelinePipeline, ges_timeline_pipeline, GST_TYPE_PIPELINE);
}
}
+static void
+pad_blocked (GstPad * pad, gboolean blocked, gpointer user_data)
+{
+ /* no nothing */
+ GST_DEBUG_OBJECT (pad, "blocked callback, blocked: %d", blocked);
+}
+
static void
pad_added_cb (GstElement * timeline, GstPad * pad, GESTimelinePipeline * self)
{
gst_object_unref (tmppad);
goto error;
}
- gst_object_unref (tmppad);
+ chain->blocked_pad = tmppad;
+ GST_DEBUG ("blocking pad %" GST_PTR_FORMAT, tmppad);
+ gst_pad_set_blocked_async (tmppad, TRUE, pad_blocked, NULL);
GST_DEBUG ("Reconfiguring playsink");
gst_object_unref (chain->playsinkpad);
}
+ if (chain->blocked_pad) {
+ GST_DEBUG ("unblocking pad %" GST_PTR_FORMAT, chain->blocked_pad);
+ gst_pad_set_blocked_async (chain->blocked_pad, FALSE, pad_blocked, NULL);
+ gst_object_unref (chain->blocked_pad);
+ chain->blocked_pad = NULL;
+ }
+
/* Unlike/remove tee */
peer = gst_element_get_static_pad (chain->tee, "sink");
gst_pad_unlink (pad, peer);
GST_DEBUG ("done");
}
+static void
+no_more_pads_cb (GstElement * timeline, GESTimelinePipeline * self)
+{
+ GList *tmp;
+
+ GST_DEBUG ("received no-more-pads");
+ for (tmp = self->priv->chains; tmp; tmp = g_list_next (tmp)) {
+ OutputChain *chain = (OutputChain *) tmp->data;
+
+ if (chain->blocked_pad) {
+ GST_DEBUG ("unblocking pad %" GST_PTR_FORMAT, chain->blocked_pad);
+ gst_pad_set_blocked_async (chain->blocked_pad, FALSE, pad_blocked, NULL);
+ }
+ }
+}
+
/**
* ges_timeline_pipeline_add_timeline:
* @pipeline: a #GESTimelinePipeline
g_signal_connect (timeline, "pad-added", (GCallback) pad_added_cb, pipeline);
g_signal_connect (timeline, "pad-removed", (GCallback) pad_removed_cb,
pipeline);
+ g_signal_connect (timeline, "no-more-pads", (GCallback) no_more_pads_cb,
+ pipeline);
return TRUE;
}
pad_added_cb (GESTrack * track, GstPad * pad, TrackPrivate * tr_priv)
{
gchar *padname;
-
+ gboolean no_more;
+ GList *tmp;
GST_DEBUG ("track:%p, pad:%s:%s", track, GST_DEBUG_PAD_NAME (pad));
}
/* Remember the pad */
+ GST_OBJECT_LOCK (track);
tr_priv->pad = pad;
+ no_more = TRUE;
+ for (tmp = tr_priv->timeline->priv->tracks; tmp; tmp = g_list_next (tmp)) {
+ TrackPrivate *tr_priv = (TrackPrivate *) tmp->data;
+
+ if (!tr_priv->pad) {
+ GST_LOG ("Found track without pad %p", tr_priv->track);
+ no_more = FALSE;
+ }
+ }
+ GST_OBJECT_UNLOCK (track);
+
/* ghost it ! */
GST_DEBUG ("Ghosting pad and adding it to ourself");
padname = g_strdup_printf ("track_%p_src", track);
g_free (padname);
gst_pad_set_active (tr_priv->ghostpad, TRUE);
gst_element_add_pad (GST_ELEMENT (tr_priv->timeline), tr_priv->ghostpad);
+
+ if (no_more) {
+ GST_DEBUG ("Signaling no-more-pads");
+ gst_element_no_more_pads (GST_ELEMENT (tr_priv->timeline));
+ }
}
static void