[Libva] [Libva-intel-driver PATCH 12/27] HEVC: gen9_hcpd_hevc_qm_state()
Xiang, Haihao
haihao.xiang at intel.com
Wed Nov 19 07:05:27 PST 2014
Set the quantization tables in HCP_QM_STATE. The default flat
tables will be used if application doesn't pass the valid tables
to driver or scaling_list_enable_flag is set to 0
Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
src/gen9_mfd.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/src/gen9_mfd.c b/src/gen9_mfd.c
index c025a96..9b63820 100644
--- a/src/gen9_mfd.c
+++ b/src/gen9_mfd.c
@@ -330,6 +330,85 @@ gen9_hcpd_ind_obj_base_addr_state(VADriverContextP ctx,
ADVANCE_BCS_BATCH(batch);
}
+static void
+gen9_hcpd_qm_state(VADriverContextP ctx,
+ int size_id,
+ int color_component,
+ int pred_type,
+ int dc,
+ unsigned char *qm,
+ int qm_length,
+ struct gen9_hcpd_context *gen9_hcpd_context)
+{
+ struct intel_batchbuffer *batch = gen9_hcpd_context->base.batch;
+ unsigned char qm_buffer[64];
+
+ assert(qm_length <= 64);
+ memset(qm_buffer, 0, sizeof(qm_buffer));
+ memcpy(qm_buffer, qm, qm_length);
+
+ BEGIN_BCS_BATCH(batch, 18);
+
+ OUT_BCS_BATCH(batch, HCP_QM_STATE | (18 - 2));
+ OUT_BCS_BATCH(batch,
+ dc << 5 |
+ color_component << 3 |
+ size_id << 1 |
+ pred_type);
+ intel_batchbuffer_data(batch, qm_buffer, 64);
+
+ ADVANCE_BCS_BATCH(batch);
+}
+
+static void
+gen9_hcpd_hevc_qm_state(VADriverContextP ctx,
+ struct decode_state *decode_state,
+ struct gen9_hcpd_context *gen9_hcpd_context)
+{
+ VAIQMatrixBufferHEVC *iq_matrix;
+ VAPictureParameterBufferHEVC *pic_param;
+ int i;
+
+ if (decode_state->iq_matrix && decode_state->iq_matrix->buffer)
+ iq_matrix = (VAIQMatrixBufferHEVC *)decode_state->iq_matrix->buffer;
+ else
+ iq_matrix = &gen9_hcpd_context->iq_matrix_hevc;
+
+ assert(decode_state->pic_param && decode_state->pic_param->buffer);
+ pic_param = (VAPictureParameterBufferHEVC *)decode_state->pic_param->buffer;
+
+ if (!pic_param->pic_fields.bits.scaling_list_enabled_flag)
+ iq_matrix = &gen9_hcpd_context->iq_matrix_hevc;
+
+ for (i = 0; i < 6; i++) {
+ gen9_hcpd_qm_state(ctx,
+ 0, i % 3, i / 3, 0,
+ iq_matrix->ScalingList4x4[i], 16,
+ gen9_hcpd_context);
+ }
+
+ for (i = 0; i < 6; i++) {
+ gen9_hcpd_qm_state(ctx,
+ 1, i % 3, i / 3, 0,
+ iq_matrix->ScalingList8x8[i], 64,
+ gen9_hcpd_context);
+ }
+
+ for (i = 0; i < 6; i++) {
+ gen9_hcpd_qm_state(ctx,
+ 2, i % 3, i / 3, iq_matrix->ScalingListDC16x16[i],
+ iq_matrix->ScalingList16x16[i], 64,
+ gen9_hcpd_context);
+ }
+
+ for (i = 0; i < 2; i++) {
+ gen9_hcpd_qm_state(ctx,
+ 3, 0, i % 2, iq_matrix->ScalingListDC32x32[i],
+ iq_matrix->ScalingList32x32[i], 64,
+ gen9_hcpd_context);
+ }
+}
+
static VAStatus
gen9_hcpd_hevc_decode_picture(VADriverContextP ctx,
struct decode_state *decode_state,
@@ -351,6 +430,7 @@ gen9_hcpd_hevc_decode_picture(VADriverContextP ctx,
gen9_hcpd_pipe_mode_select(ctx, decode_state, HCP_CODEC_HEVC, gen9_hcpd_context);
gen9_hcpd_surface_state(ctx, decode_state, gen9_hcpd_context);
gen9_hcpd_pipe_buf_addr_state(ctx, decode_state, gen9_hcpd_context);
+ gen9_hcpd_hevc_qm_state(ctx, decode_state, gen9_hcpd_context);
/* Need to double it works or not if the two slice groups have differenct slice data buffers */
for (j = 0; j < decode_state->num_slice_params; j++) {
--
1.9.1
More information about the Libva
mailing list