From 3ee462dca1038e63b8e8d5e751121736d5772a5d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 11 Aug 2015 14:57:07 +0200 Subject: examples/qsvdec: do not free the surfaces in the frame_free() callback Even though libmfx might not need them anymore, avcodec might still access the surfaces. So free them separately at the end. --- doc/examples/qsvdec.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'doc') diff --git a/doc/examples/qsvdec.c b/doc/examples/qsvdec.c index 04e5b5f..2f26f41 100644 --- a/doc/examples/qsvdec.c +++ b/doc/examples/qsvdec.c @@ -116,15 +116,6 @@ fail: static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) { - DecodeContext *decode = pthis; - - if (decode->surfaces) - vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces); - av_freep(&decode->surfaces); - av_freep(&decode->surface_ids); - av_freep(&decode->surface_used); - decode->nb_surfaces = 0; - return MFX_ERR_NONE; } @@ -144,6 +135,16 @@ static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) return MFX_ERR_NONE; } +static void free_surfaces(DecodeContext *decode) +{ + if (decode->surfaces) + vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces); + av_freep(&decode->surfaces); + av_freep(&decode->surface_ids); + av_freep(&decode->surface_used); + decode->nb_surfaces = 0; +} + static void free_buffer(void *opaque, uint8_t *data) { int *used = opaque; @@ -467,6 +468,8 @@ finish: av_frame_free(&frame); + free_surfaces(&decode); + if (decode.mfx_session) MFXClose(decode.mfx_session); if (decode.va_dpy) -- cgit v1.1