Fix enc row-mt for delta-q=2

In DELTA_Q_LF mode, for skip superblocks, delta_lf is not
encoded in the bitstream but is inferred from the previously
encoded superblock. In case of row based multi-threading of
encoder, delta_lf of the previously encoded superblock might
not be available as different threads will be operating on
different rows simultaneously. Therefore, the delta_lf values
after encoding stage of row based mt will be incorrect.
Updating these values (delta_lf_from_base and delta_lf) after
the encoding stage can help to overcome this issue.

Change-Id: I20ed9303c00cb1d5fc8b8af562e558ce7cbe2e49
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 6e963f0..f76269a 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -29,6 +29,43 @@
   td->rd_counts.skip_mode_used_flag |= td_t->rd_counts.skip_mode_used_flag;
 }
 
+static void update_delta_lf_for_row_mt(AV1_COMP *cpi) {
+  AV1_COMMON *cm = &cpi->common;
+  MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
+  const int mib_size = cm->seq_params.mib_size;
+  const int frame_lf_count =
+      av1_num_planes(cm) > 1 ? FRAME_LF_COUNT : FRAME_LF_COUNT - 2;
+  for (int row = 0; row < cm->tile_rows; row++) {
+    for (int col = 0; col < cm->tile_cols; col++) {
+      TileDataEnc *tile_data = &cpi->tile_data[row * cm->tile_cols + col];
+      const TileInfo *const tile_info = &tile_data->tile_info;
+      for (int mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
+           mi_row += mib_size) {
+        if (mi_row == tile_info->mi_row_start)
+          av1_reset_loop_filter_delta(xd, av1_num_planes(cm));
+        for (int mi_col = tile_info->mi_col_start;
+             mi_col < tile_info->mi_col_end; mi_col += mib_size) {
+          const int idx_str = cm->mi_stride * mi_row + mi_col;
+          MB_MODE_INFO **mi = cm->mi_grid_visible + idx_str;
+          MB_MODE_INFO *mbmi = mi[0];
+          if (mbmi->skip == 1 && (mbmi->sb_type == cm->seq_params.sb_size)) {
+            for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id)
+              mbmi->delta_lf[lf_id] = xd->delta_lf[lf_id];
+            mbmi->delta_lf_from_base = xd->delta_lf_from_base;
+          } else {
+            if (cm->delta_lf_multi) {
+              for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id)
+                xd->delta_lf[lf_id] = mbmi->delta_lf[lf_id];
+            } else {
+              xd->delta_lf_from_base = mbmi->delta_lf_from_base;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
 void av1_row_mt_sync_read_dummy(struct AV1RowMTSyncData *const row_mt_sync,
                                 int r, int c) {
   (void)row_mt_sync;
@@ -643,5 +680,6 @@
   prepare_enc_workers(cpi, enc_row_mt_worker_hook, num_workers);
   launch_enc_workers(cpi, num_workers);
   sync_enc_workers(cpi, num_workers);
+  if (cm->delta_lf_present_flag) update_delta_lf_for_row_mt(cpi);
   accumulate_counters_enc_workers(cpi, num_workers);
 }