[Libva] [PATCH 01/14] Encoding: Abstract the calculation of mbmv cost for qp as one function and Add one function that initialize mbmv cost table for supported Qp range

Zhao Yakui yakui.zhao at intel.com
Fri Jul 1 06:11:27 UTC 2016


On 07/01/2016 12:49 PM, Xiang, Haihao wrote:
>
>
>> From: Zhao Yakui<yakui.zhao at intel.com>
>>
>> Signed-off-by: Zhao Yakui<yakui.zhaoi at intel.com>
>> Signed-off-by: pjl<ceciliapeng at intel.com>
>> Signed-off-by: Pengfei Qu<Pengfei.Qu at intel.com>
>> ---
>>   src/gen6_mfc_common.c | 104
>> ++++++++++++++++++++++++++++++++++++++++----------
>>   src/gen6_vme.h        |  15 +++++++-
>>   2 files changed, 98 insertions(+), 21 deletions(-)
>>
>> diff --git a/src/gen6_mfc_common.c b/src/gen6_mfc_common.c
>> index f961ecd..bb02c83 100644
>> --- a/src/gen6_mfc_common.c
>> +++ b/src/gen6_mfc_common.c
>> @@ -765,29 +765,14 @@ static float intel_lambda_qp(int qp)
>>   }
>>
>>
>> -void intel_vme_update_mbmv_cost(VADriverContextP ctx,
>> -                                struct encode_state *encode_state,
>> -                                struct intel_encoder_context
>> *encoder_context)
>> +static
>> +void intel_h264_calc_mbmvcost_qp(int qp,
>> +                                 int slice_type,
>> +                                 uint8_t *vme_state_message)
>>   {
>> -    struct gen6_mfc_context *mfc_context = encoder_context-
>>> mfc_context;
>> -    struct gen6_vme_context *vme_context = encoder_context-
>>> vme_context;
>> -    VAEncPictureParameterBufferH264 *pic_param =
>> (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext-
>>> buffer;
>> -    VAEncSliceParameterBufferH264 *slice_param =
>> (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]-
>>> buffer;
>> -    int qp, m_cost, j, mv_count;
>> -    uint8_t *vme_state_message = (uint8_t *)(vme_context-
>>> vme_state_message);
>> +    int m_cost, j, mv_count;
>>       float   lambda, m_costf;
>>
>> -    int slice_type = intel_avc_enc_slice_type_fixup(slice_param-
>>> slice_type);
>> -
>> -
>> -    if (encoder_context->rate_control_mode == VA_RC_CQP)
>> -        qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
>> -    else
>> -        qp = mfc_context-
>>> bit_rate_control_context[slice_type].QpPrimeY;
>> -
>> -    if (vme_state_message == NULL)
>> -        return;
>> -
>>       assert(qp<= QP_MAX);
>>       lambda = intel_lambda_qp(qp);
>>       if (slice_type == SLICE_TYPE_I) {
>> @@ -875,6 +860,31 @@ void intel_vme_update_mbmv_cost(VADriverContextP
>> ctx,
>>               vme_state_message[MODE_INTER_BWD] =
>> intel_format_lutvalue(m_cost, 0x6f);
>>           }
>>       }
>> +    return;
>> +}
>> +
>> +void intel_vme_update_mbmv_cost(VADriverContextP ctx,
>> +                                struct encode_state *encode_state,
>> +                                struct intel_encoder_context
>> *encoder_context)
>> +{
>> +    struct gen6_mfc_context *mfc_context = encoder_context-
>>> mfc_context;
>> +    struct gen6_vme_context *vme_context = encoder_context-
>>> vme_context;
>> +    VAEncPictureParameterBufferH264 *pic_param =
>> (VAEncPictureParameterBufferH264 *)encode_state->pic_param_ext-
>>> buffer;
>> +    VAEncSliceParameterBufferH264 *slice_param =
>> (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]-
>>> buffer;
>> +    int qp;
>> +    uint8_t *vme_state_message = (uint8_t *)(vme_context-
>>> vme_state_message);
>> +
>> +    int slice_type = intel_avc_enc_slice_type_fixup(slice_param-
>>> slice_type);
>> +
>> +    if (encoder_context->rate_control_mode == VA_RC_CQP)
>> +        qp = pic_param->pic_init_qp + slice_param->slice_qp_delta;
>> +    else
>> +        qp = mfc_context-
>>> bit_rate_control_context[slice_type].QpPrimeY;
>> +
>> +    if (vme_state_message == NULL)
>> +        return;
>> +
>> +    intel_h264_calc_mbmvcost_qp(qp, slice_type, vme_state_message);
>>   }
>>
>>   void intel_vme_vp8_update_mbmv_cost(VADriverContextP ctx,
>> @@ -1636,6 +1646,60 @@ void
>> intel_avc_slice_insert_packed_data(VADriverContextP ctx,
>>       return;
>>   }
>>
>> +void
>> +intel_h264_initialize_mbmv_cost(VADriverContextP ctx,
>> +                                struct encode_state *encode_state,
>> +                                struct intel_encoder_context
>> *encoder_context)
>> +{
>> +    struct i965_driver_data *i965 = i965_driver_data(ctx);
>> +    struct gen6_vme_context *vme_context = encoder_context-
>>> vme_context;
>> +    VAEncSliceParameterBufferH264 *slice_param =
>> (VAEncSliceParameterBufferH264 *)encode_state->slice_params_ext[0]-
>>> buffer;
>> +    int qp;
>> +    dri_bo *bo;
>> +    uint8_t *cost_table;
>> +
>> +    int slice_type = intel_avc_enc_slice_type_fixup(slice_param-
>>> slice_type);
>> +
>> +
>> +    if (slice_type == SLICE_TYPE_I) {
>> +        if (vme_context->i_qp_cost_table)
>> +            return;
>> +    } else if (slice_type == SLICE_TYPE_P) {
>> +        if (vme_context->p_qp_cost_table)
>> +            return;
>> +    } else {
>> +        if (vme_context->b_qp_cost_table)
>> +            return;
>> +    }
>> +
>> +    /* It is enough to allocate 32 bytes for each qp. */
>> +    bo = dri_bo_alloc(i965->intel.bufmgr,
>> +                      "cost_table ",
>> +                      QP_MAX * 32,
>> +                      64);
>> +
>> +    dri_bo_map(bo, 1);
>> +
>> +    cost_table = (uint8_t *)(bo->virtual);
>> +    for (qp = 0; qp<  QP_MAX; qp++) {
>> +        intel_h264_calc_mbmvcost_qp(qp, slice_type, cost_table);
>> +        cost_table += 32;
>> +    }
>> +
>> +    dri_bo_unmap(bo);
>> +
>> +    if (slice_type == SLICE_TYPE_I) {
>> +        vme_context->i_qp_cost_table = bo;
>> +    } else if (slice_type == SLICE_TYPE_P) {
>> +        vme_context->p_qp_cost_table = bo;
>> +    } else {
>> +        vme_context->b_qp_cost_table = bo;
>> +    }
>> +
>
> Where are the allocated BOs released? It would be better to release
> these BOs in the same patch.
>

Bo is allocated in this newly added function API.

In fact this API is not called.  Before it is called, do we need to free 
it in the same patch?

>
>> +    vme_context->cost_table_size = QP_MAX * 32;
>> +    return;
>> +}
>> +
>>   /* HEVC */
>>   static int
>>   hevc_temporal_find_surface(VAPictureHEVC *curr_pic,
>> diff --git a/src/gen6_vme.h b/src/gen6_vme.h
>> index dc568ac..ea9918b 100644
>> --- a/src/gen6_vme.h
>> +++ b/src/gen6_vme.h
>> @@ -1,5 +1,5 @@
>>   /*
>> - * Copyright  2009 Intel Corporation
>> + * Copyright<A9>  2009 Intel Corporation
>
> Please remove this change.
>
>>    *
>>    * Permission is hereby granted, free of charge, to any person
>> obtaining a
>>    * copy of this software and associated documentation files (the
>> @@ -46,6 +46,8 @@
>>
>>   #define GEN6_VME_KERNEL_NUMBER          3
>>
>> +#define INTEL_COST_TABLE_OFFSET         8
>> +
>>   struct encode_state;
>>   struct intel_encoder_context;
>>
>> @@ -91,6 +93,11 @@ struct gen6_vme_context
>>       struct object_surface *used_reference_objects[2];
>>       void *used_references[2];
>>       unsigned int ref_index_in_mb[2];
>> +
>> +    dri_bo *i_qp_cost_table;
>> +    dri_bo *p_qp_cost_table;
>> +    dri_bo *b_qp_cost_table;
>> +    int cost_table_size;
>>   };
>>
>>   #define MPEG2_PIC_WIDTH_HEIGHT	30
>> @@ -200,4 +207,10 @@ void
>> intel_vme_hevc_update_mbmv_cost(VADriverContextP ctx,
>>   extern Bool gen8_vme_context_init(VADriverContextP ctx, struct
>> intel_encoder_context *encoder_context);
>>
>>   extern Bool gen9_vme_context_init(VADriverContextP ctx, struct
>> intel_encoder_context *encoder_context);
>> +
>> +extern void
>> +intel_h264_initialize_mbmv_cost(VADriverContextP ctx,
>> +                                struct encode_state *encode_state,
>> +                                struct intel_encoder_context
>> *encoder_context);
>> +
>>   #endif /* _GEN6_VME_H_ */
>
> BTW this patch can not be applied by 'git am' due to the following
> error:
>
> error: cannot convert from y to UTF-8
> fatal: could not parse patch
>
> Please check your input when using 'git send-email'.
>
>
>> _______________________________________________
>> Libva mailing list
>> Libva at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/libva
> _______________________________________________
> Libva mailing list
> Libva at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/libva



More information about the Libva mailing list