vp9_speed_features.c 17.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <limits.h>

Dmitry Kovalev's avatar
Dmitry Kovalev committed
13
#include "vp9/encoder/vp9_encoder.h"
14 15
#include "vp9/encoder/vp9_speed_features.h"

16 17 18
// Intra only frames, golden frames (except alt ref overlays) and
// alt ref frames tend to be coded at a higher than ambient quality
static int frame_is_boosted(const VP9_COMP *cpi) {
19
  return frame_is_kf_gf_arf(cpi) || vp9_is_upper_layer_key_frame(cpi);
20 21
}

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
static void set_good_speed_feature_framesize_dependent(VP9_COMMON *cm,
                                                       SPEED_FEATURES *sf,
                                                       int speed) {
  if (speed >= 1) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
                                              : DISABLE_ALL_INTER_SPLIT;
      sf->partition_search_breakout_dist_thr = (1 << 23);
    } else {
      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
      sf->partition_search_breakout_dist_thr = (1 << 21);
    }
  }

  if (speed >= 2) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
                                              : DISABLE_ALL_INTER_SPLIT;
      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;
    }
  }

  if (speed >= 3) {
    if (MIN(cm->width, cm->height) >= 720) {
      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 (speed >= 4) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->partition_search_breakout_dist_thr = (1 << 26);
    } else {
      sf->partition_search_breakout_dist_thr = (1 << 24);
    }
    sf->disable_split_mask = DISABLE_ALL_SPLIT;
  }
}
74

75 76
static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
                                   SPEED_FEATURES *sf, int speed) {
77 78
  const int boosted = frame_is_boosted(cpi);

79 80 81 82 83 84 85 86 87
  sf->adaptive_rd_thresh = 1;
  sf->allow_skip_recode = 1;

  if (speed >= 1) {
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check  = 1;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
88
    sf->mv.auto_mv_step_size = 1;
89
    sf->adaptive_rd_thresh = 2;
90
    sf->mv.subpel_iters_per_step = 1;
91 92 93 94 95 96 97 98
    sf->mode_skip_start = 10;
    sf->adaptive_pred_interp_filter = 1;

    sf->recode_loop = ALLOW_RECODE_KFARFGF;
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
    sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
99 100

    sf->tx_size_search_breakout = 1;
101
    sf->partition_search_breakout_rate_thr = 80;
102
  }
103

104
  if (speed >= 2) {
105 106 107
    sf->tx_size_search_method = frame_is_boosted(cpi) ? USE_FULL_RD
                                                      : USE_LARGESTALL;

108
    sf->reference_masking = 1;
109 110
    sf->mode_search_skip_flags = (cm->frame_type == KEY_FRAME) ? 0 :
                                 FLAG_SKIP_INTRA_DIRMISMATCH |
111 112 113 114 115
                                 FLAG_SKIP_INTRA_BESTINTER |
                                 FLAG_SKIP_COMP_BESTINTRA |
                                 FLAG_SKIP_INTRA_LOWVAR;
    sf->disable_filter_search_var_thresh = 100;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
116
    sf->auto_min_max_partition_size = CONSTRAIN_NEIGHBORING_MIN_MAX;
117

118
    sf->allow_partition_search_skip = 1;
119
  }
120

121
  if (speed >= 3) {
122 123
    sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
                                                        : USE_LARGESTALL;
124
    sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
125
    sf->adaptive_pred_interp_filter = 0;
126
    sf->adaptive_mode_search = 1;
127
    sf->cb_partition_search = !boosted;
128
    sf->cb_pred_filter_search = 1;
129
    sf->alt_ref_search_fp = 1;
130 131 132
    sf->recode_loop = ALLOW_RECODE_KFMAXBW;
    sf->adaptive_rd_thresh = 3;
    sf->mode_skip_start = 6;
133 134
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC;
135
    sf->adaptive_interp_filter_search = 1;
136
  }
137

138 139 140
  if (speed >= 4) {
    sf->use_square_partition_only = 1;
    sf->tx_size_search_method = USE_LARGESTALL;
141
    sf->mv.search_method = BIGDIA;
142
    sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
143
    sf->adaptive_rd_thresh = 4;
144 145
    if (cm->frame_type != KEY_FRAME)
      sf->mode_search_skip_flags |= FLAG_EARLY_TERMINATE;
146 147
    sf->disable_filter_search_var_thresh = 200;
    sf->use_lp32x32fdct = 1;
148 149
    sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
    sf->use_fast_coef_costing = 1;
150
    sf->motion_field_mode_search = !boosted;
151
    sf->partition_search_breakout_rate_thr = 300;
152
  }
153

154
  if (speed >= 5) {
155
    int i;
156
    sf->optimize_coefficients = 0;
157
    sf->mv.search_method = HEX;
158
    sf->disable_filter_search_var_thresh = 500;
159
    for (i = 0; i < TX_SIZES; ++i) {
160 161
      sf->intra_y_mode_mask[i] = INTRA_DC;
      sf->intra_uv_mode_mask[i] = INTRA_DC;
162
    }
163
    sf->partition_search_breakout_rate_thr = 500;
164 165
    sf->mv.reduce_first_step_size = 1;
  }
166 167
}

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
static void set_rt_speed_feature_framesize_dependent(VP9_COMP *cpi,
    SPEED_FEATURES *sf, int speed) {
  VP9_COMMON *const cm = &cpi->common;

  if (speed >= 1) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
                                              : DISABLE_ALL_INTER_SPLIT;
    } else {
      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
    }
  }

  if (speed >= 2) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
                                              : DISABLE_ALL_INTER_SPLIT;
    } else {
      sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
    }
  }

  if (speed >= 5) {
    if (MIN(cm->width, cm->height) >= 720) {
      sf->partition_search_breakout_dist_thr = (1 << 25);
    } else {
      sf->partition_search_breakout_dist_thr = (1 << 23);
    }
  }

  if (speed >= 7) {
    sf->encode_breakout_thresh = (MIN(cm->width, cm->height) >= 720) ?
        800 : 300;
  }
}

