[Libva] [PATCH 3/3] VP9 encode: support fractional framerate
Mark Thompson
sw at jkqxz.net
Mon Dec 5 18:02:28 UTC 2016
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
More information about the Libva
mailing list