fix issues with segment_pred_last * Proper re-allocation of seg_map buffer when resolution changes * Remove undesired resetting of seg_map buffer * This resolves issues raised in https://bugs.chromium.org/p/aomedia/issues/detail?id=1064 https://bugs.chromium.org/p/aomedia/issues/detail?id=1091 * Disable error_resilient_flag in resize_test as this covers more cases * Will be enabled by default in separate patch BUG=aomedia:1064 BUG=aomedia:1091 Change-Id: Ic3f0e47922784c66d240b52d30ba082bdb46dc3b
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 681b56f..0701674 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -3407,8 +3407,12 @@ 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)); +#endif if (cm->current_frame_seg_map) memset(cm->current_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index 1dbaa0a..c02a5d7 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -685,6 +685,12 @@ cm, buf->mvs, (MV_REF *)aom_calloc(cm->mi_rows * cm->mi_cols, sizeof(*buf->mvs))); #endif // CONFIG_TMV +#if CONFIG_SEGMENT_PRED_LAST + aom_free(buf->seg_map); + CHECK_MEM_ERROR(cm, buf->seg_map, + (uint8_t *)aom_calloc(cm->mi_rows * cm->mi_cols, + sizeof(*buf->seg_map))); +#endif } #if CONFIG_MFMV
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 93e1893..9a89c44 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -751,7 +751,10 @@ seg->enabled = aom_rb_read_bit(rb); if (!seg->enabled) return; - +#if CONFIG_SEGMENT_PRED_LAST + if (cm->seg.enabled && !cm->frame_parallel_decode && cm->prev_frame) + cm->last_frame_seg_map = cm->prev_frame->seg_map; +#endif // Segmentation map update if (frame_is_intra_only(cm) || cm->error_resilient_mode) { seg->update_map = 1; @@ -1157,16 +1160,7 @@ } } #endif // CONFIG_HORZONLY_FRAME_SUPERRES -#if CONFIG_SEGMENT_PRED_LAST -static void resize_segmap_buffer(AV1_COMMON *cm) { - aom_free(cm->cur_frame->seg_map); - cm->cur_frame->mi_rows = cm->mi_rows; - cm->cur_frame->mi_cols = cm->mi_cols; - CHECK_MEM_ERROR(cm, cm->cur_frame->seg_map, - (uint8_t *)aom_calloc(cm->mi_rows * cm->mi_cols, - sizeof(*cm->cur_frame->seg_map))); -} -#endif + static void resize_context_buffers(AV1_COMMON *cm, int width, int height) { #if CONFIG_SIZE_LIMIT if (width > DECODE_WIDTH_LIMIT || height > DECODE_HEIGHT_LIMIT) @@ -1195,12 +1189,6 @@ } ensure_mv_buffer(cm->cur_frame, cm); -#if CONFIG_SEGMENT_PRED_LAST - if (cm->cur_frame->seg_map == NULL || cm->mi_rows > cm->cur_frame->mi_rows || - cm->mi_cols > cm->cur_frame->mi_cols) { - resize_segmap_buffer(cm); - } -#endif cm->cur_frame->width = cm->width; cm->cur_frame->height = cm->height; } @@ -2808,6 +2796,10 @@ : NULL; cm->use_prev_frame_mvs = cm->use_ref_frame_mvs && frame_can_use_prev_frame_mvs(cm); +#if CONFIG_SEGMENT_PRED_LAST + if (cm->seg.enabled && !cm->frame_parallel_decode) + cm->last_frame_seg_map = cm->prev_frame->seg_map; +#endif #endif for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) { RefBuffer *const ref_buf = &cm->frame_refs[i]; @@ -3281,11 +3273,6 @@ #if CONFIG_SEGMENT_PRED_LAST cm->current_frame_seg_map = cm->cur_frame->seg_map; - if (cm->current_frame_seg_map) - memset(cm->current_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols)); - if (cm->seg.temporal_update) { - cm->last_frame_seg_map = cm->prev_frame->seg_map; - } #endif #if CONFIG_MFMV
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 8e5a9a7..d8a7b98 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -3870,8 +3870,6 @@ #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; - if (cm->current_frame_seg_map) - memset(cm->current_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols)); #endif // Special case: set prev_mi to NULL when the previous mode info
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index db86116..29a2e4d 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c
@@ -4550,21 +4550,6 @@ new_fb_ptr->height = cm->height; } -#if CONFIG_SEGMENT_PRED_LAST -static INLINE void alloc_frame_segmap(AV1_COMMON *const cm, int buffer_idx) { - RefCntBuffer *const new_fb_ptr = &cm->buffer_pool->frame_bufs[buffer_idx]; - if (new_fb_ptr->seg_map == NULL || new_fb_ptr->mi_rows < cm->mi_rows || - new_fb_ptr->mi_cols < cm->mi_cols) { - aom_free(new_fb_ptr->seg_map); - CHECK_MEM_ERROR(cm, new_fb_ptr->seg_map, - (uint8_t *)aom_calloc(cm->mi_rows * cm->mi_cols, - sizeof(*new_fb_ptr->seg_map))); - new_fb_ptr->mi_rows = cm->mi_rows; - new_fb_ptr->mi_cols = cm->mi_cols; - } -} -#endif - static void scale_references(AV1_COMP *cpi) { AV1_COMMON *cm = &cpi->common; MV_REFERENCE_FRAME ref_frame; @@ -4607,9 +4592,6 @@ (int)cm->bit_depth); cpi->scaled_ref_idx[ref_frame - 1] = new_fb; alloc_frame_mvs(cm, new_fb); -#if CONFIG_SEGMENT_PRED_LAST - alloc_frame_segmap(cm, new_fb); -#endif } } else { const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame); @@ -4924,9 +4906,6 @@ #endif alloc_frame_mvs(cm, cm->new_fb_idx); -#if CONFIG_SEGMENT_PRED_LAST - alloc_frame_segmap(cm, cm->new_fb_idx); -#endif // Reset the frame pointers to the current frame size. if (aom_realloc_frame_buffer(get_frame_new_buffer(cm), cm->width, cm->height,
diff --git a/test/resize_test.cc b/test/resize_test.cc index 3e78c05..0b0915e 100644 --- a/test/resize_test.cc +++ b/test/resize_test.cc
@@ -483,8 +483,8 @@ cfg_.kf_min_dist = cfg_.kf_max_dist = 3000; // Enable dropped frames. cfg_.rc_dropframe_thresh = 1; - // Enable error_resilience mode. - cfg_.g_error_resilient = 1; + // Disable error_resilience mode. + cfg_.g_error_resilient = 0; // Run at low bitrate. cfg_.rc_target_bitrate = 200; }