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

Jim Bankoski's avatar
Jim Bankoski committed
11
12
13
14
15
16
#include <math.h>
#include <stdio.h>
#include <limits.h>

#include "./vpx_config.h"
#include "./vpx_scale_rtcd.h"
17
18
#include "vpx/internal/vpx_psnr.h"
#include "vpx_ports/vpx_timer.h"
John Koleszar's avatar
John Koleszar committed
19

Jim Bankoski's avatar
Jim Bankoski committed
20
#include "vp9/common/vp9_alloccommon.h"
21
#include "vp9/common/vp9_filter.h"
22
#include "vp9/common/vp9_idct.h"
Jim Bankoski's avatar
Jim Bankoski committed
23
24
25
#if CONFIG_VP9_POSTPROC
#include "vp9/common/vp9_postproc.h"
#endif
26
#include "vp9/common/vp9_reconinter.h"
27
#include "vp9/common/vp9_systemdependent.h"
Jim Bankoski's avatar
Jim Bankoski committed
28
#include "vp9/common/vp9_tile_common.h"
29

30
#include "vp9/encoder/vp9_aq_complexity.h"
Marco Paniconi's avatar
Marco Paniconi committed
31
32
#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
#include "vp9/encoder/vp9_aq_variance.h"
33
#include "vp9/encoder/vp9_bitstream.h"
34
#include "vp9/encoder/vp9_encodeframe.h"
35
#include "vp9/encoder/vp9_encodemv.h"
36
#include "vp9/encoder/vp9_firstpass.h"
Jim Bankoski's avatar
Jim Bankoski committed
37
38
39
#include "vp9/encoder/vp9_mbgraph.h"
#include "vp9/encoder/vp9_onyx_int.h"
#include "vp9/encoder/vp9_picklpf.h"
40
#include "vp9/encoder/vp9_ratectrl.h"
41
#include "vp9/encoder/vp9_rdopt.h"
Jim Bankoski's avatar
Jim Bankoski committed
42
#include "vp9/encoder/vp9_segmentation.h"
43
#include "vp9/encoder/vp9_temporal_filter.h"
44
#include "vp9/encoder/vp9_resize.h"
45
#include "vp9/encoder/vp9_svc_layercontext.h"
Paul Wilkins's avatar
Paul Wilkins committed
46

47
48
49
50
51
52
#define ALL_INTRA_MODES 0x3FF
#define INTRA_DC_ONLY 0x01
#define INTRA_DC_TM ((1 << TM_PRED) | (1 << DC_PRED))
#define INTRA_DC_H_V ((1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED))
#define INTRA_DC_TM_H_V (INTRA_DC_TM | (1 << V_PRED) | (1 << H_PRED))

53
void vp9_coef_tree_initialize();
54

Adrian Grange's avatar
Adrian Grange committed
55
56
#define DEFAULT_INTERP_FILTER SWITCHABLE

57
58
#define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */

Jim Bankoski's avatar
Jim Bankoski committed
59
60
61
62
63
64
#define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv
                                         //  for altref computation.
#define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision
                                         // mv. Choose a very high value for
                                         // now so that HIGH_PRECISION is always
                                         // chosen.
65

66
67
68
69
70
71
// Masks for partially or completely disabling split mode
#define DISABLE_ALL_SPLIT         0x3F
#define DISABLE_ALL_INTER_SPLIT   0x1F
#define DISABLE_COMPOUND_SPLIT    0x18
#define LAST_AND_INTRA_SPLIT_ONLY 0x1E

Paul Wilkins's avatar
Paul Wilkins committed
72
73
74
75
76
// Max rate target for 1080P and below encodes under normal circumstances
// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
#define MAX_MB_RATE 250
#define MAXRATE_1080P 2025000

77
#if CONFIG_INTERNAL_STATS
78
extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
79
80
                            YV12_BUFFER_CONFIG *dest, int lumamask,
                            double *weight);
John Koleszar's avatar
John Koleszar committed
81

82

83
extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
84
85
                             YV12_BUFFER_CONFIG *dest, double *ssim_y,
                             double *ssim_u, double *ssim_v);
John Koleszar's avatar
John Koleszar committed
86
87
88
89


#endif

John Koleszar's avatar
John Koleszar committed
90
// #define OUTPUT_YUV_REC
John Koleszar's avatar
John Koleszar committed
91
92
93
94

#ifdef OUTPUT_YUV_SRC
FILE *yuv_file;
#endif
95
96
97
#ifdef OUTPUT_YUV_REC
FILE *yuv_rec_file;
#endif
John Koleszar's avatar
John Koleszar committed
98
99
100

