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,