[FFmpeg-devel] [PATCH] vaapi_encode: Fix the vaapi h264 encoder VBR/CBR metadata setting error.

Jun Zhao mypopydev at gmail.com
Thu Apr 13 15:34:48 EEST 2017


From 1fa48b45fe962d8c342d158d9c16ce24139ffd84 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao at intel.com>
Date: Thu, 13 Apr 2017 20:07:10 +0800
Subject: [PATCH] vaapi_encode: Fix the vaapi h264 encoder VBR/CBR metadata
 setting error.

before this fix, mediainfo check the bit rate control mode metadata info
is wrong.

Reproduce step:
encode with CBR or VBR mode like this:
./ffmpeg -y -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi -i input.mp4 -an -c:v h264_vaapi \
-maxrate 5M -b:v 5M output_cbr.mp4

./ffmpeg -y -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi -i input.mp4 -an -c:v h264_vaapi \
-maxrate 6M -b:v 5M output_cbr.mp4

then use the mediainfo check the bit rate control mode.

Signed-off-by: Jun Zhao <jun.zhao at intel.com>
---
 libavcodec/vaapi_encode_h264.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 92e2955..47d0c94 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -760,7 +760,7 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
     char tmp[256];
     size_t header_len;
 
-    if (index == 0 && ctx->va_rc_mode == VA_RC_CBR) {
+    if (index == 0 && (ctx->va_rc_mode == VA_RC_CBR || ctx->va_rc_mode == VA_RC_VBR)) {
         *type = VAEncPackedHeaderH264_SEI;
 
         init_put_bits(&pbc, tmp, sizeof(tmp));
@@ -868,7 +868,7 @@ static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
             mseq->fixed_frame_rate_flag = 0;
         }
 
-        if (ctx->va_rc_mode == VA_RC_CBR) {
+        if (ctx->va_rc_mode == VA_RC_CBR || ctx->va_rc_mode == VA_RC_VBR) {
             priv->send_timing_sei = 1;
             mseq->nal_hrd_parameters_present_flag = 1;
 
@@ -886,8 +886,7 @@ static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
             mseq->cpb_size_value_minus1[0] =
                 (ctx->hrd_params.hrd.buffer_size >> mseq->cpb_size_scale + 4) - 1;
 
-            // CBR mode isn't actually available here, despite naming.
-            mseq->cbr_flag[0] = 0;
+            mseq->cbr_flag[0] = (ctx->va_rc_mode == VA_RC_CBR ? 1 : 0);
 
             mseq->initial_cpb_removal_delay_length_minus1 = 23;
             mseq->cpb_removal_delay_length_minus1         = 23;
-- 
2.9.3



More information about the ffmpeg-devel mailing list