#if 0
FILE *framepsnr;
Yaowu Xu's avatar
Yaowu Xu committed
101
FILE *kf_list;
John Koleszar's avatar
John Koleszar committed
102
103
104
FILE *keyfile;
#endif

Dmitry Kovalev's avatar
Dmitry Kovalev committed
105
void vp9_init_quantizer(VP9_COMP *cpi);
Paul Wilkins's avatar
Paul Wilkins committed
106

107
static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  switch (mode) {
    case NORMAL:
      *hr = 1;
      *hs = 1;
      break;
    case FOURFIVE:
      *hr = 4;
      *hs = 5;
      break;
    case THREEFIVE:
      *hr = 3;
      *hs = 5;
    break;
    case ONETWO:
      *hr = 1;
      *hs = 2;
    break;
    default:
      *hr = 1;
      *hs = 1;
       assert(0);
      break;
  }
}

Deb Mukherjee's avatar
Deb Mukherjee committed
133
static void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
134
  MACROBLOCK *const mb = &cpi->mb;
Deb Mukherjee's avatar
Deb Mukherjee committed
135
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
136
  if (cpi->common.allow_high_precision_mv) {
137
138
139
140
141
142
143
    mb->mvcost = mb->nmvcost_hp;
    mb->mvsadcost = mb->nmvsadcost_hp;
  } else {
    mb->mvcost = mb->nmvcost;
    mb->mvsadcost = mb->nmvsadcost;
  }
}
Paul Wilkins's avatar
Paul Wilkins committed
144

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
static void setup_key_frame(VP9_COMP *cpi) {
  vp9_setup_past_independence(&cpi->common);

  // All buffers are implicitly updated on key frames.
  cpi->refresh_golden_frame = 1;
  cpi->refresh_alt_ref_frame = 1;
}

static void setup_inter_frame(VP9_COMMON *cm) {
  if (cm->error_resilient_mode || cm->intra_only)
    vp9_setup_past_independence(cm);

  assert(cm->frame_context_idx < FRAME_CONTEXTS);
  cm->fc = cm->frame_contexts[cm->frame_context_idx];
}

161
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
162
163
164
  static int init_done = 0;

  if (!init_done) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
165
166
167
    vp9_init_neighbors();
    vp9_init_quant_tables();

168
    vp9_coef_tree_initialize();
169
170
    vp9_tokenize_initialize();
    vp9_init_me_luts();
171
    vp9_rc_init_minq_luts();
172
    vp9_entropy_mv_init();
173
    vp9_entropy_mode_init();
John Koleszar's avatar
John Koleszar committed
174
175
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
176
177
}

178
static void dealloc_compressor_data(VP9_COMP *cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
179
  VP9_COMMON *const cm = &cpi->common;
180
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
181

John Koleszar's avatar
John Koleszar committed
182
183
  // Delete sementation map
  vpx_free(cpi->segmentation_map);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
184
185
186
  cpi->segmentation_map = NULL;
  vpx_free(cm->last_frame_seg_map);
  cm->last_frame_seg_map = NULL;
John Koleszar's avatar
John Koleszar committed
187
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
188
  cpi->coding_context.last_frame_seg_map_copy = NULL;
John Koleszar's avatar
John Koleszar committed
189

190
  vpx_free(cpi->complexity_map);
191
192
193
194
195
  cpi->complexity_map = NULL;

  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
  cpi->cyclic_refresh = NULL;

John Koleszar's avatar
John Koleszar committed
196
  vpx_free(cpi->active_map);
197
  cpi->active_map = NULL;
John Koleszar's avatar
John Koleszar committed
198

Dmitry Kovalev's avatar
Dmitry Kovalev committed
199
  vp9_free_frame_buffers(cm);
John Koleszar's avatar
John Koleszar committed
200

201
202
203
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
204
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
205

John Koleszar's avatar
John Koleszar committed
206
207
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
208

John Koleszar's avatar
John Koleszar committed
209
210
211
212
213
  // Activity mask based per mb zbin adjustments
  vpx_free(cpi->mb_activity_map);
  cpi->mb_activity_map = 0;
  vpx_free(cpi->mb_norm_activity_map);
  cpi->mb_norm_activity_map = 0;
214
215
216
217
218
219
220

  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
    vpx_free(lc->rc_twopass_stats_in.buf);
    lc->rc_twopass_stats_in.buf = NULL;
    lc->rc_twopass_stats_in.sz = 0;
  }
John Koleszar's avatar
John Koleszar committed
221
222
}

223
// Computes a q delta (in "q index" terms) to get from a starting q value
224
// to a target q value
Deb Mukherjee's avatar
Deb Mukherjee committed
225
int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
226
227
228
  const RATE_CONTROL *const rc = &cpi->rc;
  int start_index = rc->worst_quality;
  int target_index = rc->worst_quality;
John Koleszar's avatar
John Koleszar committed
229
230
231
  int i;

  // Convert the average q value to an index.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
232
  for (i = rc->best_quality; i < rc->worst_quality; ++i) {
John Koleszar's avatar
John Koleszar committed
233
    start_index = i;
234
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
235
236
237
238
      break;
  }

  // Convert the q target to an index
Dmitry Kovalev's avatar
Dmitry Kovalev committed
239
  for (i = rc->best_quality; i < rc->worst_quality; ++i) {
John Koleszar's avatar
John Koleszar committed
240
    target_index = i;
241
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
242
243
244
245
      break;
  }

  return target_index - start_index;
246
247
}

248
// Computes a q delta (in "q index" terms) to get from a starting q value
249
250
251
// to a value that should equate to the given rate ratio.
int vp9_compute_qdelta_by_rate(VP9_COMP *cpi, int base_q_index,
                               double rate_target_ratio) {
252
253
254
255
  int i;
  int target_index = cpi->rc.worst_quality;

  // Look up the current projected bits per block for the base index
Dmitry Kovalev's avatar
Dmitry Kovalev committed
256
257
  const int base_bits_per_mb = vp9_rc_bits_per_mb(cpi->common.frame_type,
                                            base_q_index, 1.0);
258
259

  // Find the target bits per mb based on the base value and given ratio.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
260
  const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb);
261
262

  // Convert the q target to an index
Dmitry Kovalev's avatar
Dmitry Kovalev committed
263
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; ++i) {
264
    target_index = i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
265
266
    if (vp9_rc_bits_per_mb(cpi->common.frame_type, i, 1.0) <=
            target_bits_per_mb )
267
268
269
270
271
272
      break;
  }

  return target_index - base_q_index;
}

273
static void configure_static_seg_features(VP9_COMP *cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
274
  VP9_COMMON *const cm = &cpi->common;
275
  const RATE_CONTROL *const rc = &cpi->rc;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
276
  struct segmentation *const seg = &cm->seg;
277

278
  int high_q = (int)(rc->avg_q > 48.0);
John Koleszar's avatar
John Koleszar committed
279
  int qi_delta;
280

John Koleszar's avatar
John Koleszar committed
281
282
283
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
284
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
285
286
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
287
    cpi->static_mb_pct = 0;
288

John Koleszar's avatar
John Koleszar committed
289
    // Disable segmentation
290
    vp9_disable_segmentation(seg);
Paul Wilkins's avatar
Paul Wilkins committed
291

John Koleszar's avatar
John Koleszar committed
292
    // Clear down the segment features.
293
    vp9_clearall_segfeatures(seg);
294
295
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
296
    // Clear down the global segmentation map
297
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
298
299
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
300
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
301

John Koleszar's avatar
John Koleszar committed
302
    // Disable segmentation and individual segment features by default
303
    vp9_disable_segmentation(seg);
304
    vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
305

John Koleszar's avatar
John Koleszar committed
306
307
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
308
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
309

John Koleszar's avatar
John Koleszar committed
310
311
    // If segmentation was enabled set those features needed for the
    // arf itself.
312
313
314
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
315

316
317
      qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 0.875);
      vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
318
      vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
Paul Wilkins's avatar
Paul Wilkins committed
319

320
321
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
322

John Koleszar's avatar
John Koleszar committed
323
      // Where relevant assume segment data is delta data
324
      seg->abs_delta = SEGMENT_DELTADATA;
325
    }
326
  } else if (seg->enabled) {
327
328
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
329
    // First normal frame in a valid gf or alt ref group
330
    if (rc->frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
331
      // Set up segment features for normal frames in an arf group
332
      if (rc->source_alt_ref_active) {
333
334
335
        seg->update_map = 0;
        seg->update_data = 1;
        seg->abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
336

337
338
        qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 1.125);
        vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
339
        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
Paul Wilkins's avatar
Paul Wilkins committed
340

341
342
        vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
Paul Wilkins's avatar
Paul Wilkins committed
343

John Koleszar's avatar
John Koleszar committed
344
345
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
346
347
348
          vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
          vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
          vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
349
        }
350
351
352
353
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

354
        vp9_disable_segmentation(seg);
Paul Wilkins's avatar
Paul Wilkins committed
355

356
        vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
Paul Wilkins's avatar
Paul Wilkins committed
357

358
359
        seg->update_map = 0;
        seg->update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
360

361
        vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
362
      }
