[Libva] [Libva-intel-driver][PATCH] Check VP8 brc parameters in the common function

Xiang, Haihao haihao.xiang at intel.com
Wed Nov 30 05:21:52 UTC 2016


These parameters are irrelative to platforms

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

diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index bca8ebd..d874322 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -368,6 +368,53 @@ error:
 }
 
 static VAStatus
+intel_encoder_check_brc_vp8_sequence_parameter(VADriverContextP ctx,
+                                               struct encode_state *encode_state,
+                                               struct intel_encoder_context *encoder_context)
+{
+    VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
+    unsigned int num_pframes_in_gop, bits_per_second;
+
+    if (!encoder_context->is_new_sequence)
+        return VA_STATUS_SUCCESS;
+
+    assert(seq_param);
+
+    encoder_context->brc.num_iframes_in_gop = 1;// Always 1
+    encoder_context->brc.num_bframes_in_gop = 0;// No B frame
+
+    if (seq_param->intra_period == 0) {         // E.g. IPPP... (only one I frame in the stream)
+        encoder_context->brc.gop_size = 30;     // fake
+    } else {
+        encoder_context->brc.gop_size = seq_param->intra_period;
+    }
+
+    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_per_100s[encoder_context->layer.num_layers - 1]) {
+        encoder_context->brc.framerate_per_100s[encoder_context->layer.num_layers - 1] = 3000;  // for the highest layer
+        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]) {
+        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;
+    }
+
+    if (!encoder_context->brc.hrd_buffer_size ||
+        !encoder_context->brc.hrd_initial_buffer_fullness) {
+        encoder_context->brc.hrd_buffer_size = seq_param->bits_per_second << 1;
+        encoder_context->brc.hrd_initial_buffer_fullness = seq_param->bits_per_second;
+        encoder_context->brc.need_reset = 1;
+    }
+
+    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)
@@ -376,6 +423,9 @@ intel_encoder_check_brc_sequence_parameter(VADriverContextP ctx,
         encoder_context->codec == CODEC_H264_MVC)
         return intel_encoder_check_brc_h264_sequence_parameter(ctx, encode_state, encoder_context);
 
+    if (encoder_context->codec == CODEC_VP8)
+        return intel_encoder_check_brc_vp8_sequence_parameter(ctx, encode_state, encoder_context);
+
     // TODO: other codecs
     return VA_STATUS_SUCCESS;
 }
@@ -801,6 +851,7 @@ intel_encoder_check_vp8_parameter(VADriverContextP ctx,
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     VAEncPictureParameterBufferVP8 *pic_param = (VAEncPictureParameterBufferVP8 *)encode_state->pic_param_ext->buffer;
+    VAEncSequenceParameterBufferVP8 *seq_param = (VAEncSequenceParameterBufferVP8 *)encode_state->seq_param_ext->buffer;
     struct object_surface *obj_surface;
     struct object_buffer *obj_buffer;
     int i = 0;
@@ -853,6 +904,14 @@ intel_encoder_check_vp8_parameter(VADriverContextP ctx,
     for ( ; i < 16; i++)
         encode_state->reference_objects[i] = NULL;
 
+    encoder_context->is_new_sequence = (is_key_frame && seq_param);
+
+    if (encoder_context->is_new_sequence) {
+        encoder_context->num_frames_in_sequence = 0;
+        encoder_context->frame_width_in_pixel = seq_param->frame_width;
+        encoder_context->frame_height_in_pixel = seq_param->frame_height;
+    }
+
     return VA_STATUS_SUCCESS;
 
 error:
-- 
1.9.1



More information about the Libva mailing list