mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 04:22:27 +00:00
video-transition: Use a SmartMixer as mixer
So that the frame position metas are parsed and taken into account
This commit is contained in:
parent
6a0ac89009
commit
c17dae8f0e
3 changed files with 34 additions and 11 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue