Superres: use TPL etc in fullres recode try.
Earlier, TPL, deltaQ and some other encoding options were disabled for
both fullres and superres recode tries.
Regression was introduced in:
https://aomedia-review.googlesource.com/c/aom/+/103104
Now, we make sure all these options are enabled for the fullres try, so
that fullres encode will be same as baseline.
BDRate baseline vs SUPERRES_AUTO mode for hdres2, VBR mode:
- before = +2.074
- after = +0.216
BUG=aomedia:2844
Change-Id: I1a06068f276aec7267911775c5aacc3040a06baf
(cherry picked from commit 2e592e3b09570ea8644bd4cf687c34e45fdca51b)
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index e30d668..bae475f 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -1191,7 +1191,8 @@
if (allow_tpl) {
// Need to set the size for TPL for ARF
// TODO(bohanli): Why is this? what part of it is necessary?
- av1_set_frame_size(cpi, cm->width, cm->height);
+ av1_set_frame_size(cpi, cm->superres_upscaled_width,
+ cm->superres_upscaled_height);
}
}
if (allow_tpl) {
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 7286c02..33a7ea8 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -653,7 +653,14 @@
av1_update_film_grain_parameters(cpi, oxcf);
cpi->oxcf = *oxcf;
- cpi->superres_mode = oxcf->superres_cfg.superres_mode; // default
+ // When user provides superres_mode = AOM_SUPERRES_AUTO, we still initialize
+ // superres mode for current encoding = AOM_SUPERRES_NONE. This is to ensure
+ // that any analysis (e.g. TPL) happening outside the main encoding loop still
+ // happens at full resolution.
+ // This value will later be set appropriately just before main encoding loop.
+ cpi->superres_mode = oxcf->superres_cfg.superres_mode == AOM_SUPERRES_AUTO
+ ? AOM_SUPERRES_NONE
+ : oxcf->superres_cfg.superres_mode; // default
x->e_mbd.bd = (int)seq_params->bit_depth;
x->e_mbd.global_motion = cm->global_motion;
@@ -2703,8 +2710,10 @@
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
@@ -2713,11 +2722,9 @@
int64_t sse2 = INT64_MAX;
int64_t rate2 = INT64_MAX;
int largest_tile_id2;
- cpi->superres_mode = AOM_SUPERRES_NONE; // To force full-res.
+ assert(cpi->superres_mode == AOM_SUPERRES_NONE);
err = encode_with_recode_loop_and_filter(cpi, size, dest, &sse2, &rate2,
&largest_tile_id2);
- cpi->superres_mode = cpi->oxcf.superres_cfg.superres_mode; // Reset.
- assert(cpi->oxcf.superres_cfg.superres_mode == AOM_SUPERRES_AUTO);
if (err != AOM_CODEC_OK) return err;
// Note: Both use common rdmult based on base qindex of fullres.
@@ -2769,8 +2776,11 @@
#endif // SUPERRES_RECODE_ALL_RATIOS
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);
@@ -3029,6 +3039,7 @@
}
} else {
#endif // CONFIG_SUPERRES_IN_RECODE
+ cpi->superres_mode = cpi->oxcf.superres_cfg.superres_mode;
if (encode_with_recode_loop_and_filter(cpi, size, dest, NULL, NULL,
&largest_tile_id) != AOM_CODEC_OK) {
return AOM_CODEC_ERROR;