summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang, Haihao <haihao.xiang@intel.com>2016-12-14 11:03:59 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2016-12-29 16:36:04 +0800
commit150fd0af8b69b8524099620097f72ce41db9b22e (patch)
tree6b1d61610c95a7e3f69b82fe8fdfbb45b9100258
parent16d7fd3beb052eeb7368253e245642e2a3a251bd (diff)
Needn't reset brc if the bitrate setting isn't changed in the Begin/Render/End sequence
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.xiang@intel.com> Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
-rw-r--r--src/i965_encoder.c72
1 files 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;
}