Add encoder options for wedge and diff-wtd comp
Allows these tools to be turned off or on with finer
granularity than the enable_masked_comp flag.
STATS_CHANGED due to a bug fix.
Change-Id: I77cafd0a5052a1d81efcf70c6efedf0b74fb4308
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 896945a..8475e48 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -784,6 +784,33 @@
*/
AV1E_SET_ENABLE_INTERINTRA_COMP,
+ /*!\brief Codec control function to turn on / off difference weighted
+ * compound.
+ *
+ * This will enable or disable usage of difference weighted compound.
+ * The default value is 1.
+ *
+ */
+ AV1E_SET_ENABLE_DIFF_WTD_COMP,
+
+ /*!\brief Codec control function to turn on / off interinter wedge
+ * compound.
+ *
+ * This will enable or disable usage of interinter wedge compound.
+ * The default value is 1.
+ *
+ */
+ AV1E_SET_ENABLE_INTERINTER_WEDGE,
+
+ /*!\brief Codec control function to turn on / off interintra wedge
+ * compound.
+ *
+ * This will enable or disable usage of interintra wedge compound.
+ * The default value is 1.
+ *
+ */
+ AV1E_SET_ENABLE_INTERINTRA_WEDGE,
+
/*!\brief Codec control function to turn on / off global motion usage
* for a sequence.
*
@@ -1104,6 +1131,15 @@
AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTRA_COMP, unsigned int)
#define AOM_CTRL_AV1E_SET_ENABLE_INTERINTRA_COMP
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_DIFF_WTD_COMP, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_DIFF_WTD_COMP
+
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTER_WEDGE, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_INTERINTER_WEDGE
+
+AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_INTERINTRA_WEDGE, unsigned int)
+#define AOM_CTRL_AV1E_SET_ENABLE_INTERINTRA_WEDGE
+
AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_GLOBAL_MOTION, unsigned int)
#define AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
diff --git a/apps/aomenc.c b/apps/aomenc.c
index dda82f6..6cff587 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -457,6 +457,18 @@
ARG_DEF(NULL, "enable-interintra-comp", 1,
"Enable interintra compound "
"(0: false, 1: true (default))");
+static const arg_def_t enable_diff_wtd_comp =
+ ARG_DEF(NULL, "enable-diff-wtd-comp", 1,
+ "Enable difference-weighted compound "
+ "(0: false, 1: true (default))");
+static const arg_def_t enable_interinter_wedge =
+ ARG_DEF(NULL, "enable-interinter-wedge", 1,
+ "Enable interinter wedge compound "
+ "(0: false, 1: true (default))");
+static const arg_def_t enable_interintra_wedge =
+ ARG_DEF(NULL, "enable-interintra-wedge", 1,
+ "Enable interintra wedge compound "
+ "(0: false, 1: true (default))");
static const arg_def_t enable_global_motion =
ARG_DEF(NULL, "enable-global-motion", 1,
"Enable global motion "
@@ -675,6 +687,9 @@
&enable_jnt_comp,
&enable_masked_comp,
&enable_interintra_comp,
+ &enable_diff_wtd_comp,
+ &enable_interinter_wedge,
+ &enable_interintra_wedge,
&enable_global_motion,
&enable_warped_motion,
&enable_obmc,
@@ -742,6 +757,9 @@
AV1E_SET_ENABLE_JNT_COMP,
AV1E_SET_ENABLE_MASKED_COMP,
AV1E_SET_ENABLE_INTERINTRA_COMP,
+ AV1E_SET_ENABLE_DIFF_WTD_COMP,
+ AV1E_SET_ENABLE_INTERINTER_WEDGE,
+ AV1E_SET_ENABLE_INTERINTRA_WEDGE,
AV1E_SET_ENABLE_GLOBAL_MOTION,
AV1E_SET_ENABLE_WARPED_MOTION,
AV1E_SET_ENABLE_OBMC,
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 13d46f4..ffe3b4a 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -96,13 +96,16 @@
unsigned int cdf_update_mode;
int enable_order_hint;
int enable_jnt_comp;
- int enable_ref_frame_mvs; // sequence level
- int allow_ref_frame_mvs; // frame level
- int enable_masked_comp; // enable masked compound for sequence
- int enable_interintra_comp; // enable interintra compound for sequence
- int enable_global_motion; // enable global motion usage for sequence
- int enable_warped_motion; // sequence level
- int allow_warped_motion; // frame level
+ int enable_ref_frame_mvs; // sequence level
+ int allow_ref_frame_mvs; // frame level
+ int enable_masked_comp; // enable masked compound for sequence
+ int enable_interintra_comp; // enable interintra compound for sequence
+ int enable_diff_wtd_comp; // enable diff-wtd compound usage
+ int enable_interinter_wedge; // enable interinter-wedge compound usage
+ int enable_interintra_wedge; // enable interintra-wedge compound usage
+ int enable_global_motion; // enable global motion usage for sequence
+ int enable_warped_motion; // sequence level
+ int allow_warped_motion; // frame level
int enable_superres;
#if CONFIG_DENOISE
float noise_level;
@@ -179,6 +182,9 @@
1, // allow ref_frame_mvs frame level
1, // enable masked compound at sequence level
1, // enable interintra compound at sequence level
+ 1, // enable difference-weighted compound
+ 1, // enable interinter wedge compound
+ 1, // enable interintra wedge compound
1, // enable_global_motion usage
1, // enable_warped_motion at sequence level
1, // allow_warped_motion at frame level
@@ -676,7 +682,13 @@
oxcf->enable_jnt_comp =
extra_cfg->enable_jnt_comp & extra_cfg->enable_order_hint;
oxcf->enable_masked_comp = extra_cfg->enable_masked_comp;
+ oxcf->enable_diff_wtd_comp =
+ extra_cfg->enable_masked_comp & extra_cfg->enable_diff_wtd_comp;
+ oxcf->enable_interinter_wedge =
+ extra_cfg->enable_masked_comp & extra_cfg->enable_interinter_wedge;
oxcf->enable_interintra_comp = extra_cfg->enable_interintra_comp;
+ oxcf->enable_interintra_wedge =
+ extra_cfg->enable_interintra_comp & extra_cfg->enable_interintra_wedge;
oxcf->enable_ref_frame_mvs =
extra_cfg->enable_ref_frame_mvs & extra_cfg->enable_order_hint;
@@ -1079,6 +1091,29 @@
return update_extra_cfg(ctx, &extra_cfg);
}
+static aom_codec_err_t ctrl_set_enable_diff_wtd_comp(aom_codec_alg_priv_t *ctx,
+ va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.enable_diff_wtd_comp = CAST(AV1E_SET_ENABLE_DIFF_WTD_COMP, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
+static aom_codec_err_t ctrl_set_enable_interinter_wedge(
+ aom_codec_alg_priv_t *ctx, va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.enable_interinter_wedge =
+ CAST(AV1E_SET_ENABLE_INTERINTER_WEDGE, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
+static aom_codec_err_t ctrl_set_enable_interintra_wedge(
+ aom_codec_alg_priv_t *ctx, va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.enable_interintra_wedge =
+ CAST(AV1E_SET_ENABLE_INTERINTRA_WEDGE, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
static aom_codec_err_t ctrl_set_enable_global_motion(aom_codec_alg_priv_t *ctx,
va_list args) {
struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -1842,6 +1877,9 @@
{ AV1E_SET_ALLOW_REF_FRAME_MVS, ctrl_set_allow_ref_frame_mvs },
{ AV1E_SET_ENABLE_MASKED_COMP, ctrl_set_enable_masked_comp },
{ AV1E_SET_ENABLE_INTERINTRA_COMP, ctrl_set_enable_interintra_comp },
+ { AV1E_SET_ENABLE_DIFF_WTD_COMP, ctrl_set_enable_diff_wtd_comp },
+ { AV1E_SET_ENABLE_INTERINTER_WEDGE, ctrl_set_enable_interinter_wedge },
+ { AV1E_SET_ENABLE_INTERINTRA_WEDGE, ctrl_set_enable_interintra_wedge },
{ AV1E_SET_ENABLE_GLOBAL_MOTION, ctrl_set_enable_global_motion },
{ AV1E_SET_ENABLE_WARPED_MOTION, ctrl_set_enable_warped_motion },
{ AV1E_SET_ALLOW_WARPED_MOTION, ctrl_set_allow_warped_motion },
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 385eea0..fd9f7bb 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -328,6 +328,9 @@
unsigned int allow_ref_frame_mvs;
int enable_masked_comp;
int enable_interintra_comp;
+ int enable_diff_wtd_comp;
+ int enable_interinter_wedge;
+ int enable_interintra_wedge;
int enable_global_motion;
int enable_warped_motion;
int allow_warped_motion;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 4863c7b..9ee24db 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8784,6 +8784,16 @@
x->edge_strength > cpi->sf.disable_wedge_search_edge_thresh;
}
+static INLINE bool enable_wedge_interinter_search(MACROBLOCK *const x,
+ const AV1_COMP *const cpi) {
+ return enable_wedge_search(x, cpi) && cpi->oxcf.enable_interinter_wedge;
+}
+
+static INLINE bool enable_wedge_interintra_search(MACROBLOCK *const x,
+ const AV1_COMP *const cpi) {
+ return enable_wedge_search(x, cpi) && cpi->oxcf.enable_interintra_wedge;
+}
+
static int handle_inter_intra_mode(const AV1_COMP *const cpi,
MACROBLOCK *const x, BLOCK_SIZE bsize,
int mi_row, int mi_col, MB_MODE_INFO *mbmi,
@@ -8859,7 +8869,7 @@
int64_t best_interintra_rd_nowedge = rd;
int64_t best_interintra_rd_wedge = INT64_MAX;
int_mv tmp_mv;
- if (enable_wedge_search(x, cpi)) {
+ if (enable_wedge_interintra_search(x, cpi)) {
mbmi->use_wedge_interintra = 1;
rwedge = av1_cost_literal(get_interintra_wedge_bits(bsize)) +
@@ -9539,14 +9549,19 @@
masked_type_cost += x->compound_type_cost[bsize][cur_type - 1];
rs2 = masked_type_cost;
- if (enable_wedge_search(x, cpi) &&
- ((*rd / cpi->max_comp_type_rd_threshold_div) *
+ if (((*rd / cpi->max_comp_type_rd_threshold_div) *
cpi->max_comp_type_rd_threshold_mul) < ref_best_rd) {
- best_rd_cur = build_and_cost_compound_type(
- cpi, x, cur_mv, bsize, this_mode, &rs2, *rate_mv, orig_dst,
- &tmp_rate_mv, preds0, preds1, buffers->residual1, buffers->diff10,
- strides, mi_row, mi_col, rd_stats->rate, ref_best_rd,
- &calc_pred_masked_compound);
+ const COMPOUND_TYPE compound_type = mbmi->interinter_comp.type;
+
+ if (!((compound_type == COMPOUND_WEDGE &&
+ !enable_wedge_interinter_search(x, cpi)) ||
+ (compound_type == COMPOUND_DIFFWTD &&
+ !cpi->oxcf.enable_diff_wtd_comp)))
+ best_rd_cur = build_and_cost_compound_type(
+ cpi, x, cur_mv, bsize, this_mode, &rs2, *rate_mv, orig_dst,
+ &tmp_rate_mv, preds0, preds1, buffers->residual1, buffers->diff10,
+ strides, mi_row, mi_col, rd_stats->rate, ref_best_rd,
+ &calc_pred_masked_compound);
}
}
if (best_rd_cur < *rd) {