Superres: convert macros to speed features
Change-Id: I50ed84997c4d1aff7791acde9748713b4123ef11
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index a95d7db..997e286 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2347,7 +2347,6 @@
av1_setup_frame_size(cpi);
-#if CONFIG_SUPERRES_IN_RECODE
if (av1_superres_in_recode_allowed(cpi) &&
cpi->superres_mode != AOM_SUPERRES_NONE &&
cm->superres_scale_denominator == SCALE_NUMERATOR) {
@@ -2356,7 +2355,6 @@
// recode loop for full-resolution after this anyway.
return -1;
}
-#endif // CONFIG_SUPERRES_IN_RECODE
int top_index = 0, bottom_index = 0;
int q = 0, q_low = 0, q_high = 0;
@@ -2695,8 +2693,6 @@
return AOM_CODEC_OK;
}
-#if CONFIG_SUPERRES_IN_RECODE
-
static int encode_with_and_without_superres(AV1_COMP *cpi, size_t *size,
uint8_t *dest,
int *largest_tile_id) {
@@ -2706,133 +2702,152 @@
aom_codec_err_t err = AOM_CODEC_OK;
av1_save_all_coding_context(cpi);
- // Encode with superres.
-#if SUPERRES_RECODE_ALL_RATIOS
- SuperResCfg *const superres_cfg = &cpi->oxcf.superres_cfg;
- int64_t superres_sses[SCALE_NUMERATOR];
- int64_t superres_rates[SCALE_NUMERATOR];
- int superres_largest_tile_ids[SCALE_NUMERATOR];
- // Use superres for Key-frames and Alt-ref frames only.
- const GF_GROUP *const gf_group = &cpi->gf_group;
- if (gf_group->update_type[gf_group->index] != OVERLAY_UPDATE &&
- gf_group->update_type[gf_group->index] != INTNL_OVERLAY_UPDATE) {
- for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
- ++denom) {
- superres_cfg->superres_scale_denominator = denom;
- superres_cfg->superres_kf_scale_denominator = denom;
- const int this_index = denom - (SCALE_NUMERATOR + 1);
-
- cpi->superres_mode = AOM_SUPERRES_AUTO; // Super-res on for this loop.
- err = encode_with_recode_loop_and_filter(
- cpi, size, dest, &superres_sses[this_index],
- &superres_rates[this_index], &superres_largest_tile_ids[this_index]);
- cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
- if (err != AOM_CODEC_OK) return err;
- restore_all_coding_context(cpi);
- }
- // Reset.
- superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
- superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
- } else {
- for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
- ++denom) {
- const int this_index = denom - (SCALE_NUMERATOR + 1);
- superres_sses[this_index] = INT64_MAX;
- superres_rates[this_index] = INT64_MAX;
- }
- }
-#else
- int64_t sse1 = INT64_MAX;
- int64_t rate1 = INT64_MAX;
- int largest_tile_id1;
- cpi->superres_mode = AOM_SUPERRES_AUTO; // Super-res on for this recode loop.
- err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse1, &rate1,
- &largest_tile_id1);
- cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
- if (err != AOM_CODEC_OK) return err;
- restore_all_coding_context(cpi);
-#endif // SUPERRES_RECODE_ALL_RATIOS
-
- // Encode without superres.
- int64_t sse2 = INT64_MAX;
- int64_t rate2 = INT64_MAX;
- int largest_tile_id2;
- assert(cpi->superres_mode == AOM_SUPERRES_NONE);
- err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse2, &rate2,
- &largest_tile_id2);
- if (err != AOM_CODEC_OK) return err;
-
- // Note: Both use common rdmult based on base qindex of fullres.
- const int64_t rdmult =
- av1_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);
-
-#if SUPERRES_RECODE_ALL_RATIOS
- // Find the best rdcost among all superres denoms.
- double proj_rdcost1 = DBL_MAX;
int64_t sse1 = INT64_MAX;
int64_t rate1 = INT64_MAX;
int largest_tile_id1 = 0;
- (void)sse1;
- (void)rate1;
- (void)largest_tile_id1;
- int best_denom = -1;
- for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR; ++denom) {
- const int this_index = denom - (SCALE_NUMERATOR + 1);
- const int64_t this_sse = superres_sses[this_index];
- const int64_t this_rate = superres_rates[this_index];
- const int this_largest_tile_id = superres_largest_tile_ids[this_index];
- const double this_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, this_rate, this_sse, cm->seq_params.bit_depth);
- if (this_rdcost < proj_rdcost1) {
- sse1 = this_sse;
- rate1 = this_rate;
- largest_tile_id1 = this_largest_tile_id;
- proj_rdcost1 = this_rdcost;
- best_denom = denom;
- }
- }
-#else
- const double proj_rdcost1 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, rate1, sse1, cm->seq_params.bit_depth);
-#endif // SUPERRES_RECODE_ALL_RATIOS
- const double proj_rdcost2 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
- rdmult, rate2, sse2, cm->seq_params.bit_depth);
+ int64_t sse2 = INT64_MAX;
+ int64_t rate2 = INT64_MAX;
+ int largest_tile_id2;
+ double proj_rdcost1 = DBL_MAX;
- // Re-encode with superres if it's better.
- if (proj_rdcost1 < proj_rdcost2) {
- restore_all_coding_context(cpi);
- // TODO(urvang): We should avoid rerunning the recode loop by saving
- // previous output+state, or running encode only for the selected 'q' in
- // previous step.
-#if SUPERRES_RECODE_ALL_RATIOS
- // Again, temporarily force the best denom.
- superres_cfg->superres_scale_denominator = best_denom;
- superres_cfg->superres_kf_scale_denominator = best_denom;
-#endif // SUPERRES_RECODE_ALL_RATIOS
- int64_t sse3 = INT64_MAX;
- int64_t rate3 = INT64_MAX;
+ // Encode with superres.
+ if (cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_ALL) {
+ SuperResCfg *const superres_cfg = &cpi->oxcf.superres_cfg;
+ int64_t superres_sses[SCALE_NUMERATOR];
+ int64_t superres_rates[SCALE_NUMERATOR];
+ int superres_largest_tile_ids[SCALE_NUMERATOR];
+ // Use superres for Key-frames and Alt-ref frames only.
+ const GF_GROUP *const gf_group = &cpi->gf_group;
+ if (gf_group->update_type[gf_group->index] != OVERLAY_UPDATE &&
+ gf_group->update_type[gf_group->index] != INTNL_OVERLAY_UPDATE) {
+ for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
+ ++denom) {
+ superres_cfg->superres_scale_denominator = denom;
+ superres_cfg->superres_kf_scale_denominator = denom;
+ const int this_index = denom - (SCALE_NUMERATOR + 1);
+
+ cpi->superres_mode = AOM_SUPERRES_AUTO; // Super-res on for this loop.
+ err = encode_with_recode_loop_and_filter(
+ cpi, size, dest, &superres_sses[this_index],
+ &superres_rates[this_index],
+ &superres_largest_tile_ids[this_index]);
+ cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
+ if (err != AOM_CODEC_OK) return err;
+ restore_all_coding_context(cpi);
+ }
+ // Reset.
+ superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
+ superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
+ } else {
+ for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
+ ++denom) {
+ const int this_index = denom - (SCALE_NUMERATOR + 1);
+ superres_sses[this_index] = INT64_MAX;
+ superres_rates[this_index] = INT64_MAX;
+ }
+ }
+ // Encode without superres.
+ assert(cpi->superres_mode == AOM_SUPERRES_NONE);
+ err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse2, &rate2,
+ &largest_tile_id2);
+ if (err != AOM_CODEC_OK) return err;
+
+ // Note: Both use common rdmult based on base qindex of fullres.
+ const int64_t rdmult =
+ av1_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);
+
+ // Find the best rdcost among all superres denoms.
+ int best_denom = -1;
+ for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
+ ++denom) {
+ const int this_index = denom - (SCALE_NUMERATOR + 1);
+ const int64_t this_sse = superres_sses[this_index];
+ const int64_t this_rate = superres_rates[this_index];
+ const int this_largest_tile_id = superres_largest_tile_ids[this_index];
+ const double this_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
+ rdmult, this_rate, this_sse, cm->seq_params.bit_depth);
+ if (this_rdcost < proj_rdcost1) {
+ sse1 = this_sse;
+ rate1 = this_rate;
+ largest_tile_id1 = this_largest_tile_id;
+ proj_rdcost1 = this_rdcost;
+ best_denom = denom;
+ }
+ }
+ const double proj_rdcost2 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
+ rdmult, rate2, sse2, cm->seq_params.bit_depth);
+ // Re-encode with superres if it's better.
+ if (proj_rdcost1 < proj_rdcost2) {
+ restore_all_coding_context(cpi);
+ // TODO(urvang): We should avoid rerunning the recode loop by saving
+ // previous output+state, or running encode only for the selected 'q' in
+ // previous step.
+ // Again, temporarily force the best denom.
+ superres_cfg->superres_scale_denominator = best_denom;
+ superres_cfg->superres_kf_scale_denominator = best_denom;
+ int64_t sse3 = INT64_MAX;
+ int64_t rate3 = INT64_MAX;
+ cpi->superres_mode =
+ AOM_SUPERRES_AUTO; // Super-res on for this recode loop.
+ err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse3, &rate3,
+ largest_tile_id);
+ cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
+ assert(sse1 == sse3);
+ assert(rate1 == rate3);
+ assert(largest_tile_id1 == *largest_tile_id);
+ // Reset.
+ superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
+ superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
+ } else {
+ *largest_tile_id = largest_tile_id2;
+ }
+ } else {
+ assert(cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_DUAL);
cpi->superres_mode =
AOM_SUPERRES_AUTO; // Super-res on for this recode loop.
- err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse3, &rate3,
- largest_tile_id);
+ err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse1, &rate1,
+ &largest_tile_id1);
cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
- assert(sse1 == sse3);
- assert(rate1 == rate3);
- assert(largest_tile_id1 == *largest_tile_id);
-#if SUPERRES_RECODE_ALL_RATIOS
- // Reset.
- superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
- superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
-#endif // SUPERRES_RECODE_ALL_RATIOS
- } else {
- *largest_tile_id = largest_tile_id2;
+ if (err != AOM_CODEC_OK) return err;
+ restore_all_coding_context(cpi);
+ // Encode without superres.
+ assert(cpi->superres_mode == AOM_SUPERRES_NONE);
+ err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse2, &rate2,
+ &largest_tile_id2);
+ if (err != AOM_CODEC_OK) return err;
+
+ // Note: Both use common rdmult based on base qindex of fullres.
+ const int64_t rdmult =
+ av1_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);
+ proj_rdcost1 = RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate1, sse1,
+ cm->seq_params.bit_depth);
+ const double proj_rdcost2 = RDCOST_DBL_WITH_NATIVE_BD_DIST(
+ rdmult, rate2, sse2, cm->seq_params.bit_depth);
+ // Re-encode with superres if it's better.
+ if (proj_rdcost1 < proj_rdcost2) {
+ restore_all_coding_context(cpi);
+ // TODO(urvang): We should avoid rerunning the recode loop by saving
+ // previous output+state, or running encode only for the selected 'q' in
+ // previous step.
+ int64_t sse3 = INT64_MAX;
+ int64_t rate3 = INT64_MAX;
+ cpi->superres_mode =
+ AOM_SUPERRES_AUTO; // Super-res on for this recode loop.
+ err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse3, &rate3,
+ largest_tile_id);
+ cpi->superres_mode = AOM_SUPERRES_NONE; // Reset to default (full-res).
+ assert(sse1 == sse3);
+ assert(rate1 == rate3);
+ assert(largest_tile_id1 == *largest_tile_id);
+ } else {
+ *largest_tile_id = largest_tile_id2;
+ }
}
release_copy_buffer(&cpi->coding_context);
return err;
}
-#endif // CONFIG_SUPERRES_IN_RECODE
extern void av1_print_frame_contexts(const FRAME_CONTEXT *fc,
const char *filename);
@@ -3059,14 +3074,12 @@
seq_params->timing_info_present &= !seq_params->reduced_still_picture_hdr;
int largest_tile_id = 0;
-#if CONFIG_SUPERRES_IN_RECODE
if (av1_superres_in_recode_allowed(cpi)) {
if (encode_with_and_without_superres(cpi, size, dest, &largest_tile_id) !=
AOM_CODEC_OK) {
return AOM_CODEC_ERROR;
}
} else {
-#endif // CONFIG_SUPERRES_IN_RECODE
const aom_superres_mode orig_superres_mode = cpi->superres_mode; // save
cpi->superres_mode = cpi->oxcf.superres_cfg.superres_mode;
if (encode_with_recode_loop_and_filter(cpi, size, dest, NULL, NULL,
@@ -3074,9 +3087,7 @@
return AOM_CODEC_ERROR;
}
cpi->superres_mode = orig_superres_mode; // restore
-#if CONFIG_SUPERRES_IN_RECODE
}
-#endif // CONFIG_SUPERRES_IN_RECODE
cpi->seq_params_locked = 1;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 0c5fc26..21143b5 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1904,13 +1904,11 @@
} MV_STATS;
typedef struct {
-#if CONFIG_SUPERRES_IN_RECODE
struct loopfilter lf;
CdefInfo cdef_info;
YV12_BUFFER_CONFIG copy_buffer;
RATE_CONTROL rc;
MV_STATS mv_stats;
-#endif // CONFIG_SUPERRES_IN_RECODE
} CODING_CONTEXT;
typedef struct {
diff --git a/av1/encoder/encoder_utils.c b/av1/encoder/encoder_utils.c
index 019facb..df56033 100644
--- a/av1/encoder/encoder_utils.c
+++ b/av1/encoder/encoder_utils.c
@@ -1235,7 +1235,6 @@
}
}
-#if CONFIG_SUPERRES_IN_RECODE
static void save_cur_buf(AV1_COMP *cpi) {
CODING_CONTEXT *const cc = &cpi->coding_context;
AV1_COMMON *cm = &cpi->common;
@@ -1272,7 +1271,6 @@
save_extra_coding_context(cpi);
if (!frame_is_intra_only(&cpi->common)) release_scaled_references(cpi);
}
-#endif // CONFIG_SUPERRES_IN_RECODE
#if DUMP_RECON_FRAMES == 1
diff --git a/av1/encoder/encoder_utils.h b/av1/encoder/encoder_utils.h
index f369cce..f6fa621 100644
--- a/av1/encoder/encoder_utils.h
+++ b/av1/encoder/encoder_utils.h
@@ -913,13 +913,11 @@
}
}
-#if CONFIG_SUPERRES_IN_RECODE
static AOM_INLINE void restore_all_coding_context(AV1_COMP *cpi) {
restore_cur_buf(cpi);
restore_extra_coding_context(cpi);
if (!frame_is_intra_only(&cpi->common)) release_scaled_references(cpi);
}
-#endif // CONFIG_SUPERRES_IN_RECODE
// Refresh reference frame buffers according to refresh_frame_flags.
static AOM_INLINE void refresh_reference_frames(AV1_COMP *cpi) {
@@ -966,9 +964,7 @@
void av1_set_mb_ssim_rdmult_scaling(AV1_COMP *cpi);
-#if CONFIG_SUPERRES_IN_RECODE
void av1_save_all_coding_context(AV1_COMP *cpi);
-#endif
#if DUMP_RECON_FRAMES == 1
void av1_dump_filtered_recon_frames(AV1_COMP *cpi);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 3d728a4..6bae838 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -428,6 +428,7 @@
}
sf->rd_sf.perform_coeff_opt = 1;
+ sf->hl_sf.superres_auto_search_type = SUPERRES_AUTO_DUAL;
if (speed >= 1) {
sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
@@ -775,6 +776,8 @@
sf->rt_sf.fullpel_search_step_param = 0;
sf->rt_sf.skip_loopfilter_non_reference = 0;
+ sf->hl_sf.superres_auto_search_type = SUPERRES_AUTO_SOLO;
+
if (speed >= 1) {
sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
@@ -1035,6 +1038,7 @@
// Recode loop tolerance %.
hl_sf->recode_tolerance = 25;
hl_sf->high_precision_mv_usage = CURRENT_Q;
+ hl_sf->superres_auto_search_type = SUPERRES_AUTO_ALL;
}
static AOM_INLINE void init_tpl_sf(TPL_SPEED_FEATURES *tpl_sf) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 183d8ea..d647b10 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -283,6 +283,12 @@
QTR_ONLY,
} UENUM1BYTE(MV_PREC_LOGIC);
+enum {
+ SUPERRES_AUTO_ALL, // Tries all possible superres ratios
+ SUPERRES_AUTO_DUAL, // Tries no superres and q-based superres ratios
+ SUPERRES_AUTO_SOLO, // Only apply the q-based superres ratio
+} UENUM1BYTE(SUPERRES_AUTO_SEARCH_TYPE);
+
/*!\endcond */
/*!
* \brief Sequence/frame level speed vs quality features
@@ -317,6 +323,11 @@
// backgrounds very to cheap to encode, and the segmentation we have
// adds overhead.
int static_segmentation;
+
+ /*!
+ * Superres-auto mode search type:
+ */
+ SUPERRES_AUTO_SEARCH_TYPE superres_auto_search_type;
/*!\endcond */
} HIGH_LEVEL_SPEED_FEATURES;
diff --git a/av1/encoder/superres_scale.c b/av1/encoder/superres_scale.c
index cb3a54d..27a1fda 100644
--- a/av1/encoder/superres_scale.c
+++ b/av1/encoder/superres_scale.c
@@ -95,14 +95,13 @@
return new_denom;
}
-#if CONFIG_SUPERRES_IN_RECODE
int av1_superres_in_recode_allowed(const AV1_COMP *const cpi) {
const AV1EncoderConfig *const oxcf = &cpi->oxcf;
// Empirically found to not be beneficial for image coding.
return oxcf->superres_cfg.superres_mode == AOM_SUPERRES_AUTO &&
+ cpi->sf.hl_sf.superres_auto_search_type != SUPERRES_AUTO_SOLO &&
cpi->rc.frames_to_key > 1;
}
-#endif // CONFIG_SUPERRES_IN_RECODE
#define SUPERRES_ENERGY_BY_Q2_THRESH_KEYFRAME_SOLO 0.012
#define SUPERRES_ENERGY_BY_Q2_THRESH_KEYFRAME 0.008
@@ -172,14 +171,12 @@
: cpi->rc.gfu_boost);
printf("denom = %d\n", denom);
*/
-#if CONFIG_SUPERRES_IN_RECODE
if (av1_superres_in_recode_allowed(cpi)) {
assert(cpi->superres_mode != AOM_SUPERRES_NONE);
// Force superres to be tried in the recode loop, as full-res is also going
// to be tried anyway.
denom = AOMMAX(denom, SCALE_NUMERATOR + 1);
}
-#endif // CONFIG_SUPERRES_IN_RECODE
return denom;
}
@@ -254,14 +251,14 @@
if (q <= qthresh) {
new_denom = SCALE_NUMERATOR;
} else {
-#if SUPERRES_RECODE_ALL_RATIOS
- if (cpi->common.current_frame.frame_type == KEY_FRAME)
- new_denom = superres_cfg->superres_kf_scale_denominator;
- else
- new_denom = superres_cfg->superres_scale_denominator;
-#else
- new_denom = get_superres_denom_for_qindex(cpi, q, 1, 1);
-#endif // SUPERRES_RECODE_ALL_RATIOS
+ if (cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_ALL) {
+ if (cpi->common.current_frame.frame_type == KEY_FRAME)
+ new_denom = superres_cfg->superres_kf_scale_denominator;
+ else
+ new_denom = superres_cfg->superres_scale_denominator;
+ } else {
+ new_denom = get_superres_denom_for_qindex(cpi, q, 1, 1);
+ }
}
break;
}
diff --git a/av1/encoder/superres_scale.h b/av1/encoder/superres_scale.h
index 691329c..450a4ed9 100644
--- a/av1/encoder/superres_scale.h
+++ b/av1/encoder/superres_scale.h
@@ -18,10 +18,6 @@
extern "C" {
#endif
-// If true, AOM_SUPERRES_AUTO mode will exhaustively search over all superres
-// denominators for all frames (except overlay and internal overlay frames).
-#define SUPERRES_RECODE_ALL_RATIOS 0
-
int av1_superres_in_recode_allowed(const AV1_COMP *const cpi);
void av1_superres_post_encode(AV1_COMP *cpi);
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index ccb720c..35e5d93 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -134,9 +134,6 @@
set_aom_config_var(CONFIG_AV1_TEMPORAL_DENOISING 0
"Build with temporal denoising support.")
set_aom_config_var(CONFIG_NN_V2 0 "Fully-connected neural nets ver.2.")
-set_aom_config_var(CONFIG_SUPERRES_IN_RECODE 1
- "Enable encoding both full-res and superres in recode loop"
- "when AOM_SUPERRES_AUTO mode is used.")
set_aom_config_var(CONFIG_OPTICAL_FLOW_API 0
"AV1 experiment flag for optical flow API.")
#