[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