[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