[vlc-commits] [Git][videolan/vlc][master] interop_vaapi: fix mem leak while pause

Steve Lhomme (@robUx4) gitlab at videolan.org
Mon Dec 9 16:53:01 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
03a56c84 by fengchao wei at 2024-12-09T16:52:46+00:00
interop_vaapi: fix mem leak while pause

- - - - -


1 changed file:

- modules/video_output/opengl/interop_vaapi.c


Changes:

=====================================
modules/video_output/opengl/interop_vaapi.c
=====================================
@@ -196,6 +196,21 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
     (void) plane_offset;
     struct priv *priv = interop->priv;
     vlc_object_t *o = VLC_OBJECT(interop->gl);
+
+    if (pic == priv->last.pic)
+    {
+#if VA_CHECK_VERSION(1, 1, 0)
+        for (unsigned i = 0; i < priv->last.va_surface_descriptor.num_layers; ++i)
+#else
+        for (unsigned i = 0; i < priv->last.va_image.num_planes; ++i)
+#endif
+        {
+            priv->gl.BindTexture(interop->tex_target, textures[i]);
+            priv->glEGLImageTargetTexture2DOES(interop->tex_target, priv->last.egl_images[i]);
+        }
+        return VLC_SUCCESS;
+    }
+
 #if VA_CHECK_VERSION(1, 1, 0)
     VADRMPRIMESurfaceDescriptor va_surface_descriptor;
 #else
@@ -206,43 +221,30 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
     bool release_image = false, release_buffer_info = false;
     unsigned num_planes = 0;
 
-    if (pic == priv->last.pic)
-    {
 #if VA_CHECK_VERSION(1, 1, 0)
-        va_surface_descriptor = priv->last.va_surface_descriptor;
-#else
-        va_image = priv->last.va_image;
-#endif
-        for (unsigned i = 0; i < priv->last.num_planes; ++i)
-            egl_images[i] = priv->last.egl_images[i];
-    }
-    else
-    {
-#if VA_CHECK_VERSION(1, 1, 0)
-        VA_CALL(o, vaSyncSurface, priv->vadpy, vlc_vaapi_PicGetSurface(pic));
-        if (vlc_vaapi_ExportSurfaceHandle(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
-                                          VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
-                                          VA_EXPORT_SURFACE_READ_ONLY | VA_EXPORT_SURFACE_SEPARATE_LAYERS,
-                                          &va_surface_descriptor))
-            goto error;
-        release_image = true;
+    VA_CALL(o, vaSyncSurface, priv->vadpy, vlc_vaapi_PicGetSurface(pic));
+    if (vlc_vaapi_ExportSurfaceHandle(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
+                                      VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
+                                      VA_EXPORT_SURFACE_READ_ONLY | VA_EXPORT_SURFACE_SEPARATE_LAYERS,
+                                      &va_surface_descriptor))
+        goto error;
+    release_image = true;
 #else
-        if (vlc_vaapi_DeriveImage(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
-                                  &va_image))
-            goto error;
-        release_image = true;
+    if (vlc_vaapi_DeriveImage(o, priv->vadpy, vlc_vaapi_PicGetSurface(pic),
+                              &va_image))
+        goto error;
+    release_image = true;
 
-        assert(va_image.format.fourcc == priv->fourcc);
+    assert(va_image.format.fourcc == priv->fourcc);
 
-        va_buffer_info = (VABufferInfo) {
-            .mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME
-        };
-        if (vlc_vaapi_AcquireBufferHandle(o, priv->vadpy, va_image.buf,
-                                          &va_buffer_info))
-            goto error;
+    va_buffer_info = (VABufferInfo) {
+        .mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME
+    };
+    if (vlc_vaapi_AcquireBufferHandle(o, priv->vadpy, va_image.buf,
+                                      &va_buffer_info))
+        goto error;
 #endif
-        release_buffer_info = true;
-    }
+    release_buffer_info = true;
 
 #if VA_CHECK_VERSION(1, 1, 0)
     num_planes = va_surface_descriptor.num_layers;
@@ -282,22 +284,19 @@ tc_vaegl_update(const struct vlc_gl_interop *interop, uint32_t textures[],
     }
 #endif
 
-    if (pic != priv->last.pic)
-    {
-        if (priv->last.pic != NULL)
-            vaegl_release_last_pic(interop, priv);
-        priv->last.pic = picture_Hold(pic);
+    if (priv->last.pic != NULL)
+        vaegl_release_last_pic(interop, priv);
+    priv->last.pic = picture_Hold(pic);
 #if VA_CHECK_VERSION(1, 1, 0)
-        priv->last.va_surface_descriptor = va_surface_descriptor;
+    priv->last.va_surface_descriptor = va_surface_descriptor;
 #else
-        priv->last.va_image = va_image;
-        priv->last.va_buffer_info = va_buffer_info;
+    priv->last.va_image = va_image;
+    priv->last.va_buffer_info = va_buffer_info;
 #endif
-        priv->last.num_planes = num_planes;
+    priv->last.num_planes = num_planes;
 
-        for (unsigned i = 0; i < num_planes; ++i)
-            priv->last.egl_images[i] = egl_images[i];
-    }
+    for (unsigned i = 0; i < num_planes; ++i)
+        priv->last.egl_images[i] = egl_images[i];
 
     return VLC_SUCCESS;
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/03a56c8406cb700c1f7ca7a50eda6e06f2182d76

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/03a56c8406cb700c1f7ca7a50eda6e06f2182d76
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list