From 86aa568383fa1a6224fd0dc9ebd4b01072325de2 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Wed, 6 Mar 2019 23:29:56 +1100 Subject: [PATCH] glcolorconvert: Ensure we free the internal convert object If we only ever make it to READY, transform_caps can create an internal convert object that will never be freed by basetransform's stop vmethod (PAUSED->READY). --- ext/gl/gstglcolorconvertelement.c | 42 +++++++++++++++++++++++++---- gst-libs/gst/gl/gstglcolorconvert.c | 2 -- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/ext/gl/gstglcolorconvertelement.c b/ext/gl/gstglcolorconvertelement.c index 9cd041def1..25e7daab90 100644 --- a/ext/gl/gstglcolorconvertelement.c +++ b/ext/gl/gstglcolorconvertelement.c @@ -27,6 +27,7 @@ #include "gstglcolorconvertelement.h" GST_DEBUG_CATEGORY_STATIC (gst_gl_color_convert_element_debug); +#define gst_gl_color_convert_element_parent_class parent_class #define GST_CAT_DEFAULT gst_gl_color_convert_element_debug G_DEFINE_TYPE_WITH_CODE (GstGLColorConvertElement, gst_gl_color_convert_element, @@ -53,6 +54,9 @@ static GstFlowReturn gst_gl_color_convert_element_transform (GstBaseTransform * bt, GstBuffer * inbuf, GstBuffer * outbuf); static GstCaps *gst_gl_color_convert_element_fixate_caps (GstBaseTransform * bt, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); +static GstStateChangeReturn +gst_gl_color_convert_element_change_state (GstElement * element, + GstStateChange transition); static GstStaticPadTemplate gst_gl_color_convert_element_src_pad_template = GST_STATIC_PAD_TEMPLATE ("src", @@ -76,9 +80,7 @@ gst_gl_color_convert_element_stop (GstBaseTransform * bt) convert->convert = NULL; } - return - GST_BASE_TRANSFORM_CLASS (gst_gl_color_convert_element_parent_class)->stop - (bt); + return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (bt); } static void @@ -100,6 +102,8 @@ gst_gl_color_convert_element_class_init (GstGLColorConvertElementClass * klass) bt_class->passthrough_on_same_caps = TRUE; + element_class->change_state = gst_gl_color_convert_element_change_state; + gst_element_class_add_static_pad_template (element_class, &gst_gl_color_convert_element_src_pad_template); gst_element_class_add_static_pad_template (element_class, @@ -178,8 +182,7 @@ gst_gl_color_convert_element_decide_allocation (GstBaseTransform * trans, GstGLColorConvertElement *convert = GST_GL_COLOR_CONVERT_ELEMENT (trans); /* get gl context */ - if (!GST_BASE_TRANSFORM_CLASS - (gst_gl_color_convert_element_parent_class)->decide_allocation (trans, + if (!GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans, query)) return FALSE; @@ -237,3 +240,32 @@ gst_gl_color_convert_element_fixate_caps (GstBaseTransform * return gst_gl_color_convert_fixate_caps (context, direction, caps, othercaps); } + +static GstStateChangeReturn +gst_gl_color_convert_element_change_state (GstElement * element, + GstStateChange transition) +{ + GstGLColorConvertElement *convert = GST_GL_COLOR_CONVERT_ELEMENT (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + GST_DEBUG_OBJECT (convert, "changing state: %s => %s", + gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), + gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_NULL: + if (convert->convert) { + gst_object_unref (convert->convert); + convert->convert = NULL; + } + break; + default: + break; + } + + return ret; +} diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c index c319709fde..9fa123a42d 100644 --- a/gst-libs/gst/gl/gstglcolorconvert.c +++ b/gst-libs/gst/gl/gstglcolorconvert.c @@ -523,8 +523,6 @@ gst_gl_color_convert_finalize (GObject * object) convert->context = NULL; } - GST_ERROR_OBJECT (convert, "finalize"); - G_OBJECT_CLASS (gst_gl_color_convert_parent_class)->finalize (object); }