mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
gstframepositioner: added 'operator' property
The 'operator' property was added to gstframepositioner so that blending modes in the compositor could be accessed. This was done by accessing the pad of the compositor class, and referencing the 'operator' property in that pad. Getters and Setters were also created so that the 'operator' could be accessed by software that is based on GES, such as Pitivi. Related to but does not close Issue https://gitlab.gnome.org/GNOME/pitivi/-/issues/2313 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/236>
This commit is contained in:
parent
1327f428d2
commit
355d986d80
4 changed files with 61 additions and 2 deletions
|
@ -238,7 +238,8 @@ set_pad_properties_from_positioner_meta (GstPad * mixer_pad, GstSample * sample,
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_set (mixer_pad, "xpos", meta->posx, "ypos",
|
g_object_set (mixer_pad, "xpos", meta->posx, "ypos",
|
||||||
meta->posy, "width", meta->width, "height", meta->height, NULL);
|
meta->posy, "width", meta->width, "height", meta->height,
|
||||||
|
"operator", meta->operator, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
|
|
|
@ -115,7 +115,7 @@ ges_video_source_create_filters (GESVideoSource * self, GPtrArray * elements,
|
||||||
GESTrackElement *trksrc = GES_TRACK_ELEMENT (self);
|
GESTrackElement *trksrc = GES_TRACK_ELEMENT (self);
|
||||||
GstElement *positioner, *videoflip, *capsfilter;
|
GstElement *positioner, *videoflip, *capsfilter;
|
||||||
const gchar *positioner_props[]
|
const gchar *positioner_props[]
|
||||||
= { "alpha", "posx", "posy", "width", "height", NULL };
|
= { "alpha", "posx", "posy", "width", "height", "operator", NULL };
|
||||||
const gchar *videoflip_props[] = { "video-direction", NULL };
|
const gchar *videoflip_props[] = { "video-direction", NULL };
|
||||||
|
|
||||||
g_ptr_array_add (elements, gst_element_factory_make ("queue", NULL));
|
g_ptr_array_add (elements, gst_element_factory_make ("queue", NULL));
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
|
|
||||||
#include "gstframepositioner.h"
|
#include "gstframepositioner.h"
|
||||||
|
#include "ges-internal.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (_framepositioner);
|
GST_DEBUG_CATEGORY_STATIC (_framepositioner);
|
||||||
#undef GST_CAT_DEFAULT
|
#undef GST_CAT_DEFAULT
|
||||||
|
@ -57,6 +58,7 @@ enum
|
||||||
PROP_ZORDER,
|
PROP_ZORDER,
|
||||||
PROP_WIDTH,
|
PROP_WIDTH,
|
||||||
PROP_HEIGHT,
|
PROP_HEIGHT,
|
||||||
|
PROP_OPERATOR,
|
||||||
PROP_LAST,
|
PROP_LAST,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,6 +81,29 @@ GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
G_DEFINE_TYPE (GstFramePositioner, gst_frame_positioner,
|
G_DEFINE_TYPE (GstFramePositioner, gst_frame_positioner,
|
||||||
GST_TYPE_BASE_TRANSFORM);
|
GST_TYPE_BASE_TRANSFORM);
|
||||||
|
|
||||||
|
static GType
|
||||||
|
gst_compositor_operator_get_type_and_default_value (int *default_operator_value)
|
||||||
|
{
|
||||||
|
GstElement *compositor =
|
||||||
|
gst_element_factory_create (ges_get_compositor_factory (), NULL);
|
||||||
|
|
||||||
|
GstPad *compositorPad = gst_element_get_request_pad (compositor, "sink_%u");
|
||||||
|
|
||||||
|
GParamSpec *pspec =
|
||||||
|
g_object_class_find_property (G_OBJECT_GET_CLASS (compositorPad),
|
||||||
|
"operator");
|
||||||
|
|
||||||
|
*default_operator_value =
|
||||||
|
g_value_get_enum (g_param_spec_get_default_value (pspec));
|
||||||
|
g_return_val_if_fail (pspec, G_TYPE_NONE);
|
||||||
|
|
||||||
|
gst_element_release_request_pad (compositor, compositorPad);
|
||||||
|
gst_object_unref (compositorPad);
|
||||||
|
gst_object_unref (compositor);
|
||||||
|
|
||||||
|
return pspec->value_type;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_weak_notify_cb (GstFramePositioner * pos, GObject * old)
|
_weak_notify_cb (GstFramePositioner * pos, GObject * old)
|
||||||
{
|
{
|
||||||
|
@ -426,6 +451,11 @@ gst_frame_positioner_dispose (GObject * object)
|
||||||
static void
|
static void
|
||||||
gst_frame_positioner_class_init (GstFramePositionerClass * klass)
|
gst_frame_positioner_class_init (GstFramePositionerClass * klass)
|
||||||
{
|
{
|
||||||
|
int default_operator_value;
|
||||||
|
GType operator_gtype =
|
||||||
|
gst_compositor_operator_get_type_and_default_value
|
||||||
|
(&default_operator_value);
|
||||||
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GstBaseTransformClass *base_transform_class =
|
GstBaseTransformClass *base_transform_class =
|
||||||
GST_BASE_TRANSFORM_CLASS (klass);
|
GST_BASE_TRANSFORM_CLASS (klass);
|
||||||
|
@ -501,6 +531,17 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
|
||||||
g_param_spec_int ("height", "height", "height of the source", 0,
|
g_param_spec_int ("height", "height", "height of the source", 0,
|
||||||
MAX_PIXELS, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
|
MAX_PIXELS, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gesframepositioner:operator:
|
||||||
|
*
|
||||||
|
* The blending operator for the source.
|
||||||
|
*/
|
||||||
|
properties[PROP_OPERATOR] =
|
||||||
|
g_param_spec_enum ("operator", "Operator",
|
||||||
|
"Blending operator to use for blending this pad over the previous ones",
|
||||||
|
operator_gtype, default_operator_value,
|
||||||
|
(G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, PROP_LAST, properties);
|
g_object_class_install_properties (gobject_class, PROP_LAST, properties);
|
||||||
|
|
||||||
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
|
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
|
||||||
|
@ -518,6 +559,7 @@ gst_frame_positioner_init (GstFramePositioner * framepositioner)
|
||||||
framepositioner->zorder = 0;
|
framepositioner->zorder = 0;
|
||||||
framepositioner->width = 0;
|
framepositioner->width = 0;
|
||||||
framepositioner->height = 0;
|
framepositioner->height = 0;
|
||||||
|
framepositioner->operator = 1;
|
||||||
framepositioner->fps_n = -1;
|
framepositioner->fps_n = -1;
|
||||||
framepositioner->fps_d = -1;
|
framepositioner->fps_d = -1;
|
||||||
framepositioner->track_width = 0;
|
framepositioner->track_width = 0;
|
||||||
|
@ -570,6 +612,11 @@ gst_frame_positioner_set_property (GObject * object, guint property_id,
|
||||||
gst_frame_positioner_update_properties (framepositioner, track_mixing,
|
gst_frame_positioner_update_properties (framepositioner, track_mixing,
|
||||||
0, 0);
|
0, 0);
|
||||||
break;
|
break;
|
||||||
|
case PROP_OPERATOR:
|
||||||
|
framepositioner->operator = g_value_get_enum (value);
|
||||||
|
gst_frame_positioner_update_properties (framepositioner, track_mixing,
|
||||||
|
0, 0);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -615,6 +662,9 @@ gst_frame_positioner_get_property (GObject * object, guint property_id,
|
||||||
g_value_set_int (value, real_height);
|
g_value_set_int (value, real_height);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PROP_OPERATOR:
|
||||||
|
g_value_set_enum (value, pos->operator);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -655,13 +705,17 @@ static gboolean
|
||||||
gst_frame_positioner_meta_init (GstMeta * meta, gpointer params,
|
gst_frame_positioner_meta_init (GstMeta * meta, gpointer params,
|
||||||
GstBuffer * buffer)
|
GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
int default_operator_value;
|
||||||
GstFramePositionerMeta *smeta;
|
GstFramePositionerMeta *smeta;
|
||||||
|
|
||||||
smeta = (GstFramePositionerMeta *) meta;
|
smeta = (GstFramePositionerMeta *) meta;
|
||||||
|
|
||||||
|
gst_compositor_operator_get_type_and_default_value (&default_operator_value);
|
||||||
|
|
||||||
smeta->alpha = 0.0;
|
smeta->alpha = 0.0;
|
||||||
smeta->posx = smeta->posy = smeta->height = smeta->width = 0;
|
smeta->posx = smeta->posy = smeta->height = smeta->width = 0;
|
||||||
smeta->zorder = 0;
|
smeta->zorder = 0;
|
||||||
|
smeta->operator = default_operator_value;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -685,6 +739,7 @@ gst_frame_positioner_meta_transform (GstBuffer * dest, GstMeta * meta,
|
||||||
dmeta->width = smeta->width;
|
dmeta->width = smeta->width;
|
||||||
dmeta->height = smeta->height;
|
dmeta->height = smeta->height;
|
||||||
dmeta->zorder = smeta->zorder;
|
dmeta->zorder = smeta->zorder;
|
||||||
|
dmeta->operator = smeta->operator;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -712,6 +767,7 @@ gst_frame_positioner_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
|
||||||
meta->width = round (framepositioner->width);
|
meta->width = round (framepositioner->width);
|
||||||
meta->height = round (framepositioner->height);
|
meta->height = round (framepositioner->height);
|
||||||
meta->zorder = framepositioner->zorder;
|
meta->zorder = framepositioner->zorder;
|
||||||
|
meta->operator = framepositioner->operator;
|
||||||
GST_OBJECT_UNLOCK (framepositioner);
|
GST_OBJECT_UNLOCK (framepositioner);
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
|
@ -52,6 +52,7 @@ struct _GstFramePositioner
|
||||||
guint zorder;
|
guint zorder;
|
||||||
gdouble width;
|
gdouble width;
|
||||||
gdouble height;
|
gdouble height;
|
||||||
|
gint operator;
|
||||||
gint natural_width;
|
gint natural_width;
|
||||||
gint natural_height;
|
gint natural_height;
|
||||||
gint track_width;
|
gint track_width;
|
||||||
|
@ -81,6 +82,7 @@ struct _GstFramePositionerMeta {
|
||||||
gint height;
|
gint height;
|
||||||
gint width;
|
gint width;
|
||||||
guint zorder;
|
guint zorder;
|
||||||
|
gint operator;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_GNUC_INTERNAL void ges_frame_positioner_set_source_and_filter (GstFramePositioner *pos,
|
G_GNUC_INTERNAL void ges_frame_positioner_set_source_and_filter (GstFramePositioner *pos,
|
||||||
|
|
Loading…
Reference in a new issue