From 1808102fb3fce09f8f905364ec62595a48fb0753 Mon Sep 17 00:00:00 2001 From: Haihua Hu Date: Thu, 25 Feb 2016 13:53:20 +0800 Subject: [PATCH 12/26] glcolorconvert: convert YUV to RGB use directviv Add a property "disable_passthrough" in glcolorconvert for enable/disable passthrough. When need convert YUV to RGB with directviv, set it to be TRUE. Upstream-Status: Inappropriate [i.MX specific] Signed-off-by: Haihua Hu Conflicts: gst-libs/gst/gl/gstglcolorconvert.c --- ext/gl/gstglcolorconvertelement.c | 70 +++++++++++++++++++++++++++++++++++++ ext/gl/gstglcolorconvertelement.h | 1 + gst-libs/gst/gl/gstglcolorconvert.c | 6 +++- 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/ext/gl/gstglcolorconvertelement.c b/ext/gl/gstglcolorconvertelement.c index 642b494..5e26f84 100644 --- a/ext/gl/gstglcolorconvertelement.c +++ b/ext/gl/gstglcolorconvertelement.c @@ -35,6 +35,14 @@ G_DEFINE_TYPE_WITH_CODE (GstGLColorConvertElement, gst_gl_color_convert_element, "glconvertelement", 0, "convert"); ); +enum +{ + GL_COLOR_CONVERT_PROP_0, + GL_COLOR_CONVERT_PROP_DISABLE_PASSTHROUGH +}; + +#define DISABLE_PASSTHROUGH_DAFAULT FALSE + static gboolean gst_gl_color_convert_element_set_caps (GstBaseTransform * bt, GstCaps * in_caps, GstCaps * out_caps); static GstCaps *gst_gl_color_convert_element_transform_caps (GstBaseTransform * @@ -54,6 +62,15 @@ static GstFlowReturn gst_gl_color_convert_element_transform (GstBaseTransform * static GstCaps *gst_gl_color_convert_element_fixate_caps (GstBaseTransform * bt, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static void gst_gl_color_convert_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gst_gl_color_convert_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + static GstStaticPadTemplate gst_gl_color_convert_element_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, @@ -89,6 +106,10 @@ gst_gl_color_convert_element_class_init (GstGLColorConvertElementClass * klass) { GstBaseTransformClass *bt_class = GST_BASE_TRANSFORM_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = gst_gl_color_convert_set_property; + object_class->get_property = gst_gl_color_convert_get_property; bt_class->transform_caps = gst_gl_color_convert_element_transform_caps; bt_class->set_caps = gst_gl_color_convert_element_set_caps; @@ -108,6 +129,13 @@ gst_gl_color_convert_element_class_init (GstGLColorConvertElementClass * klass) gst_element_class_add_static_pad_template (element_class, &gst_gl_color_convert_element_sink_pad_template); + g_object_class_install_property (object_class, GL_COLOR_CONVERT_PROP_DISABLE_PASSTHROUGH, + g_param_spec_boolean ("disable_passthrough", + "Disable passthrough", + "Disable passthrough mode", + DISABLE_PASSTHROUGH_DAFAULT, + G_PARAM_READWRITE)); + gst_element_class_set_metadata (element_class, "OpenGL color converter", "Filter/Converter/Video", "Converts between color spaces using OpenGL shaders", @@ -119,6 +147,41 @@ gst_gl_color_convert_element_init (GstGLColorConvertElement * convert) { gst_base_transform_set_prefer_passthrough (GST_BASE_TRANSFORM (convert), TRUE); + convert->disable_passthrough = FALSE; +} + +static void +gst_gl_color_convert_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GstGLColorConvertElement *convert = GST_GL_COLOR_CONVERT_ELEMENT (object); + switch (prop_id) { + case GL_COLOR_CONVERT_PROP_DISABLE_PASSTHROUGH: + convert->disable_passthrough = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gl_color_convert_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GstGLColorConvertElement *convert = GST_GL_COLOR_CONVERT_ELEMENT (object); + switch (prop_id) { + case GL_COLOR_CONVERT_PROP_DISABLE_PASSTHROUGH: + g_value_set_boolean (value, convert->disable_passthrough); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static gboolean @@ -133,6 +196,13 @@ gst_gl_color_convert_element_set_caps (GstBaseTransform * bt, if (convert->convert) gst_gl_color_convert_set_caps (convert->convert, in_caps, out_caps); + if(gst_base_transform_is_passthrough (bt) && convert->disable_passthrough){ + /* if in passthrough mode and disable_passthrough is set to true, + * set passthrough to FALSE*/ + GST_DEBUG_OBJECT(convert, "Disable passthrough mode"); + gst_base_transform_set_passthrough(bt, FALSE); + } + return TRUE; } diff --git a/ext/gl/gstglcolorconvertelement.h b/ext/gl/gstglcolorconvertelement.h index 2a0dd1d..5cdbd3a 100644 --- a/ext/gl/gstglcolorconvertelement.h +++ b/ext/gl/gstglcolorconvertelement.h @@ -47,6 +47,7 @@ struct _GstGLColorConvertElement GstGLColorConvert *convert; GstCaps *in_caps; GstCaps *out_caps; + gboolean disable_passthrough; }; struct _GstGLColorConvertElementClass diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c index 89edb16..adf5a6e 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.c +++ b/gst-libs/gst/gl/gstglcolorconvert.c @@ -718,7 +718,11 @@ _gst_gl_color_convert_set_caps_unlocked (GstGLColorConvert * convert, convert->priv->to_texture_target = to_target; convert->initted = FALSE; - convert->passthrough = passthrough; + /* We may disable passthrough via an external property + * By the way, when glconvertelement is in passthrough mode, + * the plugin will not call gst_gl_color_convert_perform().*/ + + //convert->passthrough = passthrough; #ifndef GST_DISABLE_GST_DEBUG if (G_UNLIKELY (convert->passthrough)) GST_DEBUG_OBJECT (convert, -- 1.9.1