From 6bf769c8218d3344df138387a8b891de6dd2ea49 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 13 Jul 2020 18:18:22 -0400 Subject: [PATCH] transition: Better document the way alpha is computed for transitions Part-of: --- ges/ges-smart-video-mixer.c | 26 +++++++++++++------------- ges/ges-smart-video-mixer.h | 2 +- ges/ges-utils.c | 2 +- ges/ges-video-transition.c | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ges/ges-smart-video-mixer.c b/ges/ges-smart-video-mixer.c index 26147fffff..f357e0ab95 100644 --- a/ges/ges-smart-video-mixer.c +++ b/ges/ges-smart-video-mixer.c @@ -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); diff --git a/ges/ges-smart-video-mixer.h b/ges/ges-smart-video-mixer.h index def4e7c1f8..a137c4580e 100644 --- a/ges/ges-smart-video-mixer.h +++ b/ges/ges-smart-video-mixer.h @@ -53,7 +53,7 @@ struct _GESSmartMixer GMutex lock; GstCaps *caps; - gboolean disable_zorder_alpha; + gboolean is_transition; gpointer _ges_reserved[GES_PADDING]; }; diff --git a/ges/ges-utils.c b/ges/ges-utils.c index 2ee9b06b08..6ca105f2cb 100644 --- a/ges/ges-utils.c +++ b/ges/ges-utils.c @@ -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; diff --git a/ges/ges-video-transition.c b/ges/ges-video-transition.c index fa5990188e..2f83cd2461 100644 --- a/ges/ges-video-transition.c +++ b/ges/ges-video-transition.c @@ -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);