Refactor prune_ref_by_selective_ref_frame
The function prune_ref_by_selective_ref_frame is
refactored in order to facilitate reference frame
pruning in tpl mode estimation.
Change-Id: Iae0f3aa86b726185df980a992936793d8d937b1c
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index daea2aa..ec8e1b3 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4901,7 +4901,9 @@
if (ref_buf[frame]->y_crop_width == cpi->source->y_crop_width &&
ref_buf[frame]->y_crop_height == cpi->source->y_crop_height &&
do_gm_search_logic(&cpi->sf, num_refs_using_gm, frame) &&
- !prune_ref_by_selective_ref_frame(cpi, ref_frame) &&
+ !prune_ref_by_selective_ref_frame(
+ cpi, ref_frame, cm->cur_frame->ref_display_order_hint,
+ cm->current_frame.display_order_hint) &&
!(cpi->sf.selective_ref_gm && skip_gm_frame(cm, frame))) {
assert(ref_buf[frame] != NULL);
if (num_frm_corners < 0) {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index ab3e631..83866b6 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -11885,7 +11885,10 @@
}
}
- if (prune_ref_by_selective_ref_frame(cpi, ref_frame)) return 1;
+ if (prune_ref_by_selective_ref_frame(cpi, ref_frame,
+ cm->cur_frame->ref_display_order_hint,
+ cm->current_frame.display_order_hint))
+ return 1;
if (skip_motion_mode) return 2;
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h
index bd1671a..bdb0844 100644
--- a/av1/encoder/rdopt.h
+++ b/av1/encoder/rdopt.h
@@ -352,30 +352,29 @@
}
static INLINE int prune_ref_by_selective_ref_frame(
- const AV1_COMP *const cpi, const MV_REFERENCE_FRAME *const ref_frame) {
+ const AV1_COMP *const cpi, const MV_REFERENCE_FRAME *const ref_frame,
+ const unsigned int *const ref_display_order_hint,
+ const unsigned int cur_frame_display_order_hint) {
const SPEED_FEATURES *const sf = &cpi->sf;
if (sf->selective_ref_frame) {
const AV1_COMMON *const cm = &cpi->common;
const OrderHintInfo *const order_hint_info =
&cm->seq_params.order_hint_info;
- const CurrentFrame *const current_frame = &cm->current_frame;
const int comp_pred = ref_frame[1] > INTRA_FRAME;
if (sf->selective_ref_frame >= 2 ||
(sf->selective_ref_frame == 1 && comp_pred)) {
if (ref_frame[0] == LAST3_FRAME || ref_frame[1] == LAST3_FRAME) {
if (av1_encoder_get_relative_dist(
order_hint_info,
- cm->cur_frame->ref_display_order_hint[LAST3_FRAME - LAST_FRAME],
- cm->cur_frame
- ->ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
+ ref_display_order_hint[LAST3_FRAME - LAST_FRAME],
+ ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
return 1;
}
if (ref_frame[0] == LAST2_FRAME || ref_frame[1] == LAST2_FRAME) {
if (av1_encoder_get_relative_dist(
order_hint_info,
- cm->cur_frame->ref_display_order_hint[LAST2_FRAME - LAST_FRAME],
- cm->cur_frame
- ->ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
+ ref_display_order_hint[LAST2_FRAME - LAST_FRAME],
+ ref_display_order_hint[GOLDEN_FRAME - LAST_FRAME]) <= 0)
return 1;
}
}
@@ -389,9 +388,9 @@
ref_offsets[i] = buf->display_order_hint;
}
const int ref0_dist = av1_encoder_get_relative_dist(
- order_hint_info, ref_offsets[0], current_frame->display_order_hint);
+ order_hint_info, ref_offsets[0], cur_frame_display_order_hint);
const int ref1_dist = av1_encoder_get_relative_dist(
- order_hint_info, ref_offsets[1], current_frame->display_order_hint);
+ order_hint_info, ref_offsets[1], cur_frame_display_order_hint);
if ((ref0_dist <= 0 && ref1_dist <= 0) ||
(ref0_dist > 0 && ref1_dist > 0)) {
return 1;
@@ -402,16 +401,14 @@
if (ref_frame[0] == ALTREF2_FRAME || ref_frame[1] == ALTREF2_FRAME)
if (av1_encoder_get_relative_dist(
order_hint_info,
- cm->cur_frame
- ->ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
- current_frame->display_order_hint) < 0)
+ ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
+ cur_frame_display_order_hint) < 0)
return 1;
if (ref_frame[0] == BWDREF_FRAME || ref_frame[1] == BWDREF_FRAME)
if (av1_encoder_get_relative_dist(
order_hint_info,
- cm->cur_frame
- ->ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
- current_frame->display_order_hint) < 0)
+ ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
+ cur_frame_display_order_hint) < 0)
return 1;
}
@@ -422,13 +419,11 @@
(cpi->ref_frame_flags & av1_ref_frame_flag_list[BWDREF_FRAME])) {
// Check if both ALTREF2_FRAME and BWDREF_FRAME are future references.
const int arf2_dist = av1_encoder_get_relative_dist(
- order_hint_info,
- cm->cur_frame->ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
- current_frame->display_order_hint);
+ order_hint_info, ref_display_order_hint[ALTREF2_FRAME - LAST_FRAME],
+ cur_frame_display_order_hint);
const int bwd_dist = av1_encoder_get_relative_dist(
- order_hint_info,
- cm->cur_frame->ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
- current_frame->display_order_hint);
+ order_hint_info, ref_display_order_hint[BWDREF_FRAME - LAST_FRAME],
+ cur_frame_display_order_hint);
if (arf2_dist > 0 && bwd_dist > 0 && bwd_dist <= arf2_dist) {
// Drop ALTREF2_FRAME as a reference if BWDREF_FRAME is a closer
// reference to the current frame than ALTREF2_FRAME