shithub: dav1d

Download patch

ref: 19ba5a9431f2ed19c129d3e657df6290ddb97dfe
parent: d88abfec51e91832a64f36f90c7c61ce67a79333
author: Ronald S. Bultje <rsbultje@gmail.com>
date: Tue Sep 25 04:35:54 EDT 2018

Fix minor reconstruction bugs for 10-bit content.

--- a/src/ipred.c
+++ b/src/ipred.c
@@ -133,25 +133,39 @@
                            dc += topleft[-(i + 1)]; \
                        dc_gen)
 
+#if BITDEPTH == 8
+#define MULTIPLIER_1x2 0x5556
+#define MULTIPLIER_1x4 0x3334
+#define BASE_SHIFT 16
+#else
+#define MULTIPLIER_1x2 0xAAAB
+#define MULTIPLIER_1x4 0x6667
+#define BASE_SHIFT 17
+#endif
+
 dc2d_lfn( 4,  4, dc >>= 3)
-dc2d_lfn( 4,  8, dc = iclip_pixel(0x5556 * dc >> 18))
-dc2d_lfn( 4, 16, dc = iclip_pixel(0x3334 * dc >> 18))
-dc2d_lfn( 8,  4, dc = iclip_pixel(0x5556 * dc >> 18))
+dc2d_lfn( 4,  8, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 2)))
+dc2d_lfn( 4, 16, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 2)))
+dc2d_lfn( 8,  4, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 2)))
 dc2d_lfn( 8,  8, dc >>= 4)
-dc2d_lfn( 8, 16, dc = iclip_pixel(0x5556 * dc >> 19))
-dc2d_lfn( 8, 32, dc = iclip_pixel(0x3334 * dc >> 19))
-dc2d_lfn(16,  4, dc = iclip_pixel(0x3334 * dc >> 18))
-dc2d_lfn(16,  8, dc = iclip_pixel(0x5556 * dc >> 19))
+dc2d_lfn( 8, 16, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 3)))
+dc2d_lfn( 8, 32, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 3)))
+dc2d_lfn(16,  4, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 2)))
+dc2d_lfn(16,  8, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 3)))
 dc2d_lfn(16, 16, dc >>= 5)
-dc2d_lfn(16, 32, dc = iclip_pixel(0x5556 * dc >> 20))
-dc2d_lfn(16, 64, dc = iclip_pixel(0x3334 * dc >> 20))
-dc2d_lfn(32,  8, dc = iclip_pixel(0x3334 * dc >> 19))
-dc2d_lfn(32, 16, dc = iclip_pixel(0x5556 * dc >> 20))
+dc2d_lfn(16, 32, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 4)))
+dc2d_lfn(16, 64, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 4)))
+dc2d_lfn(32,  8, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 3)))
+dc2d_lfn(32, 16, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 4)))
 dc2d_lfn(32, 32, dc >>= 6)
-dc2d_lfn(32, 64, dc = iclip_pixel(0x5556 * dc >> 21))
-dc2d_lfn(64, 16, dc = iclip_pixel(0x3334 * dc >> 20))
-dc2d_lfn(64, 32, dc = iclip_pixel(0x5556 * dc >> 21))
+dc2d_lfn(32, 64, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 5)))
+dc2d_lfn(64, 16, dc = iclip_pixel(MULTIPLIER_1x4 * dc >> (BASE_SHIFT + 4)))
+dc2d_lfn(64, 32, dc = iclip_pixel(MULTIPLIER_1x2 * dc >> (BASE_SHIFT + 5)))
 dc2d_lfn(64, 64, dc >>= 7)
+
+#undef MULTIPLIER_1x2
+#undef MULTIPLIER_1x4
+#undef BASE_SHIFT
 
 #define dc128_lfn(width, height) \
 dc_lfn(width, height, 128, const unsigned dc = (1 << BITDEPTH) >> 1)
--- a/src/loopfilter.c
+++ b/src/loopfilter.c
@@ -136,8 +136,8 @@
                 int f = iclip_diff(p1 - q1), f1, f2;
                 f = iclip_diff(3 * (q0 - p0) + f);
 
-                f1 = imin(f + 4, 127) >> 3;
-                f2 = imin(f + 3, 127) >> 3;
+                f1 = imin(f + 4, (128 << (BITDEPTH - 8)) - 1) >> 3;
+                f2 = imin(f + 3, (128 << (BITDEPTH - 8)) - 1) >> 3;
 
                 dst[strideb * -1] = iclip_pixel(p0 + f2);
                 dst[strideb * +0] = iclip_pixel(q0 - f1);
@@ -144,8 +144,8 @@
             } else {
                 int f = iclip_diff(3 * (q0 - p0)), f1, f2;
 
-                f1 = imin(f + 4, 127) >> 3;
-                f2 = imin(f + 3, 127) >> 3;
+                f1 = imin(f + 4, (128 << (BITDEPTH - 8)) - 1) >> 3;
+                f2 = imin(f + 3, (128 << (BITDEPTH - 8)) - 1) >> 3;
 
                 dst[strideb * -1] = iclip_pixel(p0 + f2);
                 dst[strideb * +0] = iclip_pixel(q0 - f1);
--- a/src/recon.c
+++ b/src/recon.c
@@ -1237,8 +1237,8 @@
                                                     0, uvdst, f->cur.p.stride[1],
                                                     top_sb_edge, m,
                                                     &angle, cbw4, cbh4, tl_edge);
-                    dsp->ipred.intra_pred[ii_tx][m](tmp, cbw4 * 4, tl_edge, 0);
-                    dsp->mc.blend(uvdst, f->cur.p.stride[1], tmp, cbw4 * 4,
+                    dsp->ipred.intra_pred[ii_tx][m](tmp, cbw4 * 4 * sizeof(pixel), tl_edge, 0);
+                    dsp->mc.blend(uvdst, f->cur.p.stride[1], tmp, cbw4 * 4 * sizeof(pixel),
                                   cbw4 * 4, cbh4 * 4, ii_mask, cbw4 * 4);
                 }
             }