Add flag to indicate if intrabc is used

Change-Id: If8a4f3d256e619c9efdb66b1d8b8da5b8fc980ab
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 1340cef..d8d8e7b 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3870,6 +3870,9 @@
     aom_wb_write_literal(wb, cpi->common.ans_window_size_log2 - 8, 4);
 #endif  // CONFIG_ANS && ANS_MAX_SYMBOLS
     aom_wb_write_bit(wb, cm->allow_screen_content_tools);
+#if CONFIG_INTRABC
+    if (cm->allow_screen_content_tools) aom_wb_write_bit(wb, cm->allow_intrabc);
+#endif  // CONFIG_INTRABC
 #if CONFIG_AMVR
     if (cm->allow_screen_content_tools) {
       if (cm->seq_force_integer_mv == 2) {
@@ -3881,7 +3884,13 @@
     }
 #endif
   } else {
-    if (cm->intra_only) aom_wb_write_bit(wb, cm->allow_screen_content_tools);
+    if (cm->intra_only) {
+      aom_wb_write_bit(wb, cm->allow_screen_content_tools);
+#if CONFIG_INTRABC
+      if (cm->allow_screen_content_tools)
+        aom_wb_write_bit(wb, cm->allow_intrabc);
+#endif  // CONFIG_INTRABC
+    }
 #if !CONFIG_NO_FRAME_CONTEXT_SIGNALING
     if (!cm->error_resilient_mode) {
       if (cm->intra_only) {
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index b646d29..0a653f4 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -3628,11 +3628,19 @@
 
   av1_crc_calculator_init(&td->mb.tx_rd_record.crc_calculator, 24, 0x5D6DCB);
 
+#if CONFIG_INTRABC
+  td->intrabc_used_this_tile = 0;
+#endif  // CONFIG_INTRABC
+
   for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
        mi_row += cm->mib_size) {
     encode_rd_sb_row(cpi, td, this_tile, mi_row, &tok);
   }
 
+#if CONFIG_INTRABC
+  cpi->intrabc_used |= td->intrabc_used_this_tile;
+#endif  // CONFIG_INTRABC
+
   cpi->tok_count[tile_row][tile_col] =
       (unsigned int)(tok - cpi->tile_tok[tile_row][tile_col]);
   assert(cpi->tok_count[tile_row][tile_col] <=
@@ -3919,6 +3927,13 @@
                           cpi->source->y_height);
   }
 
+#if CONFIG_INTRABC
+  // Allow intrabc when screen content tools are enabled.
+  cm->allow_intrabc = cm->allow_screen_content_tools;
+  // Reset the flag.
+  cpi->intrabc_used = 0;
+#endif  // CONFIG_INTRABC
+
 #if CONFIG_HASH_ME
   if (cpi->oxcf.pass != 1 && cpi->common.allow_screen_content_tools) {
     // add to hash table
@@ -4224,6 +4239,11 @@
     cpi->time_encode_sb_row += aom_usec_timer_elapsed(&emr_timer);
   }
 
+#if CONFIG_INTRABC
+  // If intrabc is allowed but never selected, reset the allow_intrabc flag.
+  if (cm->allow_intrabc && !cpi->intrabc_used) cm->allow_intrabc = 0;
+#endif  // CONFIG_INTRABC
+
 #if 0
   // Keep record of the total distortion this time around for future use
   cpi->last_frame_distortion = cpi->frame_distortion;
@@ -4850,6 +4870,10 @@
 #endif  // CONFIG_DIST_8X8
 
   if (!dry_run) {
+#if CONFIG_INTRABC
+    if (av1_allow_intrabc(bsize, cm))
+      if (is_intrabc_block(mbmi)) td->intrabc_used_this_tile = 1;
+#endif  // CONFIG_INTRABC
     TX_SIZE tx_size =
         is_inter && !mbmi->skip ? mbmi->min_tx_size : mbmi->tx_size;
     if (cm->tx_mode == TX_MODE_SELECT && !xd->lossless[mbmi->segment_id] &&
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 453be1b..32cb2f1 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -341,8 +341,10 @@
   int32_t *mask_buf;
   uint8_t *above_pred_buf;
   uint8_t *left_pred_buf;
-
   PALETTE_BUFFER *palette_buffer;
+#if CONFIG_INTRABC
+  int intrabc_used_this_tile;
+#endif  // CONFIG_INTRABC
 } ThreadData;
 
 struct EncWorkerData;
@@ -606,6 +608,10 @@
 #if CONFIG_BGSPRITE
   int bgsprite_allowed;
 #endif  // CONFIG_BGSPRITE
+#if CONFIG_INTRABC
+  // A flag to indicate if intrabc is ever used in current frame.
+  int intrabc_used;
+#endif  // CONFIG_INTRABC
 } AV1_COMP;
 
 void av1_initialize_enc(void);