[Libva] [PATCH 3/3] VP9 encode: support fractional framerate
Xiang, Haihao
haihao.xiang at intel.com
Wed Dec 7 05:48:18 UTC 2016
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
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
More information about the Libva
mailing list