[SCM] intel-vaapi-driver/upstream: Imported Upstream version 1.0.16

mfv-guest at users.alioth.debian.org mfv-guest at users.alioth.debian.org
Fri Mar 16 15:25:19 UTC 2012


The following commit has been merged in the upstream branch:
commit 51e85274e11bead87c1d6300a0e4143745dc3a6f
Author: Matteo F. Vescovi <mfv.debian at gmail.com>
Date:   Fri Mar 16 16:23:08 2012 +0100

    Imported Upstream version 1.0.16

diff --git a/NEWS b/NEWS
index f0244ad..f166182 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,15 @@
-libva-driver-intel NEWS -- summary of changes.  2011-10-28
+libva-driver-intel NEWS -- summary of changes.  2012-02-14
 Copyright (C) 2009-2011 Intel Corporation
 
+Version 1.0.16 - 14.Feb.2012
+* Fix VC-1 bitplane buffer size (SNB, IVB)
+* 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)
+* Fix memory leak of encoder buffers
+* Fix check for internal VA surface format prior to rendering
+* Add support for B43 chipset (Alexander Inyukhin)
+
 Version 1.0.15 - 28.Oct.2011
 * Add auto-generated Debian packaging
 * Fix VC-1 decoding (TTFRM packing)
diff --git a/configure.ac b/configure.ac
index 06c67b1..04528a2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
 # intel-driver package version number
 m4_define([intel_driver_major_version], [1])
 m4_define([intel_driver_minor_version], [0])
-m4_define([intel_driver_micro_version], [15])
+m4_define([intel_driver_micro_version], [16])
 m4_define([intel_driver_pre_version],   [0])
 m4_define([intel_driver_version],
           [intel_driver_major_version.intel_driver_minor_version.intel_driver_micro_version])
diff --git a/src/Makefile.am b/src/Makefile.am
index 7a8de4d..1e4bbf2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,6 +54,7 @@ source_c = \
 	i965_avc_bsd.c		\
 	i965_avc_hw_scoreboard.c\
 	i965_avc_ildb.c		\
+	i965_decoder_utils.c	\
 	i965_drv_video.c	\
 	i965_encoder.c		\
 	i965_media.c		\
@@ -76,6 +77,8 @@ source_h = \
 	i965_avc_bsd.h		\
 	i965_avc_hw_scoreboard.h\
 	i965_avc_ildb.h		\
+	i965_decoder.h		\
+	i965_decoder_utils.h	\
 	i965_defines.h          \
 	i965_drv_video.h        \
 	i965_encoder.h		\
diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c
index 92cbce9..2ffcbe2 100644
--- a/src/gen6_mfd.c
+++ b/src/gen6_mfd.c
@@ -31,13 +31,12 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 
 #include "i965_defines.h"
 #include "i965_drv_video.h"
+#include "i965_decoder_utils.h"
 
 #include "gen6_mfd.h"
 
@@ -783,81 +782,17 @@ gen6_mfd_avc_phantom_slice_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void
+static inline void
 gen6_mfd_avc_ref_idx_state(VADriverContextP ctx,
                            VAPictureParameterBufferH264 *pic_param,
                            VASliceParameterBufferH264 *slice_param,
                            struct gen6_mfd_context *gen6_mfd_context)
 {
-    struct intel_batchbuffer *batch = gen6_mfd_context->base.batch;
-    int i, j, num_ref_list;
-    struct {
-        unsigned char bottom_idc:1;
-        unsigned char frame_store_index:4;
-        unsigned char field_picture:1;
-        unsigned char long_term:1;
-        unsigned char non_exist:1;
-    } refs[32];
-
-    if (slice_param->slice_type == SLICE_TYPE_I ||
-        slice_param->slice_type == SLICE_TYPE_SI)
-        return;
-
-    if (slice_param->slice_type == SLICE_TYPE_P ||
-        slice_param->slice_type == SLICE_TYPE_SP) {
-        num_ref_list = 1;
-    } else {
-        num_ref_list = 2;
-    }
-
-    for (i = 0; i < num_ref_list; i++) {
-        VAPictureH264 *va_pic;
-
-        if (i == 0) {
-            va_pic = slice_param->RefPicList0;
-        } else {
-            va_pic = slice_param->RefPicList1;
-        }
-
-        BEGIN_BCS_BATCH(batch, 10);
-        OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
-        OUT_BCS_BATCH(batch, i);
-
-        for (j = 0; j < 32; j++) {
-            if (va_pic->flags & VA_PICTURE_H264_INVALID) {
-                refs[j].non_exist = 1;
-                refs[j].long_term = 1;
-                refs[j].field_picture = 1;
-                refs[j].frame_store_index = 0xf;
-                refs[j].bottom_idc = 1;
-            } else {
-                int frame_idx;
-                
-                for (frame_idx = 0; frame_idx < ARRAY_ELEMS(gen6_mfd_context->reference_surface); frame_idx++) {
-                    if (gen6_mfd_context->reference_surface[frame_idx].surface_id != VA_INVALID_ID &&
-                        va_pic->picture_id == gen6_mfd_context->reference_surface[frame_idx].surface_id) {
-                        assert(frame_idx == gen6_mfd_context->reference_surface[frame_idx].frame_store_id);
-                        break;
-                    }
-                }
-
-                assert(frame_idx < ARRAY_ELEMS(gen6_mfd_context->reference_surface));
-                
-                refs[j].non_exist = 0;
-                refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
-                refs[j].field_picture = !!(va_pic->flags & 
-                                           (VA_PICTURE_H264_TOP_FIELD | 
-                                            VA_PICTURE_H264_BOTTOM_FIELD));
-                refs[j].frame_store_index = frame_idx;
-                refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
-            }
-
-            va_pic++;
-        }
-        
-        intel_batchbuffer_data(batch, refs, sizeof(refs));
-        ADVANCE_BCS_BATCH(batch);
-    }
+    gen6_send_avc_ref_idx_state(
+        gen6_mfd_context->base.batch,
+        slice_param,
+        gen6_mfd_context->reference_surface
+    );
 }
 
 static void
@@ -1567,7 +1502,7 @@ gen6_mfd_vc1_decode_init(VADriverContextP ctx,
 
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
-                          bitplane_width * bitplane_width,
+                          bitplane_width * height_in_mbs,
                           0x1000);
         assert(bo);
         gen6_mfd_context->bitplane_read_buffer.bo = bo;
