[NORMATIVE] Error resilient/skip mode on OrderHint * In error_resilient_mode, some unintended frame-to-frame dependencies still exist owing to the way that the OrderHint (aka frame_offset) values are handled. * Skip mode also has dependency on OrderHint and shall be off if OrderHint is disabled. This patch removes these dependencies (as detailed in Issue 1497) when error_resilient_mode is on or when OrderHint is disabled. BUG=aomedia:1497 Change-Id: I11c45d9b7253cc51119197aec9a36806d9138aa9
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c index 28db720..20c2ed5 100644 --- a/av1/common/mvref_common.c +++ b/av1/common/mvref_common.c
@@ -1232,7 +1232,8 @@ MV_REFERENCE_FRAME ref_frame; for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { const int buf_idx = cm->frame_refs[ref_frame - LAST_FRAME].idx; - if (cm->seq_params.enable_order_hint && buf_idx != INVALID_IDX) { + if (cm->seq_params.enable_order_hint && !cm->error_resilient_mode && + buf_idx != INVALID_IDX) { const int ref_frame_offset = cm->buffer_pool->frame_bufs[buf_idx].cur_frame_offset; cm->ref_frame_sign_bias[ref_frame] = @@ -1391,7 +1392,7 @@ void av1_setup_motion_field(AV1_COMMON *cm) { memset(cm->ref_frame_side, -1, sizeof(cm->ref_frame_side)); - if (!cm->seq_params.enable_order_hint) return; + if (!cm->seq_params.enable_order_hint || cm->error_resilient_mode) return; int cur_frame_index = cm->cur_frame->cur_frame_offset; int alt_frame_index = 0, gld_frame_index = 0; @@ -1772,7 +1773,9 @@ cm->is_skip_mode_allowed = 0; cm->ref_frame_idx_0 = cm->ref_frame_idx_1 = INVALID_IDX; - if (frame_is_intra_only(cm) || cm->reference_mode == SINGLE_REFERENCE) return; + if (!cm->seq_params.enable_order_hint || cm->error_resilient_mode || + frame_is_intra_only(cm) || cm->reference_mode == SINGLE_REFERENCE) + return; RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs; const int cur_frame_offset = cm->frame_offset;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 9c8b506..551801f 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -2992,7 +2992,8 @@ av1_setup_frame_buf_refs(cm); - if (cm->frame_type != S_FRAME) av1_setup_frame_sign_bias(cm); + if (cm->frame_type != S_FRAME && !cm->error_resilient_mode) + av1_setup_frame_sign_bias(cm); cm->cur_frame->intra_only = cm->frame_type == KEY_FRAME || cm->intra_only; cm->cur_frame->frame_type = cm->frame_type; @@ -3192,6 +3193,7 @@ if (cm->reference_mode != SINGLE_REFERENCE) setup_compound_reference_mode(cm); av1_setup_skip_mode_allowed(cm); + assert(cm->error_resilient_mode ? !cm->is_skip_mode_allowed : 1); cm->skip_mode_flag = cm->is_skip_mode_allowed ? aom_rb_read_bit(rb) : 0; read_compound_tools(cm, rb);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 9147aaa..9d9e176 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -3318,6 +3318,7 @@ aom_wb_write_bit(wb, use_hybrid_pred); } + assert(cm->error_resilient_mode ? !cm->is_skip_mode_allowed : 1); if (cm->is_skip_mode_allowed) aom_wb_write_bit(wb, cm->skip_mode_flag); write_compound_tools(cm, wb);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 60b5af6..9527c05 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -7404,8 +7404,8 @@ int64_t early_terminate = 0; int comp_idx; - const int search_jnt_comp = is_comp_pred && cm->seq_params.enable_jnt_comp && - !cm->error_resilient_mode; + const int search_jnt_comp = + is_comp_pred & cm->seq_params.enable_jnt_comp & !cm->error_resilient_mode; // If !search_jnt_comp, we need to force mbmi->compound_idx = 1. for (comp_idx = !search_jnt_comp; comp_idx < 2; ++comp_idx) { compmode_interinter_cost = 0;