speed_features.c 22.1 KB
Newer Older
Jingning Han's avatar
Jingning Han committed
1
/*
Yaowu Xu's avatar
Yaowu Xu committed
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Jingning Han's avatar
Jingning Han committed
3
 *
Yaowu Xu's avatar
Yaowu Xu committed
4
5
6
7
8
9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Jingning Han's avatar
Jingning Han committed
10
11
12
13
 */

#include <limits.h>

14
15
16
#include "av1/encoder/encoder.h"
#include "av1/encoder/speed_features.h"
#include "av1/encoder/rdopt.h"
Jingning Han's avatar
Jingning Han committed
17

Yaowu Xu's avatar
Yaowu Xu committed
18
#include "aom_dsp/aom_dsp_common.h"
Jingning Han's avatar
Jingning Han committed
19

20
21
// Setting this to 1 will disable trellis optimization completely.
// Setting this to 2 will disable trellis optimization within the
22
23
24
25
// transform search. Trellis optimization will still be applied
// in the final encode.
#define DISABLE_TRELLISQ_SEARCH 0

26
#define MAX_MESH_SPEED 5  // Max speed setting for mesh motion method
27
28
29
30
31
32
33
34
static MESH_PATTERN
    good_quality_mesh_patterns[MAX_MESH_SPEED + 1][MAX_MESH_STEP] = {
      { { 64, 8 }, { 28, 4 }, { 15, 1 }, { 7, 1 } },
      { { 64, 8 }, { 28, 4 }, { 15, 1 }, { 7, 1 } },
      { { 64, 8 }, { 14, 2 }, { 7, 1 }, { 7, 1 } },
      { { 64, 16 }, { 24, 8 }, { 12, 4 }, { 7, 1 } },
      { { 64, 16 }, { 24, 8 }, { 12, 4 }, { 7, 1 } },
      { { 64, 16 }, { 24, 8 }, { 12, 4 }, { 7, 1 } },
35
    };
36
static unsigned char good_quality_max_mesh_pct[MAX_MESH_SPEED + 1] = {
37
  50, 50, 25, 15, 5, 1
38
};
39

40
41
42
43
#if CONFIG_INTRABC
// TODO(aconverse@google.com): These settings are pretty relaxed, tune them for
// each speed setting
static MESH_PATTERN intrabc_mesh_patterns[MAX_MESH_SPEED + 1][MAX_MESH_STEP] = {
44
  { { 256, 1 }, { 256, 1 }, { 0, 0 }, { 0, 0 } },
45
  { { 256, 1 }, { 256, 1 }, { 0, 0 }, { 0, 0 } },
46
47
48
49
50
51
52
53
54
  { { 64, 1 }, { 64, 1 }, { 0, 0 }, { 0, 0 } },
  { { 64, 1 }, { 64, 1 }, { 0, 0 }, { 0, 0 } },
  { { 64, 4 }, { 16, 1 }, { 0, 0 }, { 0, 0 } },
  { { 64, 4 }, { 16, 1 }, { 0, 0 }, { 0, 0 } },
};
static uint8_t intrabc_max_mesh_pct[MAX_MESH_SPEED + 1] = { 100, 100, 100,
                                                            25,  25,  10 };
#endif

Jingning Han's avatar
Jingning Han committed
55
56
// Intra only frames, golden frames (except alt ref overlays) and
// alt ref frames tend to be coded at a higher than ambient quality
Yaowu Xu's avatar
Yaowu Xu committed
57
static int frame_is_boosted(const AV1_COMP *cpi) {
Yunqing Wang's avatar
Yunqing Wang committed
58
  return frame_is_kf_gf_arf(cpi);
Jingning Han's avatar
Jingning Han committed
59
60
61
62
63
64
65
66
}

