Move IntraModeSearchState::best_pred_rd to InterModeSearchState
The member variable best_pred_rd is used for compound inter modes and
shouldn't be in INtraModeSearchState.
BUG=aomedia:2863
Change-Id: If85b0f08769a02075a33ae3a8fd301849cfd86b6
diff --git a/av1/encoder/intra_mode_search.c b/av1/encoder/intra_mode_search.c
index 048f5b9..d50f8ea 100644
--- a/av1/encoder/intra_mode_search.c
+++ b/av1/encoder/intra_mode_search.c
@@ -851,7 +851,8 @@
BLOCK_SIZE bsize, unsigned int ref_frame_cost,
const PICK_MODE_CONTEXT *ctx, RD_STATS *rd_stats,
RD_STATS *rd_stats_y, RD_STATS *rd_stats_uv,
- int64_t best_rd, int64_t *best_intra_rd) {
+ int64_t best_rd, int64_t *best_intra_rd,
+ int64_t *best_pred_rd) {
const AV1_COMMON *cm = &cpi->common;
const SPEED_FEATURES *const sf = &cpi->sf;
MACROBLOCKD *const xd = &x->e_mbd;
@@ -1018,8 +1019,7 @@
}
for (int i = 0; i < REFERENCE_MODES; ++i) {
- intra_search_state->best_pred_rd[i] =
- AOMMIN(intra_search_state->best_pred_rd[i], this_rd);
+ best_pred_rd[i] = AOMMIN(best_pred_rd[i], this_rd);
}
return this_rd;
diff --git a/av1/encoder/intra_mode_search.h b/av1/encoder/intra_mode_search.h
index 4e52f02..974b3b9 100644
--- a/av1/encoder/intra_mode_search.h
+++ b/av1/encoder/intra_mode_search.h
@@ -66,11 +66,6 @@
PALETTE_MODE_INFO pmi_uv; /*!< \brief Color map if mode_uv is palette */
int8_t uv_angle_delta; /*!< \brief Angle delta if mode_uv directional */
/**@}*/
-
- /*!
- * \brief Keep track of best intra rd for use in compound mode.
- */
- int64_t best_pred_rd[REFERENCE_MODES];
} IntraModeSearchState;
/*!\brief Evaluate a given intra-mode for inter frames.
@@ -89,24 +84,23 @@
* support palette mode prediction in the luma channel, but it does search for
* palette mode in the chroma channel.
*
- * \param[in] intra_search_state Structure to hold the best luma intra mode
- * and cache chroma prediction for speed up.
- * \param[in] cpi Top-level encoder structure.
- * \param[in] x Pointer to structure holding all the data
- * for the current macroblock.
- * \param[in] bsize Current partition block size.
- * \param[in] ref_frame_cost The entropy cost for signaling that the
- * current ref frame is an intra frame.
- * \param[in] ctx Structure to hold the number of 4x4 blks to
- * copy the tx_type and txfm_skip arrays.
- * \param[in] rd_stats Struct to keep track of the current
+ * \param[in,out] intra_search_state Structure to hold the best luma intra
+ * mode and cache chroma prediction for speed up. \param[in] cpi Top-level
+ * encoder structure. \param[in,out] x Pointer to structure
+ * holding all the data for the current macroblock. \param[in] bsize Current
+ * partition block size. \param[in] ref_frame_cost The entropy cost for
+ * signaling that the current ref frame is an intra frame. \param[in] ctx
+ * Structure to hold the number of 4x4 blks to copy the tx_type and txfm_skip
+ * arrays. \param[out] rd_stats Struct to keep track of the current
* intra-mode's rd_stats.
- * \param[in] rd_stats_y Struct to keep track of the current
+ * \param[out] rd_stats_y Struct to keep track of the current
* intra-mode's rd_stats (luma only).
- * \param[in] rd_stats_uv Struct to keep track of the current
+ * \param[out] rd_stats_uv Struct to keep track of the current
* intra-mode's rd_stats (chroma only).
* \param[in] best_rd Best RD seen for this block so far.
- * \param[in] best_intra_rd Best intra RD seen for this block so far.
+ * \param[in,out] best_intra_rd Best intra RD seen for this block so
+ * far. \param[out] best_pred_rd Array of best pred rd for
+ * single/compound refs.
*
* \return Returns the rdcost of the current intra-mode if it's available,
* otherwise returns INT64_MAX. The corresponding values in x->e_mbd.mi[0],
@@ -121,7 +115,8 @@
BLOCK_SIZE bsize, unsigned int ref_frame_cost,
const PICK_MODE_CONTEXT *ctx, RD_STATS *rd_stats,
RD_STATS *rd_stats_y, RD_STATS *rd_stats_uv,
- int64_t best_rd, int64_t *best_intra_rd);
+ int64_t best_rd, int64_t *best_intra_rd,
+ int64_t *best_pred_rd);
/*!\brief Evaluate luma palette mode for inter frames.
*
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 8b131e3..026d9a1 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -317,6 +317,11 @@
int64_t mode_threshold[MAX_MODES];
int64_t best_intra_rd;
unsigned int best_pred_sse;
+
+ /*!
+ * \brief Keep track of best intra rd for use in compound mode.
+ */
+ int64_t best_pred_rd[REFERENCE_MODES];
int64_t best_pred_diff[REFERENCE_MODES];
// Save a set of single_newmv for each checked ref_mv.
int_mv single_newmv[MAX_REF_MV_SEARCH][REF_FRAMES];
@@ -3956,8 +3961,6 @@
av1_zero(intra_search_state->directional_mode_skip_mask);
intra_search_state->rate_uv_intra = INT_MAX;
av1_zero(intra_search_state->pmi_uv);
- for (int i = 0; i < REFERENCE_MODES; ++i)
- intra_search_state->best_pred_rd[i] = INT64_MAX;
}
static AOM_INLINE void init_inter_mode_search_state(
@@ -4042,6 +4045,10 @@
}
av1_zero(search_state->single_state_cnt);
av1_zero(search_state->single_state_modelled_cnt);
+
+ for (int i = 0; i < REFERENCE_MODES; ++i) {
+ search_state->best_pred_rd[i] = INT64_MAX;
+ }
}
static bool mask_says_skip(const mode_skip_mask_t *mode_skip_mask,
@@ -4881,20 +4888,14 @@
hybrid_rd = RDCOST(rdmult, hybrid_rate, rd_stats->dist);
if (!comp_pred) {
- if (single_rd <
- search_state->intra_search_state.best_pred_rd[SINGLE_REFERENCE])
- search_state->intra_search_state.best_pred_rd[SINGLE_REFERENCE] =
- single_rd;
+ if (single_rd < search_state->best_pred_rd[SINGLE_REFERENCE])
+ search_state->best_pred_rd[SINGLE_REFERENCE] = single_rd;
} else {
- if (single_rd <
- search_state->intra_search_state.best_pred_rd[COMPOUND_REFERENCE])
- search_state->intra_search_state.best_pred_rd[COMPOUND_REFERENCE] =
- single_rd;
+ if (single_rd < search_state->best_pred_rd[COMPOUND_REFERENCE])
+ search_state->best_pred_rd[COMPOUND_REFERENCE] = single_rd;
}
- if (hybrid_rd <
- search_state->intra_search_state.best_pred_rd[REFERENCE_MODE_SELECT])
- search_state->intra_search_state.best_pred_rd[REFERENCE_MODE_SELECT] =
- hybrid_rd;
+ if (hybrid_rd < search_state->best_pred_rd[REFERENCE_MODE_SELECT])
+ search_state->best_pred_rd[REFERENCE_MODE_SELECT] = hybrid_rd;
}
// Does a transform search over a list of the best inter mode candidates.
@@ -5452,7 +5453,8 @@
intra_rd_stats.rdcost = av1_handle_intra_mode(
&search_state.intra_search_state, cpi, x, bsize, intra_ref_frame_cost,
ctx, &intra_rd_stats, &intra_rd_stats_y, &intra_rd_stats_uv,
- search_state.best_rd, &search_state.best_intra_rd);
+ search_state.best_rd, &search_state.best_intra_rd,
+ search_state.best_pred_rd);
// Collect mode stats for multiwinner mode processing
const int txfm_search_done = 1;
@@ -5567,12 +5569,11 @@
}
for (i = 0; i < REFERENCE_MODES; ++i) {
- if (search_state.intra_search_state.best_pred_rd[i] == INT64_MAX) {
+ if (search_state.best_pred_rd[i] == INT64_MAX) {
search_state.best_pred_diff[i] = INT_MIN;
} else {
search_state.best_pred_diff[i] =
- search_state.best_rd -
- search_state.intra_search_state.best_pred_rd[i];
+ search_state.best_rd - search_state.best_pred_rd[i];
}
}