diff options
author | Hyunjun Ko <zzoon@igalia.com> | 2016-09-22 16:34:48 +0900 |
---|---|---|
committer | Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com> | 2016-09-22 17:01:59 +0200 |
commit | 5a4540e6540e78be2ca4d491543c92b47dc91d06 (patch) | |
tree | 82a24020f4bebf2063430444bc9a176242d85aef | |
parent | a80e10ac5c85107592da3ce327d7739415cc9cb7 (diff) |
plugins: reset textures at negotiation/shutdown
When caps reconfiguration is called, the new downstream frame size might be
different. Thus, if the downstream caps change,the display's texture map is
reset.
In addition, during pipeline shutdown, textures in texture map have to be
released, since each one have a reference to the GstVaapiDisplay object, which
is a dangerous circular reference.
https://bugzilla.gnome.org/show_bug.cgi?id=769293
Signed-off-by: Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
-rw-r--r-- | gst/vaapi/gstvaapipluginbase.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gst/vaapi/gstvaapipluginbase.c b/gst/vaapi/gstvaapipluginbase.c index 7849161b..a1f3d3b0 100644 --- a/gst/vaapi/gstvaapipluginbase.c +++ b/gst/vaapi/gstvaapipluginbase.c @@ -207,6 +207,13 @@ error_create_proxy: } static void +plugin_reset_texture_map (GstVaapiPluginBase * plugin) +{ + if (plugin->display) + gst_vaapi_display_reset_texture_map (plugin->display); +} + +static void gst_vaapi_plugin_base_find_gl_context (GstVaapiPluginBase * plugin) { GstObject *gl_context; @@ -278,6 +285,9 @@ gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin) void 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); @@ -704,6 +714,7 @@ gst_vaapi_plugin_base_set_caps (GstVaapiPluginBase * plugin, GstCaps * incaps, if (outcaps && outcaps != plugin->srcpad_caps) { g_clear_object (&plugin->srcpad_allocator); gst_caps_replace (&plugin->srcpad_caps, outcaps); + plugin_reset_texture_map (plugin); if (!gst_video_info_from_caps (&plugin->srcpad_info, outcaps)) return FALSE; } |