[Libva] [Libva-intel-driver][PATCH v3 11/18] Check temporal layer structure
Xiang, Haihao
haihao.xiang at intel.com
Tue Sep 13 08:02:40 UTC 2016
v2: set right temporal layer id for current frame
Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
Tested-by: Luo, Focus <focus.luo at intel.com>
---
src/i965_encoder.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/i965_encoder.h | 8 ++++++
2 files changed, 80 insertions(+)
diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index 0620c40..8db1463 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -467,6 +467,72 @@ intel_encoder_check_brc_parameter(VADriverContextP ctx,
}
static VAStatus
+intel_encoder_check_temporal_layer_structure(VADriverContextP ctx,
+ struct encode_state *encode_state,
+ struct intel_encoder_context *encoder_context)
+{
+ VAEncMiscParameterBuffer* misc_param;
+ VAEncMiscParameterTemporalLayerStructure *tls_paramter;
+ unsigned int rate_control_mode = encoder_context->rate_control_mode;
+ int i;
+
+ if (!encoder_context->is_new_sequence) {
+ if (encoder_context->layer.num_layers > 1)
+ encoder_context->layer.curr_frame_layer_id = encoder_context->layer.frame_layer_ids[(encoder_context->num_frames_in_sequence - 1) % encoder_context->layer.size_frame_layer_ids];
+ else
+ encoder_context->layer.curr_frame_layer_id = 0;
+
+ return VA_STATUS_SUCCESS;
+ }
+
+ if (!(rate_control_mode & (VA_RC_CBR | VA_RC_VBR)))
+ return VA_STATUS_SUCCESS;
+
+ if (!encode_state->misc_param[VAEncMiscParameterTypeTemporalLayerStructure][0] ||
+ !encode_state->misc_param[VAEncMiscParameterTypeTemporalLayerStructure][0]->buffer)
+ return VA_STATUS_SUCCESS;
+
+ misc_param = (VAEncMiscParameterBuffer*)encode_state->misc_param[VAEncMiscParameterTypeTemporalLayerStructure][0]->buffer;
+ tls_paramter = (VAEncMiscParameterTemporalLayerStructure *)misc_param->data;
+
+ if (tls_paramter->number_of_layers <= 1)
+ return VA_STATUS_SUCCESS;
+
+ if (tls_paramter->number_of_layers >= MAX_TEMPORAL_LAYERS)
+ return VA_STATUS_ERROR_INVALID_PARAMETER;
+
+ if (tls_paramter->periodicity > 32 || tls_paramter->periodicity <= 1)
+ return VA_STATUS_ERROR_INVALID_PARAMETER;
+
+ for (i = 0; i < tls_paramter->number_of_layers; i++) {
+ if (!encode_state->misc_param[VAEncMiscParameterTypeRateControl][i] ||
+ !encode_state->misc_param[VAEncMiscParameterTypeRateControl][i]->buffer ||
+ !encode_state->misc_param[VAEncMiscParameterTypeFrameRate][i] ||
+ !encode_state->misc_param[VAEncMiscParameterTypeFrameRate][i]->buffer) {
+
+ return VA_STATUS_ERROR_INVALID_PARAMETER;
+ }
+ }
+
+ encoder_context->layer.size_frame_layer_ids = tls_paramter->periodicity;
+ encoder_context->layer.num_layers = tls_paramter->number_of_layers;
+
+ for (i = 0; i < encoder_context->layer.size_frame_layer_ids; i++) {
+ if (tls_paramter->layer_id[i] >= tls_paramter->number_of_layers)
+ return VA_STATUS_ERROR_INVALID_PARAMETER;
+
+ encoder_context->layer.frame_layer_ids[i] = tls_paramter->layer_id[i];
+ }
+
+ if (encoder_context->is_new_sequence)
+ encoder_context->layer.curr_frame_layer_id = 0;
+ else
+ encoder_context->layer.curr_frame_layer_id = encoder_context->layer.frame_layer_ids[(encoder_context->num_frames_in_sequence - 1) % encoder_context->layer.size_frame_layer_ids];
+
+ return VA_STATUS_SUCCESS;
+}
+
+static VAStatus
intel_encoder_check_misc_parameter(VADriverContextP ctx,
struct encode_state *encode_state,
struct intel_encoder_context *encoder_context)
@@ -487,6 +553,11 @@ intel_encoder_check_misc_parameter(VADriverContextP ctx,
}
}
+ ret = intel_encoder_check_temporal_layer_structure(ctx, encode_state, encoder_context);
+
+ if (ret)
+ goto out;
+
ret = intel_encoder_check_brc_parameter(ctx, encode_state, encoder_context);
out:
@@ -1020,6 +1091,7 @@ intel_enc_hw_context_init(VADriverContextP ctx,
encoder_context->rate_control_mode = VA_RC_NONE;
encoder_context->quality_level = ENCODER_DEFAULT_QUALITY;
encoder_context->quality_range = 1;
+ encoder_context->layer.num_layers = 1;
if (obj_config->entrypoint == VAEntrypointEncSliceLP)
encoder_context->low_power_mode = 1;
diff --git a/src/i965_encoder.h b/src/i965_encoder.h
index 7d5b15a..8058ccc 100644
--- a/src/i965_encoder.h
+++ b/src/i965_encoder.h
@@ -43,6 +43,7 @@
#define WIDTH_IN_MACROBLOCKS(width) (ALIGN(width, 16) >> 4)
#define HEIGHT_IN_MACROBLOCKS(height) (ALIGN(height, 16) >> 4)
+#define MAX_TEMPORAL_LAYERS 4
struct intel_roi
{
@@ -67,6 +68,13 @@ struct intel_encoder_context
unsigned int frame_height_in_pixel;
struct {
+ unsigned int num_layers;
+ unsigned int size_frame_layer_ids;
+ unsigned int frame_layer_ids[32];
+ unsigned int curr_frame_layer_id;
+ } layer;
+
+ struct {
unsigned short gop_size;
unsigned short num_iframes_in_gop;
unsigned short num_pframes_in_gop;
--
1.9.1
More information about the Libva
mailing list