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),