363
    } else if (rc->is_src_frame_alt_ref) {
364
365
366
      // Special case where we are coding over the top of a previous
      // alt ref frame.
      // Segment coding disabled for compred testing
John Koleszar's avatar
John Koleszar committed
367

Paul Wilkins's avatar
Paul Wilkins committed
368
      // Enable ref frame features for segment 0 as well
369
370
      vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
      vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
John Koleszar's avatar
John Koleszar committed
371

Paul Wilkins's avatar
Paul Wilkins committed
372
      // All mbs should use ALTREF_FRAME
373
374
375
376
      vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
      vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
      vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
      vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
John Koleszar's avatar
John Koleszar committed
377

Paul Wilkins's avatar
Paul Wilkins committed
378
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
379
      if (high_q) {
380
381
        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
382
      }
Adrian Grange's avatar
Adrian Grange committed
383
      // Enable data update
384
      seg->update_data = 1;
385
386
387
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
388
      // No updates.. leave things as they are.
389
390
      seg->update_map = 0;
      seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
391
392
    }
  }
393
394
395
}

// DEBUG: Print out the segment id of each MB in the current frame.
396
397
static void print_seg_map(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
398
399
  int row, col;
  int map_index = 0;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
400
  FILE *statsfile = fopen("segmap.stt", "a");
401

Dmitry Kovalev's avatar
Dmitry Kovalev committed
402
  fprintf(statsfile, "%10d\n", cm->current_video_frame);
403

404
405
  for (row = 0; row < cpi->common.mi_rows; row++) {
    for (col = 0; col < cpi->common.mi_cols; col++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
406
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
407
      map_index++;
408
409
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
410
411
  }
  fprintf(statsfile, "\n");
412

John Koleszar's avatar
John Koleszar committed
413
  fclose(statsfile);
414
415
}

416
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
417
  VP9_COMMON *const cm = &cpi->common;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
418
419
  MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
  uint8_t *cache_ptr = cm->last_frame_seg_map;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
420
421
  int row, col;

422
  for (row = 0; row < cm->mi_rows; row++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
423
424
    MODE_INFO **mi_8x8 = mi_8x8_ptr;
    uint8_t *cache = cache_ptr;
425
426
427
    for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
      cache[0] = mi_8x8[0]->mbmi.segment_id;
    mi_8x8_ptr += cm->mode_info_stride;
428
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
429
430
  }
}
431
432
433
static int is_slowest_mode(int mode) {
  return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY);
}
Ronald S. Bultje's avatar
Ronald S. Bultje committed
434

435
static void set_rd_speed_thresholds(VP9_COMP *cpi) {
436
437
438
  int i;

  // Set baseline threshold values
439
  for (i = 0; i < MAX_MODES; ++i)
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
  cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;

  cpi->rd_thresh_mult[THR_NEARESTMV] = 0;
  cpi->rd_thresh_mult[THR_NEARESTG] = 0;
  cpi->rd_thresh_mult[THR_NEARESTA] = 0;

  cpi->rd_thresh_mult[THR_DC] += 1000;

  cpi->rd_thresh_mult[THR_NEWMV] += 1000;
  cpi->rd_thresh_mult[THR_NEWA] += 1000;
  cpi->rd_thresh_mult[THR_NEWG] += 1000;

  cpi->rd_thresh_mult[THR_NEARMV] += 1000;
  cpi->rd_thresh_mult[THR_NEARA] += 1000;
  cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000;
  cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000;

  cpi->rd_thresh_mult[THR_TM] += 1000;

  cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500;
  cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000;
  cpi->rd_thresh_mult[THR_NEARG] += 1000;
  cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500;
  cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000;

  cpi->rd_thresh_mult[THR_ZEROMV] += 2000;
  cpi->rd_thresh_mult[THR_ZEROG] += 2000;
  cpi->rd_thresh_mult[THR_ZEROA] += 2000;
  cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500;
  cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500;

  cpi->rd_thresh_mult[THR_H_PRED] += 2000;
  cpi->rd_thresh_mult[THR_V_PRED] += 2000;
  cpi->rd_thresh_mult[THR_D45_PRED ] += 2500;
  cpi->rd_thresh_mult[THR_D135_PRED] += 2500;
  cpi->rd_thresh_mult[THR_D117_PRED] += 2500;
  cpi->rd_thresh_mult[THR_D153_PRED] += 2500;
  cpi->rd_thresh_mult[THR_D207_PRED] += 2500;
  cpi->rd_thresh_mult[THR_D63_PRED] += 2500;
479

480
481
  /* disable frame modes if flags not set */
  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
482
483
484
485
    cpi->rd_thresh_mult[THR_NEWMV    ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX;
    cpi->rd_thresh_mult[THR_ZEROMV   ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEARMV   ] = INT_MAX;
486
487
  }
  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
488
489
490
491
    cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX;
    cpi->rd_thresh_mult[THR_ZEROG    ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEARG    ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEWG     ] = INT_MAX;
492
493
  }
  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
