Re: [Libva] [PATCH 4/4] VP9 encoder: use generic rate control parameters

2016-12-21 Thread Xiang, Haihao

> 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

2016-12-21 Thread Mark Thompson
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

2016-12-20 Thread Xiang, Haihao
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) {
> -