vp9_onyx_if.c 121 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"
John Koleszar's avatar
John Koleszar committed
17

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

#include "vp9/encoder/vp9_encodemv.h"
29
#include "vp9/encoder/vp9_firstpass.h"
Jim Bankoski's avatar
Jim Bankoski committed
30 31 32
#include "vp9/encoder/vp9_mbgraph.h"
#include "vp9/encoder/vp9_onyx_int.h"
#include "vp9/encoder/vp9_picklpf.h"
33 34
#include "vp9/encoder/vp9_psnr.h"
#include "vp9/encoder/vp9_ratectrl.h"
35
#include "vp9/encoder/vp9_rdopt.h"
Jim Bankoski's avatar
Jim Bankoski committed
36
#include "vp9/encoder/vp9_segmentation.h"
37
#include "vp9/encoder/vp9_temporal_filter.h"
38
#include "vp9/encoder/vp9_vaq.h"
39
#include "vp9/encoder/vp9_resize.h"
Paul Wilkins's avatar
Paul Wilkins committed
40

Jim Bankoski's avatar
Jim Bankoski committed
41 42
#include "vpx_ports/vpx_timer.h"

43
void vp9_entropy_mode_init();
44
void vp9_coef_tree_initialize();
45

Adrian Grange's avatar
Adrian Grange committed
46 47
#define DEFAULT_INTERP_FILTER SWITCHABLE

48 49
#define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */

Jim Bankoski's avatar
Jim Bankoski committed
50 51 52 53 54 55
#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.
56

57 58 59 60 61 62
// 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
63 64 65 66 67
// 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

68
#if CONFIG_INTERNAL_STATS
69
extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
70 71
                            YV12_BUFFER_CONFIG *dest, int lumamask,
                            double *weight);
John Koleszar's avatar
John Koleszar committed
72

73

74
extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
75 76
                             YV12_BUFFER_CONFIG *dest, double *ssim_y,
                             double *ssim_u, double *ssim_v);
John Koleszar's avatar
John Koleszar committed
77 78 79 80


#endif

John Koleszar's avatar
John Koleszar committed
81
// #define OUTPUT_YUV_REC
John Koleszar's avatar
John Koleszar committed
82 83 84 85

#ifdef OUTPUT_YUV_SRC
FILE *yuv_file;
#endif
86 87 88
#ifdef OUTPUT_YUV_REC
FILE *yuv_rec_file;
#endif
John Koleszar's avatar
John Koleszar committed
89 90 91

#if 0
FILE *framepsnr;
Yaowu Xu's avatar
Yaowu Xu committed
92
FILE *kf_list;
John Koleszar's avatar
John Koleszar committed
93 94 95 96
FILE *keyfile;
#endif

#ifdef SPEEDSTATS
Jim Bankoski's avatar
Jim Bankoski committed
97 98
unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                    0, 0, 0};
John Koleszar's avatar
John Koleszar committed
99 100
#endif

101
extern void vp9_init_quantizer(VP9_COMP *cpi);
Paul Wilkins's avatar
Paul Wilkins committed
102