204
static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
205
                                 int speed, vp9e_tune_content content) {
206
  VP9_COMMON *const cm = &cpi->common;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
207 208
  const int is_keyframe = cm->frame_type == KEY_FRAME;
  const int frames_since_key = is_keyframe ? 0 : cpi->rc.frames_since_key;
209 210 211 212
  sf->static_segmentation = 0;
  sf->adaptive_rd_thresh = 1;
  sf->use_fast_coef_costing = 1;

213
  if (speed >= 1) {
214 215
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check = 1;
216 217
    sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
                                                        : USE_LARGESTALL;
218 219

    sf->use_rd_breakout = 1;
Yaowu Xu's avatar
Yaowu Xu committed
220

221 222
    sf->adaptive_motion_search = 1;
    sf->adaptive_pred_interp_filter = 1;
223
    sf->mv.auto_mv_step_size = 1;
224 225 226 227 228
    sf->adaptive_rd_thresh = 2;
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
  }
229

230
  if (speed >= 2) {
231 232
    sf->mode_search_skip_flags = (cm->frame_type == KEY_FRAME) ? 0 :
                                 FLAG_SKIP_INTRA_DIRMISMATCH |
233 234 235
                                 FLAG_SKIP_INTRA_BESTINTER |
                                 FLAG_SKIP_COMP_BESTINTRA |
                                 FLAG_SKIP_INTRA_LOWVAR;
236 237 238 239 240
    sf->adaptive_pred_interp_filter = 2;
    sf->reference_masking = 1;
    sf->disable_filter_search_var_thresh = 50;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
Paul Wilkins's avatar
Paul Wilkins committed
241
    sf->lf_motion_threshold = LOW_MOTION_THRESHOLD;
242 243 244 245 246 247
    sf->adjust_partitioning_from_last_frame = 1;
    sf->last_partitioning_redo_frequency = 3;
    sf->use_lp32x32fdct = 1;
    sf->mode_skip_start = 11;
    sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
  }
248

249 250 251 252 253
  if (speed >= 3) {
    sf->use_square_partition_only = 1;
    sf->disable_filter_search_var_thresh = 100;
    sf->use_uv_intra_rd_estimate = 1;
    sf->skip_encode_sb = 1;
254
    sf->mv.subpel_iters_per_step = 1;
255 256 257 258 259 260 261
    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
    sf->allow_skip_recode = 0;
    sf->optimize_coefficients = 0;
    sf->disable_split_mask = DISABLE_ALL_SPLIT;
    sf->lpf_pick = LPF_PICK_FROM_Q;
  }
262

Yaowu Xu's avatar
Yaowu Xu committed
263
  if (speed >= 4) {
264 265 266 267 268 269 270
    int i;
    sf->last_partitioning_redo_frequency = 4;
    sf->adaptive_rd_thresh = 5;
    sf->use_fast_coef_costing = 0;
    sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX;
    sf->adjust_partitioning_from_last_frame =
        cm->last_frame_type != cm->frame_type || (0 ==
271
        (frames_since_key + 1) % sf->last_partitioning_redo_frequency);
272
    sf->mv.subpel_force_stop = 1;
273 274
    for (i = 0; i < TX_SIZES; i++) {
      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
275
      sf->intra_uv_mode_mask[i] = INTRA_DC;
276
    }
277
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
278
    sf->frame_parameter_update = 0;
279
    sf->mv.search_method = FAST_HEX;
280

281 282 283 284
    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;
285 286 287
    sf->max_intra_bsize = BLOCK_32X32;
    sf->allow_skip_recode = 1;
  }
288

Yaowu Xu's avatar
Yaowu Xu committed
289
  if (speed >= 5) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
290 291 292
    sf->use_quant_fp = !is_keyframe;
    sf->auto_min_max_partition_size = is_keyframe ? RELAXED_NEIGHBORING_MIN_MAX
                                                  : STRICT_NEIGHBORING_MIN_MAX;
293 294
    sf->default_max_partition_size = BLOCK_32X32;
    sf->default_min_partition_size = BLOCK_8X8;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
295 296 297
    sf->force_frame_boost = is_keyframe ||
        (frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
    sf->max_delta_qindex = is_keyframe ? 20 : 15;
298
    sf->partition_search_type = REFERENCE_PARTITION;
299
    sf->use_nonrd_pick_mode = !is_keyframe;
300
    sf->allow_skip_recode = 0;
301 302 303 304
    sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEW_ZERO;
    sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST_NEW_ZERO;
    sf->inter_mode_mask[BLOCK_64X32] = INTER_NEAREST_NEW_ZERO;
    sf->inter_mode_mask[BLOCK_64X64] = INTER_NEAREST_NEW_ZERO;
305
    sf->adaptive_rd_thresh = 2;
306 307
    // This feature is only enabled when partition search is disabled.
    sf->reuse_inter_pred_sby = 1;
308
    sf->partition_search_breakout_rate_thr = 200;
309 310
    sf->coeff_prob_appx_step = 4;
    sf->use_fast_coef_updates = is_keyframe ? TWO_LOOP : ONE_LOOP_REDUCED;
311
    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH;
312

313 314 315 316 317 318 319 320 321 322
    if (!is_keyframe) {
      int i;
      if (content == VP9E_CONTENT_SCREEN) {
        for (i = 0; i < TX_SIZES; ++i)
          sf->intra_y_mode_mask[i] = INTRA_DC_TM_H_V;
      } else {
        for (i = 0; i < TX_SIZES; i++)
          sf->intra_y_mode_mask[i] = INTRA_DC;
      }
    }
323
  }
324

Yaowu Xu's avatar
Yaowu Xu committed
325
  if (speed >= 6) {
326
    // Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
327
    sf->partition_search_type = VAR_BASED_PARTITION;
328
    // Turn on this to use non-RD key frame coding mode.
329
    sf->use_nonrd_pick_mode = 1;
330
    sf->mv.search_method = NSTEP;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
331
    sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
332
    sf->mv.reduce_first_step_size = 1;
333
    sf->skip_encode_sb = 0;
334
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
335

Yaowu Xu's avatar
Yaowu Xu committed
336
  if (speed >= 7) {
Yaowu Xu's avatar
Yaowu Xu committed
337
    sf->adaptive_rd_thresh = 3;
338
    sf->mv.search_method = FAST_DIAMOND;
339
    sf->mv.fullpel_search_step_param = 10;
Yaowu Xu's avatar
Yaowu Xu committed
340
    sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
Yaowu Xu's avatar
Yaowu Xu committed
341
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
342

Yaowu Xu's avatar
Yaowu Xu committed
343
  if (speed >= 12) {
Yaowu Xu's avatar
Yaowu Xu committed
344
    sf->adaptive_rd_thresh = 4;
Yaowu Xu's avatar
Yaowu Xu committed
345 346
    sf->mv.subpel_force_stop = 2;
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
347

Yaowu Xu's avatar
Yaowu Xu committed
348
  if (speed >= 13) {
349
    int i;
350
    sf->max_intra_bsize = BLOCK_32X32;
351
    for (i = 0; i < BLOCK_SIZES; ++i)
352
      sf->inter_mode_mask[i] = INTER_NEAREST;
353 354 355
  }
}

356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
void vp9_set_speed_features_framesize_dependent(VP9_COMP *cpi) {
  SPEED_FEATURES *const sf = &cpi->sf;
  VP9_COMMON *const cm = &cpi->common;
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
  RD_OPT *const rd = &cpi->rd;
  int i;

  if (oxcf->mode == REALTIME) {
    set_rt_speed_feature_framesize_dependent(cpi, sf, oxcf->speed);
  } else if (oxcf->mode == GOOD) {
    set_good_speed_feature_framesize_dependent(cm, sf, oxcf->speed);
  }

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

  if (cpi->encode_breakout && oxcf->mode == REALTIME &&
      sf->encode_breakout_thresh > cpi->encode_breakout) {
    cpi->encode_breakout = sf->encode_breakout_thresh;
  }

  // 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;
    }
  }
}

void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) {
387 388
  SPEED_FEATURES *const sf = &cpi->sf;
  VP9_COMMON *const cm = &cpi->common;
389
  MACROBLOCK *const x = &cpi->td.mb;
390
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
391 392 393 394
  int i;

  // best quality defaults
  sf->frame_parameter_update = 1;
395
  sf->mv.search_method = NSTEP;
396
  sf->recode_loop = ALLOW_RECODE;
397 398 399
  sf->mv.subpel_search_method = SUBPEL_TREE;
  sf->mv.subpel_iters_per_step = 2;
  sf->mv.subpel_force_stop = 0;
400
  sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf);
