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;