vp9_speed_features.c 17.4 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
  }
342
  if (speed >= 8) {
Yaowu Xu's avatar
Yaowu Xu committed
343
    sf->adaptive_rd_thresh = 4;
Yaowu Xu's avatar
Yaowu Xu committed
344
345
    sf->mv.subpel_force_stop = 2;
  }
346
347
}

348
349
350
351
352
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
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) {
379
380
  SPEED_FEATURES *const sf = &cpi->sf;
  VP9_COMMON *const cm = &cpi->common;
381
  MACROBLOCK *const x = &cpi->td.mb;
382
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
383
384
385
386
  int i;

  // best quality defaults
  sf->frame_parameter_update = 1;
387
  sf->mv.search_method = NSTEP;
388
  sf->recode_loop = ALLOW_RECODE;
389
390
391
  sf->mv.subpel_search_method = SUBPEL_TREE;
  sf->mv.subpel_iters_per_step = 2;
  sf->mv.subpel_force_stop = 0;
392
  sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf);
393
  sf->mv.reduce_first_step_size = 0;
394
  sf->coeff_prob_appx_step = 1;
395
  sf->mv.auto_mv_step_size = 0;
396
  sf->mv.fullpel_search_step_param = 6;
397
398
399
400
401
402
  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;
403
  sf->adaptive_mode_search = 0;
404
  sf->cb_pred_filter_search = 0;
405
  sf->cb_partition_search = 0;
406
  sf->motion_field_mode_search = 0;
407
  sf->alt_ref_search_fp = 0;
Jingning Han's avatar
Jingning Han committed
408
  sf->use_quant_fp = 0;
409
410
411
412
413
  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;
414
415
  sf->default_max_partition_size = BLOCK_64X64;
  sf->default_min_partition_size = BLOCK_4X4;
416
417
418
419
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
  sf->disable_split_mask = 0;
  sf->mode_search_skip_flags = 0;
420
  sf->force_frame_boost = 0;
421
  sf->max_delta_qindex = 0;
422
  sf->disable_filter_search_var_thresh = 0;
423
  sf->adaptive_interp_filter_search = 0;
424
  sf->allow_partition_search_skip = 0;
425

426
  for (i = 0; i < TX_SIZES; i++) {
427
428
    sf->intra_y_mode_mask[i] = INTRA_ALL;
    sf->intra_uv_mode_mask[i] = INTRA_ALL;
429
430
431
432
433
434
  }
  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;
435
  sf->use_fast_coef_updates = TWO_LOOP;
436
437
  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
438
  sf->schedule_mode_search = 0;
439
440
  sf->use_nonrd_pick_mode = 0;
  for (i = 0; i < BLOCK_SIZES; ++i)
441
    sf->inter_mode_mask[i] = INTER_ALL;
442
  sf->max_intra_bsize = BLOCK_64X64;
443
  sf->reuse_inter_pred_sby = 0;
444
445
446
  // This setting only takes effect when partition_search_type is set
  // to FIXED_PARTITION.
  sf->always_this_block_size = BLOCK_16X16;
447
  sf->search_type_check_frequency = 50;
448
  sf->encode_breakout_thresh = 0;
449
  sf->elevate_newmv_thresh = 0;
Yaowu Xu's avatar
Yaowu Xu committed
450
  // Recode loop tolerance %.
451
  sf->recode_tolerance = 25;
452
  sf->default_interp_filter = SWITCHABLE;
453
  sf->tx_size_search_breakout = 0;
454
455
  sf->partition_search_breakout_dist_thr = 0;
  sf->partition_search_breakout_rate_thr = 0;
456

457
  if (oxcf->mode == REALTIME)
458
    set_rt_speed_feature(cpi, sf, oxcf->speed, oxcf->content);
459
460
  else if (oxcf->mode == GOOD)
    set_good_speed_feature(cpi, cm, sf, oxcf->speed);
461

462
  cpi->full_search_sad = vp9_full_search_sad;
463
464
  cpi->diamond_search_sad = oxcf->mode == BEST ? vp9_full_range_search
                                               : vp9_diamond_search_sad;
465

466
467
  // Slow quant, dct and trellis not worthwhile for first pass
  // so make sure they are always turned off.
468
  if (oxcf->pass == 1)
469
470
471
    sf->optimize_coefficients = 0;

  // No recode for 1 pass.
472
  if (oxcf->pass == 0) {
473
474
475
476
    sf->recode_loop = DISALLOW_RECODE;
    sf->optimize_coefficients = 0;
  }

477
  if (sf->mv.subpel_search_method == SUBPEL_TREE) {
478
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
479
480
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
481
482
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_MORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_more;
483
484
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_EVENMORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_evenmore;
485
486
  }

487
488
489
490
  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;
491

492
493
494
  if (!cpi->oxcf.frame_periodic_boost) {
    sf->max_delta_qindex = 0;
  }
495
}