[Libva] [Libva-intel-driver][PATCH] Needn't reset brc if the bitrate setting isn't changed in the Begin/Render/End sequence

Xiang, Haihao haihao.xiang at intel.com
Thu Dec 29 05:22:35 UTC 2016


User can use VAEncMiscParameterRateControl to update bitrate, so we should ignore
the bitrate in the sequence parameter if VAEncMiscParameterRateControl is present.
Hence it is not needed to reset brc if VAEncMiscParameterRateControl doesn't change
the used bitrate.

Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
 src/i965_encoder.c | 72 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 44 insertions(+), 28 deletions(-)

diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index d4d7445..ae31f01 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -314,18 +314,17 @@ intel_encoder_check_jpeg_yuv_surface(VADriverContextP ctx,
 static VAStatus
 intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
                                                 struct encode_state *encode_state,
-                                                struct intel_encoder_context *encoder_context)
+                                                struct intel_encoder_context *encoder_context,
+                                                unsigned int *seq_bits_per_second)
 {
     VAEncSequenceParameterBufferH264 *seq_param = (VAEncSequenceParameterBufferH264 *)encode_state->seq_param_ext->buffer;
     struct intel_fraction framerate;
-    unsigned int bits_per_second;
     unsigned short num_pframes_in_gop, num_bframes_in_gop;
 
     if (!encoder_context->is_new_sequence)
         return VA_STATUS_SUCCESS;
 
     assert(seq_param);
-    bits_per_second = seq_param->bits_per_second; // for the highest layer
 
     if (!seq_param->num_units_in_tick || !seq_param->time_scale) {
         framerate = (struct intel_fraction) { 30, 1 };
@@ -361,12 +360,10 @@ intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
 
     if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop ||
         num_bframes_in_gop != encoder_context->brc.num_bframes_in_gop ||
-        bits_per_second != encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] ||
         framerate.num != encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].num ||
         framerate.den != encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].den) {
         encoder_context->brc.num_pframes_in_gop = num_pframes_in_gop;
         encoder_context->brc.num_bframes_in_gop = num_bframes_in_gop;
-        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = bits_per_second;
         encoder_context->brc.framerate[encoder_context->layer.num_layers - 1] = framerate;
         encoder_context->brc.need_reset = 1;
     }
@@ -377,6 +374,8 @@ intel_encoder_check_brc_h264_sequence_parameter(VADriverContextP ctx,
         encoder_context->brc.hrd_initial_buffer_fullness = seq_param->bits_per_second;
     }
 
+    *seq_bits_per_second = seq_param->bits_per_second;
+
     return VA_STATUS_SUCCESS;
 
 error:
@@ -386,10 +385,11 @@ error:
 static VAStatus
 intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
                                                struct encode_state *encode_state,
-                                               struct intel_encoder_context *encoder_context)
+                                               struct intel_encoder_context *encoder_context,
+                                               unsigned int *seq_bits_per_second)
 {
     VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
-    unsigned int num_pframes_in_gop, bits_per_second;
+    unsigned int num_pframes_in_gop;
 
     if (!encoder_context->is_new_sequence)
         return VA_STATUS_SUCCESS;
@@ -406,7 +406,6 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
     }
 
     num_pframes_in_gop = encoder_context->brc.gop_size - 1;
-    bits_per_second = seq_param->bits_per_second;       // for the highest layer
 
     if (!encoder_context->brc.framerate[encoder_context->layer.num_layers - 1].num) {
         // for the highest layer
@@ -414,10 +413,8 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
         encoder_context->brc.need_reset = 1;
     }
 
-    if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop ||
-        bits_per_second != encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1]) {
+    if (num_pframes_in_gop != encoder_context->brc.num_pframes_in_gop) {
         encoder_context->brc.num_pframes_in_gop = num_pframes_in_gop;
-        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = bits_per_second;
         encoder_context->brc.need_reset = 1;
     }
 
@@ -428,13 +425,16 @@ intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
         encoder_context->brc.need_reset = 1;
     }
 
+    *seq_bits_per_second = seq_param->bits_per_second;
+
     return VA_STATUS_SUCCESS;
 }
 
 static VAStatus
 intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
                                                 struct encode_state *encode_state,
-                                                struct intel_encoder_context *encoder_context)
+                                                struct intel_encoder_context *encoder_context,
+                                                unsigned int *seq_bits_per_second)
 {
     VAEncSequenceParameterBufferHEVC *seq_param = (VAEncSequenceParameterBufferHEVC*)encode_state->seq_param_ext->buffer;
     struct intel_fraction framerate;
@@ -481,10 +481,7 @@ intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
         encoder_context->brc.need_reset = 1;
     }
 
-    if (encoder_context->brc.bits_per_second[0] != seq_param->bits_per_second) {
-        encoder_context->brc.bits_per_second[0] = seq_param->bits_per_second;
-        encoder_context->brc.need_reset = 1;
-    }
+    *seq_bits_per_second = seq_param->bits_per_second;
 
     return VA_STATUS_SUCCESS;
 }