401
  sf->mv.reduce_first_step_size = 0;
402
  sf->coeff_prob_appx_step = 1;
403
  sf->mv.auto_mv_step_size = 0;
404
  sf->mv.fullpel_search_step_param = 6;
405 406 407 408 409 410
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
  sf->adaptive_rd_thresh = 0;
  sf->tx_size_search_method = USE_FULL_RD;
  sf->use_lp32x32fdct = 0;
  sf->adaptive_motion_search = 0;
  sf->adaptive_pred_interp_filter = 0;
411
  sf->adaptive_mode_search = 0;
412
  sf->cb_pred_filter_search = 0;
413
  sf->cb_partition_search = 0;
414
  sf->motion_field_mode_search = 0;
415
  sf->alt_ref_search_fp = 0;
Jingning Han's avatar
Jingning Han committed
416
  sf->use_quant_fp = 0;
417 418 419 420 421
  sf->reference_masking = 0;
  sf->partition_search_type = SEARCH_PARTITION;
  sf->less_rectangular_check = 0;
  sf->use_square_partition_only = 0;
  sf->auto_min_max_partition_size = NOT_IN_USE;
422 423
  sf->default_max_partition_size = BLOCK_64X64;
  sf->default_min_partition_size = BLOCK_4X4;
424 425 426 427
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
  sf->disable_split_mask = 0;
  sf->mode_search_skip_flags = 0;
