rtc: Allow for compound predicton for svc

Add flag to SVC_REF_FRAME_CONFIG to pass in option
for compound prediction in non_rd (speed >= 7).
Add some logic to nonrd_pickmode for more testing of
comp_pred on base temporal layers.

Change-Id: If5d6bf03c2feccbc836e88e8fac2436bba5f3c11
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 621835a..e7ea71f 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -1502,7 +1502,8 @@
   int reference[7]; /**< Reference flag for each of the 7 references. */
   /*! Buffer slot index for each of 7 references. */
   int ref_idx[7];
-  int refresh[8]; /**< Refresh flag for each of the 8 slots. */
+  int refresh[8];    /**< Refresh flag for each of the 8 slots. */
+  int use_comp_pred; /**< Use compound prediction. */
 } aom_svc_ref_frame_config_t;
 
 /*!\cond */
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index e0f3ef5..3f67e46 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -3151,6 +3151,7 @@
   }
   for (unsigned int i = 0; i < REF_FRAMES; ++i)
     cpi->svc.refresh[i] = data->refresh[i];
+  cpi->svc.use_comp_pred = data->use_comp_pred;
   cpi->svc.use_flexible_mode = 1;
   cpi->svc.ksvc_fixed_mode = 0;
   return AOM_CODEC_OK;
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index b42ff27..86c186d 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2480,10 +2480,15 @@
                          use_ref_frame_mask, &force_skip_low_temp_var);
 
   // Test compound modes: LAST_GOLDEN for 0/NEARESST/NEAR.
-  // For now to reduce slowdowm, uses only 0/0 for blocks above 16x16.
-  if (cpi->sf.rt_sf.use_comp_ref_nonrd && is_comp_ref_allowed(bsize) &&
-      bsize > BLOCK_16X16)
-    num_comp_modes = 1;
+  // For now to reduce slowdowm, use only 0/0 for blocks above 16x16
+  // for non-svc case or on enhancement layers for svc.
+  if (cpi->sf.rt_sf.use_comp_ref_nonrd && is_comp_ref_allowed(bsize)) {
+    if (cpi->ppi->use_svc && cpi->svc.use_comp_pred &&
+        cpi->svc.temporal_layer_id == 0)
+      num_comp_modes = 3;
+    else if (bsize > BLOCK_16X16)
+      num_comp_modes = 1;
+  }
 
   for (MV_REFERENCE_FRAME ref_frame_iter = LAST_FRAME;
        ref_frame_iter <= ALTREF_FRAME; ++ref_frame_iter) {
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8d8c270..b989c05 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1212,6 +1212,13 @@
       sf->rt_sf.estimate_motion_for_var_based_partition = 0;
     }
   }
+  if (cpi->ppi->use_svc && cpi->svc.use_comp_pred &&
+      (cpi->svc.reference[GOLDEN_FRAME - 1] == 1 ||
+       cpi->svc.reference[LAST2_FRAME - 1] == 1)) {
+    sf->rt_sf.use_comp_ref_nonrd = 1;
+    sf->rt_sf.ref_frame_comp_nonrd =
+        (cpi->svc.reference[GOLDEN_FRAME - 1] == 1) ? 0 : 1;
+  }
 }
 
 // TODO(kyslov): now this is very similar to
diff --git a/av1/encoder/svc_layercontext.h b/av1/encoder/svc_layercontext.h
index 817e362..bda7be9 100644
--- a/av1/encoder/svc_layercontext.h
+++ b/av1/encoder/svc_layercontext.h
@@ -99,6 +99,7 @@
   int non_reference_frame;
   int use_flexible_mode;
   int ksvc_fixed_mode;
+  int use_comp_pred;
   /*!\endcond */
 
   /*!
diff --git a/examples/svc_encoder_rtc.c b/examples/svc_encoder_rtc.c
index 44bed38..35a1bd4 100644
--- a/examples/svc_encoder_rtc.c
+++ b/examples/svc_encoder_rtc.c
@@ -571,6 +571,7 @@
   layer_id->spatial_layer_id = spatial_layer_id;
   int lag_index = 0;
   int base_count = superframe_cnt >> 2;
+  ref_frame_config->use_comp_pred = 0;
   // Set the reference map buffer idx for the 7 references:
   // LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
   // BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).