Add INTER_MODE_RD_TEST
Change-Id: I302e168925b7bf4d11ddbe0b19b46aa02fcd75b1
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index f096644..5d1b05e 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4496,6 +4496,12 @@
else
encode_tiles(cpi);
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+#if INTER_MODE_RD_TEST
+ av1_inter_mode_data_show(cm);
+#endif
+#endif
+
aom_usec_timer_mark(&emr_timer);
cpi->time_encode_sb_row += aom_usec_timer_elapsed(&emr_timer);
}
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 25ed967..7681b18 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -514,6 +514,7 @@
double dist_mean;
int skip_count;
int non_skip_count;
+ int fp_skip_count;
int bracket_idx;
} InterModeRdModel;
@@ -542,10 +543,24 @@
md->ready = 0;
md->skip_count = 0;
md->non_skip_count = 0;
+ md->fp_skip_count = 0;
md->bracket_idx = 0;
}
}
+void av1_inter_mode_data_show(const AV1_COMMON *cm) {
+ printf("frame_offset %d\n", cm->frame_offset);
+ for (int i = 0; i < BLOCK_SIZES_ALL; ++i) {
+ const int block_idx = inter_mode_data_block_idx(i);
+ if (block_idx != -1) inter_mode_data_idx[block_idx] = 0;
+ InterModeRdModel *md = &inter_mode_rd_models[i];
+ if (md->ready) {
+ printf("bsize %d non_skip_count %d skip_count %d fp_skip_count %d\n", i,
+ md->non_skip_count, md->skip_count, md->fp_skip_count);
+ }
+ }
+}
+
static int64_t get_est_rd(BLOCK_SIZE bsize, int rdmult, int64_t sse,
int curr_cost) {
InterModeRdModel *md = &inter_mode_rd_models[bsize];
@@ -7988,11 +8003,18 @@
#if CONFIG_COLLECT_INTER_MODE_RD_STATS
#if !INTER_MODE_RD_STATS_DUMP
InterModeRdModel *md = &inter_mode_rd_models[mbmi->sb_type];
+ int64_t est_rd = 0;
+ int est_skip = 0;
if (md->ready) {
const int64_t curr_sse = get_sse(cpi, x);
- const int64_t est_rd =
- get_est_rd(mbmi->sb_type, x->rdmult, curr_sse, rd_stats->rate);
- if (est_rd * 0.8 > *best_est_rd) {
+ est_rd = get_est_rd(mbmi->sb_type, x->rdmult, curr_sse, rd_stats->rate);
+ est_skip = est_rd * 0.8 > *best_est_rd;
+#if INTER_MODE_RD_TEST
+ if (est_rd < *best_est_rd) {
+ *best_est_rd = est_rd;
+ }
+#else // INTER_MODE_RD_TEST
+ if (est_skip) {
++md->skip_count;
mbmi->ref_frame[1] = ref_frame_1;
continue;
@@ -8002,6 +8024,7 @@
}
++md->non_skip_count;
}
+#endif // INTER_MODE_RD_TEST
}
#endif // !INTER_MODE_RD_STATS_DUMP
#endif // CONFIG_COLLECT_INTER_MODE_RD_STATS
@@ -8091,6 +8114,24 @@
}
*disable_skip = 0;
#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+#if INTER_MODE_RD_TEST
+ if (md->ready) {
+ int64_t real_rd = RDCOST(x->rdmult, rd_stats->rate, rd_stats->dist);
+ if (est_skip) {
+ ++md->skip_count;
+ if (real_rd < ref_best_rd) {
+ ++md->fp_skip_count;
+ }
+ // int fp_skip = real_rd < ref_best_rd;
+ // printf("est_skip %d fp_skip %d est_rd %ld best_est_rd %ld real_rd
+ // %ld ref_best_rd %ld\n",
+ // est_skip, fp_skip, est_rd, *best_est_rd, real_rd,
+ // ref_best_rd);
+ } else {
+ ++md->non_skip_count;
+ }
+ }
+#endif // INTER_MODE_RD_TEST
inter_mode_data_push(mbmi->sb_type, rd_stats->sse, rd_stats->dist,
rd_stats_y->rate + rd_stats_uv->rate +
x->skip_cost[skip_ctx][mbmi->skip],
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h
index a701898..4ae32d4 100644
--- a/av1/encoder/rdopt.h
+++ b/av1/encoder/rdopt.h
@@ -130,8 +130,10 @@
int reduced_tx_set);
#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+#define INTER_MODE_RD_TEST 0
void av1_inter_mode_data_init();
void av1_inter_mode_data_fit(int rdmult);
+void av1_inter_mode_data_show(const AV1_COMMON *cm);
#endif
#ifdef __cplusplus