@@ -163,7 +163,7 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
VAAPIEncodeContext *ctx = avctx->priv_data;
VAAPIEncodeSlice *slice;
VAStatus vas;
- int err, i;
+ int err, i, send_global_params;
char data[MAX_PARAM_BUFFER_SIZE];
size_t bit_len;
av_unused AVFrameSideData *sd;
@@ -236,6 +236,12 @@ static int vaapi_encode_issue(AVCodecContext *avctx,
if (pic->type == PICTURE_TYPE_IDR) {
for (i = 0; i < ctx->nb_global_params; i++) {
+ if (pic->encode_order != 0 &&
+ ctx->global_params_type[i] == VAEncMiscParameterTypeRateControl &&
+ ctx->hwctx->driver_quirks & AV_VAAPI_DRIVER_QUIRK_RC_PARAMS_ONCE) {
+ // send VAEncMiscParameterTypeRateControl only once to affected drivers
+ continue;
+ }
err = vaapi_encode_make_misc_param_buffer(avctx, pic,
ctx->global_params_type[i],
ctx->global_params[i],
@@ -323,6 +323,16 @@ static const struct {
"Splitted-Desktop Systems VDPAU backend for VA-API",
AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES,
},
+ {
+ "Intel Broxton",
+ "Intel(R) Broxton",
+ AV_VAAPI_DRIVER_QUIRK_RC_PARAMS_ONCE,
+ },
+ {
+ "Intel CherryView",
+ "Intel(R) CherryView",
+ AV_VAAPI_DRIVER_QUIRK_RC_PARAMS_ONCE,
+ },
};
static int vaapi_device_init(AVHWDeviceContext *hwdev)
@@ -58,6 +58,12 @@ enum {
* and the results of the vaQuerySurfaceAttributes() call will be faked.
*/
AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3),
+
+ /**
+ * The driver does not react well to receiving global parameters with
+ * every IDR frame.
+ */
+ AV_VAAPI_DRIVER_QUIRK_RC_PARAMS_ONCE = (1 << 4),
};
/**