103 104 105
static const double in_frame_q_adj_ratio[MAX_SEGMENTS] =
  {1.0, 1.5, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0};

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
static INLINE void Scale2Ratio(int mode, int *hr, int *hs) {
  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
132
static void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
133
  MACROBLOCK *const mb = &cpi->mb;
Deb Mukherjee's avatar
Deb Mukherjee committed
134
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
135
  if (cpi->common.allow_high_precision_mv) {
136 137 138 139 140 141 142
    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
143

144
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
145 146 147
  static int init_done = 0;

  if (!init_done) {
148
    vp9_initialize_common();
149
    vp9_coef_tree_initialize();
150
    vp9_tokenize_initialize();
151
    vp9_init_quant_tables();
152
    vp9_init_me_luts();
153
    vp9_rc_init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
154
    // init_base_skip_probs();
155
    vp9_entropy_mv_init();
156
    vp9_entropy_mode_init();
John Koleszar's avatar
John Koleszar committed
157 158
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
159 160
}

161
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
162 163 164 165 166 167 168
  // Delete sementation map
  vpx_free(cpi->segmentation_map);
  cpi->segmentation_map = 0;
  vpx_free(cpi->common.last_frame_seg_map);
  cpi->common.last_frame_seg_map = 0;
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
  cpi->coding_context.last_frame_seg_map_copy = 0;
John Koleszar's avatar
John Koleszar committed
169

170 171
  vpx_free(cpi->complexity_map);
  cpi->complexity_map = 0;
John Koleszar's avatar
John Koleszar committed
172 173
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
174

Dmitry Kovalev's avatar
Dmitry Kovalev committed
175
  vp9_free_frame_buffers(&cpi->common);
John Koleszar's avatar
John Koleszar committed
176

177 178 179
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
180
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
181

John Koleszar's avatar
John Koleszar committed
182 183
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
184

John Koleszar's avatar
John Koleszar committed
185 186 187 188 189
  // 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;
190

191 192 193
  vpx_free(cpi->above_context[0]);
  cpi->above_context[0] = NULL;

194 195
  vpx_free(cpi->above_seg_context);
  cpi->above_seg_context = NULL;
John Koleszar's avatar
John Koleszar committed
196 197
}

198 199 200
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
Deb Mukherjee's avatar
Deb Mukherjee committed
201
int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
202
  int i;
203 204
  int start_index = cpi->rc.worst_quality;
  int target_index = cpi->rc.worst_quality;
John Koleszar's avatar
John Koleszar committed
205 206

  // Convert the average q value to an index.
207
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; i++) {
John Koleszar's avatar
John Koleszar committed
208
    start_index = i;
209
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
210 211 212 213
      break;
  }

  // Convert the q target to an index
214
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; i++) {
John Koleszar's avatar
John Koleszar committed
215
    target_index = i;
216
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
217 218 219 220
      break;
  }

  return target_index - start_index;
221 222
}

223 224 225 226 227 228 229 230 231 232 233 234 235 236
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a value that should equate to thegiven rate ratio.

int vp9_compute_qdelta_by_rate(VP9_COMP *cpi,
                               double base_q_index, double rate_target_ratio) {
  int i;
  int base_bits_per_mb;
  int target_bits_per_mb;
  int target_index = cpi->rc.worst_quality;

  // Make SURE use of floating point in this function is safe.
  vp9_clear_system_state();

  // Look up the current projected bits per block for the base index
237 238
  base_bits_per_mb = vp9_rc_bits_per_mb(cpi->common.frame_type,
                                        base_q_index, 1.0);
239 240 241 242 243 244 245

  // Find the target bits per mb based on the base value and given ratio.
  target_bits_per_mb = rate_target_ratio * base_bits_per_mb;

  // Convert the q target to an index
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; i++) {
    target_index = i;
246 247
    if (vp9_rc_bits_per_mb(cpi->common.frame_type,
                           i, 1.0) <= target_bits_per_mb )
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
      break;
  }

  return target_index - base_q_index;
}