@@ -2034,7 +1969,7 @@ gen6_mfd_decode_picture(VADriverContextP ctx,
 
 {
     struct gen6_mfd_context *gen6_mfd_context = (struct gen6_mfd_context *)hw_context;
-    struct decode_state *decode_state = &codec_state->dec;
+    struct decode_state *decode_state = &codec_state->decode;
 
     assert(gen6_mfd_context);
 
diff --git a/src/gen6_mfd.h b/src/gen6_mfd.h
index 46bb0e4..bf06a00 100644
--- a/src/gen6_mfd.h
+++ b/src/gen6_mfd.h
@@ -33,6 +33,7 @@
 #include <drm.h>
 #include <i915_drm.h>
 #include <intel_bufmgr.h>
+#include "i965_decoder.h"
 
 struct gen6_avc_surface
 {
@@ -58,7 +59,6 @@ struct gen6_vc1_surface
     int picture_type;
 };
 
-#define MAX_MFX_REFERENCE_SURFACES        16
 struct hw_context;
 
 struct gen6_mfd_context
@@ -69,45 +69,14 @@ struct gen6_mfd_context
         VAIQMatrixBufferMPEG2 mpeg2;
     } iq_matrix;
 
-    struct {
-        VASurfaceID surface_id;
-        int frame_store_id;
-    } reference_surface[MAX_MFX_REFERENCE_SURFACES];
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } post_deblocking_output;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } pre_deblocking_output;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } intra_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } deblocking_filter_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } bsd_mpc_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } mpr_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } bitplane_read_buffer;
+    GenFrameStore       reference_surface[MAX_GEN_REFERENCE_FRAMES];
+    GenBuffer           post_deblocking_output;
+    GenBuffer           pre_deblocking_output;
+    GenBuffer           intra_row_store_scratch_buffer;
+    GenBuffer           deblocking_filter_row_store_scratch_buffer;
+    GenBuffer           bsd_mpc_row_store_scratch_buffer;
+    GenBuffer           mpr_row_store_scratch_buffer;
+    GenBuffer           bitplane_read_buffer;
 };
 
 #endif /* _GEN6_MFD_H_ */
diff --git a/src/gen6_vme.c b/src/gen6_vme.c
index 09a042f..2ffbd43 100644
--- a/src/gen6_vme.c
+++ b/src/gen6_vme.c
@@ -30,8 +30,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 
diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
index 9308999..2995fe8 100644
--- a/src/gen7_mfd.c
+++ b/src/gen7_mfd.c
@@ -31,13 +31,12 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 
 #include "i965_defines.h"
 #include "i965_drv_video.h"
+#include "i965_decoder_utils.h"
 
 #include "gen7_mfd.h"
 
@@ -456,7 +455,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;
@@ -466,11 +464,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)
@@ -549,10 +542,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;
@@ -752,81 +745,17 @@ gen7_mfd_avc_slice_state(VADriverContextP ctx,
     ADVANCE_BCS_BATCH(batch);
 }
 
-static void
+static inline void
 gen7_mfd_avc_ref_idx_state(VADriverContextP ctx,
                            VAPictureParameterBufferH264 *pic_param,
                            VASliceParameterBufferH264 *slice_param,
                            struct gen7_mfd_context *gen7_mfd_context)
 {
-    struct intel_batchbuffer *batch = gen7_mfd_context->base.batch;
-    int i, j, num_ref_list;
-    struct {
-        unsigned char bottom_idc:1;
-        unsigned char frame_store_index:4;
-        unsigned char field_picture:1;
-        unsigned char long_term:1;
-        unsigned char non_exist:1;
-    } refs[32];
-
-    if (slice_param->slice_type == SLICE_TYPE_I ||
-        slice_param->slice_type == SLICE_TYPE_SI)
-        return;
-
-    if (slice_param->slice_type == SLICE_TYPE_P ||
-        slice_param->slice_type == SLICE_TYPE_SP) {
-        num_ref_list = 1;
-    } else {
-        num_ref_list = 2;
-    }
-
-    for (i = 0; i < num_ref_list; i++) {
-        VAPictureH264 *va_pic;
-
-        if (i == 0) {
-            va_pic = slice_param->RefPicList0;
-        } else {
-            va_pic = slice_param->RefPicList1;
-        }
-
-        BEGIN_BCS_BATCH(batch, 10);
-        OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
-        OUT_BCS_BATCH(batch, i);
-
-        for (j = 0; j < 32; j++) {
-            if (va_pic->flags & VA_PICTURE_H264_INVALID) {
-                refs[j].non_exist = 1;
-                refs[j].long_term = 1;
-                refs[j].field_picture = 1;
-                refs[j].frame_store_index = 0xf;
-                refs[j].bottom_idc = 1;
-            } else {
-                int frame_idx;
-                
-                for (frame_idx = 0; frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface); frame_idx++) {
-                    if (gen7_mfd_context->reference_surface[frame_idx].surface_id != VA_INVALID_ID &&
-                        va_pic->picture_id == gen7_mfd_context->reference_surface[frame_idx].surface_id) {
-                        assert(frame_idx == gen7_mfd_context->reference_surface[frame_idx].frame_store_id);
-                        break;
-                    }
-                }
-
-                assert(frame_idx < ARRAY_ELEMS(gen7_mfd_context->reference_surface));
-                
-                refs[j].non_exist = 0;
-                refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
-                refs[j].field_picture = !!(va_pic->flags & 
-                                           (VA_PICTURE_H264_TOP_FIELD | 
-                                            VA_PICTURE_H264_BOTTOM_FIELD));
-                refs[j].frame_store_index = frame_idx;
-                refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
-            }
-
-            va_pic++;
-        }
-        
-        intel_batchbuffer_data(batch, refs, sizeof(refs));
-        ADVANCE_BCS_BATCH(batch);
-    }
+    gen6_send_avc_ref_idx_state(
+        gen7_mfd_context->base.batch,
+        slice_param,
+        gen7_mfd_context->reference_surface
+    );
 }
 
 static void
@@ -942,6 +871,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,
@@ -1522,7 +1461,7 @@ gen7_mfd_vc1_decode_init(VADriverContextP ctx,
 
         bo = dri_bo_alloc(i965->intel.bufmgr,
                           "VC-1 Bitplane",
-                          bitplane_width * bitplane_width,
+                          bitplane_width * height_in_mbs,
                           0x1000);
         assert(bo);
         gen7_mfd_context->bitplane_read_buffer.bo = bo;
@@ -1716,13 +1655,13 @@ gen7_mfd_vc1_pic_state(VADriverContextP ctx,
     if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPelBilinear ||
         (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
          pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPelBilinear))
-        interpolation_mode = 8; /* Half-pel bilinear */
+        interpolation_mode = 9; /* Half-pel bilinear */
     else if (pic_param->mv_fields.bits.mv_mode == VAMvMode1MvHalfPel ||
              (pic_param->mv_fields.bits.mv_mode == VAMvModeIntensityCompensation &&
               pic_param->mv_fields.bits.mv_mode2 == VAMvMode1MvHalfPel))
-        interpolation_mode = 0; /* Half-pel bicubic */
+        interpolation_mode = 1; /* Half-pel bicubic */
     else
-        interpolation_mode = 1; /* Quarter-pel bicubic */
+        interpolation_mode = 0; /* Quarter-pel bicubic */
 
     BEGIN_BCS_BATCH(batch, 6);
     OUT_BCS_BATCH(batch, MFD_VC1_LONG_PIC_STATE | (6 - 2));
@@ -1988,7 +1927,7 @@ gen7_mfd_decode_picture(VADriverContextP ctx,
 
 {
     struct gen7_mfd_context *gen7_mfd_context = (struct gen7_mfd_context *)hw_context;
-    struct decode_state *decode_state = &codec_state->dec;
+    struct decode_state *decode_state = &codec_state->decode;
 
     assert(gen7_mfd_context);
 
@@ -2062,5 +2001,14 @@ gen7_dec_hw_context_init(VADriverContextP ctx, VAProfile profile)
         gen7_mfd_context->reference_surface[i].frame_store_id = -1;
     }
 
+    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 088dbda..e4a7327 100644
--- a/src/gen7_mfd.h
+++ b/src/gen7_mfd.h
@@ -33,6 +33,7 @@
 #include <drm.h>
 #include <i915_drm.h>
 #include <intel_bufmgr.h>
+#include "i965_decoder.h"
 
 struct gen7_avc_surface
 {
@@ -58,7 +59,6 @@ struct gen7_vc1_surface
     int picture_type;
 };
 
-#define MAX_MFX_REFERENCE_SURFACES        16
 struct hw_context;
 
 struct gen7_mfd_context
@@ -67,47 +67,17 @@ struct gen7_mfd_context
 
     union {
         VAIQMatrixBufferMPEG2 mpeg2;
+        VAIQMatrixBufferH264  h264;     /* flat scaling lists (default) */
     } iq_matrix;
 
-    struct {
-        VASurfaceID surface_id;
-        int frame_store_id;
-    } reference_surface[MAX_MFX_REFERENCE_SURFACES];
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } post_deblocking_output;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } pre_deblocking_output;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } intra_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } deblocking_filter_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } bsd_mpc_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } mpr_row_store_scratch_buffer;
-
-    struct {
-        dri_bo *bo;
-        int valid;
-    } bitplane_read_buffer;
+    GenFrameStore       reference_surface[MAX_GEN_REFERENCE_FRAMES];
+    GenBuffer           post_deblocking_output;
+    GenBuffer           pre_deblocking_output;
+    GenBuffer           intra_row_store_scratch_buffer;
+    GenBuffer           deblocking_filter_row_store_scratch_buffer;
+    GenBuffer           bsd_mpc_row_store_scratch_buffer;
+    GenBuffer           mpr_row_store_scratch_buffer;
+    GenBuffer           bitplane_read_buffer;
 };
 
 #endif /* _GEN7_MFD_H_ */
