vp9_speed_features.c 16.9 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
109
110
111
112
113
114
    sf->reference_masking = 1;
    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                 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;
115
    sf->auto_min_max_partition_size = CONSTRAIN_NEIGHBORING_MIN_MAX;
116

117
    sf->allow_partition_search_skip = 1;
118
  }
119

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

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

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

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

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

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

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

219
220
    sf->adaptive_motion_search = 1;
    sf->adaptive_pred_interp_filter = 1;
221
    sf->mv.auto_mv_step_size = 1;
222
223
224
225
226
    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;
  }
227

228
  if (speed >= 2) {
229
230
231
232
    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                 FLAG_SKIP_INTRA_BESTINTER |
                                 FLAG_SKIP_COMP_BESTINTRA |
                                 FLAG_SKIP_INTRA_LOWVAR;
233
234
235
236
237
    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
238
    sf->lf_motion_threshold = LOW_MOTION_THRESHOLD;
239
240
241
242
243
244
    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;
  }
245

246
247
248
249
250
  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;
251
    sf->mv.subpel_iters_per_step = 1;
252
    sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
253
254
255
256
257
258
259
    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;
  }
260

Yaowu Xu's avatar
Yaowu Xu committed
261
  if (speed >= 4) {
262
263
264
265
266
267
268
    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 ==
269
        (frames_since_key + 1) % sf->last_partitioning_redo_frequency);
270
    sf->mv.subpel_force_stop = 1;
271
272
    for (i = 0; i < TX_SIZES; i++) {
      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
273
      sf->intra_uv_mode_mask[i] = INTRA_DC;
274
    }
275
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
276
    sf->frame_parameter_update = 0;
277
    sf->mv.search_method = FAST_HEX;
278

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

Yaowu Xu's avatar
Yaowu Xu committed
287
  if (speed >= 5) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
288
289
290
    sf->use_quant_fp = !is_keyframe;
    sf->auto_min_max_partition_size = is_keyframe ? RELAXED_NEIGHBORING_MIN_MAX
                                                  : STRICT_NEIGHBORING_MIN_MAX;
291
292
    sf->max_partition_size = BLOCK_32X32;
    sf->min_partition_size = BLOCK_8X8;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
293
294
295
    sf->force_frame_boost = is_keyframe ||
        (frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
    sf->max_delta_qindex = is_keyframe ? 20 : 15;
296
297
298
    sf->partition_search_type = REFERENCE_PARTITION;
    sf->use_nonrd_pick_mode = 1;
    sf->allow_skip_recode = 0;
299
300
301
302
    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;
303
    sf->adaptive_rd_thresh = 2;
304
305
    // This feature is only enabled when partition search is disabled.
    sf->reuse_inter_pred_sby = 1;
306
    sf->partition_search_breakout_rate_thr = 200;
307
  }
308

Yaowu Xu's avatar
Yaowu Xu committed
309
  if (speed >= 6) {
310
311
312
313
    if (content == VP9E_CONTENT_SCREEN) {
      int i;
      // Allow fancy modes at all sizes since SOURCE_VAR_BASED_PARTITION is used
      for (i = 0; i < BLOCK_SIZES; ++i)
314
        sf->inter_mode_mask[i] = INTER_NEAREST_NEAR_NEW;
315
316
    }

317
    // Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
318
    sf->partition_search_type = VAR_BASED_PARTITION;
319
    sf->search_type_check_frequency = 50;
320
    sf->mv.search_method = NSTEP;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
321
    sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
322
    sf->mv.reduce_first_step_size = 1;
323
    sf->skip_encode_sb = 0;
324
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
325

Yaowu Xu's avatar
Yaowu Xu committed
326
  if (speed >= 7) {
Yaowu Xu's avatar
Yaowu Xu committed
327
    sf->adaptive_rd_thresh = 3;
328
    sf->mv.search_method = FAST_DIAMOND;
329
    sf->mv.fullpel_search_step_param = 10;
Yaowu Xu's avatar
Yaowu Xu committed
330
    sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
Yaowu Xu's avatar
Yaowu Xu committed
331
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
332

Yaowu Xu's avatar
Yaowu Xu committed
333
  if (speed >= 12) {
Yaowu Xu's avatar
Yaowu Xu committed
334
    sf->adaptive_rd_thresh = 4;
Yaowu Xu's avatar
Yaowu Xu committed
335
336
    sf->mv.subpel_force_stop = 2;
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
337

Yaowu Xu's avatar
Yaowu Xu committed
338
  if (speed >= 13) {
339
    int i;
340
    sf->max_intra_bsize = BLOCK_32X32;
341
    for (i = 0; i < BLOCK_SIZES; ++i)
342
      sf->inter_mode_mask[i] = INTER_NEAREST;
343
344
345
  }
}

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
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) {
377
378
  SPEED_FEATURES *const sf = &cpi->sf;
  VP9_COMMON *const cm = &cpi->common;
379
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
380
381
382
383
  int i;

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

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

453
  if (oxcf->mode == REALTIME)
454
    set_rt_speed_feature(cpi, sf, oxcf->speed, oxcf->content);
455
456
  else if (oxcf->mode == GOOD)
    set_good_speed_feature(cpi, cm, sf, oxcf->speed);
457

458
  cpi->full_search_sad = vp9_full_search_sad;
459
460
  cpi->diamond_search_sad = oxcf->mode == BEST ? vp9_full_range_search
                                               : vp9_diamond_search_sad;
461

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

  // No recode for 1 pass.
468
  if (oxcf->pass == 0) {
469
470
471
472
    sf->recode_loop = DISALLOW_RECODE;
    sf->optimize_coefficients = 0;
  }

473
  if (sf->mv.subpel_search_method == SUBPEL_TREE) {
474
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
475
476
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
477
478
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_MORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_more;
479
480
  } else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_EVENMORE) {
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_evenmore;
481
482
  }

483
  cpi->mb->optimize = sf->optimize_coefficients == 1 && oxcf->pass != 1;
484

485
486
487
  if (!cpi->oxcf.frame_periodic_boost) {
    sf->max_delta_qindex = 0;
  }
488
}