summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyunjun Ko <zzoon@igalia.com>2016-09-22 16:34:48 +0900
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>2016-09-22 17:01:59 +0200
commit5a4540e6540e78be2ca4d491543c92b47dc91d06 (patch)
tree82a24020f4bebf2063430444bc9a176242d85aef
parenta80e10ac5c85107592da3ce327d7739415cc9cb7 (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.c11
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;
}