@@ -492,7 +489,8 @@ intel_encoder_check_brc_hevc_sequence_parameter(VADriverContextP ctx,
 static VAStatus
 intel_encoder_check_brc_vp9_sequence_parameter(VADriverContextP ctx,
                                                struct encode_state *encode_state,
-                                               struct intel_encoder_context *encoder_context)
+                                               struct intel_encoder_context *encoder_context,
+                                               unsigned int *seq_bits_per_second)
 {
     VAEncSequenceParameterBufferVP9 *seq_param = (VAEncSequenceParameterBufferVP9*)encode_state->seq_param_ext->buffer;
     unsigned int gop_size;
@@ -507,34 +505,37 @@ intel_encoder_check_brc_vp9_sequence_parameter(VADriverContextP ctx,
     else
         gop_size = seq_param->intra_period;
 
-    if (encoder_context->brc.bits_per_second[0] != seq_param->bits_per_second ||
-        encoder_context->brc.gop_size != gop_size) {
-        encoder_context->brc.bits_per_second[0] = seq_param->bits_per_second;
+    if (encoder_context->brc.gop_size != gop_size) {
         encoder_context->brc.gop_size = gop_size;
         encoder_context->brc.need_reset = 1;
     }
 
+    *seq_bits_per_second = seq_param->bits_per_second;
+
     return VA_STATUS_SUCCESS;
 }
 
 static VAStatus
 intel_encoder_check_brc_sequence_parameter(VADriverContextP ctx,
                                            struct encode_state *encode_state,
-                                           struct intel_encoder_context *encoder_context)
+                                           struct intel_encoder_context *encoder_context,
+                                           unsigned int *seq_bits_per_second)
 {
+    *seq_bits_per_second = 0;
+
     switch (encoder_context->codec) {
     case CODEC_H264:
     case CODEC_H264_MVC:
-        return intel_encoder_check_brc_h264_sequence_parameter(ctx, encode_state, encoder_context);
+        return intel_encoder_check_brc_h264_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
 
     case CODEC_VP8:
-        return intel_encoder_check_brc_vp8_sequence_parameter(ctx, encode_state, encoder_context);
+        return intel_encoder_check_brc_vp8_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
 
     case CODEC_HEVC:
-        return intel_encoder_check_brc_hevc_sequence_parameter(ctx, encode_state, encoder_context);
+        return intel_encoder_check_brc_hevc_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
 
     case CODEC_VP9:
-        return intel_encoder_check_brc_vp9_sequence_parameter(ctx, encode_state, encoder_context);
+        return intel_encoder_check_brc_vp9_sequence_parameter(ctx, encode_state, encoder_context, seq_bits_per_second);
 
     default:
         // TODO: other codecs
@@ -545,7 +546,8 @@ intel_encoder_check_brc_sequence_parameter(VADriverContextP ctx,
 static void
 intel_encoder_check_rate_control_parameter(VADriverContextP ctx,
                                            struct intel_encoder_context *encoder_context,
-                                           VAEncMiscParameterRateControl *misc)
+                                           VAEncMiscParameterRateControl *misc,
+                                           int *hl_bitrate_updated)
 {
     int temporal_id = 0;
 
@@ -577,6 +579,9 @@ intel_encoder_check_rate_control_parameter(VADriverContextP ctx,
         encoder_context->brc.window_size = misc->window_size;
         encoder_context->brc.need_reset = 1;
     }
+
+    if (temporal_id == encoder_context->layer.num_layers - 1)
+        *hl_bitrate_updated = 1;
 }
 
 static void
@@ -651,11 +656,13 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
     VAStatus ret;
     VAEncMiscParameterBuffer *misc_param;
     int i, j;
+    int hl_bitrate_updated = 0; // Indicate whether the bitrate for the highest level is changed in misc parameters
+    unsigned int seq_bits_per_second = 0;
 
     if (!(encoder_context->rate_control_mode & (VA_RC_CBR | VA_RC_VBR)))
         return VA_STATUS_SUCCESS;
 
-    ret = intel_encoder_check_brc_sequence_parameter(ctx, encode_state, encoder_context);
+    ret = intel_encoder_check_brc_sequence_parameter(ctx, encode_state, encoder_context, &seq_bits_per_second);
 
     if (ret)
         return ret;
@@ -677,7 +684,8 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
             case VAEncMiscParameterTypeRateControl:
                 intel_encoder_check_rate_control_parameter(ctx,
                                                            encoder_context,
-                                                           (VAEncMiscParameterRateControl *)misc_param->data);
+                                                           (VAEncMiscParameterRateControl *)misc_param->data,
+                                                           &hl_bitrate_updated);
                 break;
 
             case VAEncMiscParameterTypeHRD:
@@ -698,6 +706,14 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
         }
     }
 
+    if (!hl_bitrate_updated && seq_bits_per_second &&
+        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] != seq_bits_per_second) {
+
+        encoder_context->brc.bits_per_second[encoder_context->layer.num_layers - 1] = seq_bits_per_second;
+        encoder_context->brc.need_reset = 1;
+
+    }
+
     return VA_STATUS_SUCCESS;
 }
 
-- 
1.9.1



More information about the Libva mailing list