ncobmc-adapt-weight: define data types used in the experiment
Also add another default probabilities and for two-modes
Change-Id: Ia503301e6d8e89c8d7c945ff25588807107d4807
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index e6a939e..4f2b6ce 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -110,6 +110,22 @@
} PVQ_QUEUE;
#endif
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
+typedef struct superblock_mi_boundaries {
+ int mi_row_begin;
+ int mi_col_begin;
+ int mi_row_end;
+ int mi_col_end;
+} SB_MI_BD;
+
+typedef struct {
+ int KERNEL_TL[MAX_SB_SIZE][MAX_SB_SIZE];
+ int KERNEL_TR[MAX_SB_SIZE][MAX_SB_SIZE];
+ int KERNEL_BL[MAX_SB_SIZE][MAX_SB_SIZE];
+ int KERNEL_BR[MAX_SB_SIZE][MAX_SB_SIZE];
+} NCOBMC_KERNELS;
+#endif
+
typedef struct {
uint8_t *plane[MAX_MB_PLANE];
int stride[MAX_MB_PLANE];
@@ -442,7 +458,7 @@
// blocks. A rectangular block is divided into two squared blocks and each
// squared block has an interpolation mode.
NCOBMC_MODE ncobmc_mode[2];
-#endif
+#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
#endif // CONFIG_MOTION_VAR
int_mv mv[2];
int_mv pred_mv[2];
@@ -774,6 +790,12 @@
#if CONFIG_CFL
CFL_CTX *cfl;
#endif
+
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
+ uint8_t *ncobmc_pred_buf[MAX_MB_PLANE];
+ int ncobmc_pred_buf_stride[MAX_MB_PLANE];
+ SB_MI_BD sb_mi_bd;
+#endif
} MACROBLOCKD;
static INLINE int get_bitdepth_data_path_index(const MACROBLOCKD *xd) {
@@ -1569,10 +1591,10 @@
#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
static INLINE NCOBMC_MODE ncobmc_mode_allowed_bsize(BLOCK_SIZE bsize) {
- if (bsize < BLOCK_8X8 || bsize > BLOCK_64X64)
+ if (bsize < BLOCK_8X8 || bsize >= BLOCK_64X64)
return NO_OVERLAP;
else
- return (NCOBMC_MODE)(MAX_NCOBMC_MODES - 1);
+ return MAX_NCOBMC_MODES;
}
static INLINE MOTION_MODE
@@ -1587,21 +1609,22 @@
const MB_MODE_INFO *mbmi = &mi->mbmi;
MOTION_MODE motion_mode_for_mv_search = motion_mode_allowed(
#if CONFIG_GLOBAL_MOTION
- int block, const WarpedMotionParams *gm_params,
+ block, gm_params,
#endif
#if CONFIG_WARPED_MOTION
xd,
#endif
mi);
int ncobmc_mode_allowed =
- ncobmc_mode_allowed_bsize(mbmi->sb_type) && is_inter_mode(mbmi->mode);
+ (ncobmc_mode_allowed_bsize(mbmi->sb_type) < NO_OVERLAP) &&
+ motion_mode_for_mv_search >= OBMC_CAUSAL;
if (for_mv_search)
return motion_mode_for_mv_search;
else
return ncobmc_mode_allowed ? NCOBMC_ADAPT_WEIGHT
: motion_mode_for_mv_search;
}
-#endif
+#endif // CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
static INLINE void assert_motion_mode_valid(MOTION_MODE mode,
#if CONFIG_GLOBAL_MOTION
@@ -1618,6 +1641,9 @@
#if CONFIG_GLOBAL_MOTION
block, gm_params,
#endif // CONFIG_GLOBAL_MOTION
+#if CONFIG_WARPED_MOTION
+ xd,
+#endif
mi);
#else
const MOTION_MODE last_motion_mode_allowed = motion_mode_allowed(
diff --git a/av1/common/common_data.h b/av1/common/common_data.h
index 95ca550..825fb1f 100644
--- a/av1/common/common_data.h
+++ b/av1/common/common_data.h
@@ -1901,6 +1901,19 @@
ADAPT_OVERLAP_BLOCK_INVALID, ADAPT_OVERLAP_BLOCK_INVALID,
ADAPT_OVERLAP_BLOCK_INVALID, ADAPT_OVERLAP_BLOCK_INVALID
};
+
+static const BLOCK_SIZE bsize_2_sqr_bsize[BLOCK_SIZES] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ BLOCK_2X2, BLOCK_2X2, BLOCK_2X2,
+#endif
+ BLOCK_4X4, BLOCK_4X4, BLOCK_4X4, BLOCK_8X8, BLOCK_8X8,
+ BLOCK_8X8, BLOCK_16X16, BLOCK_16X16, BLOCK_16X16, BLOCK_32X32,
+ BLOCK_32X32, BLOCK_32X32, BLOCK_64X64,
+#if CONFIG_EXT_PARTITION
+ BLOCK_64X64, BLOCK_64X64,
+#endif
+};
+
#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
#if CONFIG_ADAPT_SCAN
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index b0505fa..eae186e 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -732,40 +732,131 @@
#endif // CONFIG_EXT_INTER
#if CONFIG_NCOBMC_ADAPT_WEIGHT
+#ifdef TWO_MODE
const aom_tree_index av1_ncobmc_mode_tree[TREE_SIZE(MAX_NCOBMC_MODES)] = {
- -NO_OVERLAP, 2, -NCOBMC_MODE_1, 4,
- -NCOBMC_MODE_2, 6, -NCOBMC_MODE_3, 8,
- -NCOBMC_MODE_4, 10, -NCOBMC_MODE_5, 12,
- -NCOBMC_MODE_6, 14, -NCOBMC_MODE_7, -NCOBMC_MODE_8
+ -NCOBMC_MODE_0, -NCOBMC_MODE_1
};
+#else
+const aom_tree_index av1_ncobmc_mode_tree[TREE_SIZE(MAX_NCOBMC_MODES)] = {
+ -NCOBMC_MODE_0, 2,
+ -NCOBMC_MODE_1, 4,
+ -NCOBMC_MODE_2, 6,
+ -NCOBMC_MODE_3, 8,
+ -NCOBMC_MODE_4, 10,
+ -NCOBMC_MODE_5, 12,
+ -NCOBMC_MODE_6, -NCOBMC_MODE_7
+};
+#endif // TWO_MODE
// TODO(weitinglin): find default prob
+// right now setting the first mode with probability 1/255,
+// the last eight modes with equal probabilities
static const aom_prob
default_ncobmc_mode_prob[ADAPT_OVERLAP_BLOCKS][MAX_NCOBMC_MODES - 1] = {
- { 23, 37, 37, 38, 65, 71, 81, 86 }, // 8x8
- { 28, 32, 37, 43, 51, 64, 85, 128 }, // 16X16 equal prob
- { 86, 22, 32, 25, 10, 40, 97, 65 }, // 32X32
- { 28, 32, 37, 43, 51, 64, 85, 128 } // 64X64 equal prob
+#ifdef TWO_MODE
+ { 127 }, { 127 }, { 127 }, { 127 }
+#else
+ { 32, 36, 43, 51, 64, 85, 128 }, // 8x8
+ { 32, 36, 43, 51, 64, 85, 128 }, // 16X16
+ { 32, 36, 43, 51, 64, 85, 128 }, // 32X32
+ { 32, 36, 43, 51, 64, 85, 128 } // 64X64
+#endif // TWO_MODE
};
static const aom_cdf_prob
default_ncobmc_mode_cdf[ADAPT_OVERLAP_BLOCKS][CDF_SIZE(MAX_NCOBMC_MODES)] =
- { { AOM_ICDF(127), AOM_ICDF(4207), AOM_ICDF(8287), AOM_ICDF(12367),
- AOM_ICDF(16447), AOM_ICDF(20527), AOM_ICDF(24607), AOM_ICDF(28687),
- AOM_ICDF(32768), 0 },
- { AOM_ICDF(127), AOM_ICDF(4207), AOM_ICDF(8287), AOM_ICDF(12367),
- AOM_ICDF(16447), AOM_ICDF(20527), AOM_ICDF(24607), AOM_ICDF(28687),
- AOM_ICDF(32768), 0 },
- { AOM_ICDF(127), AOM_ICDF(4207), AOM_ICDF(8287), AOM_ICDF(12367),
- AOM_ICDF(16447), AOM_ICDF(20527), AOM_ICDF(24607), AOM_ICDF(28687),
- AOM_ICDF(32768), 0 },
- { AOM_ICDF(127), AOM_ICDF(4207), AOM_ICDF(8287), AOM_ICDF(12367),
- AOM_ICDF(16447), AOM_ICDF(20527), AOM_ICDF(24607), AOM_ICDF(28687),
- AOM_ICDF(32768), 0 } };
+#ifdef TWO_MODE
+ { { AOM_ICDF(16256), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(16256), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(16256), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(16256), AOM_ICDF(32768), 0 } };
+#else
+ { { AOM_ICDF(4096), AOM_ICDF(8192), AOM_ICDF(12288), AOM_ICDF(16384),
+ AOM_ICDF(20480), AOM_ICDF(24576), AOM_ICDF(28672), AOM_ICDF(32768),
+ 0 },
+ { AOM_ICDF(4096), AOM_ICDF(8192), AOM_ICDF(12288), AOM_ICDF(16384),
+ AOM_ICDF(20480), AOM_ICDF(24576), AOM_ICDF(28672), AOM_ICDF(32768),
+ 0 },
+ { AOM_ICDF(4096), AOM_ICDF(8192), AOM_ICDF(12288), AOM_ICDF(16384),
+ AOM_ICDF(20480), AOM_ICDF(24576), AOM_ICDF(28672), AOM_ICDF(32768),
+ 0 },
+ { AOM_ICDF(4096), AOM_ICDF(8192), AOM_ICDF(12288), AOM_ICDF(16384),
+ AOM_ICDF(20480), AOM_ICDF(24576), AOM_ICDF(28672), AOM_ICDF(32768),
+ 0 } };
+#endif // TWO_MODEE
#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
-
// Change this section appropriately once warped motion is supported
#if CONFIG_MOTION_VAR && !CONFIG_WARPED_MOTION
-#if !CONFIG_NCOBMC_ADAPT_WEIGHT
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
+const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
+ -SIMPLE_TRANSLATION, 2, -OBMC_CAUSAL, -NCOBMC_ADAPT_WEIGHT,
+};
+static const aom_prob
+ default_motion_mode_prob[BLOCK_SIZES_ALL][MOTION_MODES - 1] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ { 255, 255 },
+ { 255, 255 },
+ { 255, 255 },
+#endif
+ { 255, 255 },
+ { 255, 255 },
+ { 255, 255 },
+ /** Only these nine block sizes allow ncobmc_adapt_weight **/
+ { 45, 207 },
+ { 42, 211 },
+ { 34, 207 },
+ { 181, 123 },
+ { 129, 141 },
+ { 15, 209 },
+ { 231, 122 },
+ { 195, 190 },
+ { 168, 190 },
+ /** ----------------------------------------------------- **/
+ { 244, 255 },
+#if CONFIG_EXT_PARTITION
+ { 252, 255 },
+ { 252, 255 },
+ { 252, 255 },
+#endif // CONFIG_EXT_PARTITION
+ { 255, 200 },
+ { 255, 200 },
+ { 255, 200 },
+ { 255, 200 },
+ };
+static const aom_cdf_prob
+ default_motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)] = {
+#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+#endif
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+ { AOM_ICDF(255 * 128), AOM_ICDF(32768), 0, 0 },
+ /** Only these seven block sizes allow ncobmc_adapt_weight **/
+ { AOM_ICDF(5702), AOM_ICDF(27555), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(5408), AOM_ICDF(27964), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(4330), AOM_ICDF(27298), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(23107), AOM_ICDF(27760), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(16490), AOM_ICDF(25461), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(1959), AOM_ICDF(27153), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(29530), AOM_ICDF(31073), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(25057), AOM_ICDF(30840), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(21588), AOM_ICDF(29940), AOM_ICDF(32768), 0 },
+ /** ----------------------------------------------------- **/
+ { AOM_ICDF(244 * 128), AOM_ICDF(32768), AOM_ICDF(32768), 0 },
+#if CONFIG_EXT_PARTITION
+ { AOM_ICDF(32256), AOM_ICDF(32768), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32256), AOM_ICDF(32768), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32256), AOM_ICDF(32768), AOM_ICDF(32768), 0 },
+#endif
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 }
+ };
+#else // CONFIG_NCOBMC_ADAPT_WEIGHT
const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
-SIMPLE_TRANSLATION, -OBMC_CAUSAL
};
@@ -815,62 +906,6 @@
{ AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
{ AOM_ICDF(255 * 128), AOM_ICDF(32768), 0 },
};
-
-#else
-// TODO(weitinglin): The default probability is copied from warped motion right
-// now as a place holder. It needs to be fined tuned after
-// NCOBMC_ADAPT_WEIGHT is actually implemented. Also needs to
-// change this section appropriately once warped motion is
-// supported.
-const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
- -SIMPLE_TRANSLATION, 2, -OBMC_CAUSAL, -NCOBMC_ADAPT_WEIGHT,
-};
-static const aom_prob
- default_motion_mode_prob[BLOCK_SIZES_ALL][MOTION_MODES - 1] = {
-#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
- { 255, 200 }, { 255, 200 }, { 255, 200 },
-#endif
- { 255, 200 }, { 255, 200 }, { 255, 200 }, { 151, 200 }, { 153, 200 },
- { 144, 200 }, { 178, 200 }, { 165, 200 }, { 160, 200 }, { 207, 200 },
- { 195, 200 }, { 168, 200 }, { 244, 200 },
-#if CONFIG_EXT_PARTITION
- { 252, 200 }, { 252, 200 }, { 252, 200 },
-#endif // CONFIG_EXT_PARTITION
- { 255, 200 }, { 255, 200 }, { 255, 200 }, { 255, 200 }, { 255, 200 },
- { 255, 200 },
- };
-static const aom_cdf_prob
- default_motion_mode_cdf[BLOCK_SIZES_ALL][CDF_SIZE(MOTION_MODES)] = {
-#if CONFIG_CHROMA_2X2 || CONFIG_CHROMA_SUB8X8
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
-#endif
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
- { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(32768), 0 },
- { AOM_ICDF(7936), AOM_ICDF(19091), AOM_ICDF(32768), 0 },
- { AOM_ICDF(4991), AOM_ICDF(19205), AOM_ICDF(32768), 0 },
- { AOM_ICDF(4992), AOM_ICDF(19314), AOM_ICDF(32768), 0 },
- { AOM_ICDF(15104), AOM_ICDF(21590), AOM_ICDF(32768), 0 },
- { AOM_ICDF(9855), AOM_ICDF(21043), AOM_ICDF(32768), 0 },
- { AOM_ICDF(12800), AOM_ICDF(22238), AOM_ICDF(32768), 0 },
- { AOM_ICDF(24320), AOM_ICDF(26498), AOM_ICDF(32768), 0 },
- { AOM_ICDF(26496), AOM_ICDF(28995), AOM_ICDF(32768), 0 },
- { AOM_ICDF(25216), AOM_ICDF(28166), AOM_ICDF(32768), 0 },
- { AOM_ICDF(30592), AOM_ICDF(31238), AOM_ICDF(32768), 0 },
-#if CONFIG_EXT_PARTITION
- { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32256), AOM_ICDF(32656), AOM_ICDF(32768), 0 },
-#endif
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- { AOM_ICDF(32640), AOM_ICDF(32740), AOM_ICDF(32768), 0 },
- };
#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
#elif !CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
@@ -925,7 +960,6 @@
};
#elif CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
-
const aom_tree_index av1_motion_mode_tree[TREE_SIZE(MOTION_MODES)] = {
-SIMPLE_TRANSLATION, 2, -OBMC_CAUSAL, -WARPED_CAUSAL,
};
diff --git a/av1/common/enums.h b/av1/common/enums.h
index 1e574d7..c225b4a 100644
--- a/av1/common/enums.h
+++ b/av1/common/enums.h
@@ -22,6 +22,11 @@
#undef MAX_SB_SIZE
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
+#define TWO_MODE
+// #define FOUR_MODE
+#endif
+
// Max superblock size
#if CONFIG_EXT_PARTITION
#define MAX_SB_SIZE_LOG2 7
@@ -196,9 +201,9 @@
#define MAX_NUM_TXB (1 << (MAX_SB_SIZE_LOG2 - MIN_TX_SIZE_LOG2))
-#if CONFIG_NCOBMC_ADAPT_WEIGHT && CONFIG_MOTION_VAR
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
typedef enum ATTRIBUTE_PACKED {
- NO_OVERLAP,
+ NCOBMC_MODE_0,
NCOBMC_MODE_1,
NCOBMC_MODE_2,
NCOBMC_MODE_3,
@@ -206,11 +211,24 @@
NCOBMC_MODE_5,
NCOBMC_MODE_6,
NCOBMC_MODE_7,
- NCOBMC_MODE_8,
- MAX_NCOBMC_MODES
-} NCOBMC_MODE;
-// #define MAX_INTRPL_MODES 9
+ ALL_NCOBMC_MODES,
+#ifdef TWO_MODE
+ MAX_NCOBMC_MODES = NCOBMC_MODE_1 + 1,
+#else
+ MAX_NCOBMC_MODES = ALL_NCOBMC_MODES,
#endif
+ NO_OVERLAP = MAX_NCOBMC_MODES + 1
+} NCOBMC_MODE;
+
+typedef enum {
+ ADAPT_OVERLAP_BLOCK_8X8,
+ ADAPT_OVERLAP_BLOCK_16X16,
+ ADAPT_OVERLAP_BLOCK_32X32,
+ ADAPT_OVERLAP_BLOCK_64X64,
+ ADAPT_OVERLAP_BLOCKS,
+ ADAPT_OVERLAP_BLOCK_INVALID = 255
+} ADAPT_OVERLAP_BLOCK;
+#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
// frame transform mode
typedef enum {
@@ -486,17 +504,6 @@
MOTION_MODES
} MOTION_MODE;
-#if CONFIG_NCOBMC_ADAPT_WEIGHT
-typedef enum {
- ADAPT_OVERLAP_BLOCK_8X8,
- ADAPT_OVERLAP_BLOCK_16X16,
- ADAPT_OVERLAP_BLOCK_32X32,
- ADAPT_OVERLAP_BLOCK_64X64,
- ADAPT_OVERLAP_BLOCKS,
- ADAPT_OVERLAP_BLOCK_INVALID = 255
-} ADAPT_OVERLAP_BLOCK;
-#endif
-
#if CONFIG_EXT_INTER
#if CONFIG_INTERINTRA
typedef enum {
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index 2896deb..66f7181 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -454,6 +454,9 @@
#if CONFIG_ANS && ANS_MAX_SYMBOLS
int ans_window_size_log2;
#endif
+#if CONFIG_NCOBMC_ADAPT_WEIGHT
+ NCOBMC_KERNELS ncobmc_kernels[ADAPT_OVERLAP_BLOCKS][ALL_NCOBMC_MODES];
+#endif
} AV1_COMMON;
#if CONFIG_REFERENCE_BUFFER