494
495
496
497
    cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX;
    cpi->rd_thresh_mult[THR_ZEROA    ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEARA    ] = INT_MAX;
    cpi->rd_thresh_mult[THR_NEWA     ] = INT_MAX;
498
499
500
501
  }

  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
      (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
502
503
504
505
    cpi->rd_thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
506
507
508
  }
  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
      (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
509
510
511
512
    cpi->rd_thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
    cpi->rd_thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
513
  }
514
}
515

516
static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
517
  const SPEED_FEATURES *const sf = &cpi->sf;
518
  int i;
519

520
  for (i = 0; i < MAX_REFS; ++i)
521
    cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0;
522

523
524
525
526
527
528
  cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500;
  cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500;
  cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500;
  cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500;
  cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500;
  cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500;
529

530
  // Check for masked out split cases.
531
  for (i = 0; i < MAX_REFS; i++)
532
    if (sf->disable_split_mask & (1 << i))
533
      cpi->rd_thresh_mult_sub8x8[i] = INT_MAX;
534

535
536
  // disable mode test if frame flag is not set
  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
537
    cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX;
538
  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
539
    cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
540
  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
541
    cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
542
543
  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
      (VP9_LAST_FLAG | VP9_ALT_FLAG))
544
    cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
545
546
  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
      (VP9_GOLD_FLAG | VP9_ALT_FLAG))
547
    cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
548
549
}

