Maintain Huffman tables in MFX format so that they can simply be uploaded as an intel_batchbuffer_data() command.
Signed-off-by: Gwenole Beauchesne <[email protected]> --- 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 _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
