diff options
author | James Almer <jamrial@gmail.com> | 2018-09-11 14:04:20 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2018-09-11 14:04:20 -0300 |
commit | f8377ffce35251bba043aeda5d81df0d411a0595 (patch) | |
tree | 59bf421f0ff70f6b6ed1cb240352e36f5c71a786 | |
parent | ee96ab2db507b95a694f10b152481cf71842de28 (diff) | |
parent | 642fd4769becc2f4827f8375a3d9e8edd2f5df77 (diff) | |
download | ffmpeg-f8377ffce35251bba043aeda5d81df0d411a0595.tar.gz |
Merge commit '642fd4769becc2f4827f8375a3d9e8edd2f5df77'
* commit '642fd4769becc2f4827f8375a3d9e8edd2f5df77':
qsvvpp: Perform full init only when needed
Merged-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavutil/hwcontext_qsv.c | 83 |
1 files changed, 77 insertions, 6 deletions
diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 250091c4e8..9d64c7344f 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -23,6 +23,10 @@ #include "config.h" +#if HAVE_PTHREADS +#include <pthread.h> +#endif + #if CONFIG_VAAPI #include "hwcontext_vaapi.h" #endif @@ -56,7 +60,13 @@ typedef struct QSVDeviceContext { typedef struct QSVFramesContext { mfxSession session_download; + int session_download_init; mfxSession session_upload; + int session_upload_init; +#if HAVE_PTHREADS + pthread_mutex_t session_lock; + pthread_cond_t session_cond; +#endif AVBufferRef *child_frames_ref; mfxFrameSurface1 *surfaces_internal; @@ -147,12 +157,19 @@ static void qsv_frames_uninit(AVHWFramesContext *ctx) MFXClose(s->session_download); } 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_init = 0; + +#if HAVE_PTHREADS + pthread_mutex_destroy(&s->session_lock); + pthread_cond_destroy(&s->session_cond); +#endif av_freep(&s->mem_ids); av_freep(&s->surface_ptrs); @@ -535,13 +552,16 @@ 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; + s->session_download = NULL; + s->session_upload = NULL; - ret = qsv_init_internal_session(ctx, &s->session_upload, 1); - if (ret < 0) - return ret; + s->session_download_init = 0; + s->session_upload_init = 0; + +#if HAVE_PTHREADS + pthread_mutex_init(&s->session_lock, NULL); + pthread_cond_init(&s->session_cond, NULL); +#endif return 0; } @@ -740,6 +760,32 @@ static int qsv_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst, mfxSyncPoint sync = NULL; mfxStatus err; + int ret = 0; + + while (!s->session_download_init && !s->session_download && !ret) { +#if HAVE_PTHREADS + if (pthread_mutex_trylock(&s->session_lock) == 0) { +#endif + if (!s->session_download_init) { + ret = qsv_init_internal_session(ctx, &s->session_download, 0); + if (s->session_download) + s->session_download_init = 1; + } +#if HAVE_PTHREADS + pthread_mutex_unlock(&s->session_lock); + pthread_cond_signal(&s->session_cond); + } else { + pthread_mutex_lock(&s->session_lock); + while (!s->session_download_init && !s->session_download) { + pthread_cond_wait(&s->session_cond, &s->session_lock); + } + pthread_mutex_unlock(&s->session_lock); + } +#endif + } + + if (ret < 0) + return ret; if (!s->session_download) { if (s->child_frames_ref) @@ -787,6 +833,31 @@ static int qsv_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst, mfxSyncPoint sync = NULL; mfxStatus err; + int ret; + + while (!s->session_upload_init && !s->session_upload && !ret) { +#if HAVE_PTHREADS + if (pthread_mutex_trylock(&s->session_lock) == 0) { +#endif + if (!s->session_upload_init) { + ret = qsv_init_internal_session(ctx, &s->session_upload, 1); + if (s->session_upload) + s->session_upload_init = 1; + } +#if HAVE_PTHREADS + pthread_mutex_unlock(&s->session_lock); + pthread_cond_signal(&s->session_cond); + } else { + pthread_mutex_lock(&s->session_lock); + while (!s->session_upload_init && !s->session_upload) { + pthread_cond_wait(&s->session_cond, &s->session_lock); + } + pthread_mutex_unlock(&s->session_lock); + } +#endif + } + if (ret < 0) + return ret; if (!s->session_upload) { if (s->child_frames_ref) |