Use last_frame_seg_map only when seg enabled on last frame.

last_frame_seg_map should be NULL when segmentation is disabled on last
frame.

Reverted the temporary fix.

BUG=2512

Change-Id: Iddc084706ab2d5aded8148640b63eb1e1e60fb8a
diff --git a/av1/common/seg_common.h b/av1/common/seg_common.h
index aeb9c17..9efa48e 100644
--- a/av1/common/seg_common.h
+++ b/av1/common/seg_common.h
@@ -76,6 +76,7 @@
   }
   dst->segid_preskip = src->segid_preskip;
   dst->last_active_segid = src->last_active_segid;
+  dst->enabled = src->enabled;
 }
 
 void av1_clearall_segfeatures(struct segmentation *seg);
diff --git a/av1/encoder/aq_cyclicrefresh.h b/av1/encoder/aq_cyclicrefresh.h
index 7f4567c..774b165 100644
--- a/av1/encoder/aq_cyclicrefresh.h
+++ b/av1/encoder/aq_cyclicrefresh.h
@@ -65,10 +65,6 @@
   int qindex_delta[3];
   double weight_segment;
   int apply_cyclic_refresh;
-  // Indicate whether cyclic refresh is turned off for last frame. Used to
-  // disable temporal update for segment map when cyclic refresh is turned back
-  // on.
-  int last_frame_apply_cr;
 };
 
 struct AV1_COMP;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index eefbe1e..f3f5a76 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2052,10 +2052,9 @@
   }
 }
 
-static AOM_INLINE void encode_segmentation(AV1_COMP *cpi, MACROBLOCKD *xd,
+static AOM_INLINE void encode_segmentation(AV1_COMMON *cm, MACROBLOCKD *xd,
                                            struct aom_write_bit_buffer *wb) {
   int i, j;
-  AV1_COMMON *const cm = &cpi->common;
   struct segmentation *seg = &cm->seg;
 
   aom_wb_write_bit(wb, seg->enabled);
@@ -2070,7 +2069,7 @@
     aom_wb_write_bit(wb, seg->update_map);
     if (seg->update_map) {
       // Select the coding strategy (temporal or spatial)
-      av1_choose_segmap_coding_method(cpi, xd);
+      av1_choose_segmap_coding_method(cm, xd);
       aom_wb_write_bit(wb, seg->temporal_update);
     }
     aom_wb_write_bit(wb, seg->update_data);
@@ -3063,7 +3062,7 @@
 
   write_tile_info(cm, saved_wb, wb);
   encode_quantization(cm, wb);
-  encode_segmentation(cpi, xd, wb);
+  encode_segmentation(cm, xd, wb);
 
   const DeltaQInfo *const delta_q_info = &cm->delta_q_info;
   if (delta_q_info->delta_q_present_flag) assert(cm->base_qindex > 0);
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index d689adb..7eb1ca1 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5118,7 +5118,7 @@
 
   init_encode_frame_mb_context(cpi);
   set_default_interp_skip_flags(cpi);
-  if (cm->prev_frame)
+  if (cm->prev_frame && cm->prev_frame->seg.enabled)
     cm->last_frame_seg_map = cm->prev_frame->seg_map;
   else
     cm->last_frame_seg_map = NULL;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 8b39b04..8803e2d 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -6062,9 +6062,6 @@
     cpi->need_to_clear_prev_hash_table = 1;
   }
 
-  cpi->cyclic_refresh->last_frame_apply_cr =
-      cpi->cyclic_refresh->apply_cyclic_refresh;
-
   // Clear the one shot update flags for segmentation map and mode/ref loop
   // filter deltas.
   cm->seg.update_map = 0;
diff --git a/av1/encoder/segmentation.c b/av1/encoder/segmentation.c
index e144005..9c1ede1 100644
--- a/av1/encoder/segmentation.c
+++ b/av1/encoder/segmentation.c
@@ -168,8 +168,7 @@
 #undef CSEGS
 }
 
-void av1_choose_segmap_coding_method(AV1_COMP *cpi, MACROBLOCKD *xd) {
-  AV1_COMMON *const cm = &cpi->common;
+void av1_choose_segmap_coding_method(AV1_COMMON *cm, MACROBLOCKD *xd) {
   struct segmentation *seg = &cm->seg;
   struct segmentation_probs *segp = &cm->fc->seg;
   int no_pred_cost;
@@ -237,13 +236,6 @@
   } else {
     seg->temporal_update = 0;
   }
-
-  // Turn off temporal update when cyclic refresh is turned back on.
-  // See aomedia:2512.
-  if (!cpi->cyclic_refresh->last_frame_apply_cr &&
-      cpi->cyclic_refresh->apply_cyclic_refresh) {
-    seg->temporal_update = 0;
-  }
 }
 
 void av1_reset_segment_features(AV1_COMMON *cm) {
diff --git a/av1/encoder/segmentation.h b/av1/encoder/segmentation.h
index ad8693f..1ad13d6 100644
--- a/av1/encoder/segmentation.h
+++ b/av1/encoder/segmentation.h
@@ -27,7 +27,7 @@
 void av1_clear_segdata(struct segmentation *seg, int segment_id,
                        SEG_LVL_FEATURES feature_id);
 
-void av1_choose_segmap_coding_method(AV1_COMP *cpi, MACROBLOCKD *xd);
+void av1_choose_segmap_coding_method(AV1_COMMON *cm, MACROBLOCKD *xd);
 
 void av1_reset_segment_features(AV1_COMMON *cm);