Add encoder support to ALTREF2

This CL adds the use of ALTREF2_FRAME to both single / comp reference
prediction at the encoder side. In particular, the encoder keeps the
distant altref as ALTREF, and uses the internal extra altrefs to
refresh ALTREF2.

Compared with the baseline (ext_tx and global_motion disabled simply
for speed concern):
(a) lowres: avg_psnr -0.395% ovr_psnr -0.393% ssim -0.329%
(b) midres: avg_psnr -0.419% ovr_psnr -0.431% ssim -0.444%
(c) AWCY High Latency:
   PSNR | PSNR Cb | PSNR Cr | PSNR HVS |    SSIM | MS SSIM | CIEDE 2000
-0.6661 | -0.5988 | -0.6669 |  -0.6993 | -0.6988 | -0.7303 | -0.6051
(d) AWCY Low Latency:
  PSNR | PSNR Cb | PSNR Cr | PSNR HVS |   SSIM | MS SSIM | CIEDE 2000
0.0720 | -0.0505 |  0.1501 |   0.0670 | 0.0842 |  0.0517 |     0.0158

TODO list:
(1) To have altref2 incorporated with ext-comp-refs;
(2) To have altref2 fully work with new-multisymbol;
(3) To re-collect the initial default probs/cdfs;
(4) To tune the encoder gf group structure design for altref2.

Change-Id: I6ad63fd65afa903d3bba20acdb68e3b67acf7fdf
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index 07f0dfc..a6cb4ca 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -45,12 +45,6 @@
 
 #define INVALID_MV 0x80008000
 
-#if CONFIG_EXT_REFS
-#define MAX_REFS 15
-#else
-#define MAX_REFS 6
-#endif  // CONFIG_EXT_REFS
-
 #define RD_THRESH_MAX_FACT 64
 #define RD_THRESH_INC 1
 
@@ -62,6 +56,9 @@
   THR_NEARESTL2,
   THR_NEARESTL3,
   THR_NEARESTB,
+#if CONFIG_ALTREF2
+  THR_NEARESTA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
   THR_NEARESTA,
   THR_NEARESTG,
@@ -73,6 +70,9 @@
   THR_NEWL2,
   THR_NEWL3,
   THR_NEWB,
+#if CONFIG_ALTREF2
+  THR_NEWA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
   THR_NEWA,
   THR_NEWG,
@@ -82,6 +82,9 @@
   THR_NEARL2,
   THR_NEARL3,
   THR_NEARB,
+#if CONFIG_ALTREF2
+  THR_NEARA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
   THR_NEARA,
   THR_NEARG,
@@ -91,9 +94,12 @@
   THR_ZEROL2,
   THR_ZEROL3,
   THR_ZEROB,
+#if CONFIG_ALTREF2
+  THR_ZEROA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
-  THR_ZEROG,
   THR_ZEROA,
+  THR_ZEROG,
 
 #if CONFIG_EXT_INTER
 
@@ -156,6 +162,12 @@
   THR_COMP_NEAREST_NEARESTL2B,
   THR_COMP_NEAREST_NEARESTL3B,
   THR_COMP_NEAREST_NEARESTGB,
+#if CONFIG_ALTREF2
+  THR_COMP_NEAREST_NEARESTLA2,
+  THR_COMP_NEAREST_NEARESTL2A2,
+  THR_COMP_NEAREST_NEARESTL3A2,
+  THR_COMP_NEAREST_NEARESTGA2,
+#endif  // CONFIG_ALTREF2
 #if CONFIG_EXT_COMP_REFS
   THR_COMP_NEAREST_NEARESTLL2,
   THR_COMP_NEAREST_NEARESTLL3,
@@ -177,6 +189,12 @@
   THR_COMP_NEARESTL2B,
   THR_COMP_NEARESTL3B,
   THR_COMP_NEARESTGB,
+#if CONFIG_ALTREF2
+  THR_COMP_NEARESTLA2,
+  THR_COMP_NEARESTL2A2,
+  THR_COMP_NEARESTL3A2,
+  THR_COMP_NEARESTGA2,
+#endif  // CONFIG_ALTREF2
 #if CONFIG_EXT_COMP_REFS
   THR_COMP_NEARESTLL2,
   THR_COMP_NEARESTLL3,
@@ -266,6 +284,40 @@
   THR_COMP_NEW_NEWGB,
   THR_COMP_ZERO_ZEROGB,
 
