Within qsvdec.c, ff_qsv_init_session_frames() is typically called twice during 
decoder initialization. Although qsv_create_mids() may be called if 
avctx->hw_frames_ctx exists, this procedure causes memory and handle leaks 
because the existing created resources are merely set to NULL before 
ff_refstruct_unref() is called.

Signed-off-by: Hyunho Kim <[email protected]>
---
 libavcodec/qsv.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 8a3dc95706..d8ddf85392 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -1133,13 +1133,13 @@ int ff_qsv_init_session_frames(AVCodecContext *avctx, 
mfxSession *psession,
         return ret;
 
     if (!opaque) {
+        /* clean up the exist mids */
+        ff_refstruct_unref(&qsv_frames_ctx->mids);
         qsv_frames_ctx->logctx = avctx;
-        qsv_frames_ctx->mids = NULL;
         qsv_frames_ctx->nb_mids = 0;
 
         /* allocate the memory ids for the external frames */
         if (frames_hwctx->nb_surfaces) {
-            ff_refstruct_unref(&qsv_frames_ctx->mids);
             qsv_frames_ctx->mids = 
qsv_create_mids(qsv_frames_ctx->hw_frames_ctx);
             if (!qsv_frames_ctx->mids)
                 return AVERROR(ENOMEM);
-- 
2.48.1.windows.1

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to