Commit 3ee462dc authored by Anton Khirnov's avatar Anton Khirnov

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.
parent 2c32eace
...@@ -116,15 +116,6 @@ fail: ...@@ -116,15 +116,6 @@ fail:
static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) 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; return MFX_ERR_NONE;
} }
...@@ -144,6 +135,16 @@ static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) ...@@ -144,6 +135,16 @@ static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
return MFX_ERR_NONE; 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) static void free_buffer(void *opaque, uint8_t *data)
{ {
int *used = opaque; int *used = opaque;
...@@ -467,6 +468,8 @@ finish: ...@@ -467,6 +468,8 @@ finish:
av_frame_free(&frame); av_frame_free(&frame);
free_surfaces(&decode);
if (decode.mfx_session) if (decode.mfx_session)
MFXClose(decode.mfx_session); MFXClose(decode.mfx_session);
if (decode.va_dpy) if (decode.va_dpy)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment