> From: Zhao Yakui <yakui.z...@intel.com>
> 
> Signed-off-by: Zhao Yakui <yakui.zh...@intel.com>
> Signed-off-by: pjl <ceciliap...@intel.com>
> Signed-off-by: Pengfei Qu <pengfei...@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.


> +    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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/libva
_______________________________________________
Libva mailing list
Libva@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to