[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