summaryrefslogtreecommitdiff
path: root/libavcodec/vaapi_encode.c
diff options
context:
space:
mode:
authorWenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org>2022-02-18 11:07:46 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2022-02-28 12:37:02 +0800
commite0ff86993052b49a64d434bac345e92fc149f446 (patch)
tree3462c5a8dcdcf9dbaa9f9e2f3dba88866ae80b86 /libavcodec/vaapi_encode.c
parent567cab3bd8b797f46506e0b363d6a12555000056 (diff)
libavcodec/vaapi_encode: Add new API adaption to vaapi_encode
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>
Diffstat (limited to 'libavcodec/vaapi_encode.c')
-rw-r--r--libavcodec/vaapi_encode.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 3bf379b1a0..3f8c8ace2a 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,14 @@ 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: