summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHe Junyan <junyan.he@hotmail.com>2020-06-11 18:15:17 +0800
committerHe Junyan <junyan.he@hotmail.com>2020-06-11 18:32:58 +0800
commit72c4a161c09eef669b8f493790a4c991b6c46e8e (patch)
treec8dcee4dbd35bd28204b95ec195d6af3e1e57b83
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: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/343>
-rw-r--r--gst/vaapi/gstvaapipluginbase.c3
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)
gboolean
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);