Make InterModesInfo tile-independent for enc row-mt
InterModesInfo has been moved from TileDataEnc to ThreadData to
avoid race conditions when row based multi-threading is enabled
for encoder.
Change-Id: I19340b858334b3f3be4a43485a064e3227c97b07
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 1c093d9..4d579bc 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -187,6 +187,9 @@
COMPOUND_TYPE comp_type;
} INTERPOLATION_FILTER_STATS;
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+struct inter_modes_info;
+#endif
typedef struct macroblock MACROBLOCK;
struct macroblock {
struct macroblock_plane plane[MAX_MB_PLANE];
@@ -277,6 +280,10 @@
FRAME_CONTEXT *backup_tile_ctx;
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ struct inter_modes_info *inter_modes_info;
+#endif
+
// buffer for hash value calculation of a block
// used only in av1_get_block_hash_value()
// [first hash/second hash]
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index ab9d0bc..12e8f8b 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -501,6 +501,11 @@
aom_free(cpi->td.mb.wsrc_buf);
cpi->td.mb.wsrc_buf = NULL;
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ aom_free(cpi->td.mb.inter_modes_info);
+ cpi->td.mb.inter_modes_info = NULL;
+#endif
+
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
aom_free(cpi->td.mb.hash_value_buffer[i][j]);
@@ -2644,6 +2649,12 @@
(int32_t *)aom_memalign(
16, MAX_SB_SQUARE * sizeof(*cpi->td.mb.wsrc_buf)));
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ CHECK_MEM_ERROR(
+ cm, cpi->td.mb.inter_modes_info,
+ (InterModesInfo *)aom_malloc(sizeof(*cpi->td.mb.inter_modes_info)));
+#endif
+
for (int x = 0; x < 2; x++)
for (int y = 0; y < 2; y++)
CHECK_MEM_ERROR(
@@ -2985,6 +2996,9 @@
aom_free(thread_data->td->above_pred_buf);
aom_free(thread_data->td->left_pred_buf);
aom_free(thread_data->td->wsrc_buf);
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ aom_free(thread_data->td->inter_modes_info);
+#endif
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 2; y++) {
aom_free(thread_data->td->hash_value_buffer[x][y]);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 2983ec3..7a78ba7 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -457,7 +457,6 @@
uint8_t allow_update_cdf;
#if CONFIG_COLLECT_INTER_MODE_RD_STATS
InterModeRdModel inter_mode_rd_models[BLOCK_SIZES_ALL];
- InterModesInfo inter_modes_info;
#endif
} TileDataEnc;
@@ -481,6 +480,9 @@
FRAME_COUNTS *counts;
PC_TREE *pc_tree;
PC_TREE *pc_root[MAX_MIB_SIZE_LOG2 - MIN_MIB_SIZE_LOG2 + 1];
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ InterModesInfo *inter_modes_info;
+#endif
uint32_t *hash_value_buffer[2][2];
int32_t *wsrc_buf;
int32_t *mask_buf;
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 213bfe7..7c0e9cc 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -97,6 +97,12 @@
(int32_t *)aom_memalign(
16, MAX_SB_SQUARE * sizeof(*thread_data->td->wsrc_buf)));
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ CHECK_MEM_ERROR(cm, thread_data->td->inter_modes_info,
+ (InterModesInfo *)aom_malloc(
+ sizeof(*thread_data->td->inter_modes_info)));
+#endif
+
for (int x = 0; x < 2; x++)
for (int y = 0; y < 2; y++)
CHECK_MEM_ERROR(
@@ -199,6 +205,9 @@
thread_data->td->mb.above_pred_buf = thread_data->td->above_pred_buf;
thread_data->td->mb.left_pred_buf = thread_data->td->left_pred_buf;
thread_data->td->mb.wsrc_buf = thread_data->td->wsrc_buf;
+#if CONFIG_COLLECT_INTER_MODE_RD_STATS
+ thread_data->td->mb.inter_modes_info = thread_data->td->inter_modes_info;
+#endif
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 2; y++) {
memcpy(thread_data->td->hash_value_buffer[x][y],
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index d5fa163..a53169b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -11521,7 +11521,7 @@
#else
const int do_tx_search = 1;
#endif
- InterModesInfo *inter_modes_info = &tile_data->inter_modes_info;
+ InterModesInfo *inter_modes_info = x->inter_modes_info;
inter_modes_info->num = 0;
#endif