Revert "Remove now-unused interp_filter_selected[][]"
This reverts commit 062e57214ea52b22c0de306020a2c1c62206906a.
Reason for revert:
The CL(https://aomedia-review.googlesource.com/c/aom/+/77661)
optimizes the interp filter search, and needs interp_filter_selected.
Change-Id: I645a858961568894d280f491079743479ceb2397
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 44b7c4a..3140551 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -627,6 +627,7 @@
av1_extract_interp_filter(mbmi->interp_filters, dir);
aom_write_symbol(w, filter, ec_ctx->switchable_interp_cdf[ctx],
SWITCHABLE_FILTERS);
+ ++cpi->interp_filter_selected[0][filter];
if (cm->seq_params.enable_dual_filter == 0) return;
}
}
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 5a5cffd..46554d0 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -421,10 +421,12 @@
if (cm->current_frame.frame_type == KEY_FRAME && cm->show_frame) {
cpi->refresh_golden_frame = 1;
cpi->refresh_alt_ref_frame = 1;
+ av1_zero(cpi->interp_filter_selected);
set_sb_size(&cm->seq_params, select_sb_size(cpi));
} else if (frame_is_sframe(cm)) {
cpi->refresh_golden_frame = 1;
cpi->refresh_alt_ref_frame = 1;
+ av1_zero(cpi->interp_filter_selected);
set_sb_size(&cm->seq_params, select_sb_size(cpi));
} else {
const RefCntBuffer *const primary_ref_buf = get_primary_ref_frame_buf(cm);
@@ -435,6 +437,7 @@
} else {
*cm->fc = primary_ref_buf->frame_context;
}
+ av1_zero(cpi->interp_filter_selected[0]);
}
cm->prev_frame = get_primary_ref_frame_buf(cm);
@@ -3533,6 +3536,12 @@
const int ref_idx = ref_frame - LAST_FRAME;
cpi->common.remapped_ref_idx[ref_idx] =
cpi->common.remapped_ref_idx[ref_idx - 1];
+
+ if (!cpi->rc.is_src_frame_alt_ref) {
+ memcpy(cpi->interp_filter_selected[ref_frame],
+ cpi->interp_filter_selected[ref_frame - 1],
+ sizeof(cpi->interp_filter_selected[ref_frame - 1]));
+ }
}
}
@@ -3547,6 +3556,11 @@
EXTREF_FRAME };
for (int i = 2; i > 0; --i) {
+ // [0] is allocated to the current coded frame, i.e. bwdref
+ memcpy(cpi->interp_filter_selected[ordered_bwd[i]],
+ cpi->interp_filter_selected[ordered_bwd[i - 1]],
+ sizeof(cpi->interp_filter_selected[ordered_bwd[i - 1]]));
+
cpi->common.remapped_ref_idx[ordered_bwd[i] - LAST_FRAME] =
cpi->common.remapped_ref_idx[ordered_bwd[i - 1] - LAST_FRAME];
}
@@ -3562,6 +3576,11 @@
EXTREF_FRAME };
for (int i = 0; i < 2; ++i) {
+ // [0] is allocated to the current coded frame, i.e. bwdref
+ memcpy(cpi->interp_filter_selected[ordered_bwd[i]],
+ cpi->interp_filter_selected[ordered_bwd[i + 1]],
+ sizeof(cpi->interp_filter_selected[ordered_bwd[i + 1]]));
+
cpi->common.remapped_ref_idx[ordered_bwd[i] - LAST_FRAME] =
cpi->common.remapped_ref_idx[ordered_bwd[i + 1] - LAST_FRAME];
}
@@ -3633,6 +3652,9 @@
cm->remapped_ref_idx[ALTREF_FRAME - LAST_FRAME] =
get_ref_frame_map_idx(cm, GOLDEN_FRAME);
cm->remapped_ref_idx[GOLDEN_FRAME - LAST_FRAME] = tmp;
+
+ // TODO(zoeliu): Do we need to copy cpi->interp_filter_selected[0] over to
+ // cpi->interp_filter_selected[GOLDEN_FRAME]?
} else if (cpi->rc.is_src_frame_ext_arf && encode_show_existing_frame(cm)) {
#if CONFIG_DEBUG
const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
@@ -3653,6 +3675,9 @@
cm->remapped_ref_idx[LAST_FRAME - LAST_FRAME] =
get_ref_frame_map_idx(cm, bwdref_to_show);
+ memcpy(cpi->interp_filter_selected[LAST_FRAME],
+ cpi->interp_filter_selected[bwdref_to_show],
+ sizeof(cpi->interp_filter_selected[bwdref_to_show]));
#if USE_SYMM_MULTI_LAYER
if (cpi->new_bwdref_update_rule == 1) {
lshift_bwd_ref_frames(cpi);
@@ -3670,6 +3695,10 @@
if (cpi->refresh_alt_ref_frame) {
int arf_idx = get_ref_frame_map_idx(cm, ALTREF_FRAME);
assign_frame_buffer_p(&cm->ref_frame_map[arf_idx], cm->cur_frame);
+
+ memcpy(cpi->interp_filter_selected[ALTREF_FRAME],
+ cpi->interp_filter_selected[0],
+ sizeof(cpi->interp_filter_selected[0]));
}
// === GOLDEN_FRAME ===
@@ -3677,6 +3706,10 @@
assign_frame_buffer_p(
&cm->ref_frame_map[get_ref_frame_map_idx(cm, GOLDEN_FRAME)],
cm->cur_frame);
+
+ memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
+ cpi->interp_filter_selected[0],
+ sizeof(cpi->interp_filter_selected[0]));
}
// === BWDREF_FRAME ===
@@ -3700,6 +3733,9 @@
#if USE_SYMM_MULTI_LAYER
}
#endif
+ memcpy(cpi->interp_filter_selected[BWDREF_FRAME],
+ cpi->interp_filter_selected[0],
+ sizeof(cpi->interp_filter_selected[0]));
}
// === ALTREF2_FRAME ===
@@ -3707,6 +3743,10 @@
assign_frame_buffer_p(
&cm->ref_frame_map[get_ref_frame_map_idx(cm, ALTREF2_FRAME)],
cm->cur_frame);
+
+ memcpy(cpi->interp_filter_selected[ALTREF2_FRAME],
+ cpi->interp_filter_selected[0],
+ sizeof(cpi->interp_filter_selected[0]));
}
}
@@ -3751,6 +3791,9 @@
cm->remapped_ref_idx[LAST_FRAME - LAST_FRAME] = last3_remapped_idx;
assert(!encode_show_existing_frame(cm));
+ memcpy(cpi->interp_filter_selected[LAST_FRAME],
+ cpi->interp_filter_selected[0],
+ sizeof(cpi->interp_filter_selected[0]));
// If the new structure is used, we will always have overlay frames coupled
// with bwdref frames. Therefore, we won't have to perform this update
@@ -3774,6 +3817,10 @@
cm->remapped_ref_idx[LAST_FRAME - LAST_FRAME] =
get_ref_frame_map_idx(cm, BWDREF_FRAME);
cm->remapped_ref_idx[BWDREF_FRAME - LAST_FRAME] = last3_remapped_idx;
+
+ memcpy(cpi->interp_filter_selected[LAST_FRAME],
+ cpi->interp_filter_selected[BWDREF_FRAME],
+ sizeof(cpi->interp_filter_selected[BWDREF_FRAME]));
}
}
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 910b2de..adeba12 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -703,6 +703,12 @@
RATE_CONTROL rc;
double framerate;
+ // Relevant for an inter frame.
+ // - Index '0' corresponds to the values for the currently coded frame.
+ // - Indices LAST_FRAME ... EXTREF_FRAMES are used to store values for all the
+ // possible inter reference frames.
+ int interp_filter_selected[REF_FRAMES + 1][SWITCHABLE];
+
struct aom_codec_pkt_list *output_pkt_list;
MBGRAPH_FRAME_STATS mbgraph_stats[MAX_LAG_BUFFERS];