On 09/06/2016 11:45 PM, Xiang, Haihao wrote:
Signed-off-by: Xiang, Haihao<[email protected]>
---
src/i965_encoder.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/i965_encoder.h | 9 ++++++++
2 files changed, 75 insertions(+)
diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index 2ba5de7..1ba24e6 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -461,6 +461,66 @@ 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)
+ 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];
It seems that the curr_frame_layer_id field is the indicator of temporal
layer.
But where is the curr_frame_layer_id updated?
It seems that it is currently controlled by the
encoder_context->is_new_sequence. Not sure whether it is wrong?
Thanks
Yakui
+
+ return VA_STATUS_SUCCESS;
+}
+
+static VAStatus
intel_encoder_check_misc_parameter(VADriverContextP ctx,
struct encode_state *encode_state,
struct intel_encoder_context
*encoder_context)
@@ -481,6 +541,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:
@@ -1013,6 +1078,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 808a336..66d3d1d 100644
--- a/src/i965_encoder.h
+++ b/src/i965_encoder.h
@@ -41,6 +41,8 @@
#define I965_BRC_VBR 2
#define I965_BRC_CQP 3
+#define MAX_TEMPORAL_LAYERS 4
+
struct intel_roi
{
short left;
@@ -64,6 +66,13 @@ struct intel_encoder_context
unsigned int frame_height_in_mbs;
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;
_______________________________________________
Libva mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libva