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;
}