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];