550
551
552
553
554
static void set_good_speed_feature(VP9_COMMON *cm,
                                   SPEED_FEATURES *sf,
                                   int speed) {
  int i;
  sf->adaptive_rd_thresh = 1;
555
  sf->recode_loop = ((speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW);
556
  sf->allow_skip_recode = 1;
557
558
559
560
561
562
563
564
565
566
567
568
569
  if (speed == 1) {
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check  = 1;
    sf->tx_size_search_method = frame_is_intra_only(cm)
      ? USE_FULL_RD : USE_LARGESTALL;

    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;
    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
570
    sf->adaptive_pred_interp_filter = 1;
571
572
    sf->auto_mv_step_size = 1;
    sf->adaptive_rd_thresh = 2;
573
    sf->recode_loop = ALLOW_RECODE_KFARFGF;
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
    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;
  }
  if (speed == 2) {
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check  = 1;
    sf->tx_size_search_method = frame_is_intra_only(cm)
      ? USE_FULL_RD : USE_LARGESTALL;

    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;

    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                 FLAG_SKIP_INTRA_BESTINTER |
                                 FLAG_SKIP_COMP_BESTINTRA |
                                 FLAG_SKIP_INTRA_LOWVAR;
    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
596
    sf->adaptive_pred_interp_filter = 2;
597
598
599
600
601
    sf->reference_masking = 1;
    sf->auto_mv_step_size = 1;
    sf->disable_filter_search_var_thresh = 50;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

Yaowu Xu's avatar
Yaowu Xu committed
602
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
603
604
605
606
607
    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
    sf->adjust_partitioning_from_last_frame = 1;
    sf->last_partitioning_redo_frequency = 3;

    sf->adaptive_rd_thresh = 2;
608
    sf->recode_loop = ALLOW_RECODE_KFARFGF;
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
    sf->use_lp32x32fdct = 1;
    sf->mode_skip_start = 11;
    sf->intra_y_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_32X32] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
  }
  if (speed == 3) {
    sf->use_square_partition_only = 1;
    sf->tx_size_search_method = USE_LARGESTALL;

    if (MIN(cm->width, cm->height) >= 720)
      sf->disable_split_mask = DISABLE_ALL_SPLIT;
    else
      sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;

    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
      FLAG_SKIP_INTRA_BESTINTER |
      FLAG_SKIP_COMP_BESTINTRA |
      FLAG_SKIP_INTRA_LOWVAR;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
632
    sf->adaptive_pred_interp_filter = 2;
633
634
635
    sf->reference_masking = 1;
    sf->auto_mv_step_size = 1;

636
    sf->disable_split_var_thresh = 32;
637
638
639
    sf->disable_filter_search_var_thresh = 100;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

Yaowu Xu's avatar
Yaowu Xu committed
640
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
641
642
643
644
645
    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
    sf->adjust_partitioning_from_last_frame = 1;
    sf->last_partitioning_redo_frequency = 3;
    sf->use_uv_intra_rd_estimate = 1;
    sf->skip_encode_sb = 1;
646
    sf->allow_skip_recode = 0;
647
648
649
    sf->use_lp32x32fdct = 1;
    sf->subpel_iters_per_step = 1;
    sf->use_fast_coef_updates = 2;
650
    sf->use_fast_coef_costing = 1;
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668

    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
  }
  if (speed == 4) {
    sf->use_square_partition_only = 1;
    sf->tx_size_search_method = USE_LARGESTALL;
    sf->disable_split_mask = DISABLE_ALL_SPLIT;

    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
      FLAG_SKIP_INTRA_BESTINTER |
      FLAG_SKIP_COMP_BESTINTRA |
      FLAG_SKIP_COMP_REFMISMATCH |
      FLAG_SKIP_INTRA_LOWVAR |
      FLAG_EARLY_TERMINATE;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
669
    sf->adaptive_pred_interp_filter = 2;
670
671
672
    sf->reference_masking = 1;
    sf->auto_mv_step_size = 1;

673
    sf->disable_split_var_thresh = 64;
674
675
676
    sf->disable_filter_search_var_thresh = 200;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

Yaowu Xu's avatar
Yaowu Xu committed
677
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
678
679
680
681
682
683
    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
    sf->adjust_partitioning_from_last_frame = 1;
    sf->last_partitioning_redo_frequency = 3;

    sf->use_uv_intra_rd_estimate = 1;
    sf->skip_encode_sb = 1;
684
    sf->allow_skip_recode = 0;
685
686
687
    sf->use_lp32x32fdct = 1;
    sf->subpel_iters_per_step = 1;
    sf->use_fast_coef_updates = 2;
688
    sf->use_fast_coef_costing = 1;
689
690
691
692

    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
  }
693
  if (speed >= 5) {
694
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
695
    sf->partition_search_type = FIXED_PARTITION;
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
    sf->tx_size_search_method = frame_is_intra_only(cm) ?
      USE_FULL_RD : USE_LARGESTALL;
    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                 FLAG_SKIP_INTRA_BESTINTER |
                                 FLAG_SKIP_COMP_BESTINTRA |
                                 FLAG_SKIP_COMP_REFMISMATCH |
                                 FLAG_SKIP_INTRA_LOWVAR |
                                 FLAG_EARLY_TERMINATE;
    sf->use_rd_breakout = 1;
    sf->use_lp32x32fdct = 1;
    sf->optimize_coefficients = 0;
    sf->auto_mv_step_size = 1;
    sf->reference_masking = 1;

    sf->disable_split_mask = DISABLE_ALL_SPLIT;
    sf->search_method = HEX;
    sf->subpel_iters_per_step = 1;
    sf->disable_split_var_thresh = 64;
    sf->disable_filter_search_var_thresh = 500;
    for (i = 0; i < TX_SIZES; i++) {
      sf->intra_y_mode_mask[i] = INTRA_DC_ONLY;
      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
    }
    sf->use_fast_coef_updates = 2;
720
    sf->use_fast_coef_costing = 1;
721
722
    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
723
    sf->allow_skip_recode = 1;
724
725
  }
}
726

