[FFmpeg-devel] [PATCH V3 1/3] libavcodec/vaapi_encode: Add new API adaption to vaapi_encode
Chen, Wenbin
wenbin.chen at intel.com
Fri Feb 11 07:16:48 EET 2022
> On Tue, 2022-02-08 at 11:05 +0800, Wenbin Chen wrote:
> > 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.
> >
> > Add wait param to vaapi_encode_wait() to prepare for the async_depth
> > option. "wait=1" means wait until operation ready. "wait=0" means
> > query operation's status. If it is ready return 0, if it is still
> > in progress return EAGAIN.
> >
> > Signed-off-by: Wenbin Chen <wenbin.chen at intel.com>
> > ---
> > libavcodec/vaapi_encode.c | 47 +++++++++++++++++++++++++++++++++---
> ---
> > 1 file changed, 40 insertions(+), 7 deletions(-)
> >
> > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> > index 3bf379b1a0..b87b58a42b 100644
> > --- a/libavcodec/vaapi_encode.c
> > +++ b/libavcodec/vaapi_encode.c
> > @@ -134,7 +134,8 @@ static int
> > vaapi_encode_make_misc_param_buffer(AVCodecContext *avctx,
> > }
> >
> > static int vaapi_encode_wait(AVCodecContext *avctx,
> > - VAAPIEncodePicture *pic)
> > + VAAPIEncodePicture *pic,
> > + uint8_t wait)
> > {
> > VAAPIEncodeContext *ctx = avctx->priv_data;
> > VAStatus vas;
> > @@ -150,11 +151,43 @@ 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));
> > +#if VA_CHECK_VERSION(1, 9, 0)
> > + // Try vaSyncBuffer.
> > + vas = vaSyncBuffer(ctx->hwctx->display,
> > + pic->output_buffer,
> > + wait ? VA_TIMEOUT_INFINITE : 0);
> > + if (vas == VA_STATUS_ERROR_TIMEDOUT) {
> > + return AVERROR(EAGAIN);
> > + } else if (vas != VA_STATUS_SUCCESS && vas !=
> > VA_STATUS_ERROR_UNIMPLEMENTED) {
> > + av_log(avctx, AV_LOG_ERROR, "Failed to sync to output buffer
> > completion: "
> > + "%d (%s).\n", vas, vaErrorStr(vas));
> > return AVERROR(EIO);
>
> We may add has_sync_buffer_func flag in this patch, and run the above code
> when
> ctx->has_sync_buffer_func is true. If so, we needn't check whether
> vaSyncBuffer
> is implemented again.
>
> Thanks
> Haihao
Thanks for your review. I will update the patchset.
Thanks
Wenbin
>
>
> > + } else if (vas == VA_STATUS_ERROR_UNIMPLEMENTED)
> > + // If vaSyncBuffer is not implemented, try old version API.
> > +#endif
> > + {
> > + if (!wait) {
> > + VASurfaceStatus surface_status;
> > + vas = vaQuerySurfaceStatus(ctx->hwctx->display,
> > + pic->input_surface,
> > + &surface_status);
> > + if (vas == VA_STATUS_SUCCESS &&
> > + surface_status != VASurfaceReady &&
> > + surface_status != VASurfaceSkipped) {
> > + return AVERROR(EAGAIN);
> > + } else if (vas != VA_STATUS_SUCCESS) {
> > + av_log(avctx, AV_LOG_ERROR, "Failed to query surface status:
> > "
> > + "%d (%s).\n", vas, vaErrorStr(vas));
> > + return AVERROR(EIO);
> > + }
> > + } else {
> > + 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.
> > @@ -633,7 +666,7 @@ static int vaapi_encode_output(AVCodecContext
> *avctx,
> > uint8_t *ptr;
> > int err;
> >
> > - err = vaapi_encode_wait(avctx, pic);
> > + err = vaapi_encode_wait(avctx, pic, 1);
> > if (err < 0)
> > return err;
> >
> > @@ -695,7 +728,7 @@ fail:
> > static int vaapi_encode_discard(AVCodecContext *avctx,
> > VAAPIEncodePicture *pic)
> > {
> > - vaapi_encode_wait(avctx, pic);
> > + vaapi_encode_wait(avctx, pic, 1);
> >
> > if (pic->output_buffer_ref) {
> > av_log(avctx, AV_LOG_DEBUG, "Discard output for pic "
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list