[Libva] [Libva-intel-driver][PATCH 11/18] Check temporal layer structure

Zhao Yakui yakui.zhao at intel.com
Wed Sep 7 06:08:56 UTC 2016


On 09/06/2016 11:45 PM, Xiang, Haihao wrote:
> Signed-off-by: Xiang, Haihao<haihao.xiang at intel.com>
> ---
>   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;



More information about the Libva mailing list