Add a new intra prediction mode "smooth".
This is added as part of ALT_INTRA experiment.
This uses interpolation between top row and estimated bottom row; as
well as left column and estimated right column to generate the
predicted block.The interpolation is done using a predefined weight
array.
Based on experiments, the currently chosen weight array was created
to represent a quadratic curve, but can be tuned further if needed.
Improvement from baseline on Derf set:
ALL Keyframes: 1.279%
Improvement from existing ALT_INTRA:
ALL Keyframes: 1.146%
Change-Id: I12637fa1b91bd836f1c59b27d6caee2004acbdd4
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 8b7f19d..d828275 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -1136,11 +1136,19 @@
(unsigned int *)cpi->mode_chosen_counts; // Cast const away.
if (frame_is_intra_only(cm)) {
static const int kf_mode_index[] = {
- THR_DC /*DC_PRED*/, THR_V_PRED /*V_PRED*/,
- THR_H_PRED /*H_PRED*/, THR_D45_PRED /*D45_PRED*/,
- THR_D135_PRED /*D135_PRED*/, THR_D117_PRED /*D117_PRED*/,
- THR_D153_PRED /*D153_PRED*/, THR_D207_PRED /*D207_PRED*/,
- THR_D63_PRED /*D63_PRED*/, THR_TM /*TM_PRED*/,
+ THR_DC /*DC_PRED*/,
+ THR_V_PRED /*V_PRED*/,
+ THR_H_PRED /*H_PRED*/,
+ THR_D45_PRED /*D45_PRED*/,
+ THR_D135_PRED /*D135_PRED*/,
+ THR_D117_PRED /*D117_PRED*/,
+ THR_D153_PRED /*D153_PRED*/,
+ THR_D207_PRED /*D207_PRED*/,
+ THR_D63_PRED /*D63_PRED*/,
+#if CONFIG_ALT_INTRA
+ THR_SMOOTH, /*SMOOTH_PRED*/
+#endif // CONFIG_ALT_INTRA
+ THR_TM /*TM_PRED*/,
};
++mode_chosen_counts[kf_mode_index[mbmi->mode]];
} else {
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index c9d21a8..35093e2d 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -45,24 +45,6 @@
#define INVALID_MV 0x80008000
#if CONFIG_EXT_REFS
-
-#if CONFIG_EXT_INTER
-#define MAX_MODES 144
-#else // CONFIG_EXT_INTER
-#define MAX_MODES 66
-#endif // CONFIG_EXT_INTER
-
-#else // CONFIG_EXT_REFS
-
-#if CONFIG_EXT_INTER
-#define MAX_MODES 57
-#else // CONFIG_EXT_INTER
-#define MAX_MODES 30
-#endif // CONFIG_EXT_INTER
-
-#endif // CONFIG_EXT_REFS
-
-#if CONFIG_EXT_REFS
#define MAX_REFS 15
#else
#define MAX_REFS 6
@@ -157,6 +139,10 @@
THR_TM,
+#if CONFIG_ALT_INTRA
+ THR_SMOOTH,
+#endif // CONFIG_ALT_INTRA
+
#if CONFIG_EXT_INTER
THR_COMP_NEAR_NEARESTLA,
@@ -327,6 +313,7 @@
THR_COMP_INTERINTRA_NEARA,
THR_COMP_INTERINTRA_NEWA,
#endif // CONFIG_EXT_INTER
+ MAX_MODES
} THR_MODES;
typedef enum {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index b15b88a..b765d8c 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -224,6 +224,10 @@
{ TM_PRED, { INTRA_FRAME, NONE } },
+#if CONFIG_ALT_INTRA
+ { SMOOTH_PRED, { INTRA_FRAME, NONE } },
+#endif // CONFIG_ALT_INTRA
+
#if CONFIG_EXT_INTER
{ NEAR_NEARESTMV, { LAST_FRAME, ALTREF_FRAME } },
{ NEAREST_NEARMV, { LAST_FRAME, ALTREF_FRAME } },
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index c6821bf..c59fce8 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -21,7 +21,11 @@
enum {
INTRA_ALL = (1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED) | (1 << D45_PRED) |
(1 << D135_PRED) | (1 << D117_PRED) | (1 << D153_PRED) |
- (1 << D207_PRED) | (1 << D63_PRED) | (1 << TM_PRED),
+ (1 << D207_PRED) | (1 << D63_PRED) |
+#if CONFIG_ALT_INTRA
+ (1 << SMOOTH_PRED) |
+#endif // CONFIG_ALT_INTRA
+ (1 << TM_PRED),
INTRA_DC = (1 << DC_PRED),
INTRA_DC_TM = (1 << DC_PRED) | (1 << TM_PRED),
INTRA_DC_H_V = (1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED),