diff mbox series

[FFmpeg-devel,2/2] libswscale/tests/swscale: Use slices randomly

Message ID 20200402205633.13290-2-michael@niedermayer.cc
State New
Headers show
Series [FFmpeg-devel,1/2] swscale/yuv2rgb: Fix vertical dither offset with slices | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Michael Niedermayer April 2, 2020, 8:56 p.m. UTC
Output is identical

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libswscale/tests/swscale.c | 41 ++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c
index 19878a7877..82eb135824 100644
--- a/libswscale/tests/swscale.c
+++ b/libswscale/tests/swscale.c
@@ -55,6 +55,35 @@ 
      (x) == AV_PIX_FMT_RGB32_1 ||         \
      (x) == AV_PIX_FMT_YUVA420P)
 
+static int sws_scale_test(struct SwsContext *c,
+                                  const uint8_t * const srcSlice[],
+                                  const int srcStride[], int srcSliceY,
+                                  int srcSliceH, uint8_t *const dst[],
+                                  const int dstStride[], int vsub1)
+{
+    int h = srcSliceH;
+    int y, i;
+    static int t = 0;
+    const uint8_t * src[4];
+    t ++;
+    y = FFALIGN(t, 4) % FFALIGN(h, 4);
+
+    if (y && !srcSliceY && h == srcSliceH) {
+        int ret = sws_scale(c, srcSlice, srcStride, 0, y, dst, dstStride);
+        if (ret < 0)
+            return ret;
+        srcSliceY = y;
+        srcSliceH -= y;
+
+        for (i=0; i<4; i++) {
+            int vsub= ((i+1)&2) ? vsub1 : 0;
+            src[i] = srcSlice[i] + (y>>vsub) * srcStride[i];
+        }
+        srcSlice = src;
+    }
+    return sws_scale(c, srcSlice, srcStride, srcSliceY, srcSliceH, dst, dstStride);
+}
+
 static uint64_t getSSD(const uint8_t *src1, const uint8_t *src2,
                        int stride1, int stride2, int w, int h)
 {
@@ -132,8 +161,8 @@  static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h,
             res = -1;
             goto end;
         }
-        sws_scale(srcContext, ref, refStride, 0, h,
-                  (uint8_t * const *) src, srcStride);
+        sws_scale_test(srcContext, ref, refStride, 0, h,
+                  (uint8_t * const *) src, srcStride, 1);
         sws_freeContext(srcContext);
 
         cur_srcFormat = srcFormat;
@@ -180,7 +209,7 @@  static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h,
            flags);
     fflush(stdout);
 
-    sws_scale(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride);
+    sws_scale_test(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride, desc_src->log2_chroma_h);
 
     for (i = 0; i < 4 && dstStride[i]; i++)
         crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), crc, dst[i],
@@ -212,8 +241,8 @@  static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h,
             res = -1;
             goto end;
         }
-        sws_scale(outContext, (const uint8_t * const *) dst, dstStride, 0, dstH,
-                  out, refStride);
+        sws_scale_test(outContext, (const uint8_t * const *) dst, dstStride, 0, dstH,
+                  out, refStride, desc_dst->log2_chroma_h);
 
         ssdY = getSSD(ref[0], out[0], refStride[0], refStride[0], w, h);
         if (hasChroma(srcFormat) && hasChroma(dstFormat)) {
@@ -422,7 +451,7 @@  bad_option:
     for (y = 0; y < H; y++)
         for (x = 0; x < W * 4; x++)
             rgb_data[ x + y * 4 * W] = av_lfg_get(&rand);
-    sws_scale(sws, rgb_src, rgb_stride, 0, H / 12, (uint8_t * const *) src, stride);
+    sws_scale_test(sws, rgb_src, rgb_stride, 0, H / 12, (uint8_t * const *) src, stride, 0);
     sws_freeContext(sws);
     av_free(rgb_data);