[FFmpeg-devel] [PATCH 1/2] lavc/vaapi_encode: Query surface alignment

David Rosca nowrep at gmail.com
Mon Nov 18 17:47:02 EET 2024


On Tue, Oct 22, 2024 at 5:28 PM David Rosca <nowrep at gmail.com> wrote:
>
> It needs to create temporary config to query surface attribute.
> ---

Ping.

Thanks,
David

>  libavcodec/vaapi_encode.c | 66 +++++++++++++++++++++++++++++++++++++++
>  libavcodec/vaapi_encode.h |  4 +++
>  2 files changed, 70 insertions(+)
>
> diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> index 16a9a364f0..c8864745a9 100644
> --- a/libavcodec/vaapi_encode.c
> +++ b/libavcodec/vaapi_encode.c
> @@ -1133,6 +1133,68 @@ fail:
>      return err;
>  }
>
> +static av_cold int vaapi_encode_surface_alignment(av_unused AVCodecContext *avctx)
> +{
> +#if VA_CHECK_VERSION(1, 21, 0)
> +    VAAPIEncodeContext *ctx = avctx->priv_data;
> +    VASurfaceAttrib *attr_list = NULL;
> +    unsigned int attr_count = 0;
> +    VAConfigID va_config;
> +    VAStatus vas;
> +    int err = 0;
> +
> +    vas = vaCreateConfig(ctx->hwctx->display,
> +                         ctx->va_profile, ctx->va_entrypoint,
> +                         NULL, 0, &va_config);
> +    if (vas != VA_STATUS_SUCCESS) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to create temp encode pipeline "
> +               "configuration: %d (%s).\n", vas, vaErrorStr(vas));
> +        return AVERROR(EIO);
> +    }
> +
> +    vas = vaQuerySurfaceAttributes(ctx->hwctx->display, va_config,
> +                                   0, &attr_count);
> +    if (vas != VA_STATUS_SUCCESS) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: "
> +               "%d (%s).\n", vas, vaErrorStr(vas));
> +        err = AVERROR_EXTERNAL;
> +        goto fail;
> +    }
> +
> +    attr_list = av_malloc(attr_count * sizeof(*attr_list));
> +    if (!attr_list) {
> +        err = AVERROR(ENOMEM);
> +        goto fail;
> +    }
> +
> +    vas = vaQuerySurfaceAttributes(ctx->hwctx->display, va_config,
> +                                   attr_list, &attr_count);
> +    if (vas != VA_STATUS_SUCCESS) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to query surface attributes: "
> +               "%d (%s).\n", vas, vaErrorStr(vas));
> +        err = AVERROR_EXTERNAL;
> +        goto fail;
> +    }
> +
> +    for (unsigned int i = 0; i < attr_count; i++) {
> +        if (attr_list[i].type == VASurfaceAttribAlignmentSize) {
> +            ctx->surface_alignment_width =
> +                1 << (attr_list[i].value.value.i & 0xf);
> +            ctx->surface_alignment_height =
> +                1 << ((attr_list[i].value.value.i & 0xf0) >> 4);
> +            break;
> +        }
> +    }
> +
> +fail:
> +    av_freep(&attr_list);
> +    vaDestroyConfig(ctx->hwctx->display, va_config);
> +    return err;
> +#else
> +    return 0;
> +#endif
> +}
> +
>  static const VAAPIEncodeRCMode vaapi_encode_rc_modes[] = {
>      //                                  Bitrate   Quality
>      //                                     | Maxrate | HRD/VBV
> @@ -2111,6 +2173,10 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx)
>      if (err < 0)
>          goto fail;
>
> +    err = vaapi_encode_surface_alignment(avctx);
> +    if (err < 0)
> +        goto fail;
> +
>      if (ctx->codec->get_encoder_caps) {
>          err = ctx->codec->get_encoder_caps(avctx);
>          if (err < 0)
> diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
> index c4f85397a2..ca5cfe9eca 100644
> --- a/libavcodec/vaapi_encode.h
> +++ b/libavcodec/vaapi_encode.h
> @@ -260,6 +260,10 @@ typedef struct VAAPIEncodeContext {
>       * This is a RefStruct reference.
>       */
>      VABufferID     *coded_buffer_ref;
> +
> +    // Surface alignment required by driver.
> +    int             surface_alignment_width;
> +    int             surface_alignment_height;
>  } VAAPIEncodeContext;
>
>  typedef struct VAAPIEncodeType {
> --
> 2.47.0
>


More information about the ffmpeg-devel mailing list