[Libva] [PATCH 3/3] VP9 encode: support fractional framerate

Zhao Yakui yakui.zhao at intel.com
Thu Dec 8 01:13:16 UTC 2016


On 12/07/2016 01:48 PM, Xiang, Haihao wrote:
> Now we have the same way for frame rate for each codec in i965_encoder.c, it would be better to use the result directly

Hi, Mark

     Can you refresh your patch based on Haihao's suggestion?
     Now the frame rate is parsed in the function of 
intel_encoder_check_framerate_parameter. (It is defined in 
i965_encoder.c) and it is stored as framerate_per_100s.
So the vp9 can use the framerate_per_100s for the frame_rate_m. The 
frame_rate_d can be 100.

Thanks
    Yakui

>
> Thanks
> Haihao
>
>> -----Original Message-----
>> From: Libva [mailto:libva-bounces at lists.freedesktop.org] On Behalf Of Mark
>> Thompson
>> Sent: Tuesday, December 6, 2016 2:02 AM
>> To: libva at lists.freedesktop.org
>> Subject: [Libva] [PATCH 3/3] VP9 encode: support fractional framerate
>>
>> Signed-off-by: Mark Thompson<sw at jkqxz.net>
>> ---
>> Tested on Kaby Lake.  Someone who has access to the manuals should make
>> sure that the framerate numerator/denominator actually works there as I am
>> guessing it does.
>>
>> Removes the frame_rate field in struct gen9_vp9_brc_curbe_param, because
>> there is no longer a sensible value to set it to (and also it's not read anywhere).
>> If it is needed, it wants to be replaced by the two parts of the fraction.
>>
>> src/gen9_vp9_encoder.c | 45 ++++++++++++++++++++++++++++++++++---
>> --------
>> src/gen9_vp9_encoder.h |  4 ++--
>> 2 files changed, 36 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/gen9_vp9_encoder.c b/src/gen9_vp9_encoder.c index
>> 3ea1537..8ff1b9b 100644
>> --- a/src/gen9_vp9_encoder.c
>> +++ b/src/gen9_vp9_encoder.c
>> @@ -1201,8 +1201,8 @@ void gen9_vp9_set_curbe_brc(VADriverContextP
>> ctx,
>>                                                    VP9_BRC_KBPS;
>>              cmd->dw9.min_bit_rate           = (vp9_state->min_bit_rate  +
>> VP9_BRC_KBPS - 1) / VP9_BRC_KBPS *
>>                                                    VP9_BRC_KBPS;
>> -            cmd->dw10.frame_ratem           = vp9_state->frame_rate;
>> -            cmd->dw11.frame_rated           = 1;
>> +            cmd->dw10.frame_ratem           = vp9_state->frame_rate_num;
>> +            cmd->dw11.frame_rated           = vp9_state->frame_rate_den;
>>
>>              cmd->dw14.avbr_accuracy         = 30;
>>              cmd->dw14.avbr_convergence      = 150;
>> @@ -1235,7 +1235,7 @@ void gen9_vp9_set_curbe_brc(VADriverContextP
>> ctx,
>>              cmd->dw17.enable_dynamic_scaling = vp9_state->dys_in_use;
>>              cmd->dw17.brc_overshoot_cbr_pct = 150;
>>
>> -            dInputBitsPerFrame = (double)(cmd->dw8.max_bit_rate) / (vp9_state-
>>> frame_rate);
>> +            dInputBitsPerFrame = ((double)cmd->dw8.max_bit_rate *
>> + vp9_state->frame_rate_den) / (vp9_state->frame_rate_num);
>>              dbps_ratio         = dInputBitsPerFrame / ((double)(vp9_state-
>>> vbv_buffer_size_in_bit) / 30);
>>              if (dbps_ratio<  0.1)
>>                  dbps_ratio = 0.1;
>> @@ -1423,7 +1423,6 @@ gen9_vp9_brc_init_reset_kernel(VADriverContextP
>> ctx,
>>      brc_initreset_curbe.initbrc            = !vp9_state->brc_inited;
>>      brc_initreset_curbe.mbbrc_enabled      = 0;
>>      brc_initreset_curbe.ref_frame_flag      = vp9_state->ref_frame_flag;
>> -    brc_initreset_curbe.frame_rate           = vp9_state->frame_rate;
>>
>>      vme_context->pfn_set_curbe_brc(ctx, encode_state,
>>                                     gpe_context, @@ -1523,7 +1522,6 @@
>> gen9_vp9_brc_intra_dist_kernel(VADriverContextP ctx,
>>      brc_intra_dist_curbe.initbrc            = !vp9_state->brc_inited;
>>      brc_intra_dist_curbe.mbbrc_enabled      = 0;
>>      brc_intra_dist_curbe.ref_frame_flag      = vp9_state->ref_frame_flag;
>> -    brc_intra_dist_curbe.frame_rate           = vp9_state->frame_rate;
>>
>>      vme_context->pfn_set_curbe_brc(ctx, encode_state,
>>                                     gpe_context, @@ -3964,10 +3962,17 @@
>> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>>                          encode_state-
>>> misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
>>                      misc_param_fr = (VAEncMiscParameterFrameRate *)misc_param-
>>> data;
>>
>> -                    vp9_state->frame_rate = misc_param_fr->framerate;
>> +                    if (misc_param_fr->framerate&  0xffff0000) {
>> +                        vp9_state->frame_rate_num = misc_param_fr->framerate>>
>> 16&  0xffff;
>> +                        vp9_state->frame_rate_den = misc_param_fr->framerate&
>> 0xffff;
>> +                    } else {
>> +                        vp9_state->frame_rate_num = misc_param_fr->framerate;
>> +                        vp9_state->frame_rate_den = 1;
>> +                    }
>>                  } else {
>>                      /* Assign the default frame rate */
>> -                    vp9_state->frame_rate = 30;
>> +                    vp9_state->frame_rate_num = 30;
>> +                    vp9_state->frame_rate_den = 1;
>>                  }
>>
>>                  /* RC misc will override HRD parameter */ @@ -3999,10 +4004,17 @@
>> gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>>                          encode_state-
>>> misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
>>                      misc_param_fr = (VAEncMiscParameterFrameRate *)misc_param-
>>> data;
>>
>> -                    vp9_state->frame_rate = misc_param_fr->framerate;
>> +                    if (misc_param_fr->framerate&  0xffff0000) {
>> +                        vp9_state->frame_rate_num = misc_param_fr->framerate>>
>> 16&  0xffff;
>> +                        vp9_state->frame_rate_den = misc_param_fr->framerate&
>> 0xffff;
>> +                    } else {
>> +                        vp9_state->frame_rate_num = misc_param_fr->framerate;
>> +                        vp9_state->frame_rate_den = 1;
>> +                    }
>>                  } else {
>>                      /* Assign the default frame rate */
>> -                    vp9_state->frame_rate = 30;
>> +                    vp9_state->frame_rate_num = 30;
>> +                    vp9_state->frame_rate_den = 1;
>>                  }
>>
>>                  if (vp9_state->brc_flag_check&  VP9_BRC_RC) { @@ -4031,14
>> +4043,25 @@ gen9_encode_vp9_check_parameter(VADriverContextP ctx,
>>              /* If the parameter related with RC is changed. Reset BRC */
>>              if (vp9_state->brc_flag_check&  VP9_BRC_FR) {
>>                 VAEncMiscParameterFrameRate *misc_param_fr;
>> +               uint32_t num, den;
>>
>>                 misc_param = (VAEncMiscParameterBuffer *)
>>                     encode_state-
>>> misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer;
>>                 misc_param_fr = (VAEncMiscParameterFrameRate *)misc_param-
>>> data;
>>
>> -               if (vp9_state->frame_rate != misc_param_fr->framerate) {
>> +               if (misc_param_fr->framerate&  0xffff0000) {
>> +                   num = misc_param_fr->framerate>>  16&  0xffff;
>> +                   den = misc_param_fr->framerate&  0xffff;
>> +               } else {
>> +                   num = misc_param_fr->framerate;
>> +                   den = 1;
>> +               }
>> +
>> +               if (vp9_state->frame_rate_num != num ||
>> +                   vp9_state->frame_rate_den != den) {
>>                     vp9_state->brc_reset = 1;
>> -                   vp9_state->frame_rate = misc_param_fr->framerate;
>> +                   vp9_state->frame_rate_num = num;
>> +                   vp9_state->frame_rate_den = den;
>>                 }
>>              }
>>
>> diff --git a/src/gen9_vp9_encoder.h b/src/gen9_vp9_encoder.h index
>> ad2d875..260b8d5 100644
>> --- a/src/gen9_vp9_encoder.h
>> +++ b/src/gen9_vp9_encoder.h
>> @@ -1552,7 +1552,6 @@ struct gen9_vp9_brc_curbe_param
>>      int32_t   brc_num_pak_passes;
>>      bool      multi_ref_qp_check;
>>      int16_t   frame_number;
>> -    int32_t   frame_rate;
>>      VP9_MEDIA_STATE_TYPE                       media_state_type;
>> };
>>
>> @@ -1925,7 +1924,8 @@ struct gen9_vp9_state {
>>      unsigned long init_vbv_buffer_fullness_in_bit;
>>      unsigned long vbv_buffer_size_in_bit;
>>      int      frame_number;
>> -    uint32_t frame_rate;
>> +    uint32_t frame_rate_num;
>> +    uint32_t frame_rate_den;
>>      uint8_t  ref_frame_flag;
>>      uint8_t  dys_ref_frame_flag;
>>      uint8_t  picture_coding_type;
>> --
>> 2.10.2
>> _______________________________________________
>> Libva mailing list
>> Libva at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/libva
> _______________________________________________
> Libva mailing list
> Libva at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/libva



More information about the Libva mailing list