Not used VPP sessions, like for hwupload/hwdownload handling, can increase CPU utilization and this patch fixes it. thank you,Joe, for the contribution.
Signed-off-by: Maxym Dmytrychenko <maxim....@gmail.com> --- libavutil/hwcontext_qsv.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index b3eb4a3ea..3e6c38037 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -56,7 +56,9 @@ typedef struct QSVDeviceContext { typedef struct QSVFramesContext { mfxSession session_download; + int session_download_init; mfxSession session_upload; + int session_upload_init; AVBufferRef *child_frames_ref; mfxFrameSurface1 *surfaces_internal; @@ -146,13 +148,15 @@ static void qsv_frames_uninit(AVHWFramesContext *ctx) MFXVideoVPP_Close(s->session_download); MFXClose(s->session_download); } - s->session_download = NULL; + s->session_download = NULL; + s->session_download_init = 0; if (s->session_upload) { MFXVideoVPP_Close(s->session_upload); MFXClose(s->session_upload); } - s->session_upload = NULL; + s->session_upload = NULL; + s->session_upload_init = 0; av_freep(&s->mem_ids); av_freep(&s->surface_ptrs); @@ -535,13 +539,10 @@ static int qsv_frames_init(AVHWFramesContext *ctx) s->mem_ids[i] = frames_hwctx->surfaces[i].Data.MemId; } - ret = qsv_init_internal_session(ctx, &s->session_download, 0); - if (ret < 0) - return ret; - - ret = qsv_init_internal_session(ctx, &s->session_upload, 1); - if (ret < 0) - return ret; + s->session_download = NULL; + s->session_upload = NULL; + s->session_download_init = 0; + s->session_upload_init = 0; return 0; } @@ -740,6 +741,14 @@ static int qsv_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst, mfxSyncPoint sync = NULL; mfxStatus err; + int ret = -1; + + if (!s->session_download_init) { + s->session_download_init = 1; + ret = qsv_init_internal_session(ctx, &s->session_download, 0); + if (ret < 0) + return ret; + } if (!s->session_download) { if (s->child_frames_ref) @@ -787,6 +796,14 @@ static int qsv_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst, mfxSyncPoint sync = NULL; mfxStatus err; + int ret = -1; + + if (!s->session_upload_init) { + s->session_upload_init = 1; + ret = qsv_init_internal_session(ctx, &s->session_upload, 1); + if (ret < 0) + return ret; + } if (!s->session_upload) { if (s->child_frames_ref) -- 2.15.2 (Apple Git-101.1) _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel