> 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?
Yes if bits_per_second in the sequence parameter is not equal to the value for the previous Begin/Render/End sequence except bits_per_second in the sequence parameter is 0. > > Thanks > Yakui > > > > Signed-off-by: Xiang, Haihao<haihao.xi...@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, > > - VAEncMiscParameterRateC > > ontrol *misc) > > + VAEncMiscParameterRateC > > ontrol *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, > > encode > > r_context, > > - (VAEncM > > iscParameterRateControl *)misc_param->data); > > + (VAEncM > > iscParameterRateControl *)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; > > } > > > _______________________________________________ Libva mailing list Libva@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libva