diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2016-11-28 15:35:21 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2016-12-02 16:22:49 +0800 |
commit | 8b0837394a4224e83ba2e4448cd24307e2db73b9 (patch) | |
tree | ec9bba04b499bc56e3a9994a12468419e3640131 | |
parent | 7f9206ff3cb44948e0b9ea09af1748e77864c5c6 (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.c | 59 |
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: |