727
728
729
730
731
static void set_rt_speed_feature(VP9_COMMON *cm,
                                 SPEED_FEATURES *sf,
                                 int speed) {
  sf->static_segmentation = 0;
  sf->adaptive_rd_thresh = 1;
732
  sf->encode_breakout_thresh = 1;
733
  sf->use_fast_coef_costing = 1;
734

Yaowu Xu's avatar
Yaowu Xu committed
735
  if (speed == 1) {
736
737
738
739
740
741
742
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check = 1;
    sf->tx_size_search_method =
        frame_is_intra_only(cm) ? USE_FULL_RD : USE_LARGESTALL;

    if (MIN(cm->width, cm->height) >= 720)
      sf->disable_split_mask = cm->show_frame ?
Yaowu Xu's avatar
Yaowu Xu committed
743
        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
744
745
746
747
748
    else
      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
749
    sf->adaptive_pred_interp_filter = 1;
750
751
752
753
754
    sf->auto_mv_step_size = 1;
    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;
755
    sf->encode_breakout_thresh = 8;
756
757
758
759
760
761
762
763
764
  }
  if (speed >= 2) {
    sf->use_square_partition_only = !frame_is_intra_only(cm);
    sf->less_rectangular_check = 1;
    sf->tx_size_search_method =
        frame_is_intra_only(cm) ? USE_FULL_RD : USE_LARGESTALL;

    if (MIN(cm->width, cm->height) >= 720)
      sf->disable_split_mask = cm->show_frame ?
Yaowu Xu's avatar
Yaowu Xu committed
765
        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
766
767
768
769
770
771
772
773
774
    else
      sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;

    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH
        | FLAG_SKIP_INTRA_BESTINTER | FLAG_SKIP_COMP_BESTINTRA
        | FLAG_SKIP_INTRA_LOWVAR;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
775
    sf->adaptive_pred_interp_filter = 2;
776
    sf->auto_mv_step_size = 1;
777
    sf->reference_masking = 1;
778
779
780
781

    sf->disable_filter_search_var_thresh = 50;
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

Yaowu Xu's avatar
Yaowu Xu committed
782
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
783
784
785
786
787
788
789
790
791
792
793
    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
    sf->adjust_partitioning_from_last_frame = 1;
    sf->last_partitioning_redo_frequency = 3;

    sf->adaptive_rd_thresh = 2;
    sf->use_lp32x32fdct = 1;
    sf->mode_skip_start = 11;
    sf->intra_y_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_32X32] = INTRA_DC_H_V;
    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
794
    sf->encode_breakout_thresh = 200;
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  }
  if (speed >= 3) {
    sf->use_square_partition_only = 1;
    if (MIN(cm->width, cm->height) >= 720)
      sf->disable_split_mask = DISABLE_ALL_SPLIT;
    else
      sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;

    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->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
    sf->use_uv_intra_rd_estimate = 1;
    sf->skip_encode_sb = 1;
    sf->subpel_iters_per_step = 1;
    sf->use_fast_coef_updates = 2;
    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
815
    sf->encode_breakout_thresh = 400;
816
    sf->allow_skip_recode = 0;
817
818
  }
  if (speed >= 4) {
Yaowu Xu's avatar
Yaowu Xu committed
819
    sf->optimize_coefficients = 0;
Yaowu Xu's avatar
Yaowu Xu committed
820
    sf->disable_split_mask = DISABLE_ALL_SPLIT;
821
    sf->lpf_pick = LPF_PICK_FROM_Q;
822
    sf->encode_breakout_thresh = 700;
823
824
825
  }
  if (speed >= 5) {
    int i;
826
    sf->last_partitioning_redo_frequency = 4;
Yaowu Xu's avatar
Yaowu Xu committed
827
    sf->adaptive_rd_thresh = 5;
828
829
    sf->use_fast_coef_costing = 0;
    sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX;
830
    sf->adjust_partitioning_from_last_frame =
831
        cm->last_frame_type != cm->frame_type || (0 ==
832
        (cm->current_video_frame + 1) % sf->last_partitioning_redo_frequency);
Yaowu Xu's avatar
Yaowu Xu committed
833
    sf->subpel_force_stop = 1;
834
    for (i = 0; i < TX_SIZES; i++) {
Yaowu Xu's avatar
Yaowu Xu committed
835
      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
836
837
      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
    }
838
    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_ONLY;
839
    sf->frame_parameter_update = 0;
840
    sf->encode_breakout_thresh = 1000;
841
    sf->search_method = FAST_HEX;
842
843
844
845
846
    sf->disable_inter_mode_mask[BLOCK_32X32] = 1 << INTER_OFFSET(ZEROMV);
    sf->disable_inter_mode_mask[BLOCK_32X64] = ~(1 << INTER_OFFSET(NEARESTMV));
    sf->disable_inter_mode_mask[BLOCK_64X32] = ~(1 << INTER_OFFSET(NEARESTMV));
    sf->disable_inter_mode_mask[BLOCK_64X64] = ~(1 << INTER_OFFSET(NEARESTMV));
    sf->max_intra_bsize = BLOCK_32X32;
847
    sf->allow_skip_recode = 1;
848
  }
