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

Zhao Yakui yakui.zhao at intel.com
Tue Dec 6 01:49:30 UTC 2016


On 12/06/2016 02:02 AM, Mark Thompson wrote:
> Signed-off-by: Mark Thompson<sw at jkqxz.net>

Good work.

This patch looks good to me.

Add: Reviewed-by: Zhao Yakui <yakui.zhao at intel.com>

Thanks

> ---
> 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;



More information about the Libva mailing list