On 07/01/2016 12:49 PM, Xiang, Haihao wrote:


From: Zhao Yakui<[email protected]>

Signed-off-by: Zhao Yakui<[email protected]>
Signed-off-by: pjl<[email protected]>
Signed-off-by: Pengfei Qu<[email protected]>
---
  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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libva
_______________________________________________
Libva mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libva

_______________________________________________
Libva mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to