[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 07:09:34 UTC 2016
On 12/29/2016 03:08 PM, Xiang, Haihao wrote:
>
>> 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.
>
OK.
It makes sense.
This looks good to me.
Add: Reviewed-by: Zhao Yakui <yakui.zhao at intel.com>
Thanks
Yakui
>
>>
>> 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,
>>> - 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;
>>> }
>>>
More information about the Libva
mailing list