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
}