[segment_pred_last] fix resolution change issues

explicitly disable segmentation when ref frame has different
resolution

BUG=aomedia:1205
BUG=aomedia:1223
BUG=aomedia:1256

Change-Id: I6db51116db308514d572eb465c2453403e64e1f2
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 6e0d4f6..23ad7fe 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -3081,13 +3081,15 @@
 
   av1_clearall_segfeatures(&cm->seg);
 
-  if (cm->last_frame_seg_map && !cm->frame_parallel_decode)
-#if !CONFIG_SEGMENT_PRED_LAST
-    memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
-#else
-    memset(cm->last_frame_seg_map, 0,
-           (cm->prev_frame->mi_cols * cm->prev_frame->mi_rows));
+#if CONFIG_SEGMENT_PRED_LAST
+  cm->current_frame_seg_map = cm->cur_frame->seg_map;
 #endif
+
+#if !CONFIG_SEGMENT_PRED_LAST
+  if (cm->last_frame_seg_map && !cm->frame_parallel_decode)
+    memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
+#endif
+
   if (cm->current_frame_seg_map)
     memset(cm->current_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
 
diff --git a/av1/encoder/aq_complexity.c b/av1/encoder/aq_complexity.c
index 91ed0ff..201691d 100644
--- a/av1/encoder/aq_complexity.c
+++ b/av1/encoder/aq_complexity.c
@@ -48,10 +48,24 @@
 void av1_setup_in_frame_q_adj(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
   struct segmentation *const seg = &cm->seg;
+#if CONFIG_SEGMENT_PRED_LAST
+  int resolution_change =
+      (cm->width != cm->last_width || cm->height != cm->last_height) &&
+      cm->prev_frame;
+#endif
 
   // Make SURE use of floating point in this function is safe.
   aom_clear_system_state();
 
+#if CONFIG_SEGMENT_PRED_LAST
+  if (resolution_change) {
+    memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
+    av1_clearall_segfeatures(seg);
+    av1_disable_segmentation(seg);
+    return;
+  }
+#endif
+
   if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
       cpi->refresh_alt_ref_frame ||
       (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
diff --git a/av1/encoder/aq_cyclicrefresh.c b/av1/encoder/aq_cyclicrefresh.c
index 12bdc80..a45a0ef 100644
--- a/av1/encoder/aq_cyclicrefresh.c
+++ b/av1/encoder/aq_cyclicrefresh.c
@@ -479,6 +479,18 @@
   CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
   struct segmentation *const seg = &cm->seg;
   const int apply_cyclic_refresh = apply_cyclic_refresh_bitrate(cm, rc);
+#if CONFIG_SEGMENT_PRED_LAST
+  int resolution_change =
+      (cm->width != cm->last_width || cm->height != cm->last_height) &&
+      cm->prev_frame;
+  if (resolution_change) {
+    memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
+    av1_clearall_segfeatures(seg);
+    aom_clear_system_state();
+    av1_disable_segmentation(seg);
+    return;
+  }
+#endif
   if (cm->current_video_frame == 0) cr->low_content_avg = 0.0;
   // Don't apply refresh on key frame or enhancement layer frames.
   if (!apply_cyclic_refresh || cm->frame_type == KEY_FRAME) {
diff --git a/av1/encoder/aq_variance.c b/av1/encoder/aq_variance.c
index 0b48f62..fc7e295 100644
--- a/av1/encoder/aq_variance.c
+++ b/av1/encoder/aq_variance.c
@@ -47,6 +47,18 @@
   struct segmentation *seg = &cm->seg;
   int i;
 
+#if CONFIG_SEGMENT_PRED_LAST
+  int resolution_change =
+      (cm->width != cm->last_width || cm->height != cm->last_height) &&
+      cm->prev_frame;
+  if (resolution_change) {
+    memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
+    av1_clearall_segfeatures(seg);
+    aom_clear_system_state();
+    av1_disable_segmentation(seg);
+    return;
+  }
+#endif
   if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
       cpi->refresh_alt_ref_frame ||
       (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index f242d00..7a4e9b1 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -310,11 +310,17 @@
 
 static void setup_frame(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
-  // Set up entropy context depending on frame type. The decoder mandates
-  // the use of the default context, index 0, for keyframes and inter
-  // frames where the error_resilient_mode or intra_only flag is set. For
-  // other inter-frames the encoder currently uses only two contexts;
-  // context 1 for ALTREF frames and context 0 for the others.
+// Set up entropy context depending on frame type. The decoder mandates
+// the use of the default context, index 0, for keyframes and inter
+// frames where the error_resilient_mode or intra_only flag is set. For
+// other inter-frames the encoder currently uses only two contexts;
+// context 1 for ALTREF frames and context 0 for the others.
+
+#if CONFIG_SEGMENT_PRED_LAST
+  if (cm->prev_frame) cm->last_frame_seg_map = cm->prev_frame->seg_map;
+  cm->current_frame_seg_map = cm->cur_frame->seg_map;
+#endif
+
   if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
     av1_setup_past_independence(cm);
   } else {