rtc-svc: Add K-SVC mode to SVC sample encoder

Add another case (#9) to SVC sample encoder for K-SVC
(only do inter-layer prediction on key frames).

Also disable two codec features not currently used
for RTC: TPL_MODEL and DELTAQ_MODE.

Change-Id: If73ef2d164ee0424c1f59871572cc46147b0674b
diff --git a/examples/svc_encoder_rtc.c b/examples/svc_encoder_rtc.c
index 7dbce04..835308d 100644
--- a/examples/svc_encoder_rtc.c
+++ b/examples/svc_encoder_rtc.c
@@ -30,9 +30,9 @@
 
 void usage_exit(void) { exit(EXIT_FAILURE); }
 
-static int mode_to_num_temporal_layers[9] = { 1, 2, 3, 3, 2, 1, 1, 3, 3 };
-static int mode_to_num_spatial_layers[9] = { 1, 1, 1, 1, 1, 2, 3, 3, 3 };
-static int mode_to_num_layers[9] = { 1, 2, 3, 3, 2, 2, 3, 9, 9 };
+static int mode_to_num_temporal_layers[10] = { 1, 2, 3, 3, 2, 1, 1, 3, 3, 3 };
+static int mode_to_num_spatial_layers[10] = { 1, 1, 1, 1, 1, 2, 3, 3, 3, 3 };
+static int mode_to_num_layers[10] = { 1, 2, 3, 3, 2, 2, 3, 9, 9, 9 };
 
 // For rate control encoding stats.
 struct RateControlMetrics {
@@ -248,7 +248,8 @@
 static int set_layer_pattern(int layering_mode, int superframe_cnt,
                              aom_svc_layer_id_t *layer_id,
                              aom_svc_ref_frame_config_t *ref_frame_config,
-                             int *use_svc_control, int spatial_layer_id) {
+                             int *use_svc_control, int spatial_layer_id,
+                             int is_key_frame, int ksvc_mode) {
   int i;
   int shift = (layering_mode == 7) ? 2 : 0;
   *use_svc_control = 1;
@@ -262,6 +263,13 @@
   int layer_flags = AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 |
                     AOM_EFLAG_NO_REF_ARF | AOM_EFLAG_NO_REF_BWD |
                     AOM_EFLAG_NO_REF_ARF2;
+  if (ksvc_mode) {
+    // Same pattern as case 8.
+    layering_mode = 8;
+    if (!is_key_frame)
+      // No inter-layer prediction on inter-frames.
+      layer_flags |= AOM_EFLAG_NO_REF_GF;
+  }
   switch (layering_mode) {
     case 0:
       // 1-layer: update LAST on every frame, reference LAST and GF.
@@ -728,6 +736,8 @@
   aom_codec_control(&codec, AV1E_SET_GF_CBR_BOOST_PCT, 0);
   aom_codec_control(&codec, AV1E_SET_ENABLE_CDEF, 1);
   aom_codec_control(&codec, AV1E_SET_ENABLE_ORDER_HINT, 0);
+  aom_codec_control(&codec, AV1E_SET_ENABLE_TPL_MODEL, 0);
+  aom_codec_control(&codec, AV1E_SET_DELTAQ_MODE, 0);
 
   svc_params.number_spatial_layers = ss_number_layers;
   svc_params.number_temporal_layers = ts_number_layers;
@@ -764,6 +774,7 @@
   while (frame_avail || got_data) {
     struct aom_usec_timer timer;
     frame_avail = read_frame(&input_ctx, &raw);
+    int is_key_frame = (frame_cnt % cfg.kf_max_dist) == 0;
     // Loop over spatial layers.
     for (unsigned int slx = 0; slx < ss_number_layers; slx++) {
       aom_codec_iter_t iter = NULL;
@@ -773,7 +784,8 @@
       // Set the reference/update flags, layer_id, and reference_map
       // buffer index.
       flags = set_layer_pattern(layering_mode, frame_cnt, &layer_id,
-                                &ref_frame_config, &use_svc_control, slx);
+                                &ref_frame_config, &use_svc_control, slx,
+                                is_key_frame, (layering_mode == 9));
       aom_codec_control(&codec, AV1E_SET_SVC_LAYER_ID, &layer_id);
       if (use_svc_control)
         aom_codec_control(&codec, AV1E_SET_SVC_REF_FRAME_CONFIG,