Mesa (master): st/va encode handle ntsc framerate rate control

Christian König deathsimple at kemper.freedesktop.org
Mon Mar 6 13:12:43 UTC 2017


Module: Mesa
Branch: master
Commit: 012b6d3fe7937d1624f906351b2ba555d9e7e112
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=012b6d3fe7937d1624f906351b2ba555d9e7e112

Author: Andy Furniss <adf.lists at gmail.com>
Date:   Sun Jan 29 14:22:31 2017 +0000

st/va encode handle ntsc framerate rate control

Tested with ffmpeg and gst-vaapi. Without this bits per
frame is set way too low for fractional framerates.

v2: Mark Thompson: simplify calculation.
    Use float.

Signed-off-by: Andy Furniss <adf.lists at gmail.com>
Acked-by: Christian König <christian.koenig at amd.com>

---

 src/gallium/state_trackers/va/picture.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
index 82584ea..53bb9eb 100644
--- a/src/gallium/state_trackers/va/picture.c
+++ b/src/gallium/state_trackers/va/picture.c
@@ -119,14 +119,21 @@ 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;
+   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;
+   }
    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.target_bitrate *
+      ((float)context->desc.h264enc.rate_ctrl.frame_rate_den /
+      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.rate_ctrl.peak_bitrate *
+      ((float)context->desc.h264enc.rate_ctrl.frame_rate_den /
+      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 +369,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-commit mailing list