// This function sets up a set of segments with delta Q values around
// the baseline frame quantizer.
static void setup_in_frame_q_adj(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
  struct segmentation *seg = &cm->seg;
  // double q_ratio;
  int segment;
  int qindex_delta;

  // Make SURE use of floating point in this function is safe.
  vp9_clear_system_state();

  if (cm->frame_type == KEY_FRAME ||
      cpi->refresh_alt_ref_frame ||
268
      (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
    // Clear down the segment map
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);

    // Clear down the complexity map used for rd
    vpx_memset(cpi->complexity_map, 0, cm->mi_rows * cm->mi_cols);

    // Enable segmentation
    vp9_enable_segmentation((VP9_PTR)cpi);
    vp9_clearall_segfeatures(seg);

    // Select delta coding method
    seg->abs_delta = SEGMENT_DELTADATA;

    // Segment 0 "Q" feature is disabled so it defaults to the baseline Q
    vp9_disable_segfeature(seg, 0, SEG_LVL_ALT_Q);

    // Use some of the segments for in frame Q adjustment
    for (segment = 1; segment < 3; segment++) {
      qindex_delta =
        vp9_compute_qdelta_by_rate(cpi, cm->base_qindex,
                                   in_frame_q_adj_ratio[segment]);
      vp9_enable_segfeature(seg, segment, SEG_LVL_ALT_Q);
      vp9_set_segdata(seg, segment, SEG_LVL_ALT_Q, qindex_delta);
    }
  }
}
295
static void configure_static_seg_features(VP9_COMP *cpi) {
296
  VP9_COMMON *cm = &cpi->common;
297
  struct segmentation *seg = &cm->seg;
298

299
  int high_q = (int)(cpi->rc.avg_q > 48.0);
John Koleszar's avatar
John Koleszar committed
300
  int qi_delta;
301

John Koleszar's avatar
John Koleszar committed
302 303 304
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
305
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
306 307
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
308
    cpi->static_mb_pct = 0;
309

John Koleszar's avatar
John Koleszar committed
310
    // Disable segmentation
311
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
312

John Koleszar's avatar
John Koleszar committed
313
    // Clear down the segment features.
314
    vp9_clearall_segfeatures(seg);
315 316
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
317
    // Clear down the global segmentation map
318
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
319 320
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
321
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
322

John Koleszar's avatar
John Koleszar committed
323
    // Disable segmentation and individual segment features by default
324
    vp9_disable_segmentation((VP9_PTR)cpi);
325
    vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
326

John Koleszar's avatar
John Koleszar committed
327 328
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
329
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
330

John Koleszar's avatar
John Koleszar committed
331 332
    // If segmentation was enabled set those features needed for the
    // arf itself.
333 334 335
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
336

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

342 343
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
344

John Koleszar's avatar
John Koleszar committed
345
      // Where relevant assume segment data is delta data
346
      seg->abs_delta = SEGMENT_DELTADATA;
347
    }
348
  } else if (seg->enabled) {
349 350
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
351
    // First normal frame in a valid gf or alt ref group
352
    if (cpi->rc.frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
353
      // Set up segment features for normal frames in an arf group
354
      if (cpi->rc.source_alt_ref_active) {
355 356 357
        seg->update_map = 0;
        seg->update_data = 1;
        seg->abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
358

359 360
        qi_delta = vp9_compute_qdelta(cpi, cpi->rc.avg_q,
                                      (cpi->rc.avg_q * 1.125));
361 362
        vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
Paul Wilkins's avatar
Paul Wilkins committed
363

364 365
        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
366

John Koleszar's avatar
John Koleszar committed
367 368
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
369 370 371
          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
372
        }
373 374 375 376
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

377
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
378

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

381 382
        seg->update_map = 0;
        seg->update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
383

384
        vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
385
      }
386
    } else if (cpi->rc.is_src_frame_alt_ref) {
387 388 389
      // 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
390

Paul Wilkins's avatar
Paul Wilkins committed
391
      // Enable ref frame features for segment 0 as well
392 393
      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
394

Paul Wilkins's avatar
Paul Wilkins committed
395
      // All mbs should use ALTREF_FRAME
396 397 398 399
      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
400

Paul Wilkins's avatar
Paul Wilkins committed
401
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
402
      if (high_q) {
403 404
        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
405
      }
Adrian Grange's avatar
Adrian Grange committed
406
      // Enable data update
407
      seg->update_data = 1;
408 409 410
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
411
      // No updates.. leave things as they are.
412 413
      seg->update_map = 0;
      seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
414 415
    }
  }
416 417 418
}

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

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

427 428
  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
429
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
430
      map_index++;
431 432
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
433 434
  }
  fprintf(statsfile, "\n");
435

John Koleszar's avatar
John Koleszar committed
436
  fclose(statsfile);
437 438
}

439
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
440 441
  VP9_COMMON *const cm = &cpi->common;
  int row, col;
