Disable superres if screen content tools allowed
This optmiization is currently added to the
SUPERRES_QTHRESH mode only to decide whether to
use superres or not and by how much.
Change-Id: Ib81f7221c3d6e7cff5bd85bce3124ebdd2706339
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 8365407..a14702d 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4952,30 +4952,6 @@
return 1;
}
-// Estimate if the source frame is screen content, based on the portion of
-// blocks that have no more than 4 (experimentally selected) luma colors.
-static int is_screen_content(const uint8_t *src, int use_hbd, int bd,
- int stride, int width, int height) {
- assert(src != NULL);
- int counts = 0;
- const int blk_w = 16;
- const int blk_h = 16;
- const int limit = 4;
- for (int r = 0; r + blk_h <= height; r += blk_h) {
- for (int c = 0; c + blk_w <= width; c += blk_w) {
- int count_buf[1 << 12]; // Maximum (1 << 12) color levels.
- const int n_colors =
- use_hbd ? av1_count_colors_highbd(src + r * stride + c, stride, blk_w,
- blk_h, bd, count_buf)
- : av1_count_colors(src + r * stride + c, stride, blk_w, blk_h,
- count_buf);
- if (n_colors > 1 && n_colors <= limit) counts++;
- }
- }
- // The threshold is 10%.
- return counts * blk_h * blk_w * 10 > width * height;
-}
-
static const uint8_t ref_frame_flag_list[REF_FRAMES] = { 0,
AOM_LAST_FLAG,
AOM_LAST2_FLAG,
@@ -5184,20 +5160,6 @@
av1_zero(*td->counts);
av1_zero(rdc->comp_pred_diff);
- if (frame_is_intra_only(cm)) {
- if (cm->seq_params.force_screen_content_tools == 2) {
- cm->allow_screen_content_tools =
- cpi->oxcf.content == AOM_CONTENT_SCREEN ||
- is_screen_content(cpi->source->y_buffer,
- cpi->source->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
- cpi->source->y_stride, cpi->source->y_width,
- cpi->source->y_height);
- } else {
- cm->allow_screen_content_tools =
- cm->seq_params.force_screen_content_tools;
- }
- }
-
// Allow intrabc when screen content tools are enabled.
cm->allow_intrabc = cm->allow_screen_content_tools;
// Reset the flag.
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 8541eb7..62489ae 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -65,6 +65,7 @@
#include "av1/encoder/random.h"
#include "av1/encoder/ratectrl.h"
#include "av1/encoder/rd.h"
+#include "av1/encoder/rdopt.h"
#include "av1/encoder/segmentation.h"
#include "av1/encoder/speed_features.h"
#include "av1/encoder/temporal_filter.h"
@@ -97,6 +98,30 @@
#define FILE_NAME_LEN 100
#endif
+// Estimate if the source frame is screen content, based on the portion of
+// blocks that have no more than 4 (experimentally selected) luma colors.
+static int is_screen_content(const uint8_t *src, int use_hbd, int bd,
+ int stride, int width, int height) {
+ assert(src != NULL);
+ int counts = 0;
+ const int blk_w = 16;
+ const int blk_h = 16;
+ const int limit = 4;
+ for (int r = 0; r + blk_h <= height; r += blk_h) {
+ for (int c = 0; c + blk_w <= width; c += blk_w) {
+ int count_buf[1 << 12]; // Maximum (1 << 12) color levels.
+ const int n_colors =
+ use_hbd ? av1_count_colors_highbd(src + r * stride + c, stride, blk_w,
+ blk_h, bd, count_buf)
+ : av1_count_colors(src + r * stride + c, stride, blk_w, blk_h,
+ count_buf);
+ if (n_colors > 1 && n_colors <= limit) counts++;
+ }
+ }
+ // The threshold is 10%.
+ return counts * blk_h * blk_w * 10 > width * height;
+}
+
static INLINE void Scale2Ratio(AOM_SCALING mode, int *hr, int *hs) {
switch (mode) {
case NORMAL:
@@ -3772,15 +3797,30 @@
static void set_size_independent_vars(AV1_COMP *cpi) {
int i;
+ AV1_COMMON *cm = &cpi->common;
for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
- cpi->common.global_motion[i] = default_warp_params;
+ cm->global_motion[i] = default_warp_params;
}
cpi->global_motion_search_done = 0;
av1_set_speed_features_framesize_independent(cpi);
av1_set_rd_speed_thresholds(cpi);
av1_set_rd_speed_thresholds_sub8x8(cpi);
- cpi->common.interp_filter = SWITCHABLE;
- cpi->common.switchable_motion_mode = 1;
+ cm->interp_filter = SWITCHABLE;
+ cm->switchable_motion_mode = 1;
+
+ if (frame_is_intra_only(cm)) {
+ if (cm->seq_params.force_screen_content_tools == 2) {
+ cm->allow_screen_content_tools =
+ cpi->oxcf.content == AOM_CONTENT_SCREEN ||
+ is_screen_content(cpi->source->y_buffer,
+ cpi->source->flags & YV12_FLAG_HIGHBITDEPTH,
+ cm->seq_params.bit_depth, cpi->source->y_stride,
+ cpi->source->y_width, cpi->source->y_height);
+ } else {
+ cm->allow_screen_content_tools =
+ cm->seq_params.force_screen_content_tools;
+ }
+ }
}
static void set_size_dependent_vars(AV1_COMP *cpi, int *q, int *bottom_index,
@@ -4028,6 +4068,8 @@
break;
case SUPERRES_RANDOM: new_denom = lcg_rand16(&seed) % 9 + 8; break;
case SUPERRES_QTHRESH: {
+ // Do not use superres when screen content tools are used.
+ if (cpi->common.allow_screen_content_tools) break;
const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
const RATE_FACTOR_LEVEL rf_level = gf_group->rf_level[gf_group->index];
const double rate_factor_delta = rate_factor_deltas[rf_level];
@@ -4380,6 +4422,7 @@
cpi->source->buf_8bit_valid = 0;
aom_clear_system_state();
+
setup_frame_size(cpi);
set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);