diff --git a/src/i965_avc_bsd.c b/src/i965_avc_bsd.c
index 9fa9649..6f133a3 100644
--- a/src/i965_avc_bsd.c
+++ b/src/i965_avc_bsd.c
@@ -38,6 +38,7 @@
 #include "i965_avc_bsd.h"
 #include "i965_media_h264.h"
 #include "i965_media.h"
+#include "i965_decoder_utils.h"
 
 static void 
 i965_avc_bsd_free_avc_bsd_surface(void **data)
@@ -259,13 +260,7 @@ i965_avc_bsd_slice_state(VADriverContextP ctx,
 {
     struct intel_batchbuffer *batch = i965_h264_context->batch;
     int present_flag, cmd_len, list, j;
-    struct {
-        unsigned char bottom_idc:1;
-        unsigned char frame_store_index:4;
-        unsigned char field_picture:1;
-        unsigned char long_term:1;
-        unsigned char non_exist:1;
-    } refs[32];
+    uint8_t ref_idx_state[32];
     char weightoffsets[32 * 6];
 
     /* don't issue SLICE_STATE for intra-prediction decoding */
@@ -302,53 +297,28 @@ i965_avc_bsd_slice_state(VADriverContextP ctx,
     OUT_BCS_BATCH(batch, present_flag);
 
     for (list = 0; list < 2; list++) {
-        int flag;
+        int flag, num_va_pics;
         VAPictureH264 *va_pic;
 
         if (list == 0) {
-            flag = PRESENT_REF_LIST0;
-            va_pic = slice_param->RefPicList0;
+            flag        = PRESENT_REF_LIST0;
+            va_pic      = slice_param->RefPicList0;
+            num_va_pics = slice_param->num_ref_idx_l0_active_minus1 + 1;
         } else {
-            flag = PRESENT_REF_LIST1;
-            va_pic = slice_param->RefPicList1;
+            flag        = PRESENT_REF_LIST1;
+            va_pic      = slice_param->RefPicList1;
+            num_va_pics = slice_param->num_ref_idx_l1_active_minus1 + 1;
         }
 
         if (!(present_flag & flag))
             continue;
 
-        for (j = 0; j < 32; j++) {
-            if (va_pic->flags & VA_PICTURE_H264_INVALID) {
-                refs[j].non_exist = 1;
-                refs[j].long_term = 1;
-                refs[j].field_picture = 1;
-                refs[j].frame_store_index = 0xf;
-                refs[j].bottom_idc = 1;
-            } else {
-                int frame_idx;
-                
-                for (frame_idx = 0; frame_idx < ARRAY_ELEMS(i965_h264_context->fsid_list); frame_idx++) {
-                    if (i965_h264_context->fsid_list[frame_idx].surface_id != VA_INVALID_ID &&
-                        va_pic->picture_id == i965_h264_context->fsid_list[frame_idx].surface_id) {
-                        assert(frame_idx == i965_h264_context->fsid_list[frame_idx].frame_store_id);
-                        break;
-                    }
-                }
-
-                assert(frame_idx < ARRAY_ELEMS(i965_h264_context->fsid_list));
-                
-                refs[j].non_exist = 0;
-                refs[j].long_term = !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
-                refs[j].field_picture = !!(va_pic->flags & 
-                                           (VA_PICTURE_H264_TOP_FIELD | 
-                                            VA_PICTURE_H264_BOTTOM_FIELD));
-                refs[j].frame_store_index = frame_idx;
-                refs[j].bottom_idc = !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
-            }
-
-            va_pic++;
-        }
-        
-        intel_batchbuffer_data(batch, refs, sizeof(refs));
+        gen5_fill_avc_ref_idx_state(
+            ref_idx_state,
+            va_pic, num_va_pics,
+            i965_h264_context->fsid_list
+        );            
+        intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state));
     }
 
     i965_h264_context->weight128_luma_l0 = 0;
diff --git a/src/i965_encoder.h b/src/i965_decoder.h
similarity index 70%
copy from src/i965_encoder.h
copy to src/i965_decoder.h
index 555efe3..0e69e14 100644
--- a/src/i965_encoder.h
+++ b/src/i965_decoder.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2010 Intel Corporation
+ * Copyright (C) 2012 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
@@ -20,32 +20,27 @@
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Zhou chang <chang.zhou at intel.com>
- *
  */
 
-#ifndef _I965_ENCODER_H_
-#define _I965_ENCODER_H_
+#ifndef I965_DECODER_H
+#define I965_DECODER_H
 
-#include <xf86drm.h>
-#include <drm.h>
-#include <i915_drm.h>
+#include <stdint.h>
+#include <va/va.h>
 #include <intel_bufmgr.h>
-#include "i965_structs.h"
-#include "i965_drv_video.h"
 
-#include "gen6_vme.h"
-#include "gen6_mfc.h"
+#define MAX_GEN_REFERENCE_FRAMES 16
 
-struct gen6_encoder_context
-{
-    struct hw_context base;
-    struct gen6_vme_context vme_context;
-    struct gen6_mfc_context mfc_context;
+typedef struct gen_frame_store GenFrameStore;
+struct gen_frame_store {
+    VASurfaceID surface_id;
+    int         frame_store_id;
 };
 
-#endif	/* _I965_ENCODER_H_ */
-
+typedef struct gen_buffer GenBuffer;
+struct gen_buffer {
+    dri_bo     *bo;
+    int         valid;
+};
 
+#endif /* I965_DECODER_H */
diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c
new file mode 100644
index 0000000..d4400c5
--- /dev/null
+++ b/src/i965_decoder_utils.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2006-2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#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)
+{
+    const unsigned int is_long_term =
+        !!(va_pic->flags & VA_PICTURE_H264_LONG_TERM_REFERENCE);
+    const unsigned int is_top_field =
+        !!(va_pic->flags & VA_PICTURE_H264_TOP_FIELD);
+    const unsigned int is_bottom_field =
+        !!(va_pic->flags & VA_PICTURE_H264_BOTTOM_FIELD);
+
+    return ((is_long_term                         << 6) |
+            ((is_top_field ^ is_bottom_field ^ 1) << 5) |
+            (frame_store_id                       << 1) |
+            ((is_top_field ^ 1) & is_bottom_field));
+}
+
+/* Fill in Reference List Entries (Gen5+: ILK, SNB, IVB) */
+void
+gen5_fill_avc_ref_idx_state(
+    uint8_t             state[32],
+    const VAPictureH264 ref_list[32],
+    unsigned int        ref_list_count,
+    const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+    unsigned int i, n, frame_idx;
+
+    for (i = 0, n = 0; i < ref_list_count; i++) {
+        const VAPictureH264 * const va_pic = &ref_list[i];
+
+        if (va_pic->flags & VA_PICTURE_H264_INVALID)
+            continue;
+
+        for (frame_idx = 0; frame_idx < MAX_GEN_REFERENCE_FRAMES; frame_idx++) {
+            const GenFrameStore * const fs = &frame_store[frame_idx];
+            if (fs->surface_id != VA_INVALID_ID &&
+                fs->surface_id == va_pic->picture_id) {
+                assert(frame_idx == fs->frame_store_id);
+                break;
+            }
+        }
+        assert(frame_idx < MAX_GEN_REFERENCE_FRAMES);
+        state[n++] = get_ref_idx_state_1(va_pic, frame_idx);
+    }
+
+    for (; n < 32; n++)
+        state[n] = 0xff;
+}
+
+/* Emit Reference List Entries (Gen6+: SNB, IVB) */
+static void
+gen6_send_avc_ref_idx_state_1(
+    struct intel_batchbuffer         *batch,
+    unsigned int                      list,
+    const VAPictureH264              *ref_list,
+    unsigned int                      ref_list_count,
+    const GenFrameStore               frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+    uint8_t ref_idx_state[32];
+
+    BEGIN_BCS_BATCH(batch, 10);
+    OUT_BCS_BATCH(batch, MFX_AVC_REF_IDX_STATE | (10 - 2));
+    OUT_BCS_BATCH(batch, list);
+    gen5_fill_avc_ref_idx_state(
+        ref_idx_state,
+        ref_list, ref_list_count,
+        frame_store
+    );
+    intel_batchbuffer_data(batch, ref_idx_state, sizeof(ref_idx_state));
+    ADVANCE_BCS_BATCH(batch);
+}
+
+void
+gen6_send_avc_ref_idx_state(
+    struct intel_batchbuffer         *batch,
+    const VASliceParameterBufferH264 *slice_param,
+    const GenFrameStore               frame_store[MAX_GEN_REFERENCE_FRAMES]
+)
+{
+    if (slice_param->slice_type == SLICE_TYPE_I ||
+        slice_param->slice_type == SLICE_TYPE_SI)
+        return;
+
+    /* RefPicList0 */
+    gen6_send_avc_ref_idx_state_1(
+        batch, 0,
+        slice_param->RefPicList0, slice_param->num_ref_idx_l0_active_minus1 + 1,
+        frame_store
+    );
+
+    if (slice_param->slice_type != SLICE_TYPE_B)
+        return;
+
+    /* RefPicList1 */
+    gen6_send_avc_ref_idx_state_1(
+        batch, 1,
+        slice_param->RefPicList1, slice_param->num_ref_idx_l1_active_minus1 + 1,
+        frame_store
+    );
+}
diff --git a/src/shaders/render/exa_wm_src_affine.g7a b/src/i965_decoder_utils.h
similarity index 60%
copy from src/shaders/render/exa_wm_src_affine.g7a
copy to src/i965_decoder_utils.h
index a786bc0..bf9be84 100644
--- a/src/shaders/render/exa_wm_src_affine.g7a
+++ b/src/i965_decoder_utils.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2010 Intel Corporation
+ * Copyright (C) 2006-2012 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,31 +17,32 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
-/*
- * Fragment to compute src u/v values
- */
-include(`exa_wm.g4i')
+#ifndef I965_DECODER_UTILS_H
+#define I965_DECODER_UTILS_H
 
-define(`ul',    `g66')
-define(`uh',    `g67')
-define(`vl',    `g68')
-define(`vh',    `g69')
+#include "i965_decoder.h"
+#include "intel_batchbuffer.h"
 
-define(`bl',    `g2.0<8,8,1>F')
-define(`bh',    `g4.0<8,8,1>F')
+void
+avc_gen_default_iq_matrix(VAIQMatrixBufferH264 *iq_matrix);
 
-define(`a0_a_x',`g7.0<0,1,0>F')
-define(`a0_a_y',`g7.16<0,1,0>F')
+void
+gen5_fill_avc_ref_idx_state(
+    uint8_t             state[32],
+    const VAPictureH264 ref_list[32],
+    unsigned int        ref_list_count,
+    const GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]
+);
 
-/* U */
-pln (8) ul<1>F a0_a_x bl { align1 }; /* pixel 0-7 */
-pln (8) uh<1>F a0_a_x bh { align1 }; /* pixel 8-15 */
+void
+gen6_send_avc_ref_idx_state(
+    struct intel_batchbuffer         *batch,
+    const VASliceParameterBufferH264 *slice_param,
+    const GenFrameStore               frame_store[MAX_GEN_REFERENCE_FRAMES]
+);
 
-/* V */
-pln (8) vl<1>F a0_a_y bl { align1 }; /* pixel 0-7 */
-pln (8) vh<1>F a0_a_y bh { align1 }; /* pixel 8-15 */
+#endif /* I965_DECODER_UTILS_H */
diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c
index 4ba1aa6..e1e81c7 100644
--- a/src/i965_drv_video.c
+++ b/src/i965_drv_video.c
@@ -771,25 +771,30 @@ i965_destroy_context(struct object_heap *heap, struct object_base *obj)
     }
 
     if (obj_context->codec_type == CODEC_ENC) {
-        assert(obj_context->codec_state.enc.num_slice_params <= obj_context->codec_state.enc.max_slice_params);
-        i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
-        i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
+        assert(obj_context->codec_state.encode.num_slice_params <= obj_context->codec_state.encode.max_slice_params);
+        i965_release_buffer_store(&obj_context->codec_state.encode.pic_param);
+        i965_release_buffer_store(&obj_context->codec_state.encode.seq_param);
+
+        for (i = 0; i < obj_context->codec_state.encode.num_slice_params; i++)
+            i965_release_buffer_store(&obj_context->codec_state.encode.slice_params[i]);
+
+        free(obj_context->codec_state.encode.slice_params);
     } else {
-        assert(obj_context->codec_state.dec.num_slice_params <= obj_context->codec_state.dec.max_slice_params);
-        assert(obj_context->codec_state.dec.num_slice_datas <= obj_context->codec_state.dec.max_slice_datas);
+        assert(obj_context->codec_state.decode.num_slice_params <= obj_context->codec_state.decode.max_slice_params);
+        assert(obj_context->codec_state.decode.num_slice_datas <= obj_context->codec_state.decode.max_slice_datas);
 
-        i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
-        i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
-        i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
+        i965_release_buffer_store(&obj_context->codec_state.decode.pic_param);
+        i965_release_buffer_store(&obj_context->codec_state.decode.iq_matrix);
+        i965_release_buffer_store(&obj_context->codec_state.decode.bit_plane);
 
-        for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++)
-            i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]);
+        for (i = 0; i < obj_context->codec_state.decode.num_slice_params; i++)
+            i965_release_buffer_store(&obj_context->codec_state.decode.slice_params[i]);
 
-        for (i = 0; i < obj_context->codec_state.dec.num_slice_datas; i++)
-            i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]);
+        for (i = 0; i < obj_context->codec_state.decode.num_slice_datas; i++)
+            i965_release_buffer_store(&obj_context->codec_state.decode.slice_datas[i]);
 
-        free(obj_context->codec_state.dec.slice_params);
-        free(obj_context->codec_state.dec.slice_datas);
+        free(obj_context->codec_state.decode.slice_params);
+        free(obj_context->codec_state.decode.slice_datas);
     }
 
     free(obj_context->render_targets);
@@ -867,23 +872,23 @@ i965_CreateContext(VADriverContextP ctx,
     if (VA_STATUS_SUCCESS == vaStatus) {
         if (VAEntrypointEncSlice == obj_config->entrypoint ) { /*encode routin only*/
             obj_context->codec_type = CODEC_ENC;
-            memset(&obj_context->codec_state.enc, 0, sizeof(obj_context->codec_state.enc));
-            obj_context->codec_state.enc.current_render_target = VA_INVALID_ID;
-            obj_context->codec_state.enc.max_slice_params = NUM_SLICES;
-            obj_context->codec_state.enc.slice_params = calloc(obj_context->codec_state.enc.max_slice_params,
-                                                               sizeof(*obj_context->codec_state.enc.slice_params));
+            memset(&obj_context->codec_state.encode, 0, sizeof(obj_context->codec_state.encode));
+            obj_context->codec_state.encode.current_render_target = VA_INVALID_ID;
+            obj_context->codec_state.encode.max_slice_params = NUM_SLICES;
+            obj_context->codec_state.encode.slice_params = calloc(obj_context->codec_state.encode.max_slice_params,
+                                                               sizeof(*obj_context->codec_state.encode.slice_params));
             assert(i965->codec_info->enc_hw_context_init);
             obj_context->hw_context = i965->codec_info->enc_hw_context_init(ctx, obj_config->profile);
         } else {
             obj_context->codec_type = CODEC_DEC;
-            memset(&obj_context->codec_state.dec, 0, sizeof(obj_context->codec_state.dec));
-            obj_context->codec_state.dec.current_render_target = -1;
-            obj_context->codec_state.dec.max_slice_params = NUM_SLICES;
-            obj_context->codec_state.dec.max_slice_datas = NUM_SLICES;
-            obj_context->codec_state.dec.slice_params = calloc(obj_context->codec_state.dec.max_slice_params,
-                                                               sizeof(*obj_context->codec_state.dec.slice_params));
-            obj_context->codec_state.dec.slice_datas = calloc(obj_context->codec_state.dec.max_slice_datas,
-                                                              sizeof(*obj_context->codec_state.dec.slice_datas));
+            memset(&obj_context->codec_state.decode, 0, sizeof(obj_context->codec_state.decode));
+            obj_context->codec_state.decode.current_render_target = -1;
+            obj_context->codec_state.decode.max_slice_params = NUM_SLICES;
+            obj_context->codec_state.decode.max_slice_datas = NUM_SLICES;
+            obj_context->codec_state.decode.slice_params = calloc(obj_context->codec_state.decode.max_slice_params,
+                                                               sizeof(*obj_context->codec_state.decode.slice_params));
+            obj_context->codec_state.decode.slice_datas = calloc(obj_context->codec_state.decode.max_slice_datas,
+                                                              sizeof(*obj_context->codec_state.decode.slice_datas));
 
             assert(i965->codec_info->dec_hw_context_init);
             obj_context->hw_context = i965->codec_info->dec_hw_context_init(ctx, obj_config->profile);
@@ -1150,6 +1155,7 @@ i965_BeginPicture(VADriverContextP ctx,
     struct object_config *obj_config;
     VAContextID config;
     VAStatus vaStatus;
+    int i;
 
     assert(obj_context);
     assert(obj_surface);
@@ -1182,102 +1188,79 @@ i965_BeginPicture(VADriverContextP ctx,
         break;
     }
 
-    if (obj_context->codec_type == CODEC_ENC)
-        obj_context->codec_state.enc.current_render_target = render_target;     /*This is input new frame*/
-    else
-        obj_context->codec_state.dec.current_render_target = render_target;
-
-    return vaStatus;
-}
-
-static VAStatus
-i965_render_picture_parameter_buffer(VADriverContextP ctx,
-                                     struct object_context *obj_context,
-                                     struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
-    i965_reference_buffer_store(&obj_context->codec_state.dec.pic_param,
-                                obj_buffer->buffer_store);
-
-    return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_render_iq_matrix_buffer(VADriverContextP ctx,
-                             struct object_context *obj_context,
-                             struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
-    i965_reference_buffer_store(&obj_context->codec_state.dec.iq_matrix,
-                                obj_buffer->buffer_store);
+    if (obj_context->codec_type == CODEC_ENC) {
+        i965_release_buffer_store(&obj_context->codec_state.encode.pic_param);
+        i965_release_buffer_store(&obj_context->codec_state.encode.seq_param);
 
-    return VA_STATUS_SUCCESS;
-}
+        for (i = 0; i < obj_context->codec_state.encode.num_slice_params; i++) {
+            i965_release_buffer_store(&obj_context->codec_state.encode.slice_params[i]);
+        }
 
-static VAStatus
-i965_render_bit_plane_buffer(VADriverContextP ctx,
-                             struct object_context *obj_context,
-                             struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
-    i965_reference_buffer_store(&obj_context->codec_state.dec.bit_plane,
-                                obj_buffer->buffer_store);
-    
-    return VA_STATUS_SUCCESS;
-}
+        obj_context->codec_state.encode.num_slice_params = 0;
+        obj_context->codec_state.encode.current_render_target = render_target;     /*This is input new frame*/
+    } else {
+        obj_context->codec_state.decode.current_render_target = render_target;
+        i965_release_buffer_store(&obj_context->codec_state.decode.pic_param);
+        i965_release_buffer_store(&obj_context->codec_state.decode.iq_matrix);
+        i965_release_buffer_store(&obj_context->codec_state.decode.bit_plane);
+
+        for (i = 0; i < obj_context->codec_state.decode.num_slice_params; i++) {
+            i965_release_buffer_store(&obj_context->codec_state.decode.slice_params[i]);
+            i965_release_buffer_store(&obj_context->codec_state.decode.slice_datas[i]);
+        }
 
-static VAStatus
-i965_render_slice_parameter_buffer(VADriverContextP ctx,
-                                   struct object_context *obj_context,
-                                   struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    
-    if (obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.max_slice_params) {
-        obj_context->codec_state.dec.slice_params = realloc(obj_context->codec_state.dec.slice_params,
-                                                         (obj_context->codec_state.dec.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_params));
-        memset(obj_context->codec_state.dec.slice_params + obj_context->codec_state.dec.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_params));
-        obj_context->codec_state.dec.max_slice_params += NUM_SLICES;
+        obj_context->codec_state.decode.num_slice_params = 0;
+        obj_context->codec_state.decode.num_slice_datas = 0;
     }
-        
-    i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params]);
-    i965_reference_buffer_store(&obj_context->codec_state.dec.slice_params[obj_context->codec_state.dec.num_slice_params],
-                                obj_buffer->buffer_store);
-    obj_context->codec_state.dec.num_slice_params++;
-    
-    return VA_STATUS_SUCCESS;
-}
 
-static VAStatus
-i965_render_slice_data_buffer(VADriverContextP ctx,
-                              struct object_context *obj_context,
-                              struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->buffer == NULL);
-    assert(obj_buffer->buffer_store->bo);
-
-    if (obj_context->codec_state.dec.num_slice_datas == obj_context->codec_state.dec.max_slice_datas) {
-        obj_context->codec_state.dec.slice_datas = realloc(obj_context->codec_state.dec.slice_datas,
-                                                        (obj_context->codec_state.dec.max_slice_datas + NUM_SLICES) * sizeof(*obj_context->codec_state.dec.slice_datas));
-        memset(obj_context->codec_state.dec.slice_datas + obj_context->codec_state.dec.max_slice_datas, 0, NUM_SLICES * sizeof(*obj_context->codec_state.dec.slice_datas));
-        obj_context->codec_state.dec.max_slice_datas += NUM_SLICES;
-    }
-        
-    i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas]);
-    i965_reference_buffer_store(&obj_context->codec_state.dec.slice_datas[obj_context->codec_state.dec.num_slice_datas],
-                                obj_buffer->buffer_store);
-    obj_context->codec_state.dec.num_slice_datas++;
-    
-    return VA_STATUS_SUCCESS;
+    return vaStatus;
 }
 
+#define I965_RENDER_BUFFER(category, name) i965_render_##category##_##name##_buffer(ctx, obj_context, obj_buffer)
+
+#define DEF_RENDER_SINGLE_BUFFER_FUNC(category, name, member)           \
+    static VAStatus                                                     \
+    i965_render_##category##_##name##_buffer(VADriverContextP ctx,      \
+                                             struct object_context *obj_context, \
+                                             struct object_buffer *obj_buffer) \
+    {                                                                   \
+        struct category##_state *category = &obj_context->codec_state.category; \
+        assert(obj_buffer->buffer_store->bo == NULL);                   \
+        assert(obj_buffer->buffer_store->buffer);                       \
+        i965_release_buffer_store(&category->member);                   \
+        i965_reference_buffer_store(&category->member, obj_buffer->buffer_store); \
+        return VA_STATUS_SUCCESS;                                       \
+    }
+
+#define DEF_RENDER_MULTI_BUFFER_FUNC(category, name, member)            \
+    static VAStatus                                                     \
+    i965_render_##category##_##name##_buffer(VADriverContextP ctx,      \
+                                             struct object_context *obj_context, \
+                                             struct object_buffer *obj_buffer) \
+    {                                                                   \
+        struct category##_state *category = &obj_context->codec_state.category; \
+        if (category->num_##member == category->max_##member) {         \
+            category->member = realloc(category->member, (category->max_##member + NUM_SLICES) * sizeof(*category->member)); \
+            memset(category->member + category->max_##member, 0, NUM_SLICES * sizeof(*category->member)); \
+            category->max_##member += NUM_SLICES;                       \
+        }                                                               \
+        i965_release_buffer_store(&category->member[category->num_##member]); \
+        i965_reference_buffer_store(&category->member[category->num_##member], obj_buffer->buffer_store); \
+        category->num_##member++;                                       \
+        return VA_STATUS_SUCCESS;                                       \
+    }
+
+#define I965_RENDER_DECODE_BUFFER(name) I965_RENDER_BUFFER(decode, name)
+
+#define DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(name, member) DEF_RENDER_SINGLE_BUFFER_FUNC(decode, name, member)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(picture_parameter, pic_param)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(iq_matrix, iq_matrix)
+DEF_RENDER_DECODE_SINGLE_BUFFER_FUNC(bit_plane, bit_plane)
+
+#define DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(name, member) DEF_RENDER_MULTI_BUFFER_FUNC(decode, name, member)
+DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(slice_parameter, slice_params)
+DEF_RENDER_DECODE_MULTI_BUFFER_FUNC(slice_data, slice_datas)
+
 static VAStatus 
 i965_decoder_render_picture(VADriverContextP ctx,
                             VAContextID context,
@@ -1295,23 +1278,23 @@ i965_decoder_render_picture(VADriverContextP ctx,
 
         switch (obj_buffer->type) {
         case VAPictureParameterBufferType:
-            vaStatus = i965_render_picture_parameter_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_DECODE_BUFFER(picture_parameter);
             break;
             
         case VAIQMatrixBufferType:
-            vaStatus = i965_render_iq_matrix_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_DECODE_BUFFER(iq_matrix);
             break;
 
         case VABitPlaneBufferType:
-            vaStatus = i965_render_bit_plane_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_DECODE_BUFFER(bit_plane);
             break;
 
         case VASliceParameterBufferType:
-            vaStatus = i965_render_slice_parameter_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_DECODE_BUFFER(slice_parameter);
             break;
 
         case VASliceDataBufferType:
-            vaStatus = i965_render_slice_data_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_DECODE_BUFFER(slice_data);
             break;
 
         default:
@@ -1323,96 +1306,17 @@ i965_decoder_render_picture(VADriverContextP ctx,
     return vaStatus;
 }
 
-static VAStatus
-i965_encoder_render_squence_parameter_buffer(VADriverContextP ctx, 
-                                             struct object_context *obj_context,
-                                             struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.seq_param,
-                                obj_buffer->buffer_store);
-
-    return VA_STATUS_SUCCESS;
-}
-
-
-static VAStatus
-i965_encoder_render_picture_parameter_buffer(VADriverContextP ctx, 
-                                             struct object_context *obj_context,
-                                             struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.pic_param,
-                                obj_buffer->buffer_store);
-
-    return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_slice_parameter_buffer(VADriverContextP ctx, 
-                                           struct object_context *obj_context,
-                                           struct object_buffer *obj_buffer)
-{
-    if (obj_context->codec_state.enc.num_slice_params == obj_context->codec_state.enc.max_slice_params) {
-        obj_context->codec_state.enc.slice_params = realloc(obj_context->codec_state.enc.slice_params,
-                                                            (obj_context->codec_state.enc.max_slice_params + NUM_SLICES) * sizeof(*obj_context->codec_state.enc.slice_params));
-        memset(obj_context->codec_state.enc.slice_params + obj_context->codec_state.enc.max_slice_params, 0, NUM_SLICES * sizeof(*obj_context->codec_state.enc.slice_params));
-        obj_context->codec_state.enc.max_slice_params += NUM_SLICES;
-    }
-
-    i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params]);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.slice_params[obj_context->codec_state.enc.num_slice_params],
-                                obj_buffer->buffer_store);
-    obj_context->codec_state.enc.num_slice_params++;
-    
-    return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_picture_control_buffer(VADriverContextP ctx, 
-                                           struct object_context *obj_context,
-                                           struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.enc.pic_control);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.pic_control,
-                                obj_buffer->buffer_store);
+#define I965_RENDER_ENCODE_BUFFER(name) I965_RENDER_BUFFER(encode, name)
 
-    return VA_STATUS_SUCCESS;
-}
+#define DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(name, member) DEF_RENDER_SINGLE_BUFFER_FUNC(encode, name, member)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(sequence_parameter, seq_param)    
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_parameter, pic_param)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(picture_control, pic_control)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(qmatrix, q_matrix)
+DEF_RENDER_ENCODE_SINGLE_BUFFER_FUNC(iqmatrix, iq_matrix)
 
-static VAStatus
-i965_encoder_render_qmatrix_buffer(VADriverContextP ctx, 
-                                   struct object_context *obj_context,
-                                   struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.enc.q_matrix);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix,
-                                obj_buffer->buffer_store);
-    
-    return VA_STATUS_SUCCESS;
-}
-
-static VAStatus
-i965_encoder_render_iqmatrix_buffer(VADriverContextP ctx, 
-                                    struct object_context *obj_context,
-                                    struct object_buffer *obj_buffer)
-{
-    assert(obj_buffer->buffer_store->bo == NULL);
-    assert(obj_buffer->buffer_store->buffer);
-    i965_release_buffer_store(&obj_context->codec_state.enc.iq_matrix);
-    i965_reference_buffer_store(&obj_context->codec_state.enc.iq_matrix,
-                                obj_buffer->buffer_store);
-
-    return VA_STATUS_SUCCESS;
-}
+#define DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(name, member) DEF_RENDER_MULTI_BUFFER_FUNC(encode, name, member)
+DEF_RENDER_ENCODE_MULTI_BUFFER_FUNC(slice_parameter, slice_params)
 
 static VAStatus 
 i965_encoder_render_picture(VADriverContextP ctx,
@@ -1431,27 +1335,27 @@ i965_encoder_render_picture(VADriverContextP ctx,
 
         switch (obj_buffer->type) {
         case VAEncSequenceParameterBufferType:
-            vaStatus = i965_encoder_render_squence_parameter_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(sequence_parameter);
             break;
 
         case VAEncPictureParameterBufferType:
-            vaStatus = i965_encoder_render_picture_parameter_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(picture_parameter);
             break;		
 
         case VAEncSliceParameterBufferType:
-            vaStatus = i965_encoder_render_slice_parameter_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(slice_parameter);
             break;
 
         case VAPictureParameterBufferType:
-            vaStatus = i965_encoder_render_picture_control_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(picture_control);
             break;
 
         case VAQMatrixBufferType:
-            vaStatus = i965_encoder_render_qmatrix_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(qmatrix);
             break;
 
         case VAIQMatrixBufferType:
-            vaStatus = i965_encoder_render_iqmatrix_buffer(ctx, obj_context, obj_buffer);
+            vaStatus = I965_RENDER_ENCODE_BUFFER(iqmatrix);
             break;
 
         default:
@@ -1498,7 +1402,6 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
     struct object_context *obj_context = CONTEXT(context);
     struct object_config *obj_config;
     VAContextID config;
-    int i;
 
     assert(obj_context);
     config = obj_context->config_id;
@@ -1508,42 +1411,19 @@ i965_EndPicture(VADriverContextP ctx, VAContextID context)
     if (obj_context->codec_type == CODEC_ENC) {
         assert(VAEntrypointEncSlice == obj_config->entrypoint);
 
-        assert(obj_context->codec_state.enc.pic_param);
-        assert(obj_context->codec_state.enc.seq_param);
-        assert(obj_context->codec_state.enc.num_slice_params >= 1);
+        assert(obj_context->codec_state.encode.pic_param);
+        assert(obj_context->codec_state.encode.seq_param);
+        assert(obj_context->codec_state.encode.num_slice_params >= 1);
     } else {
-        assert(obj_context->codec_state.dec.pic_param);
-        assert(obj_context->codec_state.dec.num_slice_params >= 1);
-        assert(obj_context->codec_state.dec.num_slice_datas >= 1);
-        assert(obj_context->codec_state.dec.num_slice_params == obj_context->codec_state.dec.num_slice_datas);
+        assert(obj_context->codec_state.decode.pic_param);
+        assert(obj_context->codec_state.decode.num_slice_params >= 1);
+        assert(obj_context->codec_state.decode.num_slice_datas >= 1);
+        assert(obj_context->codec_state.decode.num_slice_params == obj_context->codec_state.decode.num_slice_datas);
     }
 
     assert(obj_context->hw_context->run);
     obj_context->hw_context->run(ctx, obj_config->profile, &obj_context->codec_state, obj_context->hw_context);
 
-    if (obj_context->codec_type == CODEC_ENC) {
-        obj_context->codec_state.enc.current_render_target = VA_INVALID_SURFACE;
-        obj_context->codec_state.enc.num_slice_params = 0;
-        i965_release_buffer_store(&obj_context->codec_state.enc.pic_param);
-        i965_release_buffer_store(&obj_context->codec_state.enc.seq_param);
-
-        for (i = 0; i < obj_context->codec_state.enc.num_slice_params; i++) {
-            i965_release_buffer_store(&obj_context->codec_state.enc.slice_params[i]);
-        }
-    } else {
-        obj_context->codec_state.dec.current_render_target = -1;
-        i965_release_buffer_store(&obj_context->codec_state.dec.pic_param);
-        i965_release_buffer_store(&obj_context->codec_state.dec.iq_matrix);
-        i965_release_buffer_store(&obj_context->codec_state.dec.bit_plane);
-
-        for (i = 0; i < obj_context->codec_state.dec.num_slice_params; i++) {
-            i965_release_buffer_store(&obj_context->codec_state.dec.slice_params[i]);
-            i965_release_buffer_store(&obj_context->codec_state.dec.slice_datas[i]);
-        }
-        obj_context->codec_state.dec.num_slice_params = 0;
-        obj_context->codec_state.dec.num_slice_datas = 0;
-    }
-
     return VA_STATUS_SUCCESS;
 }
 
diff --git a/src/i965_drv_video.h b/src/i965_drv_video.h
index ac77b19..67ca6f6 100644
--- a/src/i965_drv_video.h
+++ b/src/i965_drv_video.h
@@ -107,8 +107,8 @@ struct encode_state
 
 union codec_state
 {
-    struct decode_state dec;
-    struct encode_state enc;
+    struct decode_state decode;
+    struct encode_state encode;
 };
 
 struct hw_context
diff --git a/src/i965_encoder.c b/src/i965_encoder.c
index 0b1efef..c58eb21 100644
--- a/src/i965_encoder.c
+++ b/src/i965_encoder.c
@@ -31,8 +31,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 
@@ -47,7 +45,7 @@ gen6_encoder_end_picture(VADriverContextP ctx,
                          struct hw_context *hw_context)
 {
     struct gen6_encoder_context *gen6_encoder_context = (struct gen6_encoder_context *)hw_context;
-    struct encode_state *encode_state = &codec_state->enc;
+    struct encode_state *encode_state = &codec_state->encode;
     VAStatus vaStatus;
 
     vaStatus = gen6_vme_pipeline(ctx, profile, encode_state, gen6_encoder_context);
diff --git a/src/i965_media.c b/src/i965_media.c
index d6a56d2..f43feed 100644
--- a/src/i965_media.c
+++ b/src/i965_media.c
@@ -32,8 +32,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 #include "i965_defines.h"
@@ -277,7 +275,7 @@ i965_media_decode_picture(VADriverContextP ctx,
                           struct hw_context *hw_context)
 {
     struct i965_media_context *media_context = (struct i965_media_context *)hw_context;
-    struct decode_state *decode_state = &codec_state->dec;
+    struct decode_state *decode_state = &codec_state->decode;
 
     i965_media_decode_init(ctx, profile, decode_state, media_context);
     assert(media_context->media_states_setup);
diff --git a/src/i965_media_h264.h b/src/i965_media_h264.h
index 8a8dc8e..490213c 100644
--- a/src/i965_media_h264.h
+++ b/src/i965_media_h264.h
@@ -4,6 +4,7 @@
 #include "i965_avc_bsd.h"
 #include "i965_avc_hw_scoreboard.h"
 #include "i965_avc_ildb.h"
+#include "i965_decoder.h"
 
 struct decode_state;
 struct i965_media_context;
@@ -60,10 +61,7 @@ struct i965_h264_context
     struct i965_avc_hw_scoreboard_context avc_hw_scoreboard_context;
     struct i965_avc_ildb_context avc_ildb_context;
 
-    struct {
-        VASurfaceID surface_id;
-        int frame_store_id;
-    } fsid_list[16];
+    GenFrameStore fsid_list[MAX_GEN_REFERENCE_FRAMES];
 
     struct i965_kernel avc_kernels[NUM_H264_AVC_KERNELS];
     struct intel_batchbuffer *batch;
diff --git a/src/i965_media_mpeg2.c b/src/i965_media_mpeg2.c
index 15edc5b..1d87d9b 100644
--- a/src/i965_media_mpeg2.c
+++ b/src/i965_media_mpeg2.c
@@ -32,8 +32,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 #include "i965_defines.h"
diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c
index 4201d09..090403c 100644
--- a/src/i965_post_processing.c
+++ b/src/i965_post_processing.c
@@ -31,8 +31,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 #include "intel_driver.h"
 #include "i965_defines.h"
diff --git a/src/i965_render.c b/src/i965_render.c
index ad8de1e..0fa76d2 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -36,7 +36,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
 #include <va/va_dricommon.h>
 
 #include "intel_batchbuffer.h"
@@ -975,26 +974,24 @@ i965_render_upload_vertex(
 }
 
 static void
-i965_render_upload_constants(VADriverContextP ctx)
+i965_render_upload_constants(VADriverContextP ctx,
+                             VASurfaceID surface)
 {
     struct i965_driver_data *i965 = i965_driver_data(ctx);
     struct i965_render_state *render_state = &i965->render_state;
     unsigned short *constant_buffer;
-
-    if (render_state->curbe.upload)
-        return;
+    struct object_surface *obj_surface = SURFACE(surface);
 
     dri_bo_map(render_state->curbe.bo, 1);
     assert(render_state->curbe.bo->virtual);
     constant_buffer = render_state->curbe.bo->virtual;
 
-    if (render_state->interleaved_uv)
+    if (obj_surface->fourcc == VA_FOURCC('N','V','1','2'))
         *constant_buffer = 1;
     else
         *constant_buffer = 0;
 
     dri_bo_unmap(render_state->curbe.bo);
-    render_state->curbe.upload = 1;
 }
 
 static void
@@ -1014,7 +1011,7 @@ i965_surface_render_state_setup(
     i965_render_cc_viewport(ctx);
     i965_render_cc_unit(ctx);
     i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
-    i965_render_upload_constants(ctx);
+    i965_render_upload_constants(ctx, surface);
 }
 static void
 i965_subpic_render_state_setup(
@@ -1696,7 +1693,7 @@ gen6_render_setup_states(
     gen6_render_color_calc_state(ctx);
     gen6_render_blend_state(ctx);
     gen6_render_depth_stencil_state(ctx);
-    i965_render_upload_constants(ctx);
+    i965_render_upload_constants(ctx, surface);
     i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
 }
 
@@ -2288,7 +2285,7 @@ gen7_render_setup_states(
     gen7_render_color_calc_state(ctx);
     gen7_render_blend_state(ctx);
     gen7_render_depth_stencil_state(ctx);
-    i965_render_upload_constants(ctx);
+    i965_render_upload_constants(ctx, surface);
     i965_render_upload_vertex(ctx, surface, src_rect, dst_rect);
 }
 
@@ -2984,7 +2981,6 @@ i965_render_init(VADriverContextP ctx)
                       "constant buffer",
                       4096, 64);
     assert(render_state->curbe.bo);
-    render_state->curbe.upload = 0;
 
     return True;
 }
diff --git a/src/i965_render.h b/src/i965_render.h
index a5034d9..96a1512 100644
--- a/src/i965_render.h
+++ b/src/i965_render.h
@@ -67,7 +67,6 @@ struct i965_render_state
 
     struct {
         dri_bo *bo;
-        int upload;
     } curbe;
 
     unsigned short interleaved_uv;
diff --git a/src/intel_batchbuffer.c b/src/intel_batchbuffer.c
index f310793..0b52281 100644
--- a/src/intel_batchbuffer.c
+++ b/src/intel_batchbuffer.c
@@ -29,8 +29,6 @@
 #include <string.h>
 #include <assert.h>
 
-#include <va/va_backend.h>
-
 #include "intel_batchbuffer.h"
 
 static void 
diff --git a/src/intel_driver.h b/src/intel_driver.h
index e31360d..0ffb3a5 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -1,6 +1,7 @@
 #ifndef _INTEL_DRIVER_H_
 #define _INTEL_DRIVER_H_
 
+#include <stddef.h>
 #include <pthread.h>
 #include <signal.h>
 
@@ -63,6 +64,10 @@ struct intel_batchbuffer;
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
 #define ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
 
+#define Bool int
+#define True 1
+#define False 0
+
 #define SET_BLOCKED_SIGSET()   do {     \
         sigset_t bl_mask;               \
         sigfillset(&bl_mask);           \
@@ -138,6 +143,8 @@ struct intel_region
 #define PCI_CHIP_Q45_G                  0x2E12
 #define PCI_CHIP_G45_G                  0x2E22
 #define PCI_CHIP_G41_G                  0x2E32
+#define PCI_CHIP_B43_G                  0x2E42
+#define PCI_CHIP_B43_G1                 0x2E92
 
 #define PCI_CHIP_IRONLAKE_D_G           0x0042
 #define PCI_CHIP_IRONLAKE_M_G           0x0046
@@ -161,7 +168,10 @@ struct intel_region
 #define IS_G45(devid)           (devid == PCI_CHIP_IGD_E_G ||   \
                                  devid == PCI_CHIP_Q45_G ||     \
                                  devid == PCI_CHIP_G45_G ||     \
-                                 devid == PCI_CHIP_G41_G)
+                                 devid == PCI_CHIP_G41_G ||     \
+                                 devid == PCI_CHIP_B43_G ||     \
+                                 devid == PCI_CHIP_B43_G1)
+ 
 #define IS_GM45(devid)          (devid == PCI_CHIP_GM45_GM)
 #define IS_G4X(devid)		(IS_G45(devid) || IS_GM45(devid))
 

-- 
intel-vaapi-driver packaging



More information about the pkg-multimedia-commits mailing list