[Libva] [PATCH 3/4] VP8 encoder: use generic rate control parameters

Charles, Daniel daniel.charles at intel.com
Fri Dec 9 23:23:15 UTC 2016


On Fri, Dec 9, 2016 at 2:21 PM, Charles, Daniel
<daniel.charles at intel.com> wrote:
> On Thu, Dec 8, 2016 at 2:57 PM, Mark Thompson <sw at jkqxz.net> wrote:
>> Signed-off-by: Mark Thompson <sw at jkqxz.net>
>> ---
>>  src/gen6_mfc.h |  6 ------
>>  src/gen8_mfc.c | 64 ++++++++++++----------------------------------------------
>>  2 files changed, 13 insertions(+), 57 deletions(-)
>>
>> diff --git a/src/gen6_mfc.h b/src/gen6_mfc.h
>> index 290922b..7a5d940 100644
>> --- a/src/gen6_mfc.h
>> +++ b/src/gen6_mfc.h
>> @@ -235,12 +235,6 @@ struct gen6_mfc_context
>>          double qpf_rounding_accumulator[MAX_TEMPORAL_LAYERS];
>>          int bits_prev_frame[MAX_TEMPORAL_LAYERS];
>>          int prev_slice_type[MAX_TEMPORAL_LAYERS];
>> -
>> -        double saved_bps;
>> -        double saved_fps;
>> -        int saved_intra_period;
>> -        int saved_ip_period;
>> -        int saved_idr_period;
>>      } brc;
>>
>>      struct {
>> diff --git a/src/gen8_mfc.c b/src/gen8_mfc.c
>> index d1de92c..b0e7b08 100644
>> --- a/src/gen8_mfc.c
>> +++ b/src/gen8_mfc.c
>> @@ -3324,12 +3324,8 @@ static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
>>  {
>>      struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
>>      VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
>> -    VAEncMiscParameterBuffer* misc_param_hrd = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeHRD][0]->buffer;
>> -    VAEncMiscParameterHRD* param_hrd = (VAEncMiscParameterHRD*)misc_param_hrd->data;
>> -    VAEncMiscParameterBuffer* misc_param_frame_rate_buffer = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
>> -    VAEncMiscParameterFrameRate* param_frame_rate = (VAEncMiscParameterFrameRate*)misc_param_frame_rate_buffer->data;
>>      double bitrate = seq_param->bits_per_second;
>> -    unsigned int frame_rate = param_frame_rate->framerate;
>> +    double framerate = (double)encoder_context->brc.framerate_num[0] / (double)encoder_context->brc.framerate_den[0];
>>      int inum = 1, pnum = 0;
>>      int intra_period = seq_param->intra_period;
>>      int width_in_mbs = ALIGN(seq_param->frame_width, 16) / 16;
>> @@ -3340,14 +3336,14 @@ static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
>>
>>      mfc_context->brc.mode = encoder_context->rate_control_mode;
>>
>> -    mfc_context->brc.target_frame_size[0][SLICE_TYPE_I] = (int)((double)((bitrate * intra_period)/frame_rate) /
>> +    mfc_context->brc.target_frame_size[0][SLICE_TYPE_I] = (int)((double)((bitrate * intra_period) / framerate) /
>>                                                               (double)(inum + BRC_PWEIGHT * pnum ));
>>      mfc_context->brc.target_frame_size[0][SLICE_TYPE_P] = BRC_PWEIGHT * mfc_context->brc.target_frame_size[0][SLICE_TYPE_I];
>>
>>      mfc_context->brc.gop_nums[0][SLICE_TYPE_I] = inum;
>>      mfc_context->brc.gop_nums[0][SLICE_TYPE_P] = pnum;
>>
>> -    mfc_context->brc.bits_per_frame[0] = bitrate/frame_rate;
>> +    mfc_context->brc.bits_per_frame[0] = bitrate / framerate;
>>
>>      mfc_context->brc.qp_prime_y[0][SLICE_TYPE_I] = gen8_mfc_vp8_qindex_estimate(encode_state,
>>                                                                                  mfc_context,
>> @@ -3358,10 +3354,15 @@ static void gen8_mfc_vp8_brc_init(struct encode_state *encode_state,
>>                                                                                  mfc_context->brc.target_frame_size[0][SLICE_TYPE_P],
>>                                                                                  0);
>>
>> -    mfc_context->hrd.buffer_size[0] = (double)param_hrd->buffer_size;
>> -    mfc_context->hrd.current_buffer_fullness[0] =
>> -        (double)(param_hrd->initial_buffer_fullness < mfc_context->hrd.buffer_size[0])?
>> -        param_hrd->initial_buffer_fullness: mfc_context->hrd.buffer_size[0]/2.;
>> +    if (encoder_context->brc.hrd_buffer_size)
>> +        mfc_context->hrd.buffer_size[0] = (double)encoder_context->brc.hrd_buffer_size;
>> +    else
>> +        mfc_context->hrd.buffer_size[0] = 2.0 * bitrate;
>> +    if (encoder_context->brc.hrd_initial_buffer_fullness &&
>> +        encoder_context->brc.hrd_initial_buffer_fullness < mfc_context->hrd.buffer_size[0])
>> +        mfc_context->hrd.current_buffer_fullness[0] = (double)encoder_context->brc.hrd_initial_buffer_fullness;
>> +    else
>> +        mfc_context->hrd.current_buffer_fullness[0] = mfc_context->hrd.buffer_size[0] / 2.0;
>>      mfc_context->hrd.target_buffer_fullness[0] = (double)mfc_context->hrd.buffer_size[0]/2.;
>>      mfc_context->hrd.buffer_capacity[0] = (double)mfc_context->hrd.buffer_size[0]/max_frame_size;
>>      mfc_context->hrd.violation_noted = 0;
>> @@ -3509,45 +3510,6 @@ static void gen8_mfc_vp8_hrd_context_update(struct encode_state *encode_state,
>>      mfc_context->vui_hrd.i_frame_number++;
>>  }
>>
>> -/*
>> - * Check whether the parameters related with CBR are updated and decide whether
>> - * it needs to reinitialize the configuration related with CBR.
>> - * Currently it will check the following parameters:
>> - *      bits_per_second
>> - *      frame_rate
>> - *      gop_configuration(intra_period, ip_period, intra_idr_period)
>> - */
>> -static bool gen8_mfc_vp8_brc_updated_check(struct encode_state *encode_state,
>> -                           struct intel_encoder_context *encoder_context)
>> -{
>> -    unsigned int rate_control_mode = encoder_context->rate_control_mode;
>> -    struct gen6_mfc_context *mfc_context = encoder_context->mfc_context;
>> -    double cur_fps, cur_bitrate;
>> -    VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
>> -    VAEncMiscParameterBuffer *misc_param_frame_rate_buf = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
>> -    VAEncMiscParameterFrameRate *param_frame_rate = (VAEncMiscParameterFrameRate*)misc_param_frame_rate_buf->data;
>> -    unsigned int frame_rate = param_frame_rate->framerate;
>> -
>> -    if (rate_control_mode != VA_RC_CBR) {
>> -        return false;
>> -    }
>> -
>> -    cur_bitrate = seq_param->bits_per_second;
>> -    cur_fps = frame_rate;
>> -
>> -    if ((cur_bitrate == mfc_context->brc.saved_bps) &&
>> -        (cur_fps == mfc_context->brc.saved_fps) &&
>> -        (seq_param->intra_period == mfc_context->brc.saved_intra_period)) {
>> -        /* the parameters related with CBR are not updaetd */
>> -        return false;
>> -    }
>> -
>> -    mfc_context->brc.saved_intra_period = seq_param->intra_period;
>> -    mfc_context->brc.saved_fps = cur_fps;
>> -    mfc_context->brc.saved_bps = cur_bitrate;
>> -    return true;
>> -}
>> -
>>  static void gen8_mfc_vp8_brc_prepare(struct encode_state *encode_state,
>>                             struct intel_encoder_context *encoder_context)
>>  {
>> @@ -3557,7 +3519,7 @@ static void gen8_mfc_vp8_brc_prepare(struct encode_state *encode_state,
>>          bool brc_updated;
>>          assert(encoder_context->codec != CODEC_MPEG2);
>>
>> -        brc_updated = gen8_mfc_vp8_brc_updated_check(encode_state, encoder_context);
>> +        brc_updated = encoder_context->brc.need_reset;
>>
>>          /*Programing bit rate control */
>>          if (brc_updated) {
>
> This patch fails to compile like this
>
> i965_encoder_vp8.c:2768:68: error: ‘struct <anonymous>’ has no member
> named ‘framerate_per_100s’

Nevermind this report, this file has nothing to do here

-- 
Daniel.
>
> --
> Daniel.
>
>
>> --
>> 2.10.2
>> _______________________________________________
>> Libva mailing list
>> Libva at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/libva


More information about the Libva mailing list