Add encoder control to turn on/off IntraBC mode

IntraBC mode is enabled by default.

Change-Id: Iaa90e824beb3aadfa764ef5d24284282089789fe
diff --git a/aom/aomcx.h b/aom/aomcx.h
index f665cea..982a1f1 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -882,6 +882,9 @@
   /*!\brief Codec control function to turn on/off palette mode */
   AV1E_SET_ENABLE_PALETTE,
 
+  /*!\brief Codec control function to turn on/off intra block copy mode */
+  AV1E_SET_ENABLE_INTRABC,
+
   /*!\brief Codec control function to set the delta q mode
    *
    * AV1 has a segment based feature that allows encoder to adaptively change
@@ -1210,6 +1213,9 @@
 AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_PALETTE, unsigned int)
 #define AOM_CTRL_AV1E_SET_ENABLE_PALETTE
 
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTRABC, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_INTRABC
+
 AOM_CTRL_USE_TYPE(AV1E_SET_FRAME_PARALLEL_DECODING, unsigned int)
 #define AOM_CTRL_AV1E_SET_FRAME_PARALLEL_DECODING
 
diff --git a/apps/aomenc.c b/apps/aomenc.c
index 14fc469..af0f2fc 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -501,6 +501,10 @@
 static const arg_def_t enable_palette =
     ARG_DEF(NULL, "enable-palette", 1,
             "Enable palette prediction mode (0: false, 1: true (default))");
+static const arg_def_t enable_intrabc =
+    ARG_DEF(NULL, "enable-intrabc", 1,
+            "Enable intra block copy prediction mode "
+            "(0: false, 1: true (default))");
 static const arg_def_t disable_trellis_quant =
     ARG_DEF(NULL, "disable-trellis-quant", 1,
             "Disable trellis optimization of quantized coefficients (0: false ("
@@ -724,6 +728,7 @@
                                        &enable_filter_intra,
                                        &enable_obmc,
                                        &enable_palette,
+                                       &enable_intrabc,
                                        &disable_trellis_quant,
                                        &enable_qm,
                                        &qm_min,
@@ -801,6 +806,7 @@
                                         AV1E_SET_ENABLE_FILTER_INTRA,
                                         AV1E_SET_ENABLE_OBMC,
                                         AV1E_SET_ENABLE_PALETTE,
+                                        AV1E_SET_ENABLE_INTRABC,
                                         AV1E_SET_DISABLE_TRELLIS_QUANT,
                                         AV1E_SET_ENABLE_QM,
                                         AV1E_SET_QM_MIN,
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 60bcf60..cda5f72 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -114,6 +114,7 @@
   int enable_filter_intra;       // enable filter intra for sequence
   int enable_superres;
   int enable_palette;
+  int enable_intrabc;
 #if CONFIG_DENOISE
   float noise_level;
   int noise_block_size;
@@ -203,6 +204,7 @@
   1,                            // enable filter intra at sequence level
   1,                            // superres
   1,                            // enable palette
+  1,                            // enable intrabc
 #if CONFIG_DENOISE
   0,   // noise_level
   32,  // noise_block_size
@@ -555,6 +557,7 @@
   oxcf->enable_restoration = extra_cfg->enable_restoration;
   oxcf->enable_obmc = extra_cfg->enable_obmc;
   oxcf->enable_palette = extra_cfg->enable_palette;
+  oxcf->enable_intrabc = extra_cfg->enable_intrabc;
   oxcf->disable_trellis_quant = extra_cfg->disable_trellis_quant;
   oxcf->using_qm = extra_cfg->enable_qm;
   oxcf->qm_y = extra_cfg->qm_y;
@@ -1210,6 +1213,13 @@
   return update_extra_cfg(ctx, &extra_cfg);
 }
 
+static aom_codec_err_t ctrl_set_enable_intrabc(aom_codec_alg_priv_t *ctx,
+                                               va_list args) {
+  struct av1_extracfg extra_cfg = ctx->extra_cfg;
+  extra_cfg.enable_intrabc = CAST(AV1E_SET_ENABLE_INTRABC, args);
+  return update_extra_cfg(ctx, &extra_cfg);
+}
+
 static aom_codec_err_t ctrl_set_error_resilient_mode(aom_codec_alg_priv_t *ctx,
                                                      va_list args) {
   struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -1965,6 +1975,7 @@
   { AV1E_SET_ENABLE_FILTER_INTRA, ctrl_set_enable_filter_intra },
   { AV1E_SET_ENABLE_SUPERRES, ctrl_set_enable_superres },
   { AV1E_SET_ENABLE_PALETTE, ctrl_set_enable_palette },
+  { AV1E_SET_ENABLE_INTRABC, ctrl_set_enable_intrabc },
   { AV1E_SET_AQ_MODE, ctrl_set_aq_mode },
   { AV1E_SET_REDUCED_TX_TYPE_SET, ctrl_set_reduced_tx_type_set },
   { AV1E_SET_DELTAQ_MODE, ctrl_set_deltaq_mode },
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f478843..83b26a6 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -342,6 +342,7 @@
   int enable_filter_intra;
   int enable_superres;
   int enable_palette;
+  int enable_intrabc;
   unsigned int save_as_annexb;
 
 #if CONFIG_DENOISE
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 31a38cd..cb3bdf6 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -10048,7 +10048,7 @@
                                        RD_STATS *rd_cost, BLOCK_SIZE bsize,
                                        int64_t best_rd) {
   const AV1_COMMON *const cm = &cpi->common;
-  if (!av1_allow_intrabc(cm)) return INT64_MAX;
+  if (!av1_allow_intrabc(cm) || !cpi->oxcf.enable_intrabc) return INT64_MAX;
   const int num_planes = av1_num_planes(cm);
 
   MACROBLOCKD *const xd = &x->e_mbd;