428
  sf->force_frame_boost = 0;
429
  sf->max_delta_qindex = 0;
430
  sf->disable_filter_search_var_thresh = 0;
431
  sf->adaptive_interp_filter_search = 0;
432
  sf->allow_partition_search_skip = 0;
433

434
  for (i = 0; i < TX_SIZES; i++) {
435 436
    sf->intra_y_mode_mask[i] = INTRA_ALL;
    sf->intra_uv_mode_mask[i] = INTRA_ALL;
437 438 439 440 441 442
  }
  sf->use_rd_breakout = 0;
  sf->skip_encode_sb = 0;
  sf->use_uv_intra_rd_estimate = 0;
  sf->allow_skip_recode = 0;
  sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
443
  sf->use_fast_coef_updates = TWO_LOOP;
444 445
  sf->use_fast_coef_costing = 0;
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
Jingning Han's avatar
Jingning Han committed
446
  sf->schedule_mode_search = 0;
447 448
  sf->use_nonrd_pick_mode = 0;
  for (i = 0; i < BLOCK_SIZES; ++i)
449
    sf->inter_mode_mask[i] = INTER_ALL;
450
  sf->max_intra_bsize = BLOCK_64X64;
451
  sf->reuse_inter_pred_sby = 0;
452 453 454
  // This setting only takes effect when partition_search_type is set
  // to FIXED_PARTITION.
  sf->always_this_block_size = BLOCK_16X16;
