[Libva] [PATCH] h264: always submit MFX_QM_STATE for flat scaling lists (IVB).
Gwenole Beauchesne
gb.devel at gmail.com
Tue Feb 14 05:52:30 PST 2012
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 <gwenole.beauchesne at intel.com>
---
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
More information about the Libva
mailing list