// Sets a partition size down to which the auto partition code will always
// search (can go lower), based on the image dimensions. The logic here
// is that the extent to which ringing artefacts are offensive, depends
// partly on the screen area that over which they propogate. Propogation is
// limited by transform block size but the screen area take up by a given block
// size will be larger for a small image format stretched to full screen.
Yaowu Xu's avatar
Yaowu Xu committed
67
static BLOCK_SIZE set_partition_min_limit(AV1_COMMON *const cm) {
Jingning Han's avatar
Jingning Han committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  unsigned int screen_area = (cm->width * cm->height);

  // Select block size based on image format size.
  if (screen_area < 1280 * 720) {
    // Formats smaller in area than 720P
    return BLOCK_4X4;
  } else if (screen_area < 1920 * 1080) {
    // Format >= 720P and < 1080P
    return BLOCK_8X8;
  } else {
    // Formats 1080P and up
    return BLOCK_16X16;
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
83
static void set_good_speed_feature_framesize_dependent(AV1_COMP *cpi,
Jingning Han's avatar
Jingning Han committed
84
85
                                                       SPEED_FEATURES *sf,
                                                       int speed) {
Yaowu Xu's avatar
Yaowu Xu committed
86
  AV1_COMMON *const cm = &cpi->common;
Jingning Han's avatar
Jingning Han committed
87
88

  if (speed >= 2) {
Yaowu Xu's avatar
Yaowu Xu committed
89
    if (AOMMIN(cm->width, cm->height) >= 720) {
90
91
      sf->disable_split_mask =
          cm->show_frame ? DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
Jingning Han's avatar
Jingning Han committed
92
93
94
95
96
97
98
99
100
101
102
103
      sf->adaptive_pred_interp_filter = 0;
      sf->partition_search_breakout_dist_thr = (1 << 24);
      sf->partition_search_breakout_rate_thr = 120;
    } else {
      sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
      sf->partition_search_breakout_dist_thr = (1 << 22);
      sf->partition_search_breakout_rate_thr = 100;
    }
    sf->rd_auto_partition_min_limit = set_partition_min_limit(cm);
  }

  if (speed >= 3) {
Yaowu Xu's avatar
Yaowu Xu committed
104
    if (AOMMIN(cm->width, cm->height) >= 720) {
Jingning Han's avatar
Jingning Han committed
105
106
107
108
109
110
111
112
113
114
115
116
117
118
      sf->disable_split_mask = DISABLE_ALL_SPLIT;
      sf->schedule_mode_search = cm->base_qindex < 220 ? 1 : 0;
      sf->partition_search_breakout_dist_thr = (1 << 25);
      sf->partition_search_breakout_rate_thr = 200;
    } else {
      sf->max_intra_bsize = BLOCK_32X32;
      sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
      sf->schedule_mode_search = cm->base_qindex < 175 ? 1 : 0;
      sf->partition_search_breakout_dist_thr = (1 << 23);
      sf->partition_search_breakout_rate_thr = 120;
    }
  }

  // If this is a two pass clip that fits the criteria for animated or
119
  // graphics content then reset disable_split_mask for speeds 2+.
Jingning Han's avatar
Jingning Han committed
120
  // Also if the image edge is internal to the coded area.
121
  if ((speed >= 2) && (cpi->oxcf.pass == 2) &&
Jingning Han's avatar
Jingning Han committed
122
      ((cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION) ||
Yaowu Xu's avatar
Yaowu Xu committed
123
       (av1_internal_image_edge(cpi)))) {
Jingning Han's avatar
Jingning Han committed
124
125
126
127
    sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
  }

  if (speed >= 4) {
Yaowu Xu's avatar
Yaowu Xu committed
128
    if (AOMMIN(cm->width, cm->height) >= 720) {
Jingning Han's avatar
Jingning Han committed
129
130
131
132
133
134
135
136
      sf->partition_search_breakout_dist_thr = (1 << 26);
    } else {
      sf->partition_search_breakout_dist_thr = (1 << 24);
    }
    sf->disable_split_mask = DISABLE_ALL_SPLIT;
  }
}

137
138
139
140
static void set_good_speed_features_framesize_independent(AV1_COMP *cpi,
                                                          SPEED_FEATURES *sf,
                                                          int speed) {
  AV1_COMMON *const cm = &cpi->common;
Jingning Han's avatar
Jingning Han committed
141
142
  const int boosted = frame_is_boosted(cpi);

143
144
145
  // Speed 0 for all speed features that give neutral coding performance change.
  sf->reduce_inter_modes = 1;

Jingning Han's avatar
Jingning Han committed
146
  if (speed >= 1) {
147
    sf->selective_ref_frame = 1;
148
149
    sf->tx_size_search_init_depth_rect = 1;
    sf->tx_size_search_init_depth_sqr = 1;
150
151
152
#if CONFIG_EXT_PARTITION_TYPES
    sf->prune_ext_partition_types_search = 1;
#endif  // CONFIG_EXT_PARTITION_TYPES
153
154
155
#if CONFIG_DUAL_FILTER
    sf->use_fast_interpolation_filter_search = 1;
#endif  // CONFIG_DUAL_FILTER
156
#if 0   // CONFIG_HASH_ME && CONFIG_LV_MAP
157
158
    // TODO(mfo): Activate feature once it gives positive results.
    sf->use_hash_based_trellis = 1;
159
#endif  // CONFIG_HASH_ME && CONFIG_LV_MAP
Cheng Chen's avatar
Cheng Chen committed
160
    sf->tx_type_search.skip_tx_search = 1;
161
162
163
  }

  if (speed >= 2) {
164
    sf->tx_size_search_method = USE_FAST_RD;
165
166
167
    sf->tx_type_search.fast_intra_tx_type_search = 1;
    sf->tx_type_search.fast_inter_tx_type_search = 1;

168
    sf->selective_ref_frame = 2;
169

Jingning Han's avatar
Jingning Han committed
170
    if ((cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION) ||
Yaowu Xu's avatar
Yaowu Xu committed
171
        av1_internal_image_edge(cpi)) {
Jingning Han's avatar
Jingning Han committed
172
173
174
175
      sf->use_square_partition_only = !frame_is_boosted(cpi);
    } else {
      sf->use_square_partition_only = !frame_is_intra_only(cm);
    }
176
    sf->fast_cdef_search = 1;
Jingning Han's avatar
Jingning Han committed
177

178
    sf->less_rectangular_check = 1;
Jingning Han's avatar
Jingning Han committed
179
180
181
182

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
    sf->mv.auto_mv_step_size = 1;
183
    sf->adaptive_rd_thresh = 1;
Jingning Han's avatar
Jingning Han committed
184
185
186
187
188
    sf->mv.subpel_iters_per_step = 1;
    sf->mode_skip_start = 10;
    sf->adaptive_pred_interp_filter = 1;

    sf->recode_loop = ALLOW_RECODE_KFARFGF;
189
190
#if CONFIG_TX64X64
    sf->intra_y_mode_mask[TX_64X64] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
191
#if CONFIG_CFL
192
    sf->intra_uv_mode_mask[TX_64X64] = UV_INTRA_DC_H_V_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
193
#else
194
    sf->intra_uv_mode_mask[TX_64X64] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
195
#endif  // CONFIG_CFL
196
#endif  // CONFIG_TX64X64
Jingning Han's avatar
Jingning Han committed
197
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
198
#if CONFIG_CFL
199
    sf->intra_uv_mode_mask[TX_32X32] = UV_INTRA_DC_H_V_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
200
#else
Jingning Han's avatar
Jingning Han committed
201
    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
202
#endif
Jingning Han's avatar
Jingning Han committed
203
    sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
204
#if CONFIG_CFL
205
    sf->intra_uv_mode_mask[TX_16X16] = UV_INTRA_DC_H_V_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
206
#else
Jingning Han's avatar
Jingning Han committed
207
    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
Luc Trudeau's avatar
Luc Trudeau committed
208
#endif
Jingning Han's avatar
Jingning Han committed
209
210
211

    sf->tx_size_search_breakout = 1;
    sf->partition_search_breakout_rate_thr = 80;
212

213
214
215
    // Use transform domain distortion.
    // Note var-tx expt always uses pixel domain distortion.
    sf->use_transform_domain_distortion = 1;
216
    sf->disable_wedge_search_var_thresh = 100;
217
    sf->fast_wedge_sign_estimate = 1;
Jingning Han's avatar
Jingning Han committed
218
219
  }

220
  if (speed >= 3) {
221
222
    sf->selective_ref_frame = 3;

223
224
225
    sf->tx_size_search_method =
        frame_is_boosted(cpi) ? USE_FULL_RD : USE_LARGESTALL;
    sf->mode_search_skip_flags =
clang-format's avatar
clang-format committed
226
227
228
229
        (cm->frame_type == KEY_FRAME)
            ? 0
            : FLAG_SKIP_INTRA_DIRMISMATCH | FLAG_SKIP_INTRA_BESTINTER |
                  FLAG_SKIP_COMP_BESTINTRA | FLAG_SKIP_INTRA_LOWVAR;
Jingning Han's avatar
Jingning Han committed
230
    sf->disable_filter_search_var_thresh = 100;
231
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES_ALL;
Jingning Han's avatar
Jingning Han committed
232
233
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
    sf->allow_partition_search_skip = 1;
234
    sf->use_upsampled_references = 0;
235
    sf->adaptive_rd_thresh = 2;
236
    sf->tx_type_search.prune_mode = PRUNE_2D_FAST;
237
    sf->gm_search_type = GM_DISABLE_SEARCH;
Jingning Han's avatar
Jingning Han committed
238
239
  }

240
  if (speed >= 4) {
Jingning Han's avatar
Jingning Han committed
241
    sf->use_square_partition_only = !frame_is_intra_only(cm);
242
243
    sf->tx_size_search_method =
        frame_is_intra_only(cm) ? USE_FULL_RD : USE_LARGESTALL;
Jingning Han's avatar
Jingning Han committed
244
245
246
247
248
249
250
251
252
    sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
    sf->adaptive_pred_interp_filter = 0;
    sf->adaptive_mode_search = 1;
    sf->cb_partition_search = !boosted;
    sf->cb_pred_filter_search = 1;
    sf->alt_ref_search_fp = 1;
    sf->recode_loop = ALLOW_RECODE_KFMAXBW;
    sf->adaptive_rd_thresh = 3;
    sf->mode_skip_start = 6;
253
254
#if CONFIG_TX64X64
    sf->intra_y_mode_mask[TX_64X64] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
255
#if CONFIG_CFL
256
    sf->intra_uv_mode_mask[TX_64X64] = UV_INTRA_DC_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
257
#else
258
    sf->intra_uv_mode_mask[TX_64X64] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
259
#endif  // CONFIG_CFL
260
#endif  // CONFIG_TX64X64
Jingning Han's avatar
Jingning Han committed
261
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
262
#if CONFIG_CFL
263
    sf->intra_uv_mode_mask[TX_32X32] = UV_INTRA_DC_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
264
#else
Jingning Han's avatar
Jingning Han committed
265
    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
266
#endif  // CONFIG_CFL
Jingning Han's avatar
Jingning Han committed
267
268
269
    sf->adaptive_interp_filter_search = 1;
  }

270
  if (speed >= 5) {
Jingning Han's avatar
Jingning Han committed
271
272
273
274
275
276
277
278
279
280
281
282
283
    sf->use_square_partition_only = 1;
    sf->tx_size_search_method = USE_LARGESTALL;
    sf->mv.search_method = BIGDIA;
    sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
    sf->adaptive_rd_thresh = 4;
    if (cm->frame_type != KEY_FRAME)
      sf->mode_search_skip_flags |= FLAG_EARLY_TERMINATE;
    sf->disable_filter_search_var_thresh = 200;
    sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
    sf->use_fast_coef_costing = 1;
    sf->partition_search_breakout_rate_thr = 300;
  }

284
  if (speed >= 6) {
Jingning Han's avatar
Jingning Han committed
285
    int i;
286
    sf->optimize_coefficients = NO_TRELLIS_OPT;
Jingning Han's avatar
Jingning Han committed
287
288
289
290
    sf->mv.search_method = HEX;
    sf->disable_filter_search_var_thresh = 500;
    for (i = 0; i < TX_SIZES; ++i) {
      sf->intra_y_mode_mask[i] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
291
#if CONFIG_CFL
292
      sf->intra_uv_mode_mask[i] = UV_INTRA_DC_CFL;
Luc Trudeau's avatar
Luc Trudeau committed
293
#else
Jingning Han's avatar
Jingning Han committed
294
      sf->intra_uv_mode_mask[i] = INTRA_DC;
Luc Trudeau's avatar
Luc Trudeau committed
295
#endif  // CONFIG_CFL
Jingning Han's avatar
Jingning Han committed
296
297
298
299
300
    }
    sf->partition_search_breakout_rate_thr = 500;
    sf->mv.reduce_first_step_size = 1;
    sf->simple_model_rd_from_var = 1;
  }
Thomas Daede's avatar
Thomas Daede committed
301
302
303
304
305
  if (speed >= 7) {
    const int is_keyframe = cm->frame_type == KEY_FRAME;
    const int frames_since_key = is_keyframe ? 0 : cpi->rc.frames_since_key;
    sf->default_max_partition_size = BLOCK_32X32;
    sf->default_min_partition_size = BLOCK_8X8;
306
307
308
#if CONFIG_TX64X64
    sf->intra_y_mode_mask[TX_64X64] = INTRA_DC;
#endif  // CONFIG_TX64X64
Jingning Han's avatar
Jingning Han committed
309
310
311
312
313
314
315
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
    sf->frame_parameter_update = 0;
    sf->mv.search_method = FAST_HEX;
    sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEAR_NEW;
    sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST;
    sf->inter_mode_mask[BLOCK_64X32] = INTER_NEAREST;
    sf->inter_mode_mask[BLOCK_64X64] = INTER_NEAREST;
316
317
318
319
320
#if CONFIG_EXT_PARTITION
    sf->inter_mode_mask[BLOCK_64X128] = INTER_NEAREST;
    sf->inter_mode_mask[BLOCK_128X64] = INTER_NEAREST;
    sf->inter_mode_mask[BLOCK_128X128] = INTER_NEAREST;
#endif  // CONFIG_EXT_PARTITION
Thomas Daede's avatar
Thomas Daede committed
321
    sf->partition_search_type = REFERENCE_PARTITION;
Jingning Han's avatar
Jingning Han committed
322
    sf->default_min_partition_size = BLOCK_8X8;
Thomas Daede's avatar
Thomas Daede committed
323
    sf->reuse_inter_pred_sby = 1;
324
325
    sf->force_frame_boost =
        is_keyframe ||
Jingning Han's avatar
Jingning Han committed
326
327
328
        (frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
    sf->max_delta_qindex = is_keyframe ? 20 : 15;
    sf->coeff_prob_appx_step = 4;
Thomas Daede's avatar
Thomas Daede committed
329
    sf->mode_search_skip_flags |= FLAG_SKIP_INTRA_DIRMISMATCH;
Jingning Han's avatar
Jingning Han committed
330
  }
331
332
333
334
335
336
  if (speed >= 8) {
    sf->mv.search_method = FAST_DIAMOND;
    sf->mv.fullpel_search_step_param = 10;
    sf->mv.subpel_force_stop = 2;
    sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
  }
Jingning Han's avatar
Jingning Han committed
337
338
}

Yaowu Xu's avatar
Yaowu Xu committed
339
void av1_set_speed_features_framesize_dependent(AV1_COMP *cpi) {
Jingning Han's avatar
Jingning Han committed
340
  SPEED_FEATURES *const sf = &cpi->sf;
Yaowu Xu's avatar
Yaowu Xu committed
341
  const AV1EncoderConfig *const oxcf = &cpi->oxcf;
342
  AV1_COMMON *const cm = &cpi->common;
Jingning Han's avatar
Jingning Han committed
343
344
345
  RD_OPT *const rd = &cpi->rd;
  int i;

346
  // Limit memory usage for high resolutions
347
348
349
350
351
352
353
354
  // TODO(zoeliu): Temporary solution to resolve the insufficient RAM issue for
  //               ext-refs. Need to work with @yunqingwang to have a more
  //               effective solution.
  if (AOMMIN(cm->width, cm->height) > 720) {
    // Turn off the use of upsampled references for HD resolution
    sf->use_upsampled_references = 0;
  } else if ((AOMMIN(cm->width, cm->height) > 540) &&
             (oxcf->profile != PROFILE_0)) {
355
356
357
    sf->use_upsampled_references = 0;
  }

Thomas Daede's avatar
Thomas Daede committed
358
  if (oxcf->mode == GOOD) {
Jingning Han's avatar
Jingning Han committed
359
360
361
362
363
364
365
366
367
368
369
370
371
    set_good_speed_feature_framesize_dependent(cpi, sf, oxcf->speed);
  }

  if (sf->disable_split_mask == DISABLE_ALL_SPLIT) {
    sf->adaptive_pred_interp_filter = 0;
  }

  // Check for masked out split cases.
  for (i = 0; i < MAX_REFS; ++i) {
    if (sf->disable_split_mask & (1 << i)) {
      rd->thresh_mult_sub8x8[i] = INT_MAX;
    }
  }
Yunqing Wang's avatar
Yunqing Wang committed
372
373
374
375
376
377

  // This is only used in motion vector unit test.
  if (cpi->oxcf.motion_vector_unit_test == 1)
    cpi->find_fractional_mv_step = av1_return_max_sub_pixel_mv;
  else if (cpi->oxcf.motion_vector_unit_test == 2)
    cpi->find_fractional_mv_step = av1_return_min_sub_pixel_mv;
Jingning Han's avatar
Jingning Han committed
378
379
}

380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
static void set_dev_sf(AV1_COMP *cpi, SPEED_FEATURES *sf, int speed) {
  AV1_COMMON *const cm = &cpi->common;

  if (speed & TXFM_CODING_SF) {
    sf->tx_size_search_init_depth_rect = 1;
    sf->tx_size_search_init_depth_sqr = 1;
    sf->tx_size_search_method = USE_FAST_RD;
    sf->tx_type_search.fast_intra_tx_type_search = 1;
    sf->tx_type_search.fast_inter_tx_type_search = 1;
  }

  if (speed & INTER_PRED_SF) {
    sf->selective_ref_frame = 2;
    sf->adaptive_motion_search = 1;
    sf->mv.auto_mv_step_size = 1;
    sf->adaptive_rd_thresh = 1;
    sf->mv.subpel_iters_per_step = 1;
    sf->adaptive_pred_interp_filter = 1;
  }

  if (speed & INTRA_PRED_SF) {
    sf->max_intra_bsize = BLOCK_32X32;
  }

  if (speed & PARTITION_SF) {
    if ((cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION) ||
        av1_internal_image_edge(cpi)) {
      sf->use_square_partition_only = !frame_is_boosted(cpi);
    } else {
      sf->use_square_partition_only = !frame_is_intra_only(cm);
    }
    sf->less_rectangular_check = 1;
#if CONFIG_EXT_PARTITION_TYPES
    sf->prune_ext_partition_types_search = 1;
#endif  // CONFIG_EXT_PARTITION_TYPES
  }

  if (speed & LOOP_FILTER_SF) {
    sf->fast_cdef_search = 1;
  }

  if (speed & RD_SKIP_SF) {
    sf->use_rd_breakout = 1;
  }
}

Yaowu Xu's avatar
Yaowu Xu committed
426
427
void av1_set_speed_features_framesize_independent(AV1_COMP *cpi) {
  AV1_COMMON *const cm = &cpi->common;
428
  SPEED_FEATURES *const sf = &cpi->sf;
Jingning Han's avatar
Jingning Han committed
429
  MACROBLOCK *const x = &cpi->td.mb;
Yaowu Xu's avatar
Yaowu Xu committed
430
  const AV1EncoderConfig *const oxcf = &cpi->oxcf;
Jingning Han's avatar
Jingning Han committed
431
432
  int i;

433
  (void)cm;
Jingning Han's avatar
Jingning Han committed
434
435
436
437
438
439
440
  // best quality defaults
  sf->frame_parameter_update = 1;
  sf->mv.search_method = NSTEP;
  sf->recode_loop = ALLOW_RECODE;
  sf->mv.subpel_search_method = SUBPEL_TREE;
  sf->mv.subpel_iters_per_step = 2;
  sf->mv.subpel_force_stop = 0;
441
#if DISABLE_TRELLISQ_SEARCH == 2
442
443
444
  sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf)
                                  ? FINAL_PASS_TRELLIS_OPT
                                  : NO_TRELLIS_OPT;
445
446
#elif DISABLE_TRELLISQ_SEARCH == 1
  sf->optimize_coefficients = NO_TRELLIS_OPT;
447
#else
448
449
450
451
  if (is_lossless_requested(&cpi->oxcf))
    sf->optimize_coefficients = NO_TRELLIS_OPT;
  else
    sf->optimize_coefficients = FULL_TRELLIS_OPT;
452
#endif  // DISABLE_TRELLISQ_SEARCH
Jingning Han's avatar
Jingning Han committed
453
454
455
456
457
458
459
  sf->mv.reduce_first_step_size = 0;
  sf->coeff_prob_appx_step = 1;
  sf->mv.auto_mv_step_size = 0;
  sf->mv.fullpel_search_step_param = 6;
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
  sf->adaptive_rd_thresh = 0;
  sf->tx_size_search_method = USE_FULL_RD;
460
461
  sf->tx_size_search_init_depth_sqr = 0;
  sf->tx_size_search_init_depth_rect = 0;
462
  sf->reduce_inter_modes = 0;
Jingning Han's avatar
Jingning Han committed
463
464
465
466
467
468
469
  sf->adaptive_motion_search = 0;
  sf->adaptive_pred_interp_filter = 0;
  sf->adaptive_mode_search = 0;
  sf->cb_pred_filter_search = 0;
  sf->cb_partition_search = 0;
  sf->alt_ref_search_fp = 0;
  sf->partition_search_type = SEARCH_PARTITION;
470
  sf->tx_type_search.prune_mode = PRUNE_2D_ACCURATE;
471
  sf->tx_type_search.use_tx_size_pruning = 1;
472
  sf->tx_type_search.use_skip_flag_prediction = 1;
473
  sf->tx_type_search.fast_intra_tx_type_search = 0;
474
  sf->tx_type_search.fast_inter_tx_type_search = 0;
Cheng Chen's avatar
Cheng Chen committed
475
  sf->tx_type_search.skip_tx_search = 0;
476
  sf->selective_ref_frame = 0;
Jingning Han's avatar
Jingning Han committed
477
478
479
480
  sf->less_rectangular_check = 0;
  sf->use_square_partition_only = 0;
  sf->auto_min_max_partition_size = NOT_IN_USE;
  sf->rd_auto_partition_min_limit = BLOCK_4X4;
481
  sf->default_max_partition_size = BLOCK_LARGEST;
Jingning Han's avatar
Jingning Han committed
482
483
484
485
486
487
488
489
490
491
  sf->default_min_partition_size = BLOCK_4X4;
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
  sf->disable_split_mask = 0;
  sf->mode_search_skip_flags = 0;
  sf->force_frame_boost = 0;
  sf->max_delta_qindex = 0;
  sf->disable_filter_search_var_thresh = 0;
  sf->adaptive_interp_filter_search = 0;
  sf->allow_partition_search_skip = 0;
492
  sf->use_upsampled_references = 1;
493
  sf->disable_wedge_search_var_thresh = 0;
494
  sf->fast_wedge_sign_estimate = 0;
495
  sf->drop_ref = 0;
496
  sf->skip_intra_in_interframe = 1;
497
  sf->txb_split_cap = 1;
Jingning Han's avatar
Jingning Han committed
498
499
500

  for (i = 0; i < TX_SIZES; i++) {
    sf->intra_y_mode_mask[i] = INTRA_ALL;
Luc Trudeau's avatar
Luc Trudeau committed
501
502
503
#if CONFIG_CFL
    sf->intra_uv_mode_mask[i] = UV_INTRA_ALL;
#else
Jingning Han's avatar
Jingning Han committed
504
    sf->intra_uv_mode_mask[i] = INTRA_ALL;
Luc Trudeau's avatar
Luc Trudeau committed
505
#endif  // CONFIG_CFL
Jingning Han's avatar
Jingning Han committed
506
507
508
509
510
511
512
  }
  sf->use_rd_breakout = 0;
  sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
  sf->use_fast_coef_updates = TWO_LOOP;
  sf->use_fast_coef_costing = 0;
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
  sf->schedule_mode_search = 0;
513
  for (i = 0; i < BLOCK_SIZES_ALL; ++i) sf->inter_mode_mask[i] = INTER_ALL;
514
  sf->max_intra_bsize = BLOCK_LARGEST;
Jingning Han's avatar
Jingning Han committed
515
516
517
518
519
520
521
522
523
524
525
526
  sf->reuse_inter_pred_sby = 0;
  // This setting only takes effect when partition_search_type is set
  // to FIXED_PARTITION.
  sf->always_this_block_size = BLOCK_16X16;
  sf->search_type_check_frequency = 50;
  // Recode loop tolerance %.
  sf->recode_tolerance = 25;
  sf->default_interp_filter = SWITCHABLE;
  sf->tx_size_search_breakout = 0;
  sf->partition_search_breakout_dist_thr = 0;
  sf->partition_search_breakout_rate_thr = 0;
  sf->simple_model_rd_from_var = 0;
527
528
529
#if CONFIG_EXT_PARTITION_TYPES
  sf->prune_ext_partition_types_search = 0;
#endif  // CONFIG_EXT_PARTITION_TYPES
530
  sf->fast_cdef_search = 0;
Jingning Han's avatar
Jingning Han committed
531

532
  // Set this at the appropriate speed levels
533
  sf->use_transform_domain_distortion = 0;
534
  sf->gm_search_type = GM_FULL_SEARCH;
535
  sf->use_fast_interpolation_filter_search = 0;
536
  sf->use_hash_based_trellis = 0;
537

538
539
  set_dev_sf(cpi, sf, oxcf->dev_sf);

Sebastien Alaiwan's avatar
Sebastien Alaiwan committed
540
  if (oxcf->mode == GOOD)
541
    set_good_speed_features_framesize_independent(cpi, sf, oxcf->speed);
Jingning Han's avatar
Jingning Han committed
542

543
544
545
546
547
548
  // sf->partition_search_breakout_dist_thr is set assuming max 64x64
  // blocks. Normalise this if the blocks are bigger.
  if (MAX_SB_SIZE_LOG2 > 6) {
    sf->partition_search_breakout_dist_thr <<= 2 * (MAX_SB_SIZE_LOG2 - 6);
  }

Yaowu Xu's avatar
Yaowu Xu committed
549
550
  cpi->full_search_sad = av1_full_search_sad;
  cpi->diamond_search_sad = av1_diamond_search_sad;
551
552

  sf->allow_exhaustive_searches = 1;
553
554
  int speed = (oxcf->speed > MAX_MESH_SPEED) ? MAX_MESH_SPEED : oxcf->speed;
  if (cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION)
555
    sf->exhaustive_searches_thresh = (1 << 24);
556
  else
557
    sf->exhaustive_searches_thresh = (1 << 25);
558
559
560
561
562
563
564
565
  sf->max_exaustive_pct = good_quality_max_mesh_pct[speed];
  if (speed > 0)
    sf->exhaustive_searches_thresh = sf->exhaustive_searches_thresh << 1;

  for (i = 0; i < MAX_MESH_STEP; ++i) {
    sf->mesh_patterns[i].range = good_quality_mesh_patterns[speed][i].range;
    sf->mesh_patterns[i].interval =
        good_quality_mesh_patterns[speed][i].interval;
566
  }
567
568
569
570
571
572
573
574
575
576
577
#if CONFIG_INTRABC
  if ((frame_is_intra_only(cm) && cm->allow_screen_content_tools) &&
      (cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION ||
       cpi->oxcf.content == AOM_CONTENT_SCREEN)) {
    for (i = 0; i < MAX_MESH_STEP; ++i) {
      sf->mesh_patterns[i].range = intrabc_mesh_patterns[speed][i].range;
      sf->mesh_patterns[i].interval = intrabc_mesh_patterns[speed][i].interval;
    }
    sf->max_exaustive_pct = intrabc_max_mesh_pct[speed];
  }
#endif  // CONFIG_INTRABC
Jingning Han's avatar
Jingning Han committed
578
579
580

  // Slow quant, dct and trellis not worthwhile for first pass
  // so make sure they are always turned off.
581
  if (oxcf->pass == 1) sf->optimize_coefficients = NO_TRELLIS_OPT;
Jingning Han's avatar
Jingning Han committed
582
583
584
585

  // No recode for 1 pass.
  if (oxcf->pass == 0) {
    sf->recode_loop = DISALLOW_RECODE;
586
    sf->optimize_coefficients = NO_TRELLIS_OPT;
Jingning Han's avatar
Jingning Han committed
587
588
589
  }

  if (sf->mv.subpel_search_method == SUBPEL_TREE) {
Yaowu Xu's avatar
Yaowu Xu committed
590
    cpi->find_fractional_mv_step = av1_find_best_sub_pixel_tree;
Jingning Han's avatar
Jingning Han committed
591
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
Yaowu Xu's avatar
Yaowu Xu committed
592
    cpi->find_fractional_mv_step = av1_find_best_sub_pixel_tree_pruned;
Jingning Han's avatar
Jingning Han committed
593
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_MORE) {
Yaowu Xu's avatar
Yaowu Xu committed
594
    cpi->find_fractional_mv_step = av1_find_best_sub_pixel_tree_pruned_more;
Jingning Han's avatar
Jingning Han committed
595
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_EVENMORE) {
Yaowu Xu's avatar
Yaowu Xu committed
596
    cpi->find_fractional_mv_step = av1_find_best_sub_pixel_tree_pruned_evenmore;
Jingning Han's avatar
Jingning Han committed
597
598
  }

599
  x->optimize = oxcf->pass != 1 ? sf->optimize_coefficients : NO_TRELLIS_OPT;
600
#if CONFIG_AOM_QM
601
  // FIXME: trellis not very efficient for quantisation matrices
602
  if (cm->using_qmatrix) x->optimize = 0;
603
#endif
Jingning Han's avatar
Jingning Han committed
604
605
606
607
608
609
610

  x->min_partition_size = sf->default_min_partition_size;
  x->max_partition_size = sf->default_max_partition_size;

  if (!cpi->oxcf.frame_periodic_boost) {
    sf->max_delta_qindex = 0;
  }
Yunqing Wang's avatar
Yunqing Wang committed
611
612
613
614
615
616

  // This is only used in motion vector unit test.
  if (cpi->oxcf.motion_vector_unit_test == 1)
    cpi->find_fractional_mv_step = av1_return_max_sub_pixel_mv;
  else if (cpi->oxcf.motion_vector_unit_test == 2)
    cpi->find_fractional_mv_step = av1_return_min_sub_pixel_mv;
617
618
619
620

#if CONFIG_DIST_8X8
  if (sf->use_transform_domain_distortion) cpi->oxcf.using_dist_8x8 = 0;
#endif  // CONFIG_DIST_8X8
Jingning Han's avatar
Jingning Han committed
621
}