From 2562dd9e7831743ba6dc5680501fb7d26a2ec62c Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Tue, 18 Sep 2018 23:30:44 +0100 Subject: [PATCH] vaapi_encode: Always reapply global parameters after the sequence header The codec sequence headers may contain fields which can overwrite the fine parameters given in the specific settings (e.g. a crude bitrate value vs. the max-rate / target-percentage / etc. values in VAEncMiscParameterRateControl). Always reapply all global parameters after a sequence header to avoid this causing problems. --- libavcodec/vaapi_encode.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 35a4e90f67..1969c9252f 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -207,9 +207,16 @@ static int vaapi_encode_issue(AVCodecContext *avctx, pic->nb_param_buffers = 0; - if (pic->encode_order == 0) { - // Global parameter buffers are set on the first picture only. + if (pic->type == PICTURE_TYPE_IDR && ctx->codec->init_sequence_params) { + err = vaapi_encode_make_param_buffer(avctx, pic, + VAEncSequenceParameterBufferType, + ctx->codec_sequence_params, + ctx->codec->sequence_params_size); + if (err < 0) + goto fail; + } + if (pic->type == PICTURE_TYPE_IDR) { for (i = 0; i < ctx->nb_global_params; i++) { err = vaapi_encode_make_param_buffer(avctx, pic, VAEncMiscParameterBufferType, @@ -220,15 +227,6 @@ static int vaapi_encode_issue(AVCodecContext *avctx, } } - if (pic->type == PICTURE_TYPE_IDR && ctx->codec->init_sequence_params) { - err = vaapi_encode_make_param_buffer(avctx, pic, - VAEncSequenceParameterBufferType, - ctx->codec_sequence_params, - ctx->codec->sequence_params_size); - if (err < 0) - goto fail; - } - if (ctx->codec->init_picture_params) { err = ctx->codec->init_picture_params(avctx, pic); if (err < 0) {