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,