mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
ges: Update the media-duration-factor each time a child property is set
Otherwise the changes won't be reflected in the NLE backend. This makes speed changes working inside ges-launch-1.0 ges-launch-1.0 +clip /path/to/file i=10 d=5 +effect videorate set-rate 5.0 https://bugzilla.gnome.org/show_bug.cgi?id=794699
This commit is contained in:
parent
14b0470cb0
commit
15782c6ecd
3 changed files with 53 additions and 9 deletions
|
@ -114,6 +114,37 @@ ges_extractable_interface_init (GESExtractableInterface * iface)
|
||||||
iface->get_id = extractable_get_id;
|
iface->get_id = extractable_get_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
property_name_compare (gconstpointer s1, gconstpointer s2)
|
||||||
|
{
|
||||||
|
return g_strcmp0 ((const gchar *) s1, (const gchar *) s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_set_child_property (GESTimelineElement * self G_GNUC_UNUSED, GObject * child,
|
||||||
|
GParamSpec * pspec, GValue * value)
|
||||||
|
{
|
||||||
|
GESEffectClass *klass = GES_EFFECT_GET_CLASS (self);
|
||||||
|
gchar *full_property_name;
|
||||||
|
|
||||||
|
GES_TIMELINE_ELEMENT_CLASS
|
||||||
|
(ges_effect_parent_class)->set_child_property (self, child, pspec, value);
|
||||||
|
|
||||||
|
full_property_name = g_strdup_printf ("%s::%s", G_OBJECT_TYPE_NAME (child),
|
||||||
|
pspec->name);
|
||||||
|
|
||||||
|
if (g_list_find_custom (klass->rate_properties, full_property_name,
|
||||||
|
property_name_compare)) {
|
||||||
|
GstElement *nleobject =
|
||||||
|
ges_track_element_get_nleobject (GES_TRACK_ELEMENT (self));
|
||||||
|
gdouble media_duration_factor =
|
||||||
|
ges_timeline_element_get_media_duration_factor (self);
|
||||||
|
|
||||||
|
g_object_set (nleobject, "media-duration-factor", media_duration_factor,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ges_effect_get_property (GObject * object,
|
ges_effect_get_property (GObject * object,
|
||||||
guint property_id, GValue * value, GParamSpec * pspec)
|
guint property_id, GValue * value, GParamSpec * pspec)
|
||||||
|
@ -149,9 +180,11 @@ ges_effect_class_init (GESEffectClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class;
|
GObjectClass *object_class;
|
||||||
GESTrackElementClass *obj_bg_class;
|
GESTrackElementClass *obj_bg_class;
|
||||||
|
GESTimelineElementClass *element_class;
|
||||||
|
|
||||||
object_class = G_OBJECT_CLASS (klass);
|
object_class = G_OBJECT_CLASS (klass);
|
||||||
obj_bg_class = GES_TRACK_ELEMENT_CLASS (klass);
|
obj_bg_class = GES_TRACK_ELEMENT_CLASS (klass);
|
||||||
|
element_class = GES_TIMELINE_ELEMENT_CLASS (klass);
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (GESEffectPrivate));
|
g_type_class_add_private (klass, sizeof (GESEffectPrivate));
|
||||||
|
|
||||||
|
@ -161,6 +194,7 @@ ges_effect_class_init (GESEffectClass * klass)
|
||||||
object_class->finalize = ges_effect_finalize;
|
object_class->finalize = ges_effect_finalize;
|
||||||
|
|
||||||
obj_bg_class->create_element = ges_effect_create_element;
|
obj_bg_class->create_element = ges_effect_create_element;
|
||||||
|
element_class->set_child_property = _set_child_property;
|
||||||
|
|
||||||
klass->rate_properties = NULL;
|
klass->rate_properties = NULL;
|
||||||
ges_effect_class_register_rate_property (klass, "scaletempo", "rate");
|
ges_effect_class_register_rate_property (klass, "scaletempo", "rate");
|
||||||
|
@ -280,12 +314,6 @@ ges_effect_new (const gchar * bin_description)
|
||||||
return effect;
|
return effect;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
property_name_compare (gconstpointer s1, gconstpointer s2)
|
|
||||||
{
|
|
||||||
return g_strcmp0 ((const gchar *) s1, (const gchar *) s2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ges_effect_class_register_rate_property:
|
* ges_effect_class_register_rate_property:
|
||||||
* @klass: Instance of the GESEffectClass
|
* @klass: Instance of the GESEffectClass
|
||||||
|
|
|
@ -107,6 +107,13 @@ typedef struct
|
||||||
GESTimelineElement *self;
|
GESTimelineElement *self;
|
||||||
} EmitDeepNotifyInIdleData;
|
} EmitDeepNotifyInIdleData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_set_child_property (GESTimelineElement * self G_GNUC_UNUSED, GObject * child,
|
||||||
|
GParamSpec * pspec, GValue * value)
|
||||||
|
{
|
||||||
|
g_object_set_property (child, pspec->name, value);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_lookup_child (GESTimelineElement * self, const gchar * prop_name,
|
_lookup_child (GESTimelineElement * self, const gchar * prop_name,
|
||||||
GObject ** child, GParamSpec ** pspec)
|
GObject ** child, GParamSpec ** pspec)
|
||||||
|
@ -434,6 +441,7 @@ ges_timeline_element_class_init (GESTimelineElementClass * klass)
|
||||||
|
|
||||||
klass->list_children_properties = default_list_children_properties;
|
klass->list_children_properties = default_list_children_properties;
|
||||||
klass->lookup_child = _lookup_child;
|
klass->lookup_child = _lookup_child;
|
||||||
|
klass->set_child_property = _set_child_property;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1385,6 +1393,7 @@ ges_timeline_element_set_child_property_by_pspec (GESTimelineElement * self,
|
||||||
GParamSpec * pspec, GValue * value)
|
GParamSpec * pspec, GValue * value)
|
||||||
{
|
{
|
||||||
ChildPropHandler *handler;
|
ChildPropHandler *handler;
|
||||||
|
GESTimelineElementClass *klass;
|
||||||
|
|
||||||
g_return_if_fail (GES_IS_TRACK_ELEMENT (self));
|
g_return_if_fail (GES_IS_TRACK_ELEMENT (self));
|
||||||
|
|
||||||
|
@ -1393,7 +1402,9 @@ ges_timeline_element_set_child_property_by_pspec (GESTimelineElement * self,
|
||||||
if (!handler)
|
if (!handler)
|
||||||
goto not_found;
|
goto not_found;
|
||||||
|
|
||||||
g_object_set_property (handler->child, pspec->name, value);
|
klass = GES_TIMELINE_ELEMENT_GET_CLASS (self);
|
||||||
|
g_assert (klass->set_child_property);
|
||||||
|
klass->set_child_property (self, handler->child, pspec, value);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1423,6 +1434,7 @@ ges_timeline_element_set_child_property (GESTimelineElement * self,
|
||||||
const gchar * property_name, GValue * value)
|
const gchar * property_name, GValue * value)
|
||||||
{
|
{
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
|
GESTimelineElementClass *klass;
|
||||||
GObject *child;
|
GObject *child;
|
||||||
|
|
||||||
g_return_val_if_fail (GES_IS_TIMELINE_ELEMENT (self), FALSE);
|
g_return_val_if_fail (GES_IS_TIMELINE_ELEMENT (self), FALSE);
|
||||||
|
@ -1430,7 +1442,9 @@ ges_timeline_element_set_child_property (GESTimelineElement * self,
|
||||||
if (!ges_timeline_element_lookup_child (self, property_name, &child, &pspec))
|
if (!ges_timeline_element_lookup_child (self, property_name, &child, &pspec))
|
||||||
goto not_found;
|
goto not_found;
|
||||||
|
|
||||||
g_object_set_property (child, pspec->name, value);
|
klass = GES_TIMELINE_ELEMENT_GET_CLASS (self);
|
||||||
|
g_assert (klass->set_child_property);
|
||||||
|
klass->set_child_property (self, child, pspec, value);
|
||||||
|
|
||||||
gst_object_unref (child);
|
gst_object_unref (child);
|
||||||
g_param_spec_unref (pspec);
|
g_param_spec_unref (pspec);
|
||||||
|
|
|
@ -194,11 +194,13 @@ struct _GESTimelineElementClass
|
||||||
GParamSpec** (*list_children_properties) (GESTimelineElement * self, guint *n_properties);
|
GParamSpec** (*list_children_properties) (GESTimelineElement * self, guint *n_properties);
|
||||||
gboolean (*lookup_child) (GESTimelineElement *self, const gchar *prop_name,
|
gboolean (*lookup_child) (GESTimelineElement *self, const gchar *prop_name,
|
||||||
GObject **child, GParamSpec **pspec);
|
GObject **child, GParamSpec **pspec);
|
||||||
|
void (*set_child_property) (GESTimelineElement * self, GObject *child,
|
||||||
|
GParamSpec *pspec, GValue *value);
|
||||||
GESTrackType (*get_track_types) (GESTimelineElement * self);
|
GESTrackType (*get_track_types) (GESTimelineElement * self);
|
||||||
|
|
||||||
/*< private > */
|
/*< private > */
|
||||||
/* Padding for API extension */
|
/* Padding for API extension */
|
||||||
gpointer _ges_reserved[GES_PADDING_LARGE - 2];
|
gpointer _ges_reserved[GES_PADDING_LARGE - 3];
|
||||||
};
|
};
|
||||||
|
|
||||||
GES_API
|
GES_API
|
||||||
|
|
Loading…
Reference in a new issue