Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/videolan/dav1d.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2020-02-04 22:03:18 +0300
committerMartin Storsjö <martin@martin.st>2020-02-11 11:43:43 +0300
commit96da9cc232b4b238bcd215025d075039a5b0a86f (patch)
tree5fd75169cc44e0db1bc0b9264347afa82bf85f7f
parent8fb306575cef9c1882cfc693b1c47e68e27fc71a (diff)
looprestoration: Add a bpc parameter to the init func
This allows using completely different codepaths for 10 and 12 bpc, or just adding SIMD functions for either of them.
-rw-r--r--src/arm/looprestoration_init_tmpl.c2
-rw-r--r--src/decode.c2
-rw-r--r--src/looprestoration.h4
-rw-r--r--src/looprestoration_tmpl.c4
-rw-r--r--tests/checkasm/looprestoration.c45
5 files changed, 29 insertions, 28 deletions
diff --git a/src/arm/looprestoration_init_tmpl.c b/src/arm/looprestoration_init_tmpl.c
index ec0ea22..d701a61 100644
--- a/src/arm/looprestoration_init_tmpl.c
+++ b/src/arm/looprestoration_init_tmpl.c
@@ -270,7 +270,7 @@ static void sgr_filter_neon(pixel *const dst, const ptrdiff_t dst_stride,
}
#endif // BITDEPTH == 8
-COLD void bitfn(dav1d_loop_restoration_dsp_init_arm)(Dav1dLoopRestorationDSPContext *const c) {
+COLD void bitfn(dav1d_loop_restoration_dsp_init_arm)(Dav1dLoopRestorationDSPContext *const c, int bpc) {
const unsigned flags = dav1d_get_cpu_flags();
if (!(flags & DAV1D_ARM_CPU_FLAG_NEON)) return;
diff --git a/src/decode.c b/src/decode.c
index fbab656..2833524 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -3242,7 +3242,7 @@ int dav1d_submit_frame(Dav1dContext *const c) {
dav1d_intra_pred_dsp_init_##bd##bpc(&dsp->ipred); \
dav1d_itx_dsp_init_##bd##bpc(&dsp->itx); \
dav1d_loop_filter_dsp_init_##bd##bpc(&dsp->lf); \
- dav1d_loop_restoration_dsp_init_##bd##bpc(&dsp->lr); \
+ dav1d_loop_restoration_dsp_init_##bd##bpc(&dsp->lr, bpc); \
dav1d_mc_dsp_init_##bd##bpc(&dsp->mc); \
dav1d_film_grain_dsp_init_##bd##bpc(&dsp->fg); \
break
diff --git a/src/looprestoration.h b/src/looprestoration.h
index 2d16df8..539a76b 100644
--- a/src/looprestoration.h
+++ b/src/looprestoration.h
@@ -72,8 +72,8 @@ typedef struct Dav1dLoopRestorationDSPContext {
selfguided_fn selfguided;
} Dav1dLoopRestorationDSPContext;
-bitfn_decls(void dav1d_loop_restoration_dsp_init, Dav1dLoopRestorationDSPContext *c);
-bitfn_decls(void dav1d_loop_restoration_dsp_init_arm, Dav1dLoopRestorationDSPContext *c);
+bitfn_decls(void dav1d_loop_restoration_dsp_init, Dav1dLoopRestorationDSPContext *c, int bpc);
+bitfn_decls(void dav1d_loop_restoration_dsp_init_arm, Dav1dLoopRestorationDSPContext *c, int bpc);
bitfn_decls(void dav1d_loop_restoration_dsp_init_x86, Dav1dLoopRestorationDSPContext *c);
bitfn_decls(void dav1d_loop_restoration_dsp_init_ppc, Dav1dLoopRestorationDSPContext *c);
diff --git a/src/looprestoration_tmpl.c b/src/looprestoration_tmpl.c
index 82694ef..a8a2472 100644
--- a/src/looprestoration_tmpl.c
+++ b/src/looprestoration_tmpl.c
@@ -573,13 +573,13 @@ static void selfguided_c(pixel *p, const ptrdiff_t p_stride,
}
}
-COLD void bitfn(dav1d_loop_restoration_dsp_init)(Dav1dLoopRestorationDSPContext *const c) {
+COLD void bitfn(dav1d_loop_restoration_dsp_init)(Dav1dLoopRestorationDSPContext *const c, int bpc) {
c->wiener = wiener_c;
c->selfguided = selfguided_c;
#if HAVE_ASM
#if ARCH_AARCH64 || ARCH_ARM
- bitfn(dav1d_loop_restoration_dsp_init_arm)(c);
+ bitfn(dav1d_loop_restoration_dsp_init_arm)(c, bpc);
#elif ARCH_PPC64LE
bitfn(dav1d_loop_restoration_dsp_init_ppc)(c);
#elif ARCH_X86
diff --git a/tests/checkasm/looprestoration.c b/tests/checkasm/looprestoration.c
index 9e8eba9..c76b020 100644
--- a/tests/checkasm/looprestoration.c
+++ b/tests/checkasm/looprestoration.c
@@ -43,7 +43,7 @@ static void init_tmp(pixel *buf, const ptrdiff_t stride,
}
}
-static void check_wiener(Dav1dLoopRestorationDSPContext *const c) {
+static void check_wiener(Dav1dLoopRestorationDSPContext *const c, const int bpc) {
ALIGN_STK_64(pixel, c_dst, 448 * 64,);
ALIGN_STK_64(pixel, a_dst, 448 * 64,);
ALIGN_STK_64(pixel, h_edge, 448 * 8,);
@@ -58,7 +58,7 @@ static void check_wiener(Dav1dLoopRestorationDSPContext *const c) {
for (int pl = 0; pl < 2; pl++) {
if (check_func(c->wiener, "wiener_%s_%dbpc",
- pl ? "chroma" : "luma", BITDEPTH))
+ pl ? "chroma" : "luma", bpc))
{
int16_t filter[2][3], filter_v[7], filter_h[7];
@@ -81,11 +81,7 @@ static void check_wiener(Dav1dLoopRestorationDSPContext *const c) {
const int base_w = 1 + (rnd() % 384);
const int base_h = 1 + (rnd() & 63);
-#if BITDEPTH == 16
- const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
-#else
- const int bitdepth_max = 0xff;
-#endif
+ const int bitdepth_max = (1 << bpc) - 1;
init_tmp(c_dst, 448 * sizeof(pixel), 448, 64, bitdepth_max);
init_tmp(h_edge, 448 * sizeof(pixel), 448, 8, bitdepth_max);
@@ -112,10 +108,9 @@ static void check_wiener(Dav1dLoopRestorationDSPContext *const c) {
256, 64, filter_h, filter_v, 0xf HIGHBD_TAIL_SUFFIX);
}
}
- report("wiener");
}
-static void check_sgr(Dav1dLoopRestorationDSPContext *const c) {
+static void check_sgr(Dav1dLoopRestorationDSPContext *const c, const int bpc) {
ALIGN_STK_64(pixel, c_dst, 448 * 64,);
ALIGN_STK_64(pixel, a_dst, 448 * 64,);
ALIGN_STK_64(pixel, h_edge, 448 * 8,);
@@ -130,7 +125,7 @@ static void check_sgr(Dav1dLoopRestorationDSPContext *const c) {
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))
+ sgr_idx == 6 ? "mix" : sgr_idx == 10 ? "3x3" : "5x5", bpc))
{
int16_t sgr_wt[2];
@@ -140,11 +135,7 @@ static void check_sgr(Dav1dLoopRestorationDSPContext *const c) {
const int base_w = 1 + (rnd() % 384);
const int base_h = 1 + (rnd() & 63);
-#if BITDEPTH == 16
- const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
-#else
- const int bitdepth_max = 0xff;
-#endif
+ const int bitdepth_max = (1 << bpc) - 1;
init_tmp(c_dst, 448 * sizeof(pixel), 448, 64, bitdepth_max);
init_tmp(h_edge, 448 * sizeof(pixel), 448, 8, bitdepth_max);
@@ -171,14 +162,24 @@ static void check_sgr(Dav1dLoopRestorationDSPContext *const c) {
256, 64, sgr_idx, sgr_wt, 0xf HIGHBD_TAIL_SUFFIX);
}
}
- report("sgr");
}
void bitfn(checkasm_check_looprestoration)(void) {
- Dav1dLoopRestorationDSPContext c;
-
- bitfn(dav1d_loop_restoration_dsp_init)(&c);
-
- check_wiener(&c);
- check_sgr(&c);
+#if BITDEPTH == 16
+ const int bpc_min = 10, bpc_max = 12;
+#else
+ const int bpc_min = 8, bpc_max = 8;
+#endif
+ for (int bpc = bpc_min; bpc <= bpc_max; bpc += 2) {
+ Dav1dLoopRestorationDSPContext c;
+ bitfn(dav1d_loop_restoration_dsp_init)(&c, bpc);
+ check_wiener(&c, bpc);
+ }
+ report("wiener");
+ for (int bpc = bpc_min; bpc <= bpc_max; bpc += 2) {
+ Dav1dLoopRestorationDSPContext c;
+ bitfn(dav1d_loop_restoration_dsp_init)(&c, bpc);
+ check_sgr(&c, bpc);
+ }
+ report("sgr");
}