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.li...@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;
  }


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to