summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Thompson <[email protected]>2017-07-15 19:51:56 +0100
committerEmil Velikov <[email protected]>2017-08-03 00:19:06 +0100
commitdd241abbe0fd2b49aa380d16866e003a875c58d0 (patch)
tree2496f1551906c27cf97be29374a355e22827296c
parent31b10d28834272314bfb943e8e38595320b4fb9d (diff)
st/va: Fix scaling list ordering for H.265
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: [email protected] Signed-off-by: Mark Thompson <[email protected]> Reviewed-by: Christian König <[email protected]> (cherry picked from commit 63dcfed81f011dae5ca68af3369433be28135415)
-rw-r--r--src/gallium/auxiliary/vl/vl_zscan.c21
-rw-r--r--src/gallium/auxiliary/vl/vl_zscan.h2
-rw-r--r--src/gallium/state_trackers/va/picture_hevc.c33
3 files changed, 49 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c
index 24d64525b76..75013c42bfe 100644
--- a/src/gallium/auxiliary/vl/vl_zscan.c
+++ b/src/gallium/auxiliary/vl/vl_zscan.c
@@ -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)
{
diff --git a/src/gallium/auxiliary/vl/vl_zscan.h b/src/gallium/auxiliary/vl/vl_zscan.h
index 268cf0a6e32..292152e873e 100644
--- a/src/gallium/auxiliary/vl/vl_zscan.h
+++ b/src/gallium/auxiliary/vl/vl_zscan.h
@@ -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);
diff --git a/src/gallium/state_trackers/va/picture_hevc.c b/src/gallium/state_trackers/va/picture_hevc.c
index 28743ee7aa6..e879259ae1f 100644
--- a/src/gallium/state_trackers/va/picture_hevc.c
+++ b/src/gallium/state_trackers/va/picture_hevc.c
@@ -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)