From c17dae8f0ea0526c4a50902f823b17370ea00d6f Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 16 Jun 2015 17:07:40 +0200 Subject: [PATCH] video-transition: Use a SmartMixer as mixer So that the frame position metas are parsed and taken into account --- ges/ges-smart-video-mixer.c | 29 +++++++++++++++++++++++++---- ges/ges-smart-video-mixer.h | 5 +++-- ges/ges-video-transition.c | 11 ++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ges/ges-smart-video-mixer.c b/ges/ges-smart-video-mixer.c index 1232589704..98e545aee5 100644 --- a/ges/ges-smart-video-mixer.c +++ b/ges/ges-smart-video-mixer.c @@ -67,10 +67,28 @@ destroy_pad (PadInfos * infos) g_slice_free (PadInfos, infos); } +GstPad * +ges_smart_mixer_get_mixer_pad (GESSmartMixer * self, GstPad ** mixerpad) +{ + PadInfos *info; + GstPad *sinkpad; + + sinkpad = gst_element_get_request_pad (GST_ELEMENT (self), "sink_%u"); + + if (sinkpad == NULL) + return NULL; + + info = g_hash_table_lookup (self->pads_infos, sinkpad); + *mixerpad = info->mixer_pad; + + return sinkpad; +} + /* These metadata will get set by the upstream framepositionner element, added in the video sources' bin */ static GstPadProbeReturn -parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, gpointer unused) +parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, + GESSmartMixer * self) { GstFramePositionnerMeta *meta; @@ -83,7 +101,11 @@ parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, gpointer unused) return GST_PAD_PROBE_OK; } - g_object_set (mixer_pad, "alpha", meta->alpha, "xpos", meta->posx, "ypos", + if (!self->no_alpha) { + g_object_set (mixer_pad, "alpha", meta->alpha, NULL); + } + + g_object_set (mixer_pad, "xpos", meta->posx, "ypos", meta->posy, "zorder", meta->zorder, "width", meta->width, "height", meta->height, NULL); @@ -142,7 +164,7 @@ _request_new_pad (GstElement * element, GstPadTemplate * templ, infos->probe_id = gst_pad_add_probe (infos->mixer_pad, GST_PAD_PROBE_TYPE_BUFFER, - (GstPadProbeCallback) parse_metadata, NULL, NULL); + (GstPadProbeCallback) parse_metadata, self, NULL); LOCK (self); g_hash_table_insert (self->pads_infos, ghost, infos); @@ -245,7 +267,6 @@ GstElement * ges_smart_mixer_new (GESTrack * track) { GESSmartMixer *self = g_object_new (GES_TYPE_SMART_MIXER, NULL); - self->track = track; /* FIXME Make mixer smart and let it properly negotiate caps! */ return GST_ELEMENT (self); diff --git a/ges/ges-smart-video-mixer.h b/ges/ges-smart-video-mixer.h index 2cbc3f8ad2..b0fd632334 100644 --- a/ges/ges-smart-video-mixer.h +++ b/ges/ges-smart-video-mixer.h @@ -54,13 +54,14 @@ struct _GESSmartMixer GMutex lock; GstCaps *caps; - - GESTrack *track; + gboolean no_alpha; gpointer _ges_reserved[GES_PADDING]; }; GType ges_smart_mixer_get_type (void) G_GNUC_CONST; +GstPad * +ges_smart_mixer_get_mixer_pad (GESSmartMixer *self, GstPad **mixerpad); GstElement* ges_smart_mixer_new (GESTrack *track); G_END_DECLS diff --git a/ges/ges-video-transition.c b/ges/ges-video-transition.c index 833afc6da5..1ede5dc3d1 100644 --- a/ges/ges-video-transition.c +++ b/ges/ges-video-transition.c @@ -25,6 +25,7 @@ #include #include "ges-internal.h" +#include "ges-smart-video-mixer.h" #include @@ -311,9 +312,9 @@ ges_video_transition_create_element (GESTrackElement * object) gst_bin_add_many (GST_BIN (topbin), iconva, iconvb, oconv, NULL); - mixer = gst_element_factory_create (ges_get_compositor_factory (), NULL); + mixer = ges_smart_mixer_new (NULL); g_assert (mixer); - g_object_set (G_OBJECT (mixer), "background", 1, NULL); + GES_SMART_MIXER (mixer)->no_alpha = TRUE; gst_bin_add (GST_BIN (topbin), mixer); priv->mixer_sinka = @@ -372,7 +373,7 @@ link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element, GstElement * mixer, gint type, GstElement ** smpteref, GESVideoTransitionPrivate * priv) { - GstPad *srcpad, *sinkpad; + GstPad *srcpad, *sinkpad, *mixerpad; GstElement *smptealpha = gst_element_factory_make ("smptealpha", NULL); g_object_set (G_OBJECT (smptealpha), @@ -388,11 +389,11 @@ link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element, } srcpad = gst_element_get_static_pad (smptealpha, "src"); - sinkpad = gst_element_get_request_pad (mixer, "sink_%u"); + sinkpad = ges_smart_mixer_get_mixer_pad (GES_SMART_MIXER (mixer), &mixerpad); gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING); gst_object_unref (srcpad); - return G_OBJECT (sinkpad); + return G_OBJECT (mixerpad); } static void