diff mbox series

[FFmpeg-devel,v4,1/2] libavcodec/vaapi_encode: Add new API adaption to vaapi_encode

Message ID 20220218020757.834409-1-wenbin.chen@intel.com
State New
Headers show
Series [FFmpeg-devel,v4,1/2] libavcodec/vaapi_encode: Add new API adaption to vaapi_encode | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 fail Make failed
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished

Commit Message

Wenbin Chen Feb. 18, 2022, 2:07 a.m. UTC
From: Wenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org>

Add vaSyncBuffer to VAAPI encoder. Old version API vaSyncSurface wait
surface to complete. When surface is used for multiple operation, it
waits all operations to finish. vaSyncBuffer only wait one channel to
finish.

Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
 libavcodec/vaapi_encode.c | 31 ++++++++++++++++++++++++++-----
 libavcodec/vaapi_encode.h |  3 +++
 2 files changed, 29 insertions(+), 5 deletions(-)

Comments

Hao Chen Feb. 18, 2022, 3:02 a.m. UTC | #1
Hey, there are some make errors, pasted as follows:

libavcodec/vaapi_encode.c:2552:1: note: in expansion of macro 'av_cold'
  av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
  ^~~~~~~
libavcodec/vaapi_encode.c:2589:1: error: expected declaration or statement at end of input
  }
  ^
libavcodec/vaapi_encode.c:2589:1: error: control reaches end of non-void function [-Werror=return-type]
  }
  ^
At top level:
libavcodec/vaapi_encode.c:2552:13: warning: 'ff_vaapi_encode_close' defined but not used [-Wunused-function]
  av_cold int ff_vaapi_encode_close(AVCodecContext *avctx)
              ^~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors

在 2022/2/18 上午10:07, Wenbin Chen 写道:
> From: Wenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org>
>
> Add vaSyncBuffer to VAAPI encoder. Old version API vaSyncSurface wait
> surface to complete. When surface is used for multiple operation, it
> waits all operations to finish. vaSyncBuffer only wait one channel to
> finish.
>
> Signed-off-by: Wenbin Chen <wenbin.chen@intel.com>
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> ---
>   libavcodec/vaapi_encode.c | 31 ++++++++++++++++++++++++++-----
>   libavcodec/vaapi_encode.h |  3 +++
>   2 files changed, 29 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> index 3bf379b1a0..335a8e450a 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -150,11 +150,25 @@ static int vaapi_encode_wait(AVCodecContext *avctx,
>              "(input surface %#x).\n", pic->display_order,
>              pic->encode_order, pic->input_surface);
>   
> -    vas = vaSyncSurface(ctx->hwctx->display, pic->input_surface);
> -    if (vas != VA_STATUS_SUCCESS) {
> -        av_log(avctx, AV_LOG_ERROR, "Failed to sync to picture completion: "
> -               "%d (%s).\n", vas, vaErrorStr(vas));
> -        return AVERROR(EIO);
> +#if VA_CHECK_VERSION(1, 9, 0)
> +    if (ctx->has_sync_buffer_func) {
> +        vas = vaSyncBuffer(ctx->hwctx->display,
> +                           pic->output_buffer,
> +                           VA_TIMEOUT_INFINITE);
> +        if (vas != VA_STATUS_SUCCESS) {
> +            av_log(avctx, AV_LOG_ERROR, "Failed to sync to output buffer completion: "
> +                   "%d (%s).\n", vas, vaErrorStr(vas));
> +            return AVERROR(EIO);
> +        }
> +    } else
> +#endif
> +    { // If vaSyncBuffer is not implemented, try old version API.
> +        vas = vaSyncSurface(ctx->hwctx->display, pic->input_surface);
> +        if (vas != VA_STATUS_SUCCESS) {
> +            av_log(avctx, AV_LOG_ERROR, "Failed to sync to picture completion: "
> +                "%d (%s).\n", vas, vaErrorStr(vas));
> +            return AVERROR(EIO);
> +        }
>       }
>   
>       // Input is definitely finished with now.
> @@ -2522,6 +2536,13 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
>           }
>       }
>   
> +#if VA_CHECK_VERSION(1, 9, 0)
> +    // check vaSyncBuffer function
> +    vas = vaSyncBuffer(ctx->hwctx->display, VA_INVALID_ID, 0);
> +    if (vas != VA_STATUS_ERROR_UNIMPLEMENTED) {
> +        ctx->has_sync_buffer_func = 1;
> +#endif
> +
>       return 0;
>   
>   fail:
> diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
> index b41604a883..29d9e9b91c 100644
> --- a/libavcodec/vaapi_encode.h
> +++ b/libavcodec/vaapi_encode.h
> @@ -345,6 +345,9 @@ typedef struct VAAPIEncodeContext {
>       int             roi_warned;
>   
>       AVFrame         *frame;
> +
> +    // Whether the driver support vaSyncBuffer
> +    int             has_sync_buffer_func;
>   } VAAPIEncodeContext;
>   
>   enum {
diff mbox series

Patch

diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 3bf379b1a0..335a8e450a 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -150,11 +150,25 @@  static int vaapi_encode_wait(AVCodecContext *avctx,
            "(input surface %#x).\n", pic->display_order,
            pic->encode_order, pic->input_surface);
 
-    vas = vaSyncSurface(ctx->hwctx->display, pic->input_surface);
-    if (vas != VA_STATUS_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "Failed to sync to picture completion: "
-               "%d (%s).\n", vas, vaErrorStr(vas));
-        return AVERROR(EIO);
+#if VA_CHECK_VERSION(1, 9, 0)
+    if (ctx->has_sync_buffer_func) {
+        vas = vaSyncBuffer(ctx->hwctx->display,
+                           pic->output_buffer,
+                           VA_TIMEOUT_INFINITE);
+        if (vas != VA_STATUS_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to sync to output buffer completion: "
+                   "%d (%s).\n", vas, vaErrorStr(vas));
+            return AVERROR(EIO);
+        }
+    } else
+#endif
+    { // If vaSyncBuffer is not implemented, try old version API.
+        vas = vaSyncSurface(ctx->hwctx->display, pic->input_surface);
+        if (vas != VA_STATUS_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to sync to picture completion: "
+                "%d (%s).\n", vas, vaErrorStr(vas));
+            return AVERROR(EIO);
+        }
     }
 
     // Input is definitely finished with now.
@@ -2522,6 +2536,13 @@  av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
         }
     }
 
+#if VA_CHECK_VERSION(1, 9, 0)
+    // check vaSyncBuffer function
+    vas = vaSyncBuffer(ctx->hwctx->display, VA_INVALID_ID, 0);
+    if (vas != VA_STATUS_ERROR_UNIMPLEMENTED) {
+        ctx->has_sync_buffer_func = 1;
+#endif
+
     return 0;
 
 fail:
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index b41604a883..29d9e9b91c 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -345,6 +345,9 @@  typedef struct VAAPIEncodeContext {
     int             roi_warned;
 
     AVFrame         *frame;
+
+    // Whether the driver support vaSyncBuffer
+    int             has_sync_buffer_func;
 } VAAPIEncodeContext;
 
 enum {