442
  MODE_INFO **mi_8x8, **mi_8x8_ptr = cm->mi_grid_visible;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
443 444
  uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;

445
  for (row = 0; row < cm->mi_rows; row++) {
446
    mi_8x8 = mi_8x8_ptr;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
447
    cache = cache_ptr;
448 449 450
    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;
451
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
452 453
  }
}
454 455 456
static int is_slowest_mode(int mode) {
  return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY);
}
Ronald S. Bultje's avatar
Ronald S. Bultje committed
457

458
static void set_rd_speed_thresholds(VP9_COMP *cpi) {
459 460 461 462
  SPEED_FEATURES *sf = &cpi->sf;
  int i;

  // Set baseline threshold values
463
  for (i = 0; i < MAX_MODES; ++i)
464
    sf->thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
465 466

  sf->thresh_mult[THR_NEARESTMV] = 0;
467 468 469
  sf->thresh_mult[THR_NEARESTG] = 0;
  sf->thresh_mult[THR_NEARESTA] = 0;

Deb Mukherjee's avatar
Deb Mukherjee committed
470 471
  sf->thresh_mult[THR_DC] += 1000;

Paul Wilkins's avatar
Paul Wilkins committed
472
  sf->thresh_mult[THR_NEWMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
473
  sf->thresh_mult[THR_NEWA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
474 475 476
  sf->thresh_mult[THR_NEWG] += 1000;

  sf->thresh_mult[THR_NEARMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
477
  sf->thresh_mult[THR_NEARA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
478 479
  sf->thresh_mult[THR_COMP_NEARESTLA] += 1000;
  sf->thresh_mult[THR_COMP_NEARESTGA] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502

  sf->thresh_mult[THR_TM] += 1000;

  sf->thresh_mult[THR_COMP_NEARLA] += 1500;
  sf->thresh_mult[THR_COMP_NEWLA] += 2000;
  sf->thresh_mult[THR_NEARG] += 1000;
  sf->thresh_mult[THR_COMP_NEARGA] += 1500;
  sf->thresh_mult[THR_COMP_NEWGA] += 2000;

  sf->thresh_mult[THR_ZEROMV] += 2000;
  sf->thresh_mult[THR_ZEROG] += 2000;
  sf->thresh_mult[THR_ZEROA] += 2000;
  sf->thresh_mult[THR_COMP_ZEROLA] += 2500;
  sf->thresh_mult[THR_COMP_ZEROGA] += 2500;

  sf->thresh_mult[THR_H_PRED] += 2000;
  sf->thresh_mult[THR_V_PRED] += 2000;
  sf->thresh_mult[THR_D45_PRED ] += 2500;
  sf->thresh_mult[THR_D135_PRED] += 2500;
  sf->thresh_mult[THR_D117_PRED] += 2500;
  sf->thresh_mult[THR_D153_PRED] += 2500;
  sf->thresh_mult[THR_D207_PRED] += 2500;
  sf->thresh_mult[THR_D63_PRED] += 2500;
503

504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
  /* disable frame modes if flags not set */
  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
    sf->thresh_mult[THR_NEWMV    ] = INT_MAX;
    sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
    sf->thresh_mult[THR_ZEROMV   ] = INT_MAX;
    sf->thresh_mult[THR_NEARMV   ] = INT_MAX;
  }
  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
    sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
    sf->thresh_mult[THR_ZEROG    ] = INT_MAX;
    sf->thresh_mult[THR_NEARG    ] = INT_MAX;
    sf->thresh_mult[THR_NEWG     ] = INT_MAX;
  }
  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
    sf->thresh_mult[THR_ZEROA    ] = INT_MAX;
    sf->thresh_mult[THR_NEARA    ] = INT_MAX;
    sf->thresh_mult[THR_NEWA     ] = INT_MAX;
  }

  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
      (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
  }
  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
      (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
  }
538
}
539

540
static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
541 542
  SPEED_FEATURES *sf = &cpi->sf;
  int i;
543

544
  for (i = 0; i < MAX_REFS; ++i)
545
    sf->thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0;
546 547 548 549 550 551 552 553

  sf->thresh_mult_sub8x8[THR_LAST] += 2500;
  sf->thresh_mult_sub8x8[THR_GOLD] += 2500;
  sf->thresh_mult_sub8x8[THR_ALTR] += 2500;
  sf->thresh_mult_sub8x8[THR_INTRA] += 2500;
  sf->thresh_mult_sub8x8[THR_COMP_LA] += 4500;
  sf->thresh_mult_sub8x8[THR_COMP_GA] += 4500;

554 555 556 557 558 559
  // Check for masked out split cases.
  for (i = 0; i < MAX_REFS; i++) {
    if (sf->disable_split_mask & (1 << i))
      sf->thresh_mult_sub8x8[i] = INT_MAX;
  }

560 561 562 563 564 565 566 567 568 569 570 571 572
  // disable mode test if frame flag is not set
  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
    sf->thresh_mult_sub8x8[THR_LAST] = INT_MAX;
  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
    sf->thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
    sf->thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
      (VP9_LAST_FLAG | VP9_ALT_FLAG))
    sf->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
      (VP9_GOLD_FLAG | VP9_ALT_FLAG))
    sf->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
