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