video-transition: Use a SmartMixer as mixer

So that the frame position metas are parsed and taken into account
This commit is contained in:
Thibault Saunier 2015-06-16 17:07:40 +02:00
parent 6a0ac89009
commit c17dae8f0e
3 changed files with 34 additions and 11 deletions

View file

@ -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);

View file

@ -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

View file

@ -25,6 +25,7 @@
#include <ges/ges.h>
#include "ges-internal.h"
#include "ges-smart-video-mixer.h"
#include <gst/controller/gstdirectcontrolbinding.h>
@ -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