573 574
}

575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594
static void set_good_speed_feature(VP9_COMMON *cm,
                                   SPEED_FEATURES *sf,
                                   int speed) {
  int i;
  sf->adaptive_rd_thresh = 1;
  sf->recode_loop = (speed < 1);
  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;
595
    sf->adaptive_pred_interp_filter = 1;
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
    sf->auto_mv_step_size = 1;
    sf->adaptive_rd_thresh = 2;
    sf->recode_loop = 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;
  }
  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;
621
    sf->adaptive_pred_interp_filter = 2;
622 623 624 625 626 627
    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
628
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
    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->recode_loop = 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;
  }
  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;
658
    sf->adaptive_pred_interp_filter = 2;
659 660 661 662 663 664
    sf->reference_masking = 1;
    sf->auto_mv_step_size = 1;

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

Yaowu Xu's avatar
Yaowu Xu committed
665
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
    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;
    sf->use_lp32x32fdct = 1;
    sf->subpel_iters_per_step = 1;
    sf->use_fast_coef_updates = 2;

    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;
693
    sf->adaptive_pred_interp_filter = 2;
694 695 696 697 698 699
    sf->reference_masking = 1;
    sf->auto_mv_step_size = 1;

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

Yaowu Xu's avatar
Yaowu Xu committed
700
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
    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;
    sf->use_lp32x32fdct = 1;
    sf->subpel_iters_per_step = 1;
    sf->use_fast_coef_updates = 2;

    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
  }
  if (speed == 5) {
    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
    sf->use_one_partition_size_always = 1;
    sf->always_this_block_size = BLOCK_16X16;
    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;
    sf->adaptive_rd_thresh = 4;
    sf->mode_skip_start = 6;
  }
}
746 747 748 749 750 751
static void set_rt_speed_feature(VP9_COMMON *cm,
                                 SPEED_FEATURES *sf,
                                 int speed) {
  sf->static_segmentation = 0;
  sf->adaptive_rd_thresh = 1;
  sf->recode_loop = (speed < 1);
Yaowu Xu's avatar
Yaowu Xu committed
752
  if (speed == 1) {
753 754 755 756 757 758 759
    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
760
        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
761 762 763 764 765
    else
      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;

    sf->use_rd_breakout = 1;
    sf->adaptive_motion_search = 1;
766
    sf->adaptive_pred_interp_filter = 1;
767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
    sf->auto_mv_step_size = 1;
    sf->adaptive_rd_thresh = 2;
    sf->recode_loop = 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;
  }
  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
782
        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
783 784 785 786 787 788 789 790 791
    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;
792
    sf->adaptive_pred_interp_filter = 2;
793
    sf->auto_mv_step_size = 1;
794
    sf->reference_masking = 1;
795 796 797 798

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

Yaowu Xu's avatar
Yaowu Xu committed
799
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
    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->recode_loop = 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;
  }
  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->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;
  }
  if (speed >= 4) {
Yaowu Xu's avatar
Yaowu Xu committed
836
    sf->optimize_coefficients = 0;
Yaowu Xu's avatar
Yaowu Xu committed
837 838
    sf->disable_split_mask = DISABLE_ALL_SPLIT;
    sf->use_fast_lpf_pick = 2;
839 840 841
  }
  if (speed >= 5) {
    int i;
Yaowu Xu's avatar
Yaowu Xu committed
842
    sf->adaptive_rd_thresh = 5;
Yaowu Xu's avatar
Yaowu Xu committed
843 844
    sf->auto_min_max_partition_size = frame_is_intra_only(cm) ?
        RELAXED_NEIGHBORING_MIN_MAX : STRICT_NEIGHBORING_MIN_MAX;
Yaowu Xu's avatar
Yaowu Xu committed
845
    sf->subpel_force_stop = 1;
846
    for (i = 0; i < TX_SIZES; i++) {
Yaowu Xu's avatar
Yaowu Xu committed
847
      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
848 849
      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
    }
850
    sf->RD = 0;
851
  }
852 853 854
  if (speed >= 6) {
    sf->super_fast_rtc = 1;
  }
855 856
}

857
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
858
  SPEED_FEATURES *sf = &cpi->sf;
859
  VP9_COMMON *cm = &cpi->common;
860
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
861
  int i;
862

863 864 865
  // Convert negative speed to positive
  if (speed < 0)
    speed = -speed;
John Koleszar's avatar
John Koleszar committed
866

867
  for (i = 0; i < MAX_MODES; ++i)
John Koleszar's avatar
John Koleszar committed
868 869 870 871 872 873
    cpi->mode_chosen_counts[i] = 0;

  // best quality defaults
  sf->RD = 1;
  sf->search_method = NSTEP;
  sf->recode_loop = 1;
874 875
  sf->subpel_search_method = SUBPEL_TREE;
  sf->subpel_iters_per_step = 2;
Yaowu Xu's avatar
Yaowu Xu committed
876
  sf->subpel_force_stop = 0;
877
  sf->optimize_coefficients = !cpi->oxcf.lossless;
878
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
879
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
880
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
881
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
882
  sf->adaptive_rd_thresh = 0;
Paul Wilkins's avatar
Paul Wilkins committed
883
  sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
Deb Mukherjee's avatar
Deb Mukherjee committed
884
  sf->tx_size_search_method = USE_FULL_RD;
885
  sf->use_lp32x32fdct = 0;
Jingning Han's avatar
Jingning Han committed
886
  sf->adaptive_motion_search = 0;
887
  sf->adaptive_pred_interp_filter = 0;
Paul Wilkins's avatar
Paul Wilkins committed
888
  sf->reference_masking = 0;
889
  sf->use_one_partition_size_always = 0;
Yaowu Xu's avatar
Yaowu Xu committed
890
  sf->less_rectangular_check = 0;
891
  sf->use_square_partition_only = 0;
Yaowu Xu's avatar
Yaowu Xu committed
892
  sf->auto_min_max_partition_size = NOT_IN_USE;
893 894
  sf->max_partition_size = BLOCK_64X64;
  sf->min_partition_size = BLOCK_4X4;
895 896
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
897
  sf->disable_split_mask = 0;
898
  sf->mode_search_skip_flags = 0;
899
  sf->disable_split_var_thresh = 0;
900
  sf->disable_filter_search_var_thresh = 0;
901 902 903 904
  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;
  }
905
  sf->use_rd_breakout = 0;
906
  sf->skip_encode_sb = 0;
907
  sf->use_uv_intra_rd_estimate = 0;
908
  sf->use_fast_lpf_pick = 0;
909
  sf->use_fast_coef_updates = 0;
910
  sf->using_small_partition_info = 0;
911
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
912
  sf->super_fast_rtc = 0;
913

914 915 916
  switch (cpi->oxcf.mode) {
    case MODE_BESTQUALITY:
    case MODE_SECONDPASS_BEST:  // This is the best quality mode.
917
      cpi->diamond_search_sad = vp9_full_range_search;
John Koleszar's avatar
John Koleszar committed
918
      break;
919 920 921
    case MODE_FIRSTPASS:
    case MODE_GOODQUALITY:
    case MODE_SECONDPASS:
922
      set_good_speed_feature(cm, sf, speed);
Deb Mukherjee's avatar
Deb Mukherjee committed
923
      break;
924
    case MODE_REALTIME:
925 926
      set_rt_speed_feature(cm, sf, speed);
      break;
John Koleszar's avatar
John Koleszar committed
927
  }; /* switch */
928

929
  // Set rd thresholds based on mode and speed setting
930 931
  set_rd_speed_thresholds(cpi);
  set_rd_speed_thresholds_sub8x8(cpi);
John Koleszar's avatar
John Koleszar committed
932 933 934 935 936 937

  // Slow quant, dct and trellis not worthwhile for first pass
  // so make sure they are always turned off.
  if (cpi->pass == 1) {
    sf->optimize_coefficients = 0;
  }
938

Marco Paniconi's avatar
Marco Paniconi committed
939 940 941 942 943 944
  // No recode for 1 pass.
  if (cpi->pass == 0) {
    sf->recode_loop = 0;
    sf->optimize_coefficients = 0;
  }

945
  cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
Yaowu Xu's avatar
Yaowu Xu committed
946
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
947
    cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
John Koleszar's avatar
John Koleszar committed
948
  }
John Koleszar's avatar
John Koleszar committed
949

950
  if (cpi->sf.subpel_search_method == SUBPEL_TREE) {
951 952
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
    cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree;
John Koleszar's avatar
John Koleszar committed
953
  }
John Koleszar's avatar
John Koleszar committed
954

955
  cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1;
John Koleszar's avatar
John Koleszar committed
956 957

#ifdef SPEEDSTATS
958
  frames_at_speed[cpi->speed]++;
John Koleszar's avatar
John Koleszar committed
959 960
#endif
}
961

962
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
963 964
  VP9_COMMON *cm = &cpi->common;

965
  cpi->lookahead = vp9_lookahead_init(cpi->oxcf.width, cpi->oxcf.height,
966
                                      cm->subsampling_x, cm->subsampling_y,
John Koleszar's avatar
John Koleszar committed
967 968
                                      cpi->oxcf.lag_in_frames);
  if (!cpi->lookahead)
969
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
John Koleszar's avatar
John Koleszar committed
970
                       "Failed to allocate lag buffers");
John Koleszar's avatar
John Koleszar committed
971

972 973 974
  if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
                               cpi->oxcf.width, cpi->oxcf.height,
                               cm->subsampling_x, cm->subsampling_y,
975
                               VP9_ENC_BORDER_IN_PIXELS))
976
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
John Koleszar's avatar
John Koleszar committed
977
                       "Failed to allocate altref buffer");
John Koleszar's avatar
John Koleszar committed
978
}
979

980 981
void vp9_alloc_compressor_data(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
982

983
  if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
984
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
John Koleszar's avatar
John Koleszar committed
985
                       "Failed to allocate frame buffers");
John Koleszar's avatar
John Koleszar committed
986

987 988 989
  if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
                             cm->width, cm->height,
                             cm->subsampling_x, cm->subsampling_y,
990
                             VP9_ENC_BORDER_IN_PIXELS))
991
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
John Koleszar's avatar
John Koleszar committed
992
                       "Failed to allocate last frame buffer");
John Koleszar's avatar
John Koleszar committed
993

994 995 996
  if (vp9_alloc_frame_buffer(&cpi->scaled_source,
                             cm->width, cm->height,
                             cm->subsampling_x, cm->subsampling_y,
997
                             VP9_ENC_BORDER_IN_PIXELS))
998
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
John Koleszar's avatar
John Koleszar committed
999
                       "Failed to allocate scaled source buffer");