diff options
authorHe Junyan <>2020-06-11 18:15:17 +0800
committerHe Junyan <>2020-06-11 18:32:58 +0800
commit72c4a161c09eef669b8f493790a4c991b6c46e8e (patch)
parent1c5f32b5cd0ba48f12201565f76aa550733e544a (diff)
plugins: pluginbase: Do not destroy display when _close()
When the element's state changes to NULL, it can still receive queries, such as the image formats. The display is needed in such queries but not well protected for MT safe. For example, ensure_allowed_raw_caps() may still use the display while it is disposed by gst_vaapi_plugin_base_close() because of the state change. We can keep the display until the element is destroyed. When the state changes to NULL, and then changes to PAUSED again, the display can be correctly set(if type changes), or leave untouched. Fix: #260 Part-of: <>
1 files changed, 2 insertions, 1 deletions
diff --git a/gst/vaapi/gstvaapipluginbase.c b/gst/vaapi/gstvaapipluginbase.c
index e0c1189e..7a06493a 100644
--- a/gst/vaapi/gstvaapipluginbase.c
+++ b/gst/vaapi/gstvaapipluginbase.c
@@ -314,6 +314,7 @@ void
gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin)
gst_vaapi_plugin_base_close (plugin);
+ gst_vaapi_display_replace (&plugin->display, NULL);
g_free (plugin->display_name);
if (plugin->sinkpriv)
@@ -339,6 +340,7 @@ gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin)
gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin)
+ gst_caps_replace (&plugin->allowed_raw_caps, NULL);
return TRUE;
@@ -355,7 +357,6 @@ gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin)
/* Release vaapi textures first if exist, which refs display object */
plugin_reset_texture_map (plugin);
- gst_vaapi_display_replace (&plugin->display, NULL);
gst_object_replace (&plugin->gl_context, NULL);
gst_object_replace (&plugin->gl_display, NULL);
gst_object_replace (&plugin->gl_other_context, NULL);