[Libva] [Libva-intel-driver][PATCH] Needn't reset brc if the bitrate setting isn't changed in the Begin/Render/End sequence

Zhao Yakui yakui.zhao at intel.com
Thu Dec 29 06:14:24 UTC 2016


On 12/29/2016 01:22 PM, Xiang, Haihao wrote:
> User can use VAEncMiscParameterRateControl to update bitrate, so we should ignore
> the bitrate in the sequence parameter if VAEncMiscParameterRateControl is present.

This makes sense. The MiscRateControl mentions that it can override the 
bps setting in sequence parameter.

> Hence it is not needed to reset brc if VAEncMiscParameterRateControl doesn't change
> the used bitrate.

Does it still need to send the VAEncMiscParameterRateControl parameter 
if the bps is not changed for the new sequence?

Thanks
   Yakui
>
> Signed-off-by: Xiang, Haihao<haihao.xiang at intel.com>
> ---
>   src/i965_encoder.c | 72 +++++++++++++++++++++++++++++++++---------------------
>   1 file changed, 44 insertions(+), 28 deletions(-)
>
> diff --git a/src/i965_encoder.c b/src/i965_encoder.c
> index d4d7445..ae31f01 100644
> --- a/src/i965_encoder.c
> +++ b/src/i965_encoder.c
> @@ -314,18 +314,17 @@ intel_encoder_check_jpeg_yuv_surface(VADriverContextP ctx,
>   static VAStatus
>   intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
>                                                   struct encode_state *encode_state,
> -                                                struct intel_encoder_context *encoder_context)
> +                                                struct intel_encoder_context *encoder_context,
> +                                                unsigned int *seq_bits_per_second)
>   {
>       VAEncSequenceParameterBufferH264 *seq_param = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
>       struct intel_fraction framerate;
> -    unsigned int bits_per_second;
>       unsigned short num_pframes_in_gop, num_bframes_in_gop;
>
>       if (!encoder_context->is_new_sequence)
>           return VA_STATUS_SUCCESS;
>
>       assert(seq_param);
> -    bits_per_second = seq_param->bits_per_second; // for the highest layer
>
>       if (!seq_param->num_units_in_tick || !seq_param->time_scale) {
>           framerate = (struct intel_fraction) { 30, 1 };
> @@ -361,12 +360,10 @@ intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
>
>       if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop ||
>           num_bframes_in_gop != encoder_context->brc.num_bframes_in_gop ||
> -        bits_per_second != encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] ||
>           framerate.num != encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].num ||
>           framerate.den != encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].den) {
>           encoder_context->brc.num_pframes_in_gop = num_pframes_in_gop;
>           encoder_context->brc.num_bframes_in_gop = num_bframes_in_gop;
> -        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = bits_per_second;
>           encoder_context->brc.framerate[encoder_context->layer.num_layers - 1] = framerate;
>           encoder_context->brc.need_reset = 1;
>       }
> @@ -377,6 +374,8 @@ intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
>           encoder_context->brc.hrd_initial_buffer_fullness = seq_param->bits_per_second;
>       }
>
> +    *seq_bits_per_second = seq_param->bits_per_second;
> +
>       return VA_STATUS_SUCCESS;
>
>   error:
> @@ -386,10 +385,11 @@ error:
>   static VAStatus
>   intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
>                                                  struct encode_state *encode_state,
> -                                               struct intel_encoder_context *encoder_context)
> +                                               struct intel_encoder_context *encoder_context,
> +                                               unsigned int *seq_bits_per_second)
>   {
>       VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
> -    unsigned int num_pframes_in_gop, bits_per_second;
> +    unsigned int num_pframes_in_gop;
>
>       if (!encoder_context->is_new_sequence)
>           return VA_STATUS_SUCCESS;
> @@ -406,7 +406,6 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
>       }
>
>       num_pframes_in_gop = encoder_context->brc.gop_size - 1;
> -    bits_per_second = seq_param->bits_per_second;       // for the highest layer
>
>       if (!encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].num) {
>           // for the highest layer
> @@ -414,10 +413,8 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
>           encoder_context->brc.need_reset = 1;
>       }
>
> -    if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop ||
> -        bits_per_second != encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1]) {
> +    if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop) {
>           encoder_context->brc.num_pframes_in_gop = num_pframes_in_gop;
> -        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = bits_per_second;
>           encoder_context->brc.need_reset = 1;
>       }
>
> @@ -428,13 +425,16 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
>           encoder_context->brc.need_reset = 1;
>       }
>
> +    *seq_bits_per_second = seq_param->bits_per_second;
> +
>       return VA_STATUS_SUCCESS;
>   }
>
>   static VAStatus
>   intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
>                                                   struct encode_state *encode_state,
> -                                                struct intel_encoder_context *encoder_context)
> +                                                struct intel_encoder_context *encoder_context,
> +                                                unsigned int *seq_bits_per_second)
>   {
>       VAEncSequenceParameterBufferHEVC *seq_param = (VAEncSequenceParameterBufferHEVC*)encode_state->seq_param_ext->buffer;
>       struct intel_fraction framerate;
> @@ -481,10 +481,7 @@ intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
>           encoder_context->brc.need_reset = 1;
>       }
>
> -    if (encoder_context->brc.bits_per_second[0] != seq_param->bits_per_second) {
> -        encoder_context->brc.bits_per_second[0] = seq_param->bits_per_second;
> -        encoder_context->brc.need_reset = 1;
> -    }
> +    *seq_bits_per_second = seq_param->bits_per_second;
>
>       return VA_STATUS_SUCCESS;
>   }
> @@ -492,7 +489,8 @@ intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
>   static VAStatus
>   intel_encoder_check_brc_vp9_sequence_parameter(VADriverContextP ctx,
>                                                  struct encode_state *encode_state,
> -                                               struct intel_encoder_context *encoder_context)
> +                                               struct intel_encoder_context *encoder_context,
> +                                               unsigned int *seq_bits_per_second)
>   {
>       VAEncSequenceParameterBufferVP9 *seq_param = (VAEncSequenceParameterBufferVP9*)encode_state->seq_param_ext->buffer;
>       unsigned int gop_size;
> @@ -507,34 +505,37 @@ intel_encoder_check_brc_vp9_sequence_parameter(VADriverContextP ctx,
>       else
>           gop_size = seq_param->intra_period;
>
> -    if (encoder_context->brc.bits_per_second[0] != seq_param->bits_per_second ||
> -        encoder_context->brc.gop_size != gop_size) {
> -        encoder_context->brc.bits_per_second[0] = seq_param->bits_per_second;
> +    if (encoder_context->brc.gop_size != gop_size) {
>           encoder_context->brc.gop_size = gop_size;
>           encoder_context->brc.need_reset = 1;
>       }
>
> +    *seq_bits_per_second = seq_param->bits_per_second;
> +
>       return VA_STATUS_SUCCESS;
>   }
>
>   static VAStatus
>   intel_encoder_check_brc_sequence_parameter(VADriverContextP ctx,
>                                              struct encode_state *encode_state,
> -                                           struct intel_encoder_context *encoder_context)
> +                                           struct intel_encoder_context *encoder_context,
> +                                           unsigned int *seq_bits_per_second)
>   {
> +    *seq_bits_per_second = 0;
> +
>       switch (encoder_context->codec) {
>       case CODEC_H264:
>       case CODEC_H264_MVC:
> -        return intel_encoder_check_brc_h264_sequence_parameter(ctx, encode_state, encoder_context);
> +        return intel_encoder_check_brc_h264_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
>
>       case CODEC_VP8:
> -        return intel_encoder_check_brc_vp8_sequence_parameter(ctx, encode_state, encoder_context);
> +        return intel_encoder_check_brc_vp8_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
>
>       case CODEC_HEVC:
> -        return intel_encoder_check_brc_hevc_sequence_parameter(ctx, encode_state, encoder_context);
> +        return intel_encoder_check_brc_hevc_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
>
>       case CODEC_VP9:
> -        return intel_encoder_check_brc_vp9_sequence_parameter(ctx, encode_state, encoder_context);
> +        return intel_encoder_check_brc_vp9_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
>
>       default:
>           // TODO: other codecs
> @@ -545,7 +546,8 @@ intel_encoder_check_brc_sequence_parameter(VADriverContextP ctx,
>   static void
>   intel_encoder_check_rate_control_parameter(VADriverContextP ctx,
>                                              struct intel_encoder_context *encoder_context,
> -                                           VAEncMiscParameterRateControl *misc)
> +                                           VAEncMiscParameterRateControl *misc,
> +                                           int *hl_bitrate_updated)
>   {
>       int temporal_id = 0;
>
> @@ -577,6 +579,9 @@ intel_encoder_check_rate_control_parameter(VADriverContextP ctx,
>           encoder_context->brc.window_size = misc->window_size;
>           encoder_context->brc.need_reset = 1;
>       }
> +
> +    if (temporal_id == encoder_context->layer.num_layers - 1)
> +        *hl_bitrate_updated = 1;
>   }
>
>   static void
> @@ -651,11 +656,13 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
>       VAStatus ret;
>       VAEncMiscParameterBuffer *misc_param;
>       int i, j;
> +    int hl_bitrate_updated = 0; // Indicate whether the bitrate for the highest level is changed in misc parameters
> +    unsigned int seq_bits_per_second = 0;
>
>       if (!(encoder_context->rate_control_mode&  (VA_RC_CBR | VA_RC_VBR)))
>           return VA_STATUS_SUCCESS;
>
> -    ret = intel_encoder_check_brc_sequence_parameter(ctx, encode_state, encoder_context);
> +    ret = intel_encoder_check_brc_sequence_parameter(ctx, encode_state, encoder_context,&seq_bits_per_second);
>
>       if (ret)
>           return ret;
> @@ -677,7 +684,8 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
>               case VAEncMiscParameterTypeRateControl:
>                   intel_encoder_check_rate_control_parameter(ctx,
>                                                              encoder_context,
> -                                                           (VAEncMiscParameterRateControl *)misc_param->data);
> +                                                           (VAEncMiscParameterRateControl *)misc_param->data,
> +&hl_bitrate_updated);
>                   break;
>
>               case VAEncMiscParameterTypeHRD:
> @@ -698,6 +706,14 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
>           }
>       }
>
> +    if (!hl_bitrate_updated&&  seq_bits_per_second&&
> +        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] != seq_bits_per_second) {
> +
> +        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = seq_bits_per_second;
> +        encoder_context->brc.need_reset = 1;
> +
> +    }
> +
>       return VA_STATUS_SUCCESS;
>   }
>



More information about the Libva mailing list