On 12/29/2016 03:08 PM, Xiang, Haihao wrote:

On 12/29/2016 01:22 PM, Xiang, Haihao wrote:
User can use VAEncMiscParameterRateControl to update bitrate, so we
should ignore
the bitrate in the sequence parameter if
VAEncMiscParameterRateControl is present.

This makes sense. The MiscRateControl mentions that it can override
the
bps setting in sequence parameter.

Hence it is not needed to reset brc if
VAEncMiscParameterRateControl doesn't change
the used bitrate.

Does it still need to send the VAEncMiscParameterRateControl
parameter
if the bps is not changed for the new sequence?

Yes if bits_per_second in the sequence parameter is not equal to the
value for the previous Begin/Render/End sequence except bits_per_second
in the sequence parameter is 0.


OK.
It makes sense.

This looks good to me.

Add: Reviewed-by: Zhao Yakui <yakui.z...@intel.com>

Thanks
   Yakui



Thanks
    Yakui

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,
-                                           VAEncMiscParameterRateC
ontrol *misc)
+                                           VAEncMiscParameterRateC
ontrol *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,
                                                              encode
r_context,
-                                                           (VAEncM
iscParameterRateControl *)misc_param->data);
+                                                           (VAEncM
iscParameterRateControl *)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;
   }


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

Reply via email to