mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +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);
|
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,
|
/* These metadata will get set by the upstream framepositionner element,
|
||||||
added in the video sources' bin */
|
added in the video sources' bin */
|
||||||
static GstPadProbeReturn
|
static GstPadProbeReturn
|
||||||
parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, gpointer unused)
|
parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info,
|
||||||
|
GESSmartMixer * self)
|
||||||
{
|
{
|
||||||
GstFramePositionnerMeta *meta;
|
GstFramePositionnerMeta *meta;
|
||||||
|
|
||||||
|
@ -83,7 +101,11 @@ parse_metadata (GstPad * mixer_pad, GstPadProbeInfo * info, gpointer unused)
|
||||||
return GST_PAD_PROBE_OK;
|
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,
|
meta->posy, "zorder", meta->zorder, "width", meta->width,
|
||||||
"height", meta->height, NULL);
|
"height", meta->height, NULL);
|
||||||
|
|
||||||
|
@ -142,7 +164,7 @@ _request_new_pad (GstElement * element, GstPadTemplate * templ,
|
||||||
|
|
||||||
infos->probe_id =
|
infos->probe_id =
|
||||||
gst_pad_add_probe (infos->mixer_pad, GST_PAD_PROBE_TYPE_BUFFER,
|
gst_pad_add_probe (infos->mixer_pad, GST_PAD_PROBE_TYPE_BUFFER,
|
||||||
(GstPadProbeCallback) parse_metadata, NULL, NULL);
|
(GstPadProbeCallback) parse_metadata, self, NULL);
|
||||||
|
|
||||||
LOCK (self);
|
LOCK (self);
|
||||||
g_hash_table_insert (self->pads_infos, ghost, infos);
|
g_hash_table_insert (self->pads_infos, ghost, infos);
|
||||||
|
@ -245,7 +267,6 @@ GstElement *
|
||||||
ges_smart_mixer_new (GESTrack * track)
|
ges_smart_mixer_new (GESTrack * track)
|
||||||
{
|
{
|
||||||
GESSmartMixer *self = g_object_new (GES_TYPE_SMART_MIXER, NULL);
|
GESSmartMixer *self = g_object_new (GES_TYPE_SMART_MIXER, NULL);
|
||||||
self->track = track;
|
|
||||||
|
|
||||||
/* FIXME Make mixer smart and let it properly negotiate caps! */
|
/* FIXME Make mixer smart and let it properly negotiate caps! */
|
||||||
return GST_ELEMENT (self);
|
return GST_ELEMENT (self);
|
||||||
|
|
|
@ -54,13 +54,14 @@ struct _GESSmartMixer
|
||||||
GMutex lock;
|
GMutex lock;
|
||||||
|
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
gboolean no_alpha;
|
||||||
GESTrack *track;
|
|
||||||
|
|
||||||
gpointer _ges_reserved[GES_PADDING];
|
gpointer _ges_reserved[GES_PADDING];
|
||||||
};
|
};
|
||||||
|
|
||||||
GType ges_smart_mixer_get_type (void) G_GNUC_CONST;
|
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);
|
GstElement* ges_smart_mixer_new (GESTrack *track);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
#include <ges/ges.h>
|
#include <ges/ges.h>
|
||||||
#include "ges-internal.h"
|
#include "ges-internal.h"
|
||||||
|
#include "ges-smart-video-mixer.h"
|
||||||
|
|
||||||
#include <gst/controller/gstdirectcontrolbinding.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);
|
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_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);
|
gst_bin_add (GST_BIN (topbin), mixer);
|
||||||
|
|
||||||
priv->mixer_sinka =
|
priv->mixer_sinka =
|
||||||
|
@ -372,7 +373,7 @@ link_element_to_mixer_with_smpte (GstBin * bin, GstElement * element,
|
||||||
GstElement * mixer, gint type, GstElement ** smpteref,
|
GstElement * mixer, gint type, GstElement ** smpteref,
|
||||||
GESVideoTransitionPrivate * priv)
|
GESVideoTransitionPrivate * priv)
|
||||||
{
|
{
|
||||||
GstPad *srcpad, *sinkpad;
|
GstPad *srcpad, *sinkpad, *mixerpad;
|
||||||
GstElement *smptealpha = gst_element_factory_make ("smptealpha", NULL);
|
GstElement *smptealpha = gst_element_factory_make ("smptealpha", NULL);
|
||||||
|
|
||||||
g_object_set (G_OBJECT (smptealpha),
|
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");
|
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_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING);
|
||||||
gst_object_unref (srcpad);
|
gst_object_unref (srcpad);
|
||||||
|
|
||||||
return G_OBJECT (sinkpad);
|
return G_OBJECT (mixerpad);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue