[FFmpeg-devel] [PATCH v4 3/5] lavc: Remove libva 1.x support

Mark Thompson sw at jkqxz.net
Sun May 5 22:01:45 EEST 2024


libva 2.0 was released in 2017 and the 2.x versions are included in all
supported distributions nowadays.
---
 libavcodec/vaapi_decode.c      | 39 ++---------------
 libavcodec/vaapi_encode.c      | 78 ++++++----------------------------
 libavcodec/vaapi_encode.h      |  9 ----
 libavcodec/vaapi_encode_h264.c | 18 --------
 libavcodec/vaapi_encode_h265.c |  2 -
 5 files changed, 15 insertions(+), 131 deletions(-)

diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c
index 21b273cd0f..ef1ea27a08 100644
--- a/libavcodec/vaapi_decode.c
+++ b/libavcodec/vaapi_decode.c
@@ -191,16 +191,10 @@ int ff_vaapi_decode_issue(AVCodecContext *avctx,
         av_log(avctx, AV_LOG_ERROR, "Failed to end picture decode "
                "issue: %d (%s).\n", vas, vaErrorStr(vas));
         err = AVERROR(EIO);
-        if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-            AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS)
-            goto fail;
-        else
-            goto fail_at_end;
+        goto fail;
     }
 
-    if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-        AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS)
-        ff_vaapi_decode_destroy_buffers(avctx, pic);
+    ff_vaapi_decode_destroy_buffers(avctx, pic);
 
     err = 0;
     goto exit;
@@ -213,7 +207,6 @@ fail_with_picture:
     }
 fail:
     ff_vaapi_decode_destroy_buffers(avctx, pic);
-fail_at_end:
 exit:
     pic->nb_param_buffers = 0;
     pic->nb_slices        = 0;
@@ -406,12 +399,10 @@ static const struct {
                            H264ConstrainedBaseline),
     MAP(H264,        H264_MAIN,       H264Main    ),
     MAP(H264,        H264_HIGH,       H264High    ),
-#if VA_CHECK_VERSION(0, 37, 0)
     MAP(HEVC,        HEVC_MAIN,       HEVCMain    ),
     MAP(HEVC,        HEVC_MAIN_10,    HEVCMain10  ),
     MAP(HEVC,        HEVC_MAIN_STILL_PICTURE,
                                       HEVCMain    ),
-#endif
 #if VA_CHECK_VERSION(1, 2, 0) && CONFIG_HEVC_VAAPI_HWACCEL
     MAP(HEVC,        HEVC_REXT,       None,
                  ff_vaapi_parse_hevc_rext_scc_profile ),
@@ -429,14 +420,10 @@ static const struct {
     MAP(VC1,         VC1_COMPLEX,     VC1Advanced ),
     MAP(VC1,         VC1_ADVANCED,    VC1Advanced ),
     MAP(VP8,         UNKNOWN,       VP8Version0_3 ),
-#if VA_CHECK_VERSION(0, 38, 0)
     MAP(VP9,         VP9_0,           VP9Profile0 ),
-#endif
-#if VA_CHECK_VERSION(0, 39, 0)
     MAP(VP9,         VP9_1,           VP9Profile1 ),
     MAP(VP9,         VP9_2,           VP9Profile2 ),
     MAP(VP9,         VP9_3,           VP9Profile3 ),
-#endif
 #if VA_CHECK_VERSION(1, 8, 0)
     MAP(AV1,         AV1_MAIN,        AV1Profile0),
     MAP(AV1,         AV1_HIGH,        AV1Profile1),
@@ -599,27 +586,7 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
         if (err < 0)
             goto fail;
 
-        if (CONFIG_VAAPI_1)
-            frames->initial_pool_size = 0;
-        else {
-            frames->initial_pool_size = 1;
-            // Add per-codec number of surfaces used for storing reference frames.
-            switch (avctx->codec_id) {
-            case AV_CODEC_ID_H264:
-            case AV_CODEC_ID_HEVC:
-            case AV_CODEC_ID_AV1:
-                frames->initial_pool_size += 16;
-                break;
-            case AV_CODEC_ID_VP9:
-                frames->initial_pool_size += 8;
-                break;
-            case AV_CODEC_ID_VP8:
-                frames->initial_pool_size += 3;
-                break;
-            default:
-                frames->initial_pool_size += 2;
-            }
-        }
+        frames->initial_pool_size = 0;
     }
 
     av_hwframe_constraints_free(&constraints);
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index f54b2579ec..6f062e8277 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -530,7 +530,6 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
         }
     }
 
-#if VA_CHECK_VERSION(1, 0, 0)
     sd = av_frame_get_side_data(pic->input_image,
                                 AV_FRAME_DATA_REGIONS_OF_INTEREST);
     if (sd && ctx->roi_allowed) {
@@ -593,7 +592,6 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
         if (err < 0)
             goto fail;
     }
-#endif
 
     vas = vaBeginPicture(ctx->hwctx->display, ctx->va_context,
                          pic->input_surface);
@@ -618,26 +616,17 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
         av_log(avctx, AV_LOG_ERROR, "Failed to end picture encode issue: "
                "%d (%s).\n", vas, vaErrorStr(vas));
         err = AVERROR(EIO);
-        // vaRenderPicture() has been called here, so we should not destroy
-        // the parameter buffers unless separate destruction is required.
-        if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-            AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS)
-            goto fail;
-        else
-            goto fail_at_end;
-    }
-
-    if (CONFIG_VAAPI_1 || ctx->hwctx->driver_quirks &
-        AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS) {
-        for (i = 0; i < pic->nb_param_buffers; i++) {
-            vas = vaDestroyBuffer(ctx->hwctx->display,
-                                  pic->param_buffers[i]);
-            if (vas != VA_STATUS_SUCCESS) {
-                av_log(avctx, AV_LOG_ERROR, "Failed to destroy "
-                       "param buffer %#x: %d (%s).\n",
-                       pic->param_buffers[i], vas, vaErrorStr(vas));
-                // And ignore.
-            }
+        goto fail;
+    }
+
+    for (i = 0; i < pic->nb_param_buffers; i++) {
+        vas = vaDestroyBuffer(ctx->hwctx->display,
+                              pic->param_buffers[i]);
+        if (vas != VA_STATUS_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to destroy "
+                   "param buffer %#x: %d (%s).\n",
+                   pic->param_buffers[i], vas, vaErrorStr(vas));
+            // And ignore.
         }
     }
 
@@ -654,7 +643,6 @@ fail:
         for (i = 0; i < pic->nb_slices; i++)
             av_freep(&pic->slices[i].codec_slice_params);
     }
-fail_at_end:
     av_freep(&pic->codec_picture_params);
     av_freep(&pic->param_buffers);
     av_freep(&pic->slices);
@@ -1530,25 +1518,19 @@ static const VAAPIEncodeRTFormat vaapi_encode_rt_formats[] = {
     { "YUV444",    VA_RT_FORMAT_YUV444,        8, 3, 0, 0 },
     { "XYUV",      VA_RT_FORMAT_YUV444,        8, 3, 0, 0 },
     { "YUV411",    VA_RT_FORMAT_YUV411,        8, 3, 2, 0 },
-#if VA_CHECK_VERSION(0, 38, 1)
     { "YUV420_10", VA_RT_FORMAT_YUV420_10BPP, 10, 3, 1, 1 },
-#endif
 };
 
 static const VAEntrypoint vaapi_encode_entrypoints_normal[] = {
     VAEntrypointEncSlice,
     VAEntrypointEncPicture,
-#if VA_CHECK_VERSION(0, 39, 2)
     VAEntrypointEncSliceLP,
-#endif
     0
 };
-#if VA_CHECK_VERSION(0, 39, 2)
 static const VAEntrypoint vaapi_encode_entrypoints_low_power[] = {
     VAEntrypointEncSliceLP,
     0
 };
-#endif
 
 static av_cold int vaapi_encode_profile_entrypoint(AVCodecContext *avctx)
 {
@@ -1566,13 +1548,7 @@ static av_cold int vaapi_encode_profile_entrypoint(AVCodecContext *avctx)
 
 
     if (ctx->low_power) {
-#if VA_CHECK_VERSION(0, 39, 2)
         usable_entrypoints = vaapi_encode_entrypoints_low_power;
-#else
-        av_log(avctx, AV_LOG_ERROR, "Low-power encoding is not "
-               "supported with this VAAPI version.\n");
-        return AVERROR(EINVAL);
-#endif
     } else {
         usable_entrypoints = vaapi_encode_entrypoints_normal;
     }
@@ -1623,11 +1599,7 @@ static av_cold int vaapi_encode_profile_entrypoint(AVCodecContext *avctx)
             avctx->profile != AV_PROFILE_UNKNOWN)
             continue;
 
