Re: [Libva] [PATCH 4/4] VP9 encoder: use generic rate control parameters
> On 21/12/16 04:46, Xiang, Haihao wrote: > > On Mon, 2016-12-19 at 23:01 +, Mark Thompson wrote: > > > Also adds support for fractional framerate. > > > > > > Signed-off-by: Mark Thompson> > > --- > > > src/gen9_vp9_encoder.c | 240 --- > > > -- > > > src/gen9_vp9_encoder.h | 10 +-- > > > src/i965_drv_video.c | 10 +-- > > > src/i965_encoder.c | 36 > > > src/i965_encoder.h | 1 + > > > 5 files changed, 77 insertions(+), 220 deletions(-) > > > ... > > > /* check the corresponding BRC parameter for CBR and > > > VBR */ > > > if (encoder_context->rate_control_mode == VA_RC_CBR) > > > { > > > -vp9_state->target_bit_rate = seq_param- > > > >bits_per_second; > > > -vp9_state->gop_size = seq_param->intra_period; > > > - > > > -if (vp9_state->brc_flag_check & VP9_BRC_HRD) { > > > -VAEncMiscParameterHRD *misc_param_hrd; > > > - > > > -misc_param = (VAEncMiscParameterBuffer *) > > > -encode_state- > > > >misc_param[VAEncMiscParameterTypeHRD][0]->buffer; > > > -misc_param_hrd = (VAEncMiscParameterHRD > > > *)misc_param->data; > > > - > > > -vp9_state->init_vbv_buffer_fullness_in_bit = > > > misc_param_hrd->initial_buffer_fullness; > > > -vp9_state->vbv_buffer_size_in_bit = > > > misc_param_hrd->buffer_size; > > > -} > > > - > > > -if (vp9_state->brc_flag_check & VP9_BRC_FR) { > > > -VAEncMiscParameterFrameRate *misc_param_fr; > > > - > > > -misc_param = (VAEncMiscParameterBuffer *) > > > -encode_state- > > > >misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer; > > > -misc_param_fr = (VAEncMiscParameterFrameRate > > > *)misc_param->data; > > > - > > > -vp9_state->frame_rate = misc_param_fr- > > > >framerate; > > > -} else { > > > -/* Assign the default frame rate */ > > > -vp9_state->frame_rate = 30; > > > -} > > > - > > > -/* RC misc will override HRD parameter */ > > > -if (vp9_state->brc_flag_check & VP9_BRC_RC) { > > > -VAEncMiscParameterRateControl > > > *misc_param_rc; > > > - > > > -misc_param = (VAEncMiscParameterBuffer *) > > > -encode_state- > > > >misc_param[VAEncMiscParameterTypeRateControl][0]->buffer; > > > -misc_param_rc = > > > (VAEncMiscParameterRateControl *)misc_param->data; > > > - > > > -vp9_state->target_bit_rate = misc_param_rc- > > > >bits_per_second; > > > -vp9_state->vbv_buffer_size_in_bit = > > > (misc_param_rc->bits_per_second / 1000) * > > > - misc_param_rc- > > > >window_size; > > > -vp9_state->init_vbv_buffer_fullness_in_bit = > > > vp9_state->vbv_buffer_size_in_bit / 2; > > > -vp9_state->window_size = misc_param_rc- > > > >window_size; > > > -} > > > +if (!encoder_context->brc.framerate[0].num || > > > !encoder_context->brc.framerate[0].den || > > > +!encoder_context->brc.bits_per_second[0]) > > > +return VA_STATUS_ERROR_INVALID_PARAMETER; > > > + > > > +vp9_state->gop_size = encoder_context- > > > >brc.gop_size; > > > + > > > +vp9_state->framerate = encoder_context- > > > >brc.framerate[0]; > > > +vp9_state->target_bit_rate = encoder_context- > > > >brc.bits_per_second[0]; > > > vp9_state->max_bit_rate = vp9_state- > > > >target_bit_rate; > > > vp9_state->min_bit_rate = vp9_state- > > > >target_bit_rate; > > > -} else { > > > -/* VBR mode */ > > > -brc_flag = VP9_BRC_SEQ | VP9_BRC_RC; > > > -vp9_state->target_bit_rate = seq_param- > > > >bits_per_second; > > > -vp9_state->gop_size = seq_param->intra_period; > > > - > > > -if (vp9_state->brc_flag_check & VP9_BRC_FR) { > > > -VAEncMiscParameterFrameRate *misc_param_fr; > > > - > > > -misc_param = (VAEncMiscParameterBuffer *) > > > -encode_state- > > > >misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer; > > > -misc_param_fr = (VAEncMiscParameterFrameRate > > > *)misc_param->data; > > > - > > > -vp9_state->frame_rate = misc_param_fr- > > > >framerate; > > > -} else { > > > -/* Assign the default frame rate */ > > > -vp9_state->frame_rate = 30; > > > -} > > > - > > > -
Re: [Libva] [PATCH 4/4] VP9 encoder: use generic rate control parameters
On 21/12/16 04:46, Xiang, Haihao wrote: > On Mon, 2016-12-19 at 23:01 +, Mark Thompson wrote: >> Also adds support for fractional framerate. >> >> Signed-off-by: Mark Thompson>> --- >> src/gen9_vp9_encoder.c | 240 >> - >> src/gen9_vp9_encoder.h | 10 +-- >> src/i965_drv_video.c | 10 +-- >> src/i965_encoder.c | 36 >> src/i965_encoder.h | 1 + >> 5 files changed, 77 insertions(+), 220 deletions(-) >> ... >> /* check the corresponding BRC parameter for CBR and VBR */ >> if (encoder_context->rate_control_mode == VA_RC_CBR) { >> -vp9_state->target_bit_rate = seq_param->bits_per_second; >> -vp9_state->gop_size = seq_param->intra_period; >> - >> -if (vp9_state->brc_flag_check & VP9_BRC_HRD) { >> -VAEncMiscParameterHRD *misc_param_hrd; >> - >> -misc_param = (VAEncMiscParameterBuffer *) >> - >> encode_state->misc_param[VAEncMiscParameterTypeHRD][0]->buffer; >> -misc_param_hrd = (VAEncMiscParameterHRD >> *)misc_param->data; >> - >> -vp9_state->init_vbv_buffer_fullness_in_bit = >> misc_param_hrd->initial_buffer_fullness; >> -vp9_state->vbv_buffer_size_in_bit = >> misc_param_hrd->buffer_size; >> -} >> - >> -if (vp9_state->brc_flag_check & VP9_BRC_FR) { >> -VAEncMiscParameterFrameRate *misc_param_fr; >> - >> -misc_param = (VAEncMiscParameterBuffer *) >> - >> encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer; >> -misc_param_fr = (VAEncMiscParameterFrameRate >> *)misc_param->data; >> - >> -vp9_state->frame_rate = misc_param_fr->framerate; >> -} else { >> -/* Assign the default frame rate */ >> -vp9_state->frame_rate = 30; >> -} >> - >> -/* RC misc will override HRD parameter */ >> -if (vp9_state->brc_flag_check & VP9_BRC_RC) { >> -VAEncMiscParameterRateControl *misc_param_rc; >> - >> -misc_param = (VAEncMiscParameterBuffer *) >> - >> encode_state->misc_param[VAEncMiscParameterTypeRateControl][0]->buffer; >> -misc_param_rc = (VAEncMiscParameterRateControl >> *)misc_param->data; >> - >> -vp9_state->target_bit_rate = >> misc_param_rc->bits_per_second; >> -vp9_state->vbv_buffer_size_in_bit = >> (misc_param_rc->bits_per_second / 1000) * >> - misc_param_rc->window_size; >> -vp9_state->init_vbv_buffer_fullness_in_bit = >> vp9_state->vbv_buffer_size_in_bit / 2; >> -vp9_state->window_size = misc_param_rc->window_size; >> -} >> +if (!encoder_context->brc.framerate[0].num || >> !encoder_context->brc.framerate[0].den || >> +!encoder_context->brc.bits_per_second[0]) >> +return VA_STATUS_ERROR_INVALID_PARAMETER; >> + >> +vp9_state->gop_size = encoder_context->brc.gop_size; >> + >> +vp9_state->framerate = encoder_context->brc.framerate[0]; >> +vp9_state->target_bit_rate = >> encoder_context->brc.bits_per_second[0]; >> vp9_state->max_bit_rate = vp9_state->target_bit_rate; >> vp9_state->min_bit_rate = vp9_state->target_bit_rate; >> -} else { >> -/* VBR mode */ >> -brc_flag = VP9_BRC_SEQ | VP9_BRC_RC; >> -vp9_state->target_bit_rate = seq_param->bits_per_second; >> -vp9_state->gop_size = seq_param->intra_period; >> - >> -if (vp9_state->brc_flag_check & VP9_BRC_FR) { >> -VAEncMiscParameterFrameRate *misc_param_fr; >> - >> -misc_param = (VAEncMiscParameterBuffer *) >> - >> encode_state->misc_param[VAEncMiscParameterTypeFrameRate][0]->buffer; >> -misc_param_fr = (VAEncMiscParameterFrameRate >> *)misc_param->data; >> - >> -vp9_state->frame_rate = misc_param_fr->framerate; >> -} else { >> -/* Assign the default frame rate */ >> -vp9_state->frame_rate = 30; >> -} >> - >> -if (vp9_state->brc_flag_check & VP9_BRC_RC) { >> -VAEncMiscParameterRateControl *misc_param_rc; >> - >> -misc_param = (VAEncMiscParameterBuffer *) >> - >> encode_state->misc_param[VAEncMiscParameterTypeRateControl][0]->buffer; >> -misc_param_rc = (VAEncMiscParameterRateControl >> *)misc_param->data;
Re: [Libva] [PATCH 4/4] VP9 encoder: use generic rate control parameters
On Mon, 2016-12-19 at 23:01 +, Mark Thompson wrote: > Also adds support for fractional framerate. > > Signed-off-by: Mark Thompson> --- > src/gen9_vp9_encoder.c | 240 > - > src/gen9_vp9_encoder.h | 10 +-- > src/i965_drv_video.c | 10 +-- > src/i965_encoder.c | 36 > src/i965_encoder.h | 1 + > 5 files changed, 77 insertions(+), 220 deletions(-) > > diff --git a/src/gen9_vp9_encoder.c b/src/gen9_vp9_encoder.c > index 3ea1537..2e884e2 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->framerate.num; > +cmd->dw11.frame_rated = vp9_state->framerate.den; > > cmd->dw14.avbr_accuracy = 30; > cmd->dw14.avbr_convergence = 150; > @@ -1235,8 +1235,8 @@ 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); > -dbps_ratio = dInputBitsPerFrame / > ((double)(vp9_state->vbv_buffer_size_in_bit) / 30); > +dInputBitsPerFrame = (double)cmd->dw8.max_bit_rate * > (double)vp9_state->framerate.den / (double)vp9_state->framerate.num; > +dbps_ratio = dInputBitsPerFrame / > (double)vp9_state->vbv_buffer_size_in_bit / 30.0; > if (dbps_ratio < 0.1) > dbps_ratio = 0.1; > if (dbps_ratio > 3.5) > @@ -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, > @@ -3926,168 +3924,47 @@ gen9_encode_vp9_check_parameter(VADriverContextP ctx, > return VA_STATUS_ERROR_UNIMPLEMENTED; > > if (vp9_state->brc_enabled) { > -if (vp9_state->brc_flag_check & VP9_BRC_FAILURE) { > -WARN_ONCE("Rate control misc_parameter is required for BRC\n"); > -return VA_STATUS_ERROR_INVALID_PARAMETER; > -} > - > -if (vp9_state->first_frame) { > -unsigned int brc_flag; > -VAEncMiscParameterBuffer *misc_param; > - > -brc_flag = VP9_BRC_SEQ | VP9_BRC_RC; > -if ((vp9_state->brc_flag_check & brc_flag) != brc_flag) { > -WARN_ONCE("SPS/RC misc is required for BRC\n"); > -return VA_STATUS_ERROR_INVALID_PARAMETER; > -} > +if (vp9_state->first_frame || vp9_state->picture_coding_type == > KEY_FRAME) { > +vp9_state->brc_reset = encoder_context->brc.need_reset || > vp9_state->first_frame; > > /* check the corresponding BRC parameter for CBR and VBR */ > if (encoder_context->rate_control_mode == VA_RC_CBR) { > -vp9_state->target_bit_rate = seq_param->bits_per_second; > -vp9_state->gop_size = seq_param->intra_period; > - > -if (vp9_state->brc_flag_check & VP9_BRC_HRD) { > -VAEncMiscParameterHRD *misc_param_hrd; > - > -misc_param = (VAEncMiscParameterBuffer *) > - > encode_state->misc_param[VAEncMiscParameterTypeHRD][0]->buffer; > -misc_param_hrd = (VAEncMiscParameterHRD > *)misc_param->data; > - > -vp9_state->init_vbv_buffer_fullness_in_bit = > misc_param_hrd->initial_buffer_fullness; > -vp9_state->vbv_buffer_size_in_bit = > misc_param_hrd->buffer_size; > -} > - > -if (vp9_state->brc_flag_check & VP9_BRC_FR) { > -