+#if CONFIG_ALTREF2
+  THR_COMP_NEAR_NEARLA2,
+  THR_COMP_NEW_NEARESTLA2,
+  THR_COMP_NEAREST_NEWLA2,
+  THR_COMP_NEW_NEARLA2,
+  THR_COMP_NEAR_NEWLA2,
+  THR_COMP_NEW_NEWLA2,
+  THR_COMP_ZERO_ZEROLA2,
+
+  THR_COMP_NEAR_NEARL2A2,
+  THR_COMP_NEW_NEARESTL2A2,
+  THR_COMP_NEAREST_NEWL2A2,
+  THR_COMP_NEW_NEARL2A2,
+  THR_COMP_NEAR_NEWL2A2,
+  THR_COMP_NEW_NEWL2A2,
+  THR_COMP_ZERO_ZEROL2A2,
+
+  THR_COMP_NEAR_NEARL3A2,
+  THR_COMP_NEW_NEARESTL3A2,
+  THR_COMP_NEAREST_NEWL3A2,
+  THR_COMP_NEW_NEARL3A2,
+  THR_COMP_NEAR_NEWL3A2,
+  THR_COMP_NEW_NEWL3A2,
+  THR_COMP_ZERO_ZEROL3A2,
+
+  THR_COMP_NEAR_NEARGA2,
+  THR_COMP_NEW_NEARESTGA2,
+  THR_COMP_NEAREST_NEWGA2,
+  THR_COMP_NEW_NEARGA2,
+  THR_COMP_NEAR_NEWGA2,
+  THR_COMP_NEW_NEWGA2,
+  THR_COMP_ZERO_ZEROGA2,
+#endif  // CONFIG_ALTREF2
+
 #if CONFIG_EXT_COMP_REFS
   THR_COMP_NEAR_NEARLL2,
   THR_COMP_NEW_NEARESTLL2,
@@ -324,6 +376,17 @@
   THR_COMP_NEARGB,
   THR_COMP_NEWGB,
 
+#if CONFIG_ALTREF2
+  THR_COMP_NEARLA2,
+  THR_COMP_NEWLA2,
+  THR_COMP_NEARL2A2,
+  THR_COMP_NEWL2A2,
+  THR_COMP_NEARL3A2,
+  THR_COMP_NEWL3A2,
+  THR_COMP_NEARGA2,
+  THR_COMP_NEWGA2,
+#endif  // CONFIG_ALTREF2
+
 #if CONFIG_EXT_COMP_REFS
   THR_COMP_NEARLL2,
   THR_COMP_NEWLL2,
@@ -349,6 +412,13 @@
   THR_COMP_ZEROL3B,
   THR_COMP_ZEROGB,
 
+#if CONFIG_ALTREF2
+  THR_COMP_ZEROLA2,
+  THR_COMP_ZEROL2A2,
+  THR_COMP_ZEROL3A2,
+  THR_COMP_ZEROGA2,
+#endif  // CONFIG_ALTEF2
+
 #if CONFIG_EXT_COMP_REFS
   THR_COMP_ZEROLL2,
   THR_COMP_ZEROLL3,
@@ -396,6 +466,13 @@
   THR_COMP_INTERINTRA_NEARESTB,
   THR_COMP_INTERINTRA_NEARB,
   THR_COMP_INTERINTRA_NEWB,
+
+#if CONFIG_ALTREF2
+  THR_COMP_INTERINTRA_ZEROA2,
+  THR_COMP_INTERINTRA_NEARESTA2,
+  THR_COMP_INTERINTRA_NEARA2,
+  THR_COMP_INTERINTRA_NEWA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
 
   THR_COMP_INTERINTRA_ZEROA,
@@ -412,6 +489,9 @@
   THR_LAST2,
   THR_LAST3,
   THR_BWDR,
+#if CONFIG_ALTREF2
+  THR_ALTR2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
   THR_GOLD,
   THR_ALTR,
@@ -428,9 +508,18 @@
   THR_COMP_L2B,
   THR_COMP_L3B,
   THR_COMP_GB,
+
+#if CONFIG_ALTREF2
+  THR_COMP_LA2,
+  THR_COMP_L2A2,
+  THR_COMP_L3A2,
+  THR_COMP_GA2,
+#endif  // CONFIG_ALTREF2
 #endif  // CONFIG_EXT_REFS
 
   THR_INTRA,
+
+  MAX_REFS
 } THR_MODES_SUB8X8;
 
 typedef struct RD_OPT {