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.xi...@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

_______________________________________________
Libva mailing list
Libva@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to