If codec layer does not provide a VAIQMatrixBufferH264, this means flat scaling lists shall be used. The MFX_QM_STATE command still has to be submitted since IVB+ does not have a means to use HW generated scaling lists.
Signed-off-by: Gwenole Beauchesne <[email protected]> --- NEWS | 1 + src/gen7_mfd.c | 33 +++++++++++++++++++++++---------- src/gen7_mfd.h | 1 + src/i965_decoder_utils.c | 12 ++++++++++++ src/i965_decoder_utils.h | 3 +++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index ae52707..8c5ac97 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Copyright (C) 2009-2011 Intel Corporation Version 1.0.16 - DD.Feb.2012 * Fix VC-1 motion vector modes for Ivy Bridge +* Fix MFX_QM_STATE for H.264 flat scaling lists (IVB) * Fix and simplify AVC_REF_IDX_STATE setup (ILK, SNB, IVB) Version 1.0.15 - 28.Oct.2011 diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c index e36af34..02047c1 100644 --- a/src/gen7_mfd.c +++ b/src/gen7_mfd.c @@ -463,7 +463,6 @@ gen7_mfd_avc_img_state(VADriverContextP ctx, struct gen7_mfd_context *gen7_mfd_context) { struct intel_batchbuffer *batch = gen7_mfd_context->base.batch; - int qm_present_flag; int img_struct; int mbaff_frame_flag; unsigned int width_in_mbs, height_in_mbs; @@ -473,11 +472,6 @@ gen7_mfd_avc_img_state(VADriverContextP ctx, pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; assert(!(pic_param->CurrPic.flags & VA_PICTURE_H264_INVALID)); - if (decode_state->iq_matrix && decode_state->iq_matrix->buffer) - qm_present_flag = 1; - else - qm_present_flag = 0; /* built-in QM matrices */ - if (pic_param->CurrPic.flags & VA_PICTURE_H264_TOP_FIELD) img_struct = 1; else if (pic_param->CurrPic.flags & VA_PICTURE_H264_BOTTOM_FIELD) @@ -556,10 +550,10 @@ gen7_mfd_avc_qm_state(VADriverContextP ctx, VAIQMatrixBufferH264 *iq_matrix; VAPictureParameterBufferH264 *pic_param; - if (!decode_state->iq_matrix || !decode_state->iq_matrix->buffer) - return; - - iq_matrix = (VAIQMatrixBufferH264 *)decode_state->iq_matrix->buffer; + if (decode_state->iq_matrix && decode_state->iq_matrix->buffer) + iq_matrix = (VAIQMatrixBufferH264 *)decode_state->iq_matrix->buffer; + else + iq_matrix = &gen7_mfd_context->iq_matrix.h264; assert(decode_state->pic_param && decode_state->pic_param->buffer); pic_param = (VAPictureParameterBufferH264 *)decode_state->pic_param->buffer; @@ -885,6 +879,16 @@ gen7_mfd_avc_bsd_object(VADriverContextP ctx, ADVANCE_BCS_BATCH(batch); } +static inline void +gen7_mfd_avc_context_init( + VADriverContextP ctx, + struct gen7_mfd_context *gen7_mfd_context +) +{ + /* Initialize flat scaling lists */ + avc_gen_default_iq_matrix(&gen7_mfd_context->iq_matrix.h264); +} + static void gen7_mfd_avc_decode_init(VADriverContextP ctx, struct decode_state *decode_state, @@ -2804,5 +2808,14 @@ gen7_dec_hw_context_init(VADriverContextP ctx, VAProfile profile) gen7_mfd_context->jpeg_wa_surface_id = VA_INVALID_SURFACE; + switch (profile) { + case VAProfileH264Baseline: + case VAProfileH264Main: + case VAProfileH264High: + gen7_mfd_avc_context_init(ctx, gen7_mfd_context); + break; + default: + break; + } return (struct hw_context *)gen7_mfd_context; } diff --git a/src/gen7_mfd.h b/src/gen7_mfd.h index bb55a34..225a808 100644 --- a/src/gen7_mfd.h +++ b/src/gen7_mfd.h @@ -81,6 +81,7 @@ struct gen7_mfd_context union { VAIQMatrixBufferMPEG2 mpeg2; + VAIQMatrixBufferH264 h264; /* flat scaling lists (default) */ } iq_matrix; GenFrameStore reference_surface[MAX_GEN_REFERENCE_FRAMES]; diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index 36f51c4..d4400c5 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -23,10 +23,22 @@ #include <assert.h> #include <stddef.h> +#include <string.h> #include "intel_batchbuffer.h" #include "i965_decoder_utils.h" #include "i965_defines.h" +/* Generate flat scaling matrices for H.264 decoding */ +void +avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix) +{ + /* Flat_4x4_16 */ + memset(&iq_matrix->ScalingList4x4, 16, sizeof(iq_matrix->ScalingList4x4)); + + /* Flat_8x8_16 */ + memset(&iq_matrix->ScalingList8x8, 16, sizeof(iq_matrix->ScalingList8x8)); +} + static inline uint8_t get_ref_idx_state_1(const VAPictureH264 *va_pic, unsigned int frame_store_id) { diff --git a/src/i965_decoder_utils.h b/src/i965_decoder_utils.h index 6390ecc..bf9be84 100644 --- a/src/i965_decoder_utils.h +++ b/src/i965_decoder_utils.h @@ -28,6 +28,9 @@ #include "intel_batchbuffer.h" void +avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix); + +void gen5_fill_avc_ref_idx_state( uint8_t state[32], const VAPictureH264 ref_list[32], -- 1.7.5.4 _______________________________________________ Libva mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libva
