From 1492fb4ef93fe076a8b91f19c2b956a2bb60de0c Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Sun, 6 May 2018 16:44:47 +0200 Subject: [PATCH] videoaggregator: expose converter-config on convert pads This in order to allow users control over the conversion process, for example the scaling method. --- gst-libs/gst/video/gstvideoaggregator.c | 67 ++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c index c6fbf541ba..ce56543953 100644 --- a/gst-libs/gst/video/gstvideoaggregator.c +++ b/gst-libs/gst/video/gstvideoaggregator.c @@ -335,6 +335,12 @@ gst_video_aggregator_pad_set_needs_alpha (GstVideoAggregatorPad * pad, * GstVideoAggregatorConvertPad implementation * ****************************************/ +enum +{ + PROP_CONVERT_PAD_0, + PROP_CONVERT_PAD_CONVERTER_CONFIG, +}; + struct _GstVideoAggregatorConvertPadPrivate { /* Converter, if NULL no conversion is done */ @@ -344,6 +350,7 @@ struct _GstVideoAggregatorConvertPadPrivate GstVideoInfo conversion_info; GstBuffer *converted_buffer; + GstStructure *converter_config; gboolean converter_config_changed; }; @@ -359,6 +366,10 @@ gst_video_aggregator_convert_pad_finalize (GObject * o) gst_video_converter_free (vaggpad->priv->convert); vaggpad->priv->convert = NULL; + if (vaggpad->priv->converter_config) + gst_structure_free (vaggpad->priv->converter_config); + vaggpad->priv->converter_config = NULL; + G_OBJECT_CLASS (gst_video_aggregator_pad_parent_class)->finalize (o); } @@ -403,7 +414,8 @@ gst_video_aggregator_convert_pad_prepare_frame (GstVideoAggregatorPad * vpad, if (!gst_video_info_is_equal (&vpad->info, &pad->priv->conversion_info)) { pad->priv->convert = gst_video_converter_new (&vpad->info, &pad->priv->conversion_info, - NULL); + pad->priv->converter_config ? gst_structure_copy (pad-> + priv->converter_config) : NULL); if (!pad->priv->convert) { GST_WARNING_OBJECT (pad, "No path found for conversion"); return FALSE; @@ -530,6 +542,46 @@ static void g_free (best_colorimetry); } +static void +gst_video_aggregator_convert_pad_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstVideoAggregatorConvertPad *pad = GST_VIDEO_AGGREGATOR_CONVERT_PAD (object); + + switch (prop_id) { + case PROP_CONVERT_PAD_CONVERTER_CONFIG: + GST_OBJECT_LOCK (pad); + if (pad->priv->converter_config) + g_value_set_boxed (value, pad->priv->converter_config); + GST_OBJECT_UNLOCK (pad); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_video_aggregator_convert_pad_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoAggregatorConvertPad *pad = GST_VIDEO_AGGREGATOR_CONVERT_PAD (object); + + switch (prop_id) { + case PROP_CONVERT_PAD_CONVERTER_CONFIG: + GST_OBJECT_LOCK (pad); + if (pad->priv->converter_config) + gst_structure_free (pad->priv->converter_config); + pad->priv->converter_config = g_value_dup_boxed (value); + pad->priv->converter_config_changed = TRUE; + GST_OBJECT_UNLOCK (pad); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void gst_video_aggregator_convert_pad_class_init (GstVideoAggregatorConvertPadClass * klass) @@ -543,6 +595,18 @@ gst_video_aggregator_convert_pad_class_init (GstVideoAggregatorConvertPadClass * g_type_class_add_private (klass, sizeof (GstVideoAggregatorConvertPadPrivate)); + g_object_class_install_property (gobject_class, + PROP_CONVERT_PAD_CONVERTER_CONFIG, g_param_spec_boxed ("converter-config", + "Converter configuration", + "A GstStructure describing the configuration that should be used " + "when scaling and converting this pad's video frames", + GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gobject_class->get_property = + GST_DEBUG_FUNCPTR (gst_video_aggregator_convert_pad_get_property); + gobject_class->set_property = + GST_DEBUG_FUNCPTR (gst_video_aggregator_convert_pad_set_property); + vaggpadclass->update_conversion_info = GST_DEBUG_FUNCPTR (gst_video_aggregator_convert_pad_update_conversion_info_internal); @@ -565,6 +629,7 @@ gst_video_aggregator_convert_pad_init (GstVideoAggregatorConvertPad * vaggpad) vaggpad->priv->converted_buffer = NULL; vaggpad->priv->convert = NULL; + vaggpad->priv->converter_config = NULL; vaggpad->priv->converter_config_changed = FALSE; }