Fix initialization in delta-q-mode

For delta_q_mode, av1_setup_src_planes was accessing incorrect
value of xd->mi[0] before it is initialized for the current SB
in set_offsets function. This would result in thread sanitizer
issue for row based multi-threading of encoder.

STATS_CHANGED

Change-Id: I2d59075f495eee793ba16dffe4d4c060418b672e
diff --git a/av1/encoder/aq_complexity.c b/av1/encoder/aq_complexity.c
index 80f8e2e..daa3438 100644
--- a/av1/encoder/aq_complexity.c
+++ b/av1/encoder/aq_complexity.c
@@ -148,7 +148,7 @@
             ? AOMMAX(exp(cpi->twopass.mb_av_energy), MIN_DEFAULT_LV_THRESH)
             : DEFAULT_LV_THRESH;
 
-    av1_setup_src_planes(mb, cpi->source, mi_row, mi_col, num_planes);
+    av1_setup_src_planes(mb, cpi->source, mi_row, mi_col, num_planes, bs);
     logvar = av1_log_block_var(cpi, mb, bs);
 
     segment = AQ_C_SEGMENTS - 1;  // Just in case no break out below.
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 68c5485..0ab3cb6 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -259,7 +259,7 @@
                  cm->mi_cols);
 
   // Set up source buffers.
-  av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes);
+  av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, bsize);
 
   // R/D setup.
   x->rdmult = cpi->rd.RDMULT;
@@ -479,7 +479,8 @@
 }
 
 void av1_setup_src_planes(MACROBLOCK *x, const YV12_BUFFER_CONFIG *src,
-                          int mi_row, int mi_col, const int num_planes) {
+                          int mi_row, int mi_col, const int num_planes,
+                          BLOCK_SIZE bsize) {
   // Set current frame pointer.
   x->e_mbd.cur_buf = src;
 
@@ -487,11 +488,10 @@
   // the static analysis warnings.
   for (int i = 0; i < AOMMIN(num_planes, MAX_MB_PLANE); i++) {
     const int is_uv = i > 0;
-    setup_pred_plane(&x->plane[i].src, x->e_mbd.mi[0]->sb_type, src->buffers[i],
-                     src->crop_widths[is_uv], src->crop_heights[is_uv],
-                     src->strides[is_uv], mi_row, mi_col, NULL,
-                     x->e_mbd.plane[i].subsampling_x,
-                     x->e_mbd.plane[i].subsampling_y);
+    setup_pred_plane(
+        &x->plane[i].src, bsize, src->buffers[i], src->crop_widths[is_uv],
+        src->crop_heights[is_uv], src->strides[is_uv], mi_row, mi_col, NULL,
+        x->e_mbd.plane[i].subsampling_x, x->e_mbd.plane[i].subsampling_y);
   }
 }
 
@@ -3046,7 +3046,7 @@
     BLOCK_SIZE horz_4_bs = get_partition_subsize(bsize, PARTITION_HORZ_4);
     BLOCK_SIZE vert_4_bs = get_partition_subsize(bsize, PARTITION_VERT_4);
     av1_setup_src_planes(x, cpi->source, mi_row, mi_col,
-                         av1_num_planes(&cpi->common));
+                         av1_num_planes(&cpi->common), bsize);
     const int src_stride = x->plane[0].src.stride;
     const uint8_t *src = x->plane[0].src.buf;
     const MACROBLOCKD *const xd = &x->e_mbd;
@@ -3784,7 +3784,7 @@
   int prune_vert = 0;
   if (cpi->sf.ml_prune_rect_partition && !frame_is_intra_only(cm) &&
       (partition_horz_allowed || partition_vert_allowed)) {
-    av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes);
+    av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, bsize);
     ml_prune_rect_partition(cpi, x, bsize, best_rdc.rdcost, cur_none_rd,
                             split_rd, &prune_horz, &prune_vert);
   }
@@ -3937,7 +3937,7 @@
   }
 
   if (pb_source_variance == UINT_MAX) {
-    av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes);
+    av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, bsize);
     if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
       pb_source_variance = av1_high_get_sby_perpixel_variance(
           cpi, &x->plane[0].src, bsize, xd->bd);
@@ -4508,7 +4508,7 @@
   const int mib_size = cm->seq_params.mib_size;
 
   // Delta-q modulation based on variance
-  av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes);
+  av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, sb_size);
 
   int offset_qindex;
   if (DELTAQ_MODULATION == 1) {
@@ -4796,7 +4796,8 @@
   MACROBLOCKD *const xd = &x->e_mbd;
 
   // Copy data over into macro block data structures.
-  av1_setup_src_planes(x, cpi->source, 0, 0, num_planes);
+  av1_setup_src_planes(x, cpi->source, 0, 0, num_planes,
+                       cm->seq_params.sb_size);
 
   av1_setup_block_planes(xd, cm->seq_params.subsampling_x,
                          cm->seq_params.subsampling_y, num_planes);
diff --git a/av1/encoder/encodeframe.h b/av1/encoder/encodeframe.h
index e8cf9b4..3b1730d 100644
--- a/av1/encoder/encodeframe.h
+++ b/av1/encoder/encodeframe.h
@@ -29,7 +29,7 @@
 
 void av1_setup_src_planes(struct macroblock *x,
                           const struct yv12_buffer_config *src, int mi_row,
-                          int mi_col, const int num_planes);
+                          int mi_col, const int num_planes, BLOCK_SIZE bsize);
 
 void av1_encode_frame(struct AV1_COMP *cpi);
 
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index a2fd1c3..2c3e00f 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -562,7 +562,8 @@
   av1_setup_block_planes(&x->e_mbd, seq_params->subsampling_x,
                          seq_params->subsampling_y, num_planes);
 
-  av1_setup_src_planes(x, cpi->source, 0, 0, num_planes);
+  av1_setup_src_planes(x, cpi->source, 0, 0, num_planes,
+                       x->e_mbd.mi[0]->sb_type);
   av1_setup_dst_planes(xd->plane, seq_params->sb_size, new_yv12, 0, 0, 0,
                        num_planes);