transition: Better document the way alpha is computed for transitions
authorThibault Saunier <tsaunier@igalia.com>
Mon, 13 Jul 2020 22:18:22 +0000 (18:18 -0400)
committerThibault Saunier <tsaunier@igalia.com>
Thu, 13 Aug 2020 22:34:48 +0000 (18:34 -0400)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/204>

ges/ges-smart-video-mixer.c
ges/ges-smart-video-mixer.h
ges/ges-utils.c
ges/ges-video-transition.c

index 26147ff..f357e0a 100644 (file)
@@ -208,12 +208,12 @@ ges_smart_mixer_get_mixer_pad (GESSmartMixer * self, GstPad ** mixerpad)
   return sinkpad;
 }
 
-/* These metadata will get set by the upstream framepositioner element,
-   added in the video sources' bin */
 static void
-parse_metadata (GstPad * mixer_pad, GstBuffer * buf, GESSmartMixerPad * ghost)
+set_pad_properties_from_positioner_meta (GstPad * mixer_pad, GstSample * sample,
+    GESSmartMixerPad * ghost)
 {
   GstFramePositionerMeta *meta;
+  GstBuffer *buf = gst_sample_get_buffer (sample);
   GESSmartMixer *self = GES_SMART_MIXER (GST_OBJECT_PARENT (ghost));
 
   meta =
@@ -225,18 +225,18 @@ parse_metadata (GstPad * mixer_pad, GstBuffer * buf, GESSmartMixerPad * ghost)
     return;
   }
 
-  if (!self->disable_zorder_alpha) {
+  if (!self->is_transition) {
     g_object_set (mixer_pad, "alpha", meta->alpha,
         "zorder", meta->zorder, NULL);
   } else {
     gint64 stream_time;
     gdouble transalpha;
 
-    GST_OBJECT_LOCK (ghost);
-    stream_time = gst_segment_to_stream_time (&ghost->segment, GST_FORMAT_TIME,
-        GST_BUFFER_PTS (buf));
-    GST_OBJECT_UNLOCK (ghost);
+    stream_time = gst_segment_to_stream_time (gst_sample_get_segment (sample),
+        GST_FORMAT_TIME, GST_BUFFER_PTS (buf));
 
+    /* When used in a transition we aggregate the alpha value value if the
+     * transition pad and the alpha value from upstream frame positioner */
     if (GST_CLOCK_TIME_IS_VALID (stream_time))
       gst_object_sync_values (GST_OBJECT (ghost), stream_time);
 
@@ -377,12 +377,12 @@ compositor_sync_properties_with_meta (GstElement * compositor,
   sample = gst_aggregator_peek_next_sample (GST_AGGREGATOR (compositor),
       GST_AGGREGATOR_PAD (sinkpad));
 
-  if (!sample) {
-    GST_INFO_OBJECT (sinkpad, "No sample set!");
-  } else {
-    parse_metadata (sinkpad, gst_sample_get_buffer (sample),
-        GES_SMART_MIXER_PAD (info->ghostpad));
+  if (sample) {
+    set_pad_properties_from_positioner_meta (sinkpad,
+        sample, GES_SMART_MIXER_PAD (info->ghostpad));
     gst_sample_unref (sample);
+  } else {
+    GST_INFO_OBJECT (sinkpad, "No sample set!");
   }
   pad_infos_unref (info);
 
index def4e7c..a137c45 100644 (file)
@@ -53,7 +53,7 @@ struct _GESSmartMixer
   GMutex lock;
 
   GstCaps *caps;
-  gboolean disable_zorder_alpha;
+  gboolean is_transition;
 
   gpointer _ges_reserved[GES_PADDING];
 };
index 2ee9b06..6ca105f 100644 (file)
@@ -132,7 +132,7 @@ ges_pspec_hash (gconstpointer key_spec)
 }
 
 static gboolean
-find_compositor (GstPluginFeatureFilter * feature, gpointer udata)
+find_compositor (GstPluginFeature * feature, gpointer udata)
 {
   gboolean res = FALSE;
   const gchar *klass;
index fa59901..2f83cd2 100644 (file)
@@ -354,7 +354,7 @@ ges_video_transition_create_element (GESTrackElement * object)
       oconv, NULL);
 
   mixer = ges_smart_mixer_new (NULL);
-  GES_SMART_MIXER (mixer)->disable_zorder_alpha = TRUE;
+  GES_SMART_MIXER (mixer)->is_transition = TRUE;
   g_object_set (GES_SMART_MIXER (mixer)->mixer, "background", 3, NULL); /* transparent */
   gst_bin_add (GST_BIN (topbin), mixer);