455
  sf->search_type_check_frequency = 50;
456
  sf->encode_breakout_thresh = 0;
457
  sf->elevate_newmv_thresh = 0;
Yaowu Xu's avatar
Yaowu Xu committed
458
  // Recode loop tolerance %.
459
  sf->recode_tolerance = 25;
460
  sf->default_interp_filter = SWITCHABLE;
461
  sf->tx_size_search_breakout = 0;
462 463
  sf->partition_search_breakout_dist_thr = 0;
  sf->partition_search_breakout_rate_thr = 0;
464

465
  if (oxcf->mode == REALTIME)
466
    set_rt_speed_feature(cpi, sf, oxcf->speed, oxcf->content);
467 468
  else if (oxcf->mode == GOOD)
    set_good_speed_feature(cpi, cm, sf, oxcf->speed);
469

470
  cpi->full_search_sad = vp9_full_search_sad;
471 472
  cpi->diamond_search_sad = oxcf->mode == BEST ? vp9_full_range_search
                                               : vp9_diamond_search_sad;
473

474 475
  // Slow quant, dct and trellis not worthwhile for first pass
  // so make sure they are always turned off.
476
  if (oxcf->pass == 1)
477 478 479
    sf->optimize_coefficients = 0;

  // No recode for 1 pass.
480
  if (oxcf->pass == 0) {
481 482 483 484
    sf->recode_loop = DISALLOW_RECODE;
    sf->optimize_coefficients = 0;
  }

485
  if (sf->mv.subpel_search_method == SUBPEL_TREE) {
486
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
487 488
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
489 490
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_MORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_more;
491 492
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_EVENMORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_evenmore;
493 494
  }

495 496 497 498
  x->optimize = sf->optimize_coefficients == 1 && oxcf->pass != 1;

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

500 501 502
  if (!cpi->oxcf.frame_periodic_boost) {
    sf->max_delta_qindex = 0;
  }
503
}