shithub: dav1d

Download patch

ref: 7d1d7d28072632f944a51d59dcb4f90a9816cf2d
parent: c6fe27cd1340c539bb1648103e7288f7ee6f3ef8
author: Ronald S. Bultje <rsbultje@gmail.com>
date: Thu Nov 1 11:44:57 EDT 2018

Add unit test for SGR looprestoration

--- a/tests/checkasm/looprestoration.c
+++ b/tests/checkasm/looprestoration.c
@@ -31,6 +31,7 @@
 
 #include "src/levels.h"
 #include "src/looprestoration.h"
+#include "src/tables.h"
 
 static void init_tmp(pixel *buf, const ptrdiff_t stride,
                      const int w, const int h)
@@ -99,7 +100,7 @@
                 const int w = edges & LR_HAVE_RIGHT ? 256 : base_w;
                 const int h = edges & LR_HAVE_BOTTOM ? 64 : base_h;
 
-                memcpy(a_dst, c_dst, sizeof(c_dst));
+                memcpy(a_dst, c_dst, 448 * 64 * sizeof(pixel));
 
                 call_ref(c_dst + 32, 448 * sizeof(pixel), left,
                          h_edge + 32, 448 * sizeof(pixel),
@@ -118,6 +119,57 @@
     report("wiener");
 }
 
+static void check_sgr(Dav1dLoopRestorationDSPContext *const c) {
+    ALIGN_STK_32(pixel, c_dst, 448 * 64,);
+    ALIGN_STK_32(pixel, a_dst, 448 * 64,);
+    ALIGN_STK_32(pixel, h_edge, 448 * 8,);
+    pixel left[64][4];
+
+    declare_func(void, pixel *dst, ptrdiff_t dst_stride,
+                 const pixel (*const left)[4],
+                 const pixel *lpf, ptrdiff_t lpf_stride,
+                 int w, int h, int sgr_idx,
+                 const int16_t sgr_wt[7], enum LrEdgeFlags edges);
+
+    init_tmp(c_dst, 448 * sizeof(pixel), 448, 64);
+    init_tmp(h_edge, 448 * sizeof(pixel), 448, 8);
+    init_tmp((pixel *) left, 4 * sizeof(pixel), 4, 64);
+
+    for (int sgr_idx = 14; sgr_idx >= 6; sgr_idx -= 4) {
+        if (check_func(c->selfguided, "selfguided_%s_%dbpc",
+                       sgr_idx == 6 ? "mix" : sgr_idx == 10 ? "3x3" : "5x5", BITDEPTH))
+        {
+            int16_t sgr_wt[2];
+
+            sgr_wt[0] = dav1d_sgr_params[sgr_idx][0] ? (rand() & 127) - 96 : 0;
+            sgr_wt[1] = dav1d_sgr_params[sgr_idx][1] ? (rand() & 127) - 32 :
+                            iclip(128 - sgr_wt[0], -32, 95);
+
+            const int base_w = 1 + (rand() % 384);
+            const int base_h = 1 + (rand() & 63);
+            for (enum LrEdgeFlags edges = 0; edges <= 0xf; edges++) {
+                const int w = edges & LR_HAVE_RIGHT ? 256 : base_w;
+                const int h = edges & LR_HAVE_BOTTOM ? 64 : base_h;
+
+                memcpy(a_dst, c_dst, 448 * 64 * sizeof(pixel));
+
+                call_ref(c_dst + 32, 448 * sizeof(pixel), left,
+                         h_edge + 32, 448 * sizeof(pixel),
+                         w, h, sgr_idx, sgr_wt, edges);
+                call_new(a_dst + 32, 448 * sizeof(pixel), left,
+                         h_edge + 32, 448 * sizeof(pixel),
+                         w, h, sgr_idx, sgr_wt, edges);
+                const int res = cmp2d(c_dst + 32, a_dst + 32, 448 * sizeof(pixel), w, h);
+                if (res != -1) fail();
+            }
+            bench_new(a_dst + 32, 448 * sizeof(pixel), left,
+                      h_edge + 32, 448 * sizeof(pixel),
+                      256, 64, sgr_idx, sgr_wt, 0xf);
+        }
+    }
+    report("sgr");
+}
+
 void bitfn(checkasm_check_looprestoration)(void) {
     Dav1dLoopRestorationDSPContext c;
 
@@ -124,4 +176,5 @@
     bitfn(dav1d_loop_restoration_dsp_init)(&c);
 
     check_wiener(&c);
+    check_sgr(&c);
 }