[Mesa-dev] [PATCH] st/va encode handle ntsc framerate rate control

Christian König christian.koenig at amd.com
Fri Jan 27 08:48:51 UTC 2017


That looks correct to me, but I'm not deeply enough into the H264 
encoding any more.

Adding Leo and Boyuan to comment as well.

Regards,
Christian.

Am 26.01.2017 um 19:26 schrieb Andy Furniss:
> Tested with ffmpeg and gst-vaapi. Without this bits per
> frame is set way too low.
>
> Signed-off-by: Andy Furniss <adf.lists at gmail.com>
> ---
>   src/gallium/state_trackers/va/picture.c | 32 ++++++++++++++++++++++++--------
>   1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
> index 82584ea..a024437 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -119,14 +119,30 @@ getEncParamPreset(vlVaContext *context)
>      context->desc.h264enc.rate_ctrl.fill_data_enable = 1;
>      context->desc.h264enc.rate_ctrl.enforce_hrd = 1;
>      context->desc.h264enc.enable_vui = false;
> -   if (context->desc.h264enc.rate_ctrl.frame_rate_num == 0)
> -      context->desc.h264enc.rate_ctrl.frame_rate_num = 30;
> -   context->desc.h264enc.rate_ctrl.target_bits_picture =
> -      context->desc.h264enc.rate_ctrl.target_bitrate / context->desc.h264enc.rate_ctrl.frame_rate_num;
> -   context->desc.h264enc.rate_ctrl.peak_bits_picture_integer =
> -      context->desc.h264enc.rate_ctrl.peak_bitrate / context->desc.h264enc.rate_ctrl.frame_rate_num;
> -   context->desc.h264enc.rate_ctrl.peak_bits_picture_fraction = 0;
> +   if (context->desc.h264enc.rate_ctrl.frame_rate_num == 0 ||
> +       context->desc.h264enc.rate_ctrl.frame_rate_den == 0) {
> +         context->desc.h264enc.rate_ctrl.frame_rate_num = 30;
> +         context->desc.h264enc.rate_ctrl.frame_rate_den = 1;
> +   }
> +   if (context->desc.h264enc.rate_ctrl.frame_rate_den > 1) {
> +      context->desc.h264enc.rate_ctrl.target_bits_picture =
> +         context->desc.h264enc.rate_ctrl.target_bitrate /
> +         (context->desc.h264enc.rate_ctrl.frame_rate_num /
> +         context->desc.h264enc.rate_ctrl.frame_rate_den + 1);
> +      context->desc.h264enc.rate_ctrl.peak_bits_picture_integer =
> +         context->desc.h264enc.rate_ctrl.peak_bitrate /
> +         (context->desc.h264enc.rate_ctrl.frame_rate_num /
> +         context->desc.h264enc.rate_ctrl.frame_rate_den + 1);
> +   } else {
> +      context->desc.h264enc.rate_ctrl.target_bits_picture =
> +         context->desc.h264enc.rate_ctrl.target_bitrate /
> +         context->desc.h264enc.rate_ctrl.frame_rate_num;
> +      context->desc.h264enc.rate_ctrl.peak_bits_picture_integer =
> +         context->desc.h264enc.rate_ctrl.peak_bitrate /
> +         context->desc.h264enc.rate_ctrl.frame_rate_num;
> +   }
>   
> +   context->desc.h264enc.rate_ctrl.peak_bits_picture_fraction = 0;
>      context->desc.h264enc.ref_pic_mode = 0x00000201;
>   }
>   
> @@ -362,7 +378,7 @@ handleVAEncSequenceParameterBufferType(vlVaDriver *drv, vlVaContext *context, vl
>         context->gop_coeff = VL_VA_ENC_GOP_COEFF;
>      context->desc.h264enc.gop_size = h264->intra_idr_period * context->gop_coeff;
>      context->desc.h264enc.rate_ctrl.frame_rate_num = h264->time_scale / 2;
> -   context->desc.h264enc.rate_ctrl.frame_rate_den = 1;
> +   context->desc.h264enc.rate_ctrl.frame_rate_den = h264->num_units_in_tick;
>      return VA_STATUS_SUCCESS;
>   }
>   




More information about the mesa-dev mailing list