849
  if (speed >= 6) {
850
851
    sf->max_partition_size = BLOCK_32X32;
    sf->min_partition_size = BLOCK_8X8;
852
853
854
855
856
    sf->partition_check =
        (cm->current_video_frame % sf->last_partitioning_redo_frequency == 1);
    sf->partition_search_type = REFERENCE_PARTITION;
    sf->use_nonrd_pick_mode = 1;
    sf->search_method = FAST_DIAMOND;
857
    sf->allow_skip_recode = 0;
858
859
  }
  if (speed >= 7) {
860
    sf->partition_search_type = VAR_BASED_FIXED_PARTITION;
861
    sf->use_nonrd_pick_mode = 1;
862
    sf->search_method = FAST_DIAMOND;
863
864
865
866
  }
  if (speed >= 8) {
    int i;
    for (i = 0; i < BLOCK_SIZES; ++i)
867
      sf->disable_inter_mode_mask[i] = 14;    // only search NEARESTMV (0)
868
  }
869
870
}

871
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
872
  SPEED_FEATURES *sf = &cpi->sf;
873
  VP9_COMMON *cm = &cpi->common;
874
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
875
  int i;
876

877
878
879
  // Convert negative speed to positive
  if (speed < 0)
    speed = -speed;
John Koleszar's avatar
John Koleszar committed
880

881
#if CONFIG_INTERNAL_STATS
882
  for (i = 0; i < MAX_MODES; ++i)
John Koleszar's avatar
John Koleszar committed
883
    cpi->mode_chosen_counts[i] = 0;
884
#endif
John Koleszar's avatar
John Koleszar committed
885
886

  // best quality defaults
887
  sf->frame_parameter_update = 1;
John Koleszar's avatar
John Koleszar committed
888
  sf->search_method = NSTEP;
889
  sf->recode_loop = ALLOW_RECODE;
890
891
  sf->subpel_search_method = SUBPEL_TREE;
  sf->subpel_iters_per_step = 2;
Yaowu Xu's avatar
Yaowu Xu committed
892
  sf->subpel_force_stop = 0;
893
  sf->optimize_coefficients = !cpi->oxcf.lossless;
894
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
895
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
896
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
897
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
898
  sf->adaptive_rd_thresh = 0;
Paul Wilkins's avatar
Paul Wilkins committed
899
  sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
Deb Mukherjee's avatar
Deb Mukherjee committed
900
  sf->tx_size_search_method = USE_FULL_RD;
901
  sf->use_lp32x32fdct = 0;
Jingning Han's avatar
Jingning Han committed
902
  sf->adaptive_motion_search = 0;
903
  sf->adaptive_pred_interp_filter = 0;
Paul Wilkins's avatar
Paul Wilkins committed
904
  sf->reference_masking = 0;
905
  sf->partition_search_type = SEARCH_PARTITION;
Yaowu Xu's avatar
Yaowu Xu committed
906
  sf->less_rectangular_check = 0;
907
  sf->use_square_partition_only = 0;
Yaowu Xu's avatar
Yaowu Xu committed
908
  sf->auto_min_max_partition_size = NOT_IN_USE;
909
910
  sf->max_partition_size = BLOCK_64X64;
  sf->min_partition_size = BLOCK_4X4;
911
912
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
913
  sf->disable_split_mask = 0;
914
  sf->mode_search_skip_flags = 0;
915
  sf->disable_split_var_thresh = 0;
916
  sf->disable_filter_search_var_thresh = 0;
917
918
919
920
  for (i = 0; i < TX_SIZES; i++) {
    sf->intra_y_mode_mask[i] = ALL_INTRA_MODES;
    sf->intra_uv_mode_mask[i] = ALL_INTRA_MODES;
  }
921
  sf->use_rd_breakout = 0;
922
  sf->skip_encode_sb = 0;
923
  sf->use_uv_intra_rd_estimate = 0;
924
  sf->allow_skip_recode = 0;
925
  sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
926
  sf->use_fast_coef_updates = 0;
927
  sf->use_fast_coef_costing = 0;
928
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
929
  sf->use_nonrd_pick_mode = 0;
930
  sf->encode_breakout_thresh = 0;
931
932
  for (i = 0; i < BLOCK_SIZES; ++i)
    sf->disable_inter_mode_mask[i] = 0;
933
  sf->max_intra_bsize = BLOCK_64X64;
934
935
936
  // This setting only takes effect when partition_se