rtc: Fix use of prev_frame for spatial layers
The usage of cm->prev_frame in cyclic_refresh
should only be for single spatial layers, and also
not used for external_ratectrl.
Also fix the update of prev_number_spatial_layers
for dropped frames, and force the usage of
cyclic_refresh_reset_resize() only for TL0, as
cyclic_refresh is only used for TL0 frames.
Bug: b:400885218
Change-Id: Id739cbae29092736e093a56ffc0defc3760e9535
diff --git a/av1/encoder/aq_cyclicrefresh.c b/av1/encoder/aq_cyclicrefresh.c
index ea337e3..2e6d949 100644
--- a/av1/encoder/aq_cyclicrefresh.c
+++ b/av1/encoder/aq_cyclicrefresh.c
@@ -565,15 +565,15 @@
const int layer_depth = AOMMIN(gf_group->layer_depth[cpi->gf_frame_index], 6);
const FRAME_TYPE frame_type = cm->current_frame.frame_type;
- // Set resolution_change flag: for svc only set it when the
- // number of spatial layers has not changed.
- const int resolution_change =
- cm->prev_frame &&
- (cm->width != cm->prev_frame->width ||
- cm->height != cm->prev_frame->height) &&
- cpi->svc.prev_number_spatial_layers == cpi->svc.number_spatial_layers;
+ // Set resolution_change flag: for single spatial layers only.
+ const int resolution_change = !cpi->rc.rtc_external_ratectrl &&
+ cm->prev_frame &&
+ cpi->svc.number_spatial_layers == 1 &&
+ (cm->width != cm->prev_frame->width ||
+ cm->height != cm->prev_frame->height);
- if (resolution_change) cyclic_refresh_reset_resize(cpi);
+ if (resolution_change && cpi->svc.temporal_layer_id == 0)
+ cyclic_refresh_reset_resize(cpi);
if (!cr->apply_cyclic_refresh) {
// Don't disable and set seg_map to 0 if active_maps is enabled, unless
// whole frame is set as inactive (since we only apply cyclic_refresh to
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 479ef85..64968ab 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -2019,7 +2019,8 @@
init_encode_frame_mb_context(cpi);
set_default_interp_skip_flags(cm, &cpi->interp_search_flags);
- if (cm->prev_frame && cm->prev_frame->seg.enabled)
+ if (cm->prev_frame && cm->prev_frame->seg.enabled &&
+ cpi->svc.number_spatial_layers == 1)
cm->last_frame_seg_map = cm->prev_frame->seg_map;
else
cm->last_frame_seg_map = NULL;
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 2461cfb..750f5ae 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -2494,6 +2494,9 @@
cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = true;
cpi->svc.drop_spatial_layer[cpi->svc.spatial_layer_id] = true;
}
+ if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) {
+ cpi->svc.prev_number_spatial_layers = cpi->svc.number_spatial_layers;
+ }
}
int av1_find_qindex(double desired_q, aom_bit_depth_t bit_depth,