summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2016-11-28 15:35:21 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2016-12-02 16:22:49 +0800
commit8b0837394a4224e83ba2e4448cd24307e2db73b9 (patch)
treeec9bba04b499bc56e3a9994a12468419e3640131
parent7f9206ff3cb44948e0b9ea09af1748e77864c5c6 (diff)
Check VP8 brc parameters in the common function
These parameters are irrelative to platforms Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
-rw-r--r--src/i965_encoder.c59
1 files changed, 59 insertions, 0 deletions
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: