[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
Pengfei Qu
Pengfei.Qu at intel.com
Thu Jun 30 02:32:58 UTC 2016
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;
+ }
+
+ 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
*
* 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_ */
--
2.7.4
More information about the Libva
mailing list