diff --git a/ges/ges-timeline.c b/ges/ges-timeline.c index 8280a29ec3..df5b76e52a 100644 --- a/ges/ges-timeline.c +++ b/ges/ges-timeline.c @@ -1810,6 +1810,73 @@ track_object_removed_cb (GESTrack * track, GESTrackObject * object, } } +static void +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)); + + if (G_UNLIKELY (tr_priv->pad)) { + GST_WARNING ("We are already controlling a pad for this track"); + return; + } + + /* 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); + tr_priv->ghostpad = gst_ghost_pad_new (padname, pad); + 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 +pad_removed_cb (GESTrack * track, GstPad * pad, TrackPrivate * tr_priv) +{ + GST_DEBUG ("track:%p, pad:%s:%s", track, GST_DEBUG_PAD_NAME (pad)); + + if (G_UNLIKELY (tr_priv->pad != pad)) { + GST_WARNING ("Not the pad we're controlling"); + return; + } + + if (G_UNLIKELY (tr_priv->ghostpad == NULL)) { + GST_WARNING ("We don't have a ghostpad for this pad !"); + return; + } + + GST_DEBUG ("Removing ghostpad"); + gst_pad_set_active (tr_priv->ghostpad, FALSE); + gst_element_remove_pad (GST_ELEMENT (tr_priv->timeline), tr_priv->ghostpad); + tr_priv->ghostpad = NULL; + tr_priv->pad = NULL; +} + + +/* GstElement Virtual methods */ static GstStateChangeReturn ges_timeline_change_state (GstElement * element, GstStateChange transition) { @@ -1853,6 +1920,7 @@ ges_timeline_change_state (GstElement * element, GstStateChange transition) } +/**** API *****/ /** * ges_timeline_new: * @@ -2120,71 +2188,6 @@ ges_timeline_remove_layer (GESTimeline * timeline, GESTimelineLayer * layer) return TRUE; } -static void -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)); - - if (G_UNLIKELY (tr_priv->pad)) { - GST_WARNING ("We are already controlling a pad for this track"); - return; - } - - /* 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); - tr_priv->ghostpad = gst_ghost_pad_new (padname, pad); - 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 -pad_removed_cb (GESTrack * track, GstPad * pad, TrackPrivate * tr_priv) -{ - GST_DEBUG ("track:%p, pad:%s:%s", track, GST_DEBUG_PAD_NAME (pad)); - - if (G_UNLIKELY (tr_priv->pad != pad)) { - GST_WARNING ("Not the pad we're controlling"); - return; - } - - if (G_UNLIKELY (tr_priv->ghostpad == NULL)) { - GST_WARNING ("We don't have a ghostpad for this pad !"); - return; - } - - GST_DEBUG ("Removing ghostpad"); - gst_pad_set_active (tr_priv->ghostpad, FALSE); - gst_element_remove_pad (GST_ELEMENT (tr_priv->timeline), tr_priv->ghostpad); - tr_priv->ghostpad = NULL; - tr_priv->pad = NULL; -} - /** * ges_timeline_add_track: * @timeline: a #GESTimeline