st/va: Fix scaling list ordering for H.265
authorMark Thompson <sw@jkqxz.net>
Sat, 15 Jul 2017 18:51:56 +0000 (19:51 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Mon, 17 Jul 2017 14:24:56 +0000 (15:24 +0100)
Mesa here requires the scaling lists in diagonal scan order, but
VAAPI passes them in raster scan order.  Therefore, rearrange the
elements when copying.

v2: Move scan tables to vl_zscan.c.
    Fix type in size assertion.

Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Mark Thompson <sw@jkqxz.net>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/auxiliary/vl/vl_zscan.c
src/gallium/auxiliary/vl/vl_zscan.h
src/gallium/state_trackers/va/picture_hevc.c

index 24d64525b763672b72584b55f50dce19c649783e..75013c42bfed423f9f3c7bd368274492b2c737c0 100644 (file)
@@ -95,6 +95,27 @@ const int vl_zscan_alternate[] =
    38,46,54,62,39,47,55,63
 };
 
+const int vl_zscan_h265_up_right_diagonal_16[] =
+{
+   /* Up-right diagonal scan order for 4x4 blocks - see H.265 section 6.5.3. */
+    0,  4,  1,  8,  5,  2, 12,  9,
+    6,  3, 13, 10,  7, 14, 11, 15,
+};
+
+const int vl_zscan_h265_up_right_diagonal[] =
+{
+   /* Up-right diagonal scan order for 8x8 blocks - see H.265 section 6.5.3. */
+    0,  8,  1, 16,  9,  2, 24, 17,
+   10,  3, 32, 25, 18, 11,  4, 40,
+   33, 26, 19, 12,  5, 48, 41, 34,
+   27, 20, 13,  6, 56, 49, 42, 35,
+   28, 21, 14,  7, 57, 50, 43, 36,
+   29, 22, 15, 58, 51, 44, 37, 30,
+   23, 59, 52, 45, 38, 31, 60, 53,
+   46, 39, 61, 54, 47, 62, 55, 63,
+};
+
+
 static void *
 create_vert_shader(struct vl_zscan *zscan)
 {
index 268cf0a6e328a7ce7dc8b3d4814b67f28b5e6d51..292152e873e00db923930ed33da83056c2b9349c 100644 (file)
@@ -68,6 +68,8 @@ extern const int vl_zscan_normal_16[];
 extern const int vl_zscan_linear[];
 extern const int vl_zscan_normal[];
 extern const int vl_zscan_alternate[];
+extern const int vl_zscan_h265_up_right_diagonal_16[];
+extern const int vl_zscan_h265_up_right_diagonal[];
 
 struct pipe_sampler_view *
 vl_zscan_layout(struct pipe_context *pipe, const int layout[64], unsigned blocks_per_line);
index 28743ee7aa674f1c5f471bbf462a5eae19580b41..e879259ae1fde14ef2924bebb74884a898d7a34f 100644 (file)
@@ -25,6 +25,7 @@
  *
  **************************************************************************/
 
+#include "vl/vl_zscan.h"
 #include "va_private.h"
 
 void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf)
@@ -179,14 +180,32 @@ void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context,
 void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf)
 {
    VAIQMatrixBufferHEVC *h265 = buf->data;
+   int i, j;
 
-   assert(buf->size >= sizeof(VAIQMatrixBufferH264) && buf->num_elements == 1);
-   memcpy(&context->desc.h265.pps->sps->ScalingList4x4, h265->ScalingList4x4, 6 * 16);
-   memcpy(&context->desc.h265.pps->sps->ScalingList8x8, h265->ScalingList8x8, 6 * 64);
-   memcpy(&context->desc.h265.pps->sps->ScalingList16x16, h265->ScalingList16x16, 6 * 64);
-   memcpy(&context->desc.h265.pps->sps->ScalingList32x32, h265->ScalingList32x32, 2 * 64);
-   memcpy(&context->desc.h265.pps->sps->ScalingListDCCoeff16x16, h265->ScalingListDC16x16, 6);
-   memcpy(&context->desc.h265.pps->sps->ScalingListDCCoeff32x32, h265->ScalingListDC32x32, 2);
+   assert(buf->size >= sizeof(VAIQMatrixBufferHEVC) && buf->num_elements == 1);
+
+   for (i = 0; i < 6; i++) {
+      for (j = 0; j < 16; j++)
+         context->desc.h265.pps->sps->ScalingList4x4[i][j] =
+                                h265->ScalingList4x4[i][vl_zscan_h265_up_right_diagonal_16[j]];
+
+      for (j = 0; j < 64; j++) {
+         context->desc.h265.pps->sps->ScalingList8x8[i][j] =
+                                h265->ScalingList8x8[i][vl_zscan_h265_up_right_diagonal[j]];
+         context->desc.h265.pps->sps->ScalingList16x16[i][j] =
+                                h265->ScalingList16x16[i][vl_zscan_h265_up_right_diagonal[j]];
+
+         if (i < 2)
+            context->desc.h265.pps->sps->ScalingList32x32[i][j] =
+                                   h265->ScalingList32x32[i][vl_zscan_h265_up_right_diagonal[j]];
+      }
+
+      context->desc.h265.pps->sps->ScalingListDCCoeff16x16[i] =
+                             h265->ScalingListDC16x16[i];
+      if (i < 2)
+         context->desc.h265.pps->sps->ScalingListDCCoeff32x32[i] =
+                                h265->ScalingListDC32x32[i];
+   }
 }
 
 void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf)