#endif // CONFIG_OBMC
#if CONFIG_EXT_INTER
-#define NSMOOTHERS 2
+
+// Set to one to use larger codebooks
+#define USE_LARGE_WEDGE_CODEBOOK 0
+
+#define NSMOOTHERS 1
static int get_masked_weight(int m, int smoothness) {
#define SMOOTHER_LEN 32
static const uint8_t smoothfn[NSMOOTHERS][2 * SMOOTHER_LEN + 1] = {
64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64,
- }, {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 2, 2,
- 3, 3, 4, 4, 5, 6, 8, 9,
- 11, 13, 15, 17, 20, 23, 26, 29,
- 32,
- 35, 38, 41, 44, 47, 49, 51, 53,
- 55, 56, 58, 59, 60, 60, 61, 61,
- 62, 62, 63, 63, 63, 63, 63, 63,
- 64, 64, 64, 64, 64, 64, 64, 64,
}
};
if (m < -SMOOTHER_LEN)
return smoothfn[smoothness][m + SMOOTHER_LEN];
}
-// Angles are with respect to horizontal anti-clockwise
-typedef enum {
- WEDGE_HORIZONTAL = 0,
- WEDGE_VERTICAL = 1,
- WEDGE_OBLIQUE27 = 2,
- WEDGE_OBLIQUE63 = 3,
- WEDGE_OBLIQUE117 = 4,
- WEDGE_OBLIQUE153 = 5,
- WEDGE_DIRECTIONS
-} WedgeDirectionType;
-
-#define WEDGE_PARMS 4
// [smoother][negative][direction]
DECLARE_ALIGNED(
wedge_mask_obl[NSMOOTHERS][2][WEDGE_DIRECTIONS]
[MASK_MASTER_SIZE * MASK_MASTER_SIZE]);
-// Equation of line: f(x, y) = a[0]*(x - a[2]*w/8) + a[1]*(y - a[3]*h/8) = 0
-void vp10_init_wedge_masks() {
- int i, j, s;
- const int w = MASK_MASTER_SIZE;
- const int h = MASK_MASTER_SIZE;
- const int stride = MASK_MASTER_STRIDE;
- const int a[2] = {2, 1};
- const double asqrt = sqrt(a[0] * a[0] + a[1] * a[1]);
- for (s = 0; s < NSMOOTHERS; s++) {
- for (i = 0; i < h; ++i)
- for (j = 0; j < w; ++j) {
- int x = (2 * j + 1 - w);
- int y = (2 * i + 1 - h);
- int m = (int)rint((a[0] * x + a[1] * y) / asqrt);
- wedge_mask_obl[s][1][WEDGE_OBLIQUE63][i * stride + j] =
- wedge_mask_obl[s][1][WEDGE_OBLIQUE27][j * stride + i] =
- get_masked_weight(m, s);
- wedge_mask_obl[s][1][WEDGE_OBLIQUE117][i * stride + w - 1 - j] =
- wedge_mask_obl[s][1][WEDGE_OBLIQUE153][(w - 1 - j) * stride + i] =
- (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(m, s);
- wedge_mask_obl[s][0][WEDGE_OBLIQUE63][i * stride + j] =
- wedge_mask_obl[s][0][WEDGE_OBLIQUE27][j * stride + i] =
- (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(m, s);
- wedge_mask_obl[s][0][WEDGE_OBLIQUE117][i * stride + w - 1 - j] =
- wedge_mask_obl[s][0][WEDGE_OBLIQUE153][(w - 1 - j) * stride + i] =
- get_masked_weight(m, s);
- wedge_mask_obl[s][1][WEDGE_VERTICAL][i * stride + j] =
- wedge_mask_obl[s][1][WEDGE_HORIZONTAL][j * stride + i] =
- get_masked_weight(x, s);
- wedge_mask_obl[s][0][WEDGE_VERTICAL][i * stride + j] =
- wedge_mask_obl[s][0][WEDGE_HORIZONTAL][j * stride + i] =
- (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(x, s);
- }
- }
-}
-
-static const int wedge_params_4[1 << WEDGE_BITS_2]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 1},
- {WEDGE_OBLIQUE63, 4, 4, 1},
- {WEDGE_OBLIQUE117, 4, 4, 1},
- {WEDGE_OBLIQUE153, 4, 4, 1},
+DECLARE_ALIGNED(
+ 16, static uint8_t,
+ wedge_signflip_lookup[BLOCK_SIZES][MAX_WEDGE_TYPES]);
+
+// Some unused wedge codebooks left temporarily to facilitate experiments.
+// To be removed when setteld.
+static wedge_code_type wedge_codebook_8_hgtw[8] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 6},
};
-static const int wedge_params_8_hgtw[1 << WEDGE_BITS_3]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 1},
- {WEDGE_OBLIQUE63, 4, 4, 1},
- {WEDGE_OBLIQUE117, 4, 4, 1},
- {WEDGE_OBLIQUE153, 4, 4, 1},
-
- {WEDGE_OBLIQUE27, 4, 2, 1},
- {WEDGE_OBLIQUE27, 4, 6, 1},
- {WEDGE_OBLIQUE153, 4, 2, 1},
- {WEDGE_OBLIQUE153, 4, 6, 1},
+static wedge_code_type wedge_codebook_8_hltw[8] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
};
-static const int wedge_params_8_hltw[1 << WEDGE_BITS_3]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 1},
- {WEDGE_OBLIQUE63, 4, 4, 1},
- {WEDGE_OBLIQUE117, 4, 4, 1},
- {WEDGE_OBLIQUE153, 4, 4, 1},
-
- {WEDGE_OBLIQUE63, 2, 4, 1},
- {WEDGE_OBLIQUE63, 6, 4, 1},
- {WEDGE_OBLIQUE117, 2, 4, 1},
- {WEDGE_OBLIQUE117, 6, 4, 1},
+static wedge_code_type wedge_codebook_8_heqw[8] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 2},
+ {WEDGE_HORIZONTAL, 4, 6},
+ {WEDGE_VERTICAL, 2, 4},
+ {WEDGE_VERTICAL, 6, 4},
};
-static const int wedge_params_8_heqw[1 << WEDGE_BITS_3]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 1},
- {WEDGE_OBLIQUE63, 4, 4, 1},
- {WEDGE_OBLIQUE117, 4, 4, 1},
- {WEDGE_OBLIQUE153, 4, 4, 1},
-
- {WEDGE_HORIZONTAL, 4, 2, 1},
- {WEDGE_HORIZONTAL, 4, 6, 1},
- {WEDGE_VERTICAL, 2, 4, 1},
- {WEDGE_VERTICAL, 6, 4, 1},
+#if !USE_LARGE_WEDGE_CODEBOOK
+static const wedge_code_type wedge_codebook_16_hgtw[16] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 2},
+ {WEDGE_HORIZONTAL, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 6},
+ {WEDGE_VERTICAL, 4, 4},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
};
-static const int wedge_params_16_hgtw[1 << WEDGE_BITS_4]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_HORIZONTAL, 4, 2, 0},
- {WEDGE_HORIZONTAL, 4, 4, 0},
- {WEDGE_HORIZONTAL, 4, 6, 0},
- {WEDGE_VERTICAL, 4, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
-
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
+static const wedge_code_type wedge_codebook_16_hltw[16] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_VERTICAL, 2, 4},
+ {WEDGE_VERTICAL, 4, 4},
+ {WEDGE_VERTICAL, 6, 4},
+ {WEDGE_HORIZONTAL, 4, 4},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
};
-static const int wedge_params_16_hltw[1 << WEDGE_BITS_4]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_VERTICAL, 2, 4, 0},
- {WEDGE_VERTICAL, 4, 4, 0},
- {WEDGE_VERTICAL, 6, 4, 0},
- {WEDGE_HORIZONTAL, 4, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
-
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
+static const wedge_code_type wedge_codebook_16_heqw[16] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 2},
+ {WEDGE_HORIZONTAL, 4, 6},
+ {WEDGE_VERTICAL, 2, 4},
+ {WEDGE_VERTICAL, 6, 4},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
};
-static const int wedge_params_16_heqw[1 << WEDGE_BITS_4]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_HORIZONTAL, 4, 2, 0},
- {WEDGE_HORIZONTAL, 4, 6, 0},
- {WEDGE_VERTICAL, 2, 4, 0},
- {WEDGE_VERTICAL, 6, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
-
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
+const wedge_params_type wedge_params_lookup[BLOCK_SIZES] = {
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {4, wedge_codebook_16_heqw, wedge_signflip_lookup[3], 0},
+ {4, wedge_codebook_16_hgtw, wedge_signflip_lookup[4], 0},
+ {4, wedge_codebook_16_hltw, wedge_signflip_lookup[5], 0},
+ {4, wedge_codebook_16_heqw, wedge_signflip_lookup[6], 0},
+ {4, wedge_codebook_16_hgtw, wedge_signflip_lookup[7], 0},
+ {4, wedge_codebook_16_hltw, wedge_signflip_lookup[8], 0},
+ {4, wedge_codebook_16_heqw, wedge_signflip_lookup[9], 0},
+ {0, wedge_codebook_8_hgtw, wedge_signflip_lookup[10], 0},
+ {0, wedge_codebook_8_hltw, wedge_signflip_lookup[11], 0},
+ {0, wedge_codebook_8_heqw, wedge_signflip_lookup[12], 0},
+#if CONFIG_EXT_PARTITION
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+#endif // CONFIG_EXT_PARTITION
};
-static const int wedge_params_32_hgtw[1 << WEDGE_BITS_5]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_HORIZONTAL, 4, 2, 0},
- {WEDGE_HORIZONTAL, 4, 4, 0},
- {WEDGE_HORIZONTAL, 4, 6, 0},
- {WEDGE_VERTICAL, 4, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 1, 0},
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 3, 0},
- {WEDGE_OBLIQUE27, 4, 5, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE27, 4, 7, 0},
-
- {WEDGE_OBLIQUE153, 4, 1, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 3, 0},
- {WEDGE_OBLIQUE153, 4, 5, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 7, 0},
-
- {WEDGE_OBLIQUE63, 1, 4, 0},
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 3, 4, 0},
- {WEDGE_OBLIQUE63, 5, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE63, 7, 4, 0},
-
- {WEDGE_OBLIQUE117, 1, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 3, 4, 0},
- {WEDGE_OBLIQUE117, 5, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
- {WEDGE_OBLIQUE117, 7, 4, 0},
+#else
+
+static const wedge_code_type wedge_codebook_32_hgtw[32] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 2},
+ {WEDGE_HORIZONTAL, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 6},
+ {WEDGE_VERTICAL, 4, 4},
+ {WEDGE_OBLIQUE27, 4, 1},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 3},
+ {WEDGE_OBLIQUE27, 4, 5},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE27, 4, 7},
+ {WEDGE_OBLIQUE153, 4, 1},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 3},
+ {WEDGE_OBLIQUE153, 4, 5},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 7},
+ {WEDGE_OBLIQUE63, 1, 4},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 3, 4},
+ {WEDGE_OBLIQUE63, 5, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE63, 7, 4},
+ {WEDGE_OBLIQUE117, 1, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 3, 4},
+ {WEDGE_OBLIQUE117, 5, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
+ {WEDGE_OBLIQUE117, 7, 4},
};
-static const int wedge_params_32_hltw[1 << WEDGE_BITS_5]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_VERTICAL, 2, 4, 0},
- {WEDGE_VERTICAL, 4, 4, 0},
- {WEDGE_VERTICAL, 6, 4, 0},
- {WEDGE_HORIZONTAL, 4, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 1, 0},
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 3, 0},
- {WEDGE_OBLIQUE27, 4, 5, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE27, 4, 7, 0},
-
- {WEDGE_OBLIQUE153, 4, 1, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 3, 0},
- {WEDGE_OBLIQUE153, 4, 5, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 7, 0},
-
- {WEDGE_OBLIQUE63, 1, 4, 0},
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 3, 4, 0},
- {WEDGE_OBLIQUE63, 5, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE63, 7, 4, 0},
-
- {WEDGE_OBLIQUE117, 1, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 3, 4, 0},
- {WEDGE_OBLIQUE117, 5, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
- {WEDGE_OBLIQUE117, 7, 4, 0},
+static const wedge_code_type wedge_codebook_32_hltw[32] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_VERTICAL, 2, 4},
+ {WEDGE_VERTICAL, 4, 4},
+ {WEDGE_VERTICAL, 6, 4},
+ {WEDGE_HORIZONTAL, 4, 4},
+ {WEDGE_OBLIQUE27, 4, 1},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 3},
+ {WEDGE_OBLIQUE27, 4, 5},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE27, 4, 7},
+ {WEDGE_OBLIQUE153, 4, 1},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 3},
+ {WEDGE_OBLIQUE153, 4, 5},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 7},
+ {WEDGE_OBLIQUE63, 1, 4},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 3, 4},
+ {WEDGE_OBLIQUE63, 5, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE63, 7, 4},
+ {WEDGE_OBLIQUE117, 1, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 3, 4},
+ {WEDGE_OBLIQUE117, 5, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
+ {WEDGE_OBLIQUE117, 7, 4},
};
-static const int wedge_params_32_heqw[1 << WEDGE_BITS_5]
- [WEDGE_PARMS] = {
- {WEDGE_OBLIQUE27, 4, 4, 0},
- {WEDGE_OBLIQUE63, 4, 4, 0},
- {WEDGE_OBLIQUE117, 4, 4, 0},
- {WEDGE_OBLIQUE153, 4, 4, 0},
-
- {WEDGE_HORIZONTAL, 4, 2, 0},
- {WEDGE_HORIZONTAL, 4, 6, 0},
- {WEDGE_VERTICAL, 2, 4, 0},
- {WEDGE_VERTICAL, 6, 4, 0},
-
- {WEDGE_OBLIQUE27, 4, 1, 0},
- {WEDGE_OBLIQUE27, 4, 2, 0},
- {WEDGE_OBLIQUE27, 4, 3, 0},
- {WEDGE_OBLIQUE27, 4, 5, 0},
- {WEDGE_OBLIQUE27, 4, 6, 0},
- {WEDGE_OBLIQUE27, 4, 7, 0},
-
- {WEDGE_OBLIQUE153, 4, 1, 0},
- {WEDGE_OBLIQUE153, 4, 2, 0},
- {WEDGE_OBLIQUE153, 4, 3, 0},
- {WEDGE_OBLIQUE153, 4, 5, 0},
- {WEDGE_OBLIQUE153, 4, 6, 0},
- {WEDGE_OBLIQUE153, 4, 7, 0},
-
- {WEDGE_OBLIQUE63, 1, 4, 0},
- {WEDGE_OBLIQUE63, 2, 4, 0},
- {WEDGE_OBLIQUE63, 3, 4, 0},
- {WEDGE_OBLIQUE63, 5, 4, 0},
- {WEDGE_OBLIQUE63, 6, 4, 0},
- {WEDGE_OBLIQUE63, 7, 4, 0},
-
- {WEDGE_OBLIQUE117, 1, 4, 0},
- {WEDGE_OBLIQUE117, 2, 4, 0},
- {WEDGE_OBLIQUE117, 3, 4, 0},
- {WEDGE_OBLIQUE117, 5, 4, 0},
- {WEDGE_OBLIQUE117, 6, 4, 0},
- {WEDGE_OBLIQUE117, 7, 4, 0},
+static const wedge_code_type wedge_codebook_32_heqw[32] = {
+ {WEDGE_OBLIQUE27, 4, 4},
+ {WEDGE_OBLIQUE63, 4, 4},
+ {WEDGE_OBLIQUE117, 4, 4},
+ {WEDGE_OBLIQUE153, 4, 4},
+ {WEDGE_HORIZONTAL, 4, 2},
+ {WEDGE_HORIZONTAL, 4, 6},
+ {WEDGE_VERTICAL, 2, 4},
+ {WEDGE_VERTICAL, 6, 4},
+ {WEDGE_OBLIQUE27, 4, 1},
+ {WEDGE_OBLIQUE27, 4, 2},
+ {WEDGE_OBLIQUE27, 4, 3},
+ {WEDGE_OBLIQUE27, 4, 5},
+ {WEDGE_OBLIQUE27, 4, 6},
+ {WEDGE_OBLIQUE27, 4, 7},
+ {WEDGE_OBLIQUE153, 4, 1},
+ {WEDGE_OBLIQUE153, 4, 2},
+ {WEDGE_OBLIQUE153, 4, 3},
+ {WEDGE_OBLIQUE153, 4, 5},
+ {WEDGE_OBLIQUE153, 4, 6},
+ {WEDGE_OBLIQUE153, 4, 7},
+ {WEDGE_OBLIQUE63, 1, 4},
+ {WEDGE_OBLIQUE63, 2, 4},
+ {WEDGE_OBLIQUE63, 3, 4},
+ {WEDGE_OBLIQUE63, 5, 4},
+ {WEDGE_OBLIQUE63, 6, 4},
+ {WEDGE_OBLIQUE63, 7, 4},
+ {WEDGE_OBLIQUE117, 1, 4},
+ {WEDGE_OBLIQUE117, 2, 4},
+ {WEDGE_OBLIQUE117, 3, 4},
+ {WEDGE_OBLIQUE117, 5, 4},
+ {WEDGE_OBLIQUE117, 6, 4},
+ {WEDGE_OBLIQUE117, 7, 4},
};
-static const int *get_wedge_params_lookup[BLOCK_SIZES] = {
- NULL,
- NULL,
- NULL,
- &wedge_params_16_heqw[0][0],
- &wedge_params_16_hgtw[0][0],
- &wedge_params_16_hltw[0][0],
- &wedge_params_16_heqw[0][0],
- &wedge_params_16_hgtw[0][0],
- &wedge_params_16_hltw[0][0],
- &wedge_params_16_heqw[0][0],
- NULL,
- NULL,
- NULL,
+const wedge_params_type wedge_params_lookup[BLOCK_SIZES] = {
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {5, wedge_codebook_32_heqw, wedge_signflip_lookup[3], 0},
+ {5, wedge_codebook_32_hgtw, wedge_signflip_lookup[4], 0},
+ {5, wedge_codebook_32_hltw, wedge_signflip_lookup[5], 0},
+ {5, wedge_codebook_32_heqw, wedge_signflip_lookup[6], 0},
+ {5, wedge_codebook_32_hgtw, wedge_signflip_lookup[7], 0},
+ {5, wedge_codebook_32_hltw, wedge_signflip_lookup[8], 0},
+ {5, wedge_codebook_32_heqw, wedge_signflip_lookup[9], 0},
+ {0, wedge_codebook_8_hgtw, wedge_signflip_lookup[10], 0},
+ {0, wedge_codebook_8_hltw, wedge_signflip_lookup[11], 0},
+ {0, wedge_codebook_8_heqw, wedge_signflip_lookup[12], 0},
#if CONFIG_EXT_PARTITION
- NULL,
- NULL,
- NULL,
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
+ {0, NULL, NULL, 0},
#endif // CONFIG_EXT_PARTITION
};
-
-static const int *get_wedge_params(int wedge_index,
- BLOCK_SIZE sb_type) {
- const int *a = NULL;
- if (wedge_index != WEDGE_NONE) {
- return get_wedge_params_lookup[sb_type] + WEDGE_PARMS * wedge_index;
- }
- return a;
-}
+#endif // USE_LARGE_WEDGE_CODEBOOK
static const uint8_t *get_wedge_mask_inplace(int wedge_index,
int neg,
const uint8_t *master;
const int bh = 4 << b_height_log2_lookup[sb_type];
const int bw = 4 << b_width_log2_lookup[sb_type];
- const int *a = get_wedge_params(wedge_index, sb_type);
+ const wedge_code_type *a =
+ wedge_params_lookup[sb_type].codebook + wedge_index;
+ const int smoother = wedge_params_lookup[sb_type].smoother;
int woff, hoff;
- if (!a) return NULL;
- woff = (a[1] * bw) >> 3;
- hoff = (a[2] * bh) >> 3;
- master = wedge_mask_obl[a[3]][neg][a[0]] +
+ const uint8_t wsignflip = wedge_params_lookup[sb_type].signflip[wedge_index];
+
+ assert(wedge_index >= 0 &&
+ wedge_index < (1 << get_wedge_bits_lookup(sb_type)));
+ woff = (a->x_offset * bw) >> 3;
+ hoff = (a->y_offset * bh) >> 3;
+ master = wedge_mask_obl[smoother][neg ^ wsignflip][a->direction] +
MASK_MASTER_STRIDE * (MASK_MASTER_SIZE / 2 - hoff) +
MASK_MASTER_SIZE / 2 - woff;
return master;
return mask;
}
+// If the signs for the wedges for various blocksizes are
+// inconsistent flip the sign flag. Do it only once for every
+// wedge codebook.
+static void init_wedge_signs() {
+ BLOCK_SIZE sb_type;
+ memset(wedge_signflip_lookup, 0, sizeof(wedge_signflip_lookup));
+ for (sb_type = BLOCK_4X4; sb_type < BLOCK_SIZES; ++sb_type) {
+ const int bw = 4 * num_4x4_blocks_wide_lookup[sb_type];
+ const int bh = 4 * num_4x4_blocks_high_lookup[sb_type];
+ const wedge_params_type wedge_params = wedge_params_lookup[sb_type];
+ const int wbits = wedge_params.bits;
+ const int wtypes = 1 << wbits;
+ int i, w;
+ if (wbits == 0) continue;
+ for (w = 0; w < wtypes; ++w) {
+ const uint8_t *mask = get_wedge_mask_inplace(w, 0, sb_type);
+ int sum = 0;
+ for (i = 0; i < bw; ++i)
+ sum += mask[i];
+ for (i = 0; i < bh; ++i)
+ sum += mask[i * MASK_MASTER_STRIDE];
+ sum = (sum + (bw + bh) / 2) / (bw + bh);
+ wedge_params.signflip[w] = (sum < 32);
+ }
+ }
+}
+
+// Equation of line: f(x, y) = a[0]*(x - a[2]*w/8) + a[1]*(y - a[3]*h/8) = 0
+void vp10_init_wedge_masks() {
+ int i, j, s;
+ const int w = MASK_MASTER_SIZE;
+ const int h = MASK_MASTER_SIZE;
+ const int stride = MASK_MASTER_STRIDE;
+ const int a[2] = {2, 1};
+ const double asqrt = sqrt(a[0] * a[0] + a[1] * a[1]);
+ for (s = 0; s < NSMOOTHERS; s++) {
+ for (i = 0; i < h; ++i)
+ for (j = 0; j < w; ++j) {
+ int x = (2 * j + 1 - w);
+ int y = (2 * i + 1 - h);
+ int m = (int)rint((a[0] * x + a[1] * y) / asqrt);
+ wedge_mask_obl[s][1][WEDGE_OBLIQUE63][i * stride + j] =
+ wedge_mask_obl[s][1][WEDGE_OBLIQUE27][j * stride + i] =
+ get_masked_weight(m, s);
+ wedge_mask_obl[s][1][WEDGE_OBLIQUE117][i * stride + w - 1 - j] =
+ wedge_mask_obl[s][1][WEDGE_OBLIQUE153][(w - 1 - j) * stride + i] =
+ (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(m, s);
+ wedge_mask_obl[s][0][WEDGE_OBLIQUE63][i * stride + j] =
+ wedge_mask_obl[s][0][WEDGE_OBLIQUE27][j * stride + i] =
+ (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(m, s);
+ wedge_mask_obl[s][0][WEDGE_OBLIQUE117][i * stride + w - 1 - j] =
+ wedge_mask_obl[s][0][WEDGE_OBLIQUE153][(w - 1 - j) * stride + i] =
+ get_masked_weight(m, s);
+ wedge_mask_obl[s][1][WEDGE_VERTICAL][i * stride + j] =
+ wedge_mask_obl[s][1][WEDGE_HORIZONTAL][j * stride + i] =
+ get_masked_weight(x, s);
+ wedge_mask_obl[s][0][WEDGE_VERTICAL][i * stride + j] =
+ wedge_mask_obl[s][0][WEDGE_HORIZONTAL][j * stride + i] =
+ (1 << WEDGE_WEIGHT_BITS) - get_masked_weight(x, s);
+ }
+ }
+ init_wedge_signs();
+}
+
static void build_masked_compound(uint8_t *dst, int dst_stride,
uint8_t *dst1, int dst1_stride,
uint8_t *dst2, int dst2_stride,