[Libva] [PATCH 2/2] jpeg: maintain internal Huffman tables in MFX format.
Gwenole Beauchesne
gb.devel at gmail.com
Mon Jun 18 07:49:45 PDT 2012
Maintain Huffman tables in MFX format so that they can simply be
uploaded as an intel_batchbuffer_data() command.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
---
src/gen7_mfd.c | 83 +++++++++++++++++++++-------------------------
src/gen7_mfd.h | 7 +---
src/i965_decoder.h | 13 +++++++
src/i965_decoder_utils.c | 26 ++++++++++++++
src/i965_decoder_utils.h | 8 ++++
5 files changed, 87 insertions(+), 50 deletions(-)
diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
index 654d2b9..129c585 100644
--- a/src/gen7_mfd.c
+++ b/src/gen7_mfd.c
@@ -1918,14 +1918,31 @@ gen7_mfd_vc1_decode_picture(VADriverContextP ctx,
intel_batchbuffer_flush(batch);
}
+static const int va_to_gen7_jpeg_hufftable[2] = {
+ MFX_HUFFTABLE_ID_Y,
+ MFX_HUFFTABLE_ID_UV
+};
+
static inline void
gen7_mfd_jpeg_context_init(
VADriverContextP ctx,
struct gen7_mfd_context *gen7_mfd_context
)
{
+ VAHuffmanTableBufferJPEG default_huffman_table;
+ unsigned int i;
+
/* Initialize default Huffman table */
- jpeg_gen_default_huffman_table(&gen7_mfd_context->huffman_table.jpeg);
+ jpeg_gen_default_huffman_table(&default_huffman_table);
+ for (i = 0; i < 2; i++) {
+ const unsigned int id = va_to_gen7_jpeg_hufftable[i];
+ GenHuffTableStateJPEG * const huff_table_state =
+ &gen7_mfd_context->jpeg_huff_table_state[id];
+ jpeg_fill_huff_table_state(huff_table_state, id, &default_huffman_table, i);
+ huff_table_state->data.padding[0] = 0;
+ huff_table_state->data.padding[1] = 0;
+ huff_table_state->valid = 1;
+ }
}
static void
@@ -2086,38 +2103,11 @@ gen7_mfd_jpeg_pic_state(VADriverContextP ctx,
ADVANCE_BCS_BATCH(batch);
}
-static const int va_to_gen7_jpeg_hufftable[2] = {
- MFX_HUFFTABLE_ID_Y,
- MFX_HUFFTABLE_ID_UV
-};
-
static void
gen7_mfd_jpeg_huff_table_state(VADriverContextP ctx,
- unsigned int HuffTableID,
- unsigned char dc_bits[12],
- unsigned char dc_huffval[12],
- unsigned char ac_bits[16],
- unsigned char ac_huffval[162],
+ struct decode_state *decode_state,
struct gen7_mfd_context *gen7_mfd_context)
{
- struct intel_batchbuffer * const batch = gen7_mfd_context->base.batch;
-
- BEGIN_BCS_BATCH(batch, 53);
- OUT_BCS_BATCH(batch, MFX_JPEG_HUFF_TABLE_STATE | (53 - 2));
- OUT_BCS_BATCH(batch, HuffTableID);
- intel_batchbuffer_data(batch, dc_bits, 12);
- intel_batchbuffer_data(batch, dc_huffval, 12);
- intel_batchbuffer_data(batch, ac_bits, 16);
- intel_batchbuffer_data(batch, ac_huffval, 164);
- ADVANCE_BCS_BATCH(batch);
-}
-
-static void
-gen7_mfd_jpeg_update_huff_table_state(VADriverContextP ctx,
- struct decode_state *decode_state,
- struct gen7_mfd_context *gen7_mfd_context)
-{
- VAHuffmanTableBufferJPEG * const gen_huffman_table = &gen7_mfd_context->huffman_table.jpeg;
unsigned int i, id;
/* Update internal Huffman tables */
@@ -2129,26 +2119,29 @@ gen7_mfd_jpeg_update_huff_table_state(VADriverContextP ctx,
if (!huffman_table->load_huffman_table[i])
continue;
id = va_to_gen7_jpeg_hufftable[i];
- memcpy(&gen_huffman_table->huffman_table[id],
- &huffman_table->huffman_table[i],
- sizeof(gen_huffman_table->huffman_table[id]));
- gen_huffman_table->load_huffman_table[id] = 1;
+
+ GenHuffTableStateJPEG * const huff_table_state =
+ &gen7_mfd_context->jpeg_huff_table_state[id];
+ jpeg_fill_huff_table_state(huff_table_state, id, huffman_table, i);
+ huff_table_state->valid = 1;
}
}
/* Upload Huffman table, if necessary */
- for (i = 0; i < ARRAY_ELEMS(gen_huffman_table->huffman_table); i++) {
- if (!gen_huffman_table->load_huffman_table[i])
+ for (i = 0; i < ARRAY_ELEMS(gen7_mfd_context->jpeg_huff_table_state); i++) {
+ GenHuffTableStateJPEG * const huff_table_state =
+ &gen7_mfd_context->jpeg_huff_table_state[i];
+
+ if (!huff_table_state->valid)
continue;
- gen7_mfd_jpeg_huff_table_state(
- ctx, i,
- gen_huffman_table->huffman_table[i].num_dc_codes,
- gen_huffman_table->huffman_table[i].dc_values,
- gen_huffman_table->huffman_table[i].num_ac_codes,
- gen_huffman_table->huffman_table[i].ac_values,
- gen7_mfd_context
- );
- gen_huffman_table->load_huffman_table[i] = 0;
+
+ struct intel_batchbuffer * const batch = gen7_mfd_context->base.batch;
+ BEGIN_BCS_BATCH(batch, 53);
+ OUT_BCS_BATCH(batch, MFX_JPEG_HUFF_TABLE_STATE | (53 - 2));
+ intel_batchbuffer_data(batch, &huff_table_state->data,
+ sizeof(huff_table_state->data));
+ ADVANCE_BCS_BATCH(batch);
+ huff_table_state->valid = 0;
}
}
@@ -2691,7 +2684,7 @@ gen7_mfd_jpeg_decode_picture(VADriverContextP ctx,
gen7_mfd_ind_obj_base_addr_state(ctx, slice_data_bo, MFX_FORMAT_JPEG, gen7_mfd_context);
}
- gen7_mfd_jpeg_update_huff_table_state(ctx, decode_state, gen7_mfd_context);
+ gen7_mfd_jpeg_huff_table_state(ctx, decode_state, gen7_mfd_context);
for (j = 0; j < decode_state->num_slice_params; j++) {
assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
diff --git a/src/gen7_mfd.h b/src/gen7_mfd.h
index e2e25b6..555951e 100644
--- a/src/gen7_mfd.h
+++ b/src/gen7_mfd.h
@@ -84,10 +84,6 @@ struct gen7_mfd_context
VAIQMatrixBufferH264 h264; /* flat scaling lists (default) */
} iq_matrix;
- union {
- VAHuffmanTableBufferJPEG jpeg; /* in MFX format */
- } huffman_table;
-
GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES];
GenBuffer post_deblocking_output;
GenBuffer pre_deblocking_output;
@@ -96,7 +92,8 @@ struct gen7_mfd_context
GenBuffer bsd_mpc_row_store_scratch_buffer;
GenBuffer mpr_row_store_scratch_buffer;
GenBuffer bitplane_read_buffer;
-
+
+ GenHuffTableStateJPEG jpeg_huff_table_state[2];
VASurfaceID jpeg_wa_surface_id;
dri_bo *jpeg_wa_slice_data_bo;
diff --git a/src/i965_decoder.h b/src/i965_decoder.h
index 8d88e3b..513529d 100644
--- a/src/i965_decoder.h
+++ b/src/i965_decoder.h
@@ -44,4 +44,17 @@ struct gen_buffer {
int valid;
};
+typedef struct gen_huff_table_state_jpeg GenHuffTableStateJPEG;
+struct gen_huff_table_state_jpeg {
+ unsigned int valid;
+ struct {
+ unsigned int HuffTableID;
+ unsigned char DC_BITS[12];
+ unsigned char DC_HUFFVAL[12];
+ unsigned char AC_BITS[16];
+ unsigned char AC_HUFFVAL[162];
+ unsigned char padding[2]; /* MBZ */
+ } data;
+};
+
#endif /* I965_DECODER_H */
diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c
index 042ec95..c9e2b9c 100644
--- a/src/i965_decoder_utils.c
+++ b/src/i965_decoder_utils.c
@@ -124,6 +124,32 @@ jpeg_gen_default_huffman_table(VAHuffmanTableBufferJPEG *huffman_table)
huffman_table->load_huffman_table[1] = 1;
}
+/* Convert VA Huffman table to MFX format */
+void
+jpeg_fill_huff_table_state(
+ GenHuffTableStateJPEG *huff_table_state,
+ unsigned int id,
+ const VAHuffmanTableBufferJPEG *huffman_table,
+ unsigned int index
+)
+{
+ huff_table_state->data.HuffTableID = id;
+
+ /* XXX: baseline profile only */
+ memcpy(huff_table_state->data.DC_BITS,
+ huffman_table->huffman_table[index].num_dc_codes,
+ 12);
+ memcpy(huff_table_state->data.DC_HUFFVAL,
+ huffman_table->huffman_table[index].dc_values,
+ 12);
+ memcpy(huff_table_state->data.AC_BITS,
+ huffman_table->huffman_table[index].num_ac_codes,
+ 16);
+ memcpy(huff_table_state->data.AC_HUFFVAL,
+ huffman_table->huffman_table[index].ac_values,
+ 162);
+}
+
/* Set reference surface if backing store exists */
static inline int
set_ref_frame(
diff --git a/src/i965_decoder_utils.h b/src/i965_decoder_utils.h
index aa1eba1..4b36602 100644
--- a/src/i965_decoder_utils.h
+++ b/src/i965_decoder_utils.h
@@ -32,6 +32,14 @@ struct decode_state;
void
jpeg_gen_default_huffman_table(VAHuffmanTableBufferJPEG *huffman_table);
+void
+jpeg_fill_huff_table_state(
+ GenHuffTableStateJPEG *huff_table_state,
+ unsigned int id,
+ const VAHuffmanTableBufferJPEG *huffman_table,
+ unsigned int index
+);
+
int
mpeg2_wa_slice_vertical_position(
struct decode_state *decode_state,
--
1.7.5.4
More information about the Libva
mailing list