Re: [libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only when needed

2018-09-03 Thread Maxym Dmytrychenko
On Mon, Sep 3, 2018 at 11:20 AM Li, Zhong  wrote:

> > From: libav-devel [mailto:libav-devel-boun...@libav.org] On Behalf Of
> > Maxym Dmytrychenko
> > Sent: Monday, September 3, 2018 2:07 AM
> > To: libav-devel@libav.org
> > Subject: [libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only
> when
> > needed
> >
> > From: Joe Olivas 
> >
> > Removing unused VPP sessions by initializing only when used in order to
> help
> > reduce CPU utilization. Thanks to Maxym for the guidance.
> >
> > Signed-off-by: Joe Olivas 
> > Signed-off-by: Maxym Dmytrychenko 
>
> Patch LGTM. Just wonder how much CPU utilization can be reduced?
> ___
> libav-devel mailing list
> libav-devel@libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel


thank you as well

5-10% of CPU utilization can be reduced

regards
Max
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Re: [libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only when needed

2018-09-03 Thread Li, Zhong
> From: libav-devel [mailto:libav-devel-boun...@libav.org] On Behalf Of
> Maxym Dmytrychenko
> Sent: Monday, September 3, 2018 2:07 AM
> To: libav-devel@libav.org
> Subject: [libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only when
> needed
> 
> From: Joe Olivas 
> 
> Removing unused VPP sessions by initializing only when used in order to help
> reduce CPU utilization. Thanks to Maxym for the guidance.
> 
> Signed-off-by: Joe Olivas 
> Signed-off-by: Maxym Dmytrychenko 

Patch LGTM. Just wonder how much CPU utilization can be reduced?
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Re: [libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only when needed

2018-09-02 Thread Luca Barbato
On 02/09/2018 20:06, Maxym Dmytrychenko wrote:
> From: Joe Olivas 
> 
> Removing unused VPP sessions by initializing only when used in order to help 
> reduce CPU utilization. Thanks to Maxym for the guidance.
> 
> Signed-off-by: Joe Olivas 
> Signed-off-by: Maxym Dmytrychenko 
> ---
>  libavutil/hwcontext_qsv.c | 83 
> +++
>  1 file changed, 77 insertions(+), 6 deletions(-)
> 

Fine for me :)

lu

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH v7] qsvvpp: Fix to perform full init only when needed

2018-09-02 Thread Maxym Dmytrychenko
From: Joe Olivas 

Removing unused VPP sessions by initializing only when used in order to help 
reduce CPU utilization. Thanks to Maxym for the guidance.

Signed-off-by: Joe Olivas 
Signed-off-by: Maxym Dmytrychenko 
---
 libavutil/hwcontext_qsv.c | 83 +++
 1 file changed, 77 insertions(+), 6 deletions(-)

diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index b3eb4a3ea..0cfcc01fe 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -23,6 +23,10 @@
 
 #include "config.h"
 
+#if HAVE_PTHREADS
+#include 
+#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)
-- 
2.15.2 (Apple Git-101.1)

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel