[vlc-commits] vdpau: fix surface leaks if the picture is not extracted

Rémi Denis-Courmont git at videolan.org
Wed Jul 24 21:51:42 CEST 2013


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Jul 24 22:48:50 2013 +0300| [2392db7de488cfc960278c2aa7888d8e7809b948] | committer: Rémi Denis-Courmont

vdpau: fix surface leaks if the picture is not extracted

This can happen in some corner cases such as flushing (luckily the leak
would automatically be resolved when the device instance is released).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2392db7de488cfc960278c2aa7888d8e7809b948
---

 modules/hw/vdpau/avcodec.c |   27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
index d9d04e4..f243240 100644
--- a/modules/hw/vdpau/avcodec.c
+++ b/modules/hw/vdpau/avcodec.c
@@ -81,26 +81,41 @@ static int Lock(vlc_va_t *va, AVFrame *ff)
         return VLC_EGENERIC;
     }
 
+    vlc_vdp_video_field_t *field = vlc_vdp_video_create(sys->vdp, surface);
+    if (unlikely(field == NULL))
+        return VLC_ENOMEM;
+
     ff->data[0] = (void *)sys->vdp; /* must be non-NULL */
     ff->data[3] = (void *)(uintptr_t)surface;
-    ff->opaque = (void *)(uintptr_t)surface;
+    ff->opaque = field;
     return VLC_SUCCESS;
 }
 
 static void Unlock(vlc_va_t *va, AVFrame *ff)
 {
-    (void) va;
+    vlc_vdp_video_field_t *field = ff->opaque;
+
+    assert(field != NULL);
+    field->destroy(field);
+
     ff->data[0] = ff->data[3] = NULL;
     ff->opaque = NULL;
+    (void) va;
 }
 
 static int Copy(vlc_va_t *va, picture_t *pic, AVFrame *ff)
 {
-    vlc_va_sys_t *sys = va->sys;
-    VdpVideoSurface surface = (uintptr_t)ff->opaque;
+    vlc_vdp_video_field_t *field = ff->opaque;
+
+    assert(field != NULL);
+    field = vlc_vdp_video_copy(field);
+    if (unlikely(field == NULL))
+        return VLC_ENOMEM;
 
-    return vlc_vdp_video_attach(sys->vdp, surface, pic)
-        ? VLC_ENOMEM : VLC_SUCCESS;
+    assert(pic->context == NULL);
+    pic->context = field;
+    (void) va;
+    return VLC_SUCCESS;
 }
 
 static int Init(vlc_va_t *va, void **ctxp, vlc_fourcc_t *chromap,



More information about the vlc-commits mailing list