-#if VA_CHECK_VERSION(1, 0, 0)
         profile_string = vaProfileStr(profile->va_profile);
-#else
-        profile_string = "(no profile names)";
-#endif
 
         for (j = 0; j < n; j++) {
             if (va_profiles[j] == profile->va_profile)
@@ -1686,11 +1658,7 @@ static av_cold int vaapi_encode_profile_entrypoint(AVCodecContext *avctx)
     }
 
     ctx->va_entrypoint = va_entrypoints[i];
-#if VA_CHECK_VERSION(1, 0, 0)
     entrypoint_string = vaEntrypointStr(ctx->va_entrypoint);
-#else
-    entrypoint_string = "(no entrypoint names)";
-#endif
     av_log(avctx, AV_LOG_VERBOSE, "Using VAAPI entrypoint %s (%d).\n",
            entrypoint_string, ctx->va_entrypoint);
 
@@ -1807,16 +1775,10 @@ static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
 
         supported_va_rc_modes = rc_attr.value;
         if (ctx->blbrc) {
-#if VA_CHECK_VERSION(0, 39, 2)
             if (!(supported_va_rc_modes & VA_RC_MB)) {
                 ctx->blbrc = 0;
                 av_log(avctx, AV_LOG_WARNING, "Driver does not support BLBRC.\n");
             }
-#else
-            ctx->blbrc = 0;
-            av_log(avctx, AV_LOG_WARNING, "Please consider to update to VAAPI 0.39.2 "
-                   "or above, which can support BLBRC.\n");
-#endif
         }
 
         for (i = 0; i < FF_ARRAY_ELEMS(vaapi_encode_rc_modes); i++) {
@@ -2044,11 +2006,7 @@ rc_mode_found:
         ctx->config_attributes[ctx->nb_config_attributes++] =
             (VAConfigAttrib) {
             .type  = VAConfigAttribRateControl,
-#if VA_CHECK_VERSION(0, 39, 2)
             .value = ctx->blbrc ? ctx->va_rc_mode | VA_RC_MB : ctx->va_rc_mode,
-#else
-            .value = ctx->va_rc_mode,
-#endif
         };
     }
 
@@ -2081,9 +2039,7 @@ rc_mode_found:
 #if VA_CHECK_VERSION(1, 3, 0)
             .quality_factor     = rc_quality,
 #endif
-#if VA_CHECK_VERSION(0, 39, 2)
             .rc_flags.bits.mb_rate_control = ctx->blbrc ? 1 : 2,
-#endif
         };
         vaapi_encode_add_global_param(avctx,
                                       VAEncMiscParameterTypeRateControl,
@@ -2119,12 +2075,10 @@ rc_mode_found:
     ctx->fr_params = (VAEncMiscParameterFrameRate) {
         .framerate = (unsigned int)fr_den << 16 | fr_num,
     };
-#if VA_CHECK_VERSION(0, 40, 0)
     vaapi_encode_add_global_param(avctx,
                                   VAEncMiscParameterTypeFrameRate,
                                   &ctx->fr_params,
                                   sizeof(ctx->fr_params));
-#endif
 
     return 0;
 }
@@ -2338,11 +2292,9 @@ static av_cold int vaapi_encode_init_row_slice_structure(AVCodecContext *avctx,
         }
         ctx->nb_slices  = (ctx->slice_block_rows + k - 1) / k;
         ctx->slice_size = k;
-#if VA_CHECK_VERSION(1, 0, 0)
     } else if (slice_structure & VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS) {
         ctx->nb_slices  = ctx->slice_block_rows;
         ctx->slice_size = 1;
-#endif
     } else {
         av_log(avctx, AV_LOG_ERROR, "Driver does not support any usable "
                "slice structure modes (%#x).\n", slice_structure);
@@ -2566,7 +2518,6 @@ static av_cold int vaapi_encode_init_packed_headers(AVCodecContext *avctx)
 
 static av_cold int vaapi_encode_init_quality(AVCodecContext *avctx)
 {
-#if VA_CHECK_VERSION(0, 36, 0)
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VAStatus vas;
     VAConfigAttrib attr = { VAConfigAttribEncQualityRange };
@@ -2603,17 +2554,12 @@ static av_cold int vaapi_encode_init_quality(AVCodecContext *avctx)
                                       &ctx->quality_params,
                                       sizeof(ctx->quality_params));
     }
