Fix an issue with refresh with external frame flags. For the case where the user supplies the frame_flags via the EFLAG_NO_UPD_#: LAST should be used instead of LAST3 in get_refresh_frame_flags. Added an example (case 4) for 2 temporal layers in svc_encoder_rtc to verfiy this. In general for RTC appplication the new svc.external_ref_frame_config should be used for setting the references and updates, so this is an non-issue for that case. This change only affects the case where user uses the old EFLAG_NO_UPD_# flags. Change-Id: Ibbbafee7893b2e8eb2042f3dd8d1178f98877733
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c index 667951d..6bd325a 100644 --- a/av1/encoder/encode_strategy.c +++ b/av1/encoder/encode_strategy.c
@@ -910,7 +910,7 @@ // Unfortunately the encoder interface reflects the old refresh_*_frame // flags so we have to replicate the old refresh_frame_flags logic here in // order to preserve the behaviour of the flag overrides. - int ref_frame_map_idx = get_ref_frame_map_idx(cm, LAST3_FRAME); + int ref_frame_map_idx = get_ref_frame_map_idx(cm, LAST_FRAME); if (ref_frame_map_idx != INVALID_IDX) refresh_mask |= cpi->ext_refresh_last_frame << ref_frame_map_idx;
diff --git a/examples/svc_encoder_rtc.c b/examples/svc_encoder_rtc.c index c5d97cd..2e9d5fc 100644 --- a/examples/svc_encoder_rtc.c +++ b/examples/svc_encoder_rtc.c
@@ -30,7 +30,7 @@ void usage_exit(void) { exit(EXIT_FAILURE); } -static int mode_to_num_layers[4] = { 1, 2, 3, 3 }; +static int mode_to_num_layers[5] = { 1, 2, 3, 3, 2 }; // For rate control encoding stats. struct RateControlMetrics { @@ -238,8 +238,10 @@ // Layer pattern configuration. static int set_layer_pattern(int layering_mode, int frame_cnt, aom_svc_layer_id_t *layer_id, - aom_svc_ref_frame_config_t *ref_frame_config) { + aom_svc_ref_frame_config_t *ref_frame_config, + int *use_svc_control) { int i; + *use_svc_control = 1; // No spatial layers in this test. layer_id->spatial_layer_id = 0; // Set the referende map buffer idx for the 7 references: @@ -327,6 +329,22 @@ layer_flags |= AOM_EFLAG_NO_REF_LAST; } break; + case 4: + // 2-layer with the old update flags, not with the new SVC control. + *use_svc_control = 0; + // 1 3 5 + // 0 2 4 + if (frame_cnt % 2 == 0) { + layer_id->temporal_layer_id = 0; + // Update LAST on layer 0, reference LAST and GF. + layer_flags |= AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF; + } else { + layer_id->temporal_layer_id = 1; + // No updates on layer 1, only reference LAST (TL0). + layer_flags |= AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | + AOM_EFLAG_NO_UPD_ARF | AOM_EFLAG_NO_REF_GF; + } + break; default: assert(0); die("Error: Unsupported temporal layering mode!\n"); } return layer_flags; @@ -362,6 +380,7 @@ double sum_bitrate = 0.0; double sum_bitrate2 = 0.0; double framerate = 30.0; + int use_svc_control = 1; zero(rc.layer_target_bitrate); memset(&layer_id, 0, sizeof(aom_svc_layer_id_t)); memset(&input_ctx, 0, sizeof(input_ctx)); @@ -549,9 +568,11 @@ // 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); + &ref_frame_config, &use_svc_control); aom_codec_control(&codec, AV1E_SET_SVC_LAYER_ID, &layer_id); - aom_codec_control(&codec, AV1E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config); + if (use_svc_control) + aom_codec_control(&codec, AV1E_SET_SVC_REF_FRAME_CONFIG, + &ref_frame_config); frame_avail = read_frame(&input_ctx, &raw); if (frame_avail) ++rc.layer_input_frames[layer_id.temporal_layer_id];