[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gstreamer-cvs
Subject:    gst-editing-services: =?UTF-8?Q?ges=3A=20Update=20the=20media?= =?UTF-8?Q?=2Dduration=2Dfactor=20eac
From:       tsaunier () kemper ! freedesktop ! org (Thibault Saunier)
Date:       2018-03-30 21:31:39
Message-ID: 20180330213139.98B4776166 () kemper ! freedesktop ! org
[Download RAW message or body]

Module: gst-editing-services
Branch: master
Commit: 15782c6ecd6589219eb693ca77d9eadc4283c9c1
URL:    http://cgit.freedesktop.org/gstreamer/gst-editing-services/commit/?id=15782c6ecd6589219eb693ca77d9eadc4283c9c1


Author: Thibault Saunier <tsaunier@igalia.com>
Date:   Mon Mar 26 12:13:25 2018 -0300

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

---

 ges/ges-effect.c           | 40 ++++++++++++++++++++++++++++++++++------
 ges/ges-timeline-element.c | 18 ++++++++++++++++--
 ges/ges-timeline-element.h |  4 +++-
 3 files changed, 53 insertions(+), 9 deletions(-)

diff --git a/ges/ges-effect.c b/ges/ges-effect.c
index c13b2cfa..eb9c9e57 100644
--- a/ges/ges-effect.c
+++ b/ges/ges-effect.c
@@ -114,6 +114,37 @@ ges_extractable_interface_init (GESExtractableInterface * iface)
   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
 ges_effect_get_property (GObject * object,
     guint property_id, GValue * value, GParamSpec * pspec)
@@ -149,9 +180,11 @@ ges_effect_class_init (GESEffectClass * klass)
 {
   GObjectClass *object_class;
   GESTrackElementClass *obj_bg_class;
+  GESTimelineElementClass *element_class;
 
   object_class = G_OBJECT_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));
 
@@ -161,6 +194,7 @@ ges_effect_class_init (GESEffectClass * klass)
   object_class->finalize = ges_effect_finalize;
 
   obj_bg_class->create_element = ges_effect_create_element;
+  element_class->set_child_property = _set_child_property;
 
   klass->rate_properties = NULL;
   ges_effect_class_register_rate_property (klass, "scaletempo", "rate");
@@ -280,12 +314,6 @@ ges_effect_new (const gchar * bin_description)
   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:
  * @klass: Instance of the GESEffectClass
diff --git a/ges/ges-timeline-element.c b/ges/ges-timeline-element.c
index 583b369f..f68acdad 100644
--- a/ges/ges-timeline-element.c
+++ b/ges/ges-timeline-element.c
@@ -107,6 +107,13 @@ typedef struct
   GESTimelineElement *self;
 } 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
 _lookup_child (GESTimelineElement * self, const gchar * prop_name,
     GObject ** child, GParamSpec ** pspec)
@@ -434,6 +441,7 @@ ges_timeline_element_class_init (GESTimelineElementClass * klass)
 
   klass->list_children_properties = default_list_children_properties;
   klass->lookup_child = _lookup_child;
+  klass->set_child_property = _set_child_property;
 }
 
 static void
@@ -1385,6 +1393,7 @@ ges_timeline_element_set_child_property_by_pspec \
(GESTimelineElement * self,  GParamSpec * pspec, GValue * value)
 {
   ChildPropHandler *handler;
+  GESTimelineElementClass *klass;
 
   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)
     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;
 
@@ -1423,6 +1434,7 @@ ges_timeline_element_set_child_property (GESTimelineElement * \
self,  const gchar * property_name, GValue * value)
 {
   GParamSpec *pspec;
+  GESTimelineElementClass *klass;
   GObject *child;
 
   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))
     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);
   g_param_spec_unref (pspec);
diff --git a/ges/ges-timeline-element.h b/ges/ges-timeline-element.h
index 7743948c..d7794343 100644
--- a/ges/ges-timeline-element.h
+++ b/ges/ges-timeline-element.h
@@ -194,11 +194,13 @@ struct _GESTimelineElementClass
   GParamSpec** (*list_children_properties) (GESTimelineElement * self, guint \
*n_properties);  gboolean (*lookup_child)                 (GESTimelineElement *self, \
                const gchar *prop_name,
                                             GObject **child, GParamSpec **pspec);
+  void         (*set_child_property)       (GESTimelineElement * self, GObject \
*child, +                                            GParamSpec *pspec, GValue \
*value);  GESTrackType (*get_track_types)          (GESTimelineElement * self);
 
   /*< private > */
   /* Padding for API extension */
-  gpointer _ges_reserved[GES_PADDING_LARGE - 2];
+  gpointer _ges_reserved[GES_PADDING_LARGE - 3];
 };
 
 GES_API

_______________________________________________
gstreamer-commits mailing list
gstreamer-commits@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/gstreamer-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic