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