Add structure for best compound type stats
Added a structure to store stats for best compound type
Change-Id: Ib0dabddc7cddfeb93f80a3977983f06b61817a3a
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 461dd01..0c3451c 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -191,6 +191,13 @@
int skip_trellis;
};
+// Structure to store the compound type related stats for best compound type
+typedef struct {
+ INTERINTER_COMPOUND_DATA best_compound_data;
+ int64_t comp_best_model_rd;
+ int best_compmode_interinter_cost;
+} BEST_COMP_TYPE_STATS;
+
#define LAST_NEW_MV_INDEX 6
static const MODE_DEFINITION av1_mode_order[MAX_MODES] = {
{ NEARESTMV, { LAST_FRAME, NONE_FRAME } },
@@ -9774,8 +9781,12 @@
int rs2;
int_mv best_mv[2];
int best_tmp_rate_mv = *rate_mv;
- INTERINTER_COMPOUND_DATA best_compound_data;
- best_compound_data.type = COMPOUND_AVERAGE;
+ BEST_COMP_TYPE_STATS best_type_stats;
+ // Initializing BEST_COMP_TYPE_STATS
+ best_type_stats.best_compound_data.type = COMPOUND_AVERAGE;
+ best_type_stats.best_compmode_interinter_cost = 0;
+ best_type_stats.comp_best_model_rd = INT64_MAX;
+
uint8_t *preds0[1] = { buffers->pred0 };
uint8_t *preds1[1] = { buffers->pred1 };
int strides[1] = { bw };
@@ -9785,7 +9796,7 @@
COMPOUND_TYPE cur_type;
// Local array to store the mask cost for different compound types
int masked_type_cost[COMPOUND_TYPES];
- int best_compmode_interinter_cost = 0;
+
int calc_pred_masked_compound = 1;
int64_t comp_dist[COMPOUND_TYPES] = { INT64_MAX, INT64_MAX, INT64_MAX,
INT64_MAX };
@@ -9800,7 +9811,7 @@
*rd = INT64_MAX;
int rate_sum, tmp_skip_txfm_sb;
int64_t dist_sum, tmp_skip_sse_sb;
- int64_t comp_best_model_rd = INT64_MAX;
+
// Special handling if both compound_average and compound_distwtd
// are to be searched. In this case, first estimate between the two
// modes and then call estimate_yrd_for_sb() only for the better of
@@ -9963,19 +9974,20 @@
&tmp_rate_mv, preds0, preds1, buffers->residual1,
buffers->diff10, strides, mi_row, mi_col, rd_stats->rate,
tmp_rd_thresh, &calc_pred_masked_compound, comp_rate, comp_dist,
- comp_model_rd, comp_best_model_rd, &comp_model_rd_cur);
+ comp_model_rd, best_type_stats.comp_best_model_rd,
+ &comp_model_rd_cur);
}
}
}
}
if (best_rd_cur < *rd) {
*rd = best_rd_cur;
- comp_best_model_rd = comp_model_rd_cur;
- best_compound_data = mbmi->interinter_comp;
+ best_type_stats.comp_best_model_rd = comp_model_rd_cur;
+ best_type_stats.best_compound_data = mbmi->interinter_comp;
if (masked_compound_used && cur_type >= COMPOUND_WEDGE) {
memcpy(buffers->tmp_best_mask_buf, xd->seg_mask, mask_len);
}
- best_compmode_interinter_cost = rs2;
+ best_type_stats.best_compmode_interinter_cost = rs2;
if (have_newmv_in_inter_mode(this_mode)) {
if (cur_type == COMPOUND_WEDGE) {
best_tmp_rate_mv = tmp_rate_mv;
@@ -9991,10 +10003,12 @@
mbmi->mv[0].as_int = cur_mv[0].as_int;
mbmi->mv[1].as_int = cur_mv[1].as_int;
}
- if (mbmi->interinter_comp.type != best_compound_data.type) {
- mbmi->comp_group_idx = (best_compound_data.type < COMPOUND_WEDGE) ? 0 : 1;
- mbmi->compound_idx = !(best_compound_data.type == COMPOUND_DISTWTD);
- mbmi->interinter_comp = best_compound_data;
+ if (mbmi->interinter_comp.type != best_type_stats.best_compound_data.type) {
+ mbmi->comp_group_idx =
+ (best_type_stats.best_compound_data.type < COMPOUND_WEDGE) ? 0 : 1;
+ mbmi->compound_idx =
+ !(best_type_stats.best_compound_data.type == COMPOUND_DISTWTD);
+ mbmi->interinter_comp = best_type_stats.best_compound_data;
memcpy(xd->seg_mask, buffers->tmp_best_mask_buf, mask_len);
}
if (have_newmv_in_inter_mode(this_mode)) {
@@ -10009,7 +10023,7 @@
if (!match_found)
save_comp_rd_search_stat(x, mbmi, comp_rate, comp_dist, comp_model_rd,
cur_mv);
- return best_compmode_interinter_cost;
+ return best_type_stats.best_compmode_interinter_cost;
}
static INLINE int is_single_newmv_valid(const HandleInterModeArgs *const args,