-#else
-    av_log(avctx, AV_LOG_WARNING, "The encode quality option is "
-           "not supported with this VAAPI version.\n");
-#endif
 
     return 0;
 }
 
 static av_cold int vaapi_encode_init_roi(AVCodecContext *avctx)
 {
-#if VA_CHECK_VERSION(1, 0, 0)
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VAStatus vas;
     VAConfigAttrib attr = { VAConfigAttribEncROI };
@@ -2640,7 +2586,7 @@ static av_cold int vaapi_encode_init_roi(AVCodecContext *avctx)
             (ctx->va_rc_mode == VA_RC_CQP ||
              roi.bits.roi_rc_qp_delta_support);
     }
-#endif
+
     return 0;
 }
 
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index 0eed9691ca..43f3b8cf82 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -22,10 +22,7 @@
 #include <stdint.h>
 
 #include <va/va.h>
-
-#if VA_CHECK_VERSION(1, 0, 0)
 #include <va/va_str.h>
-#endif
 
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_vaapi.h"
@@ -82,12 +79,8 @@ typedef struct VAAPIEncodePicture {
     void           *opaque;
     AVBufferRef    *opaque_ref;
 
-#if VA_CHECK_VERSION(1, 0, 0)
     // ROI regions.
     VAEncROI       *roi;
-#else
-    void           *roi;
-#endif
 
     int             type;
     int             b_depth;
@@ -293,9 +286,7 @@ typedef struct VAAPIEncodeContext {
     VAEncMiscParameterHRD        hrd_params;
     VAEncMiscParameterFrameRate   fr_params;
     VAEncMiscParameterBufferMaxFrameSize mfs_params;
-#if VA_CHECK_VERSION(0, 36, 0)
     VAEncMiscParameterBufferQualityLevel quality_params;
-#endif
 
     // Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
     void           *codec_sequence_params;
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index d656b1020f..bb4c250bb4 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -106,7 +106,6 @@ typedef struct VAAPIEncodeH264Context {
 
     int aud_needed;
     int sei_needed;
-    int sei_cbr_workaround_needed;
 } VAAPIEncodeH264Context;
 
 
@@ -271,19 +270,6 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
 
         *type = VAEncPackedHeaderRawData;
         return 0;
-
-#if !CONFIG_VAAPI_1
-    } else if (priv->sei_cbr_workaround_needed) {
-        // Insert a zero-length header using the old SEI type.  This is
-        // required to avoid triggering broken behaviour on Intel platforms
-        // in CBR mode where an invalid SEI message is generated by the
-        // driver and inserted into the stream.
-        *data_len = 0;
-        *type = VAEncPackedHeaderH264_SEI;
-        priv->sei_cbr_workaround_needed = 0;
-        return 0;
-#endif
-
     } else {
         return AVERROR_EOF;
     }
@@ -681,10 +667,6 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
 
     if (priv->sei & SEI_IDENTIFIER && pic->encode_order == 0)
         priv->sei_needed |= SEI_IDENTIFIER;
-#if !CONFIG_VAAPI_1
-    if (ctx->va_rc_mode == VA_RC_CBR)
-        priv->sei_cbr_workaround_needed = 1;
-#endif
 
     if (priv->sei & SEI_TIMING) {
         priv->sei_pic_timing = (H264RawSEIPicTiming) {
diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index 2f59161346..a85b514715 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -1302,10 +1302,8 @@ static av_cold int vaapi_encode_h265_configure(AVCodecContext *avctx)
 static const VAAPIEncodeProfile vaapi_encode_h265_profiles[] = {
     { AV_PROFILE_HEVC_MAIN,     8, 3, 1, 1, VAProfileHEVCMain       },
     { AV_PROFILE_HEVC_REXT,     8, 3, 1, 1, VAProfileHEVCMain       },
-#if VA_CHECK_VERSION(0, 37, 0)
     { AV_PROFILE_HEVC_MAIN_10, 10, 3, 1, 1, VAProfileHEVCMain10     },
     { AV_PROFILE_HEVC_REXT,    10, 3, 1, 1, VAProfileHEVCMain10     },
-#endif
 #if VA_CHECK_VERSION(1, 2, 0)
     { AV_PROFILE_HEVC_REXT,    12, 3, 1, 1, VAProfileHEVCMain12 },
     { AV_PROFILE_HEVC_REXT,     8, 3, 1, 0, VAProfileHEVCMain422_10 },
-- 
2.43.0



More information about the ffmpeg-devel mailing list