vp9_onyx_if.c 128 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
FILE *keyfile;
#endif

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

98 99 100
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};

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

139
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
140 141 142
  static int init_done = 0;

  if (!init_done) {
143
    vp9_initialize_common();
144
    vp9_coef_tree_initialize();
145
    vp9_tokenize_initialize();
146
    vp9_init_quant_tables();
147
    vp9_init_me_luts();
148
    vp9_rc_init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
149
    // init_base_skip_probs();
150
    vp9_entropy_mv_init();
151
    vp9_entropy_mode_init();
John Koleszar's avatar
John Koleszar committed
152 153
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
154 155
}

156
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
157 158 159 160 161 162 163
  // 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
164

165 166
  vpx_free(cpi->complexity_map);
  cpi->complexity_map = 0;
John Koleszar's avatar
John Koleszar committed
167 168
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
169

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

172 173 174
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
175
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
176

John Koleszar's avatar
John Koleszar committed
177 178
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
179

John Koleszar's avatar
John Koleszar committed
180 181 182 183 184
  // 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;
185

186 187 188
  vpx_free(cpi->above_context[0]);
  cpi->above_context[0] = NULL;

189 190
  vpx_free(cpi->above_seg_context);
  cpi->above_seg_context = NULL;
John Koleszar's avatar
John Koleszar committed
191 192
}

193 194 195
// 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
196
int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
197
  int i;
198 199
  int start_index = cpi->rc.worst_quality;
  int target_index = cpi->rc.worst_quality;
John Koleszar's avatar
John Koleszar committed
200 201

  // Convert the average q value to an index.
202
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; i++) {
John Koleszar's avatar
John Koleszar committed
203
    start_index = i;
204
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
205 206 207 208
      break;
  }

  // Convert the q target to an index
209
  for (i = cpi->rc.best_quality; i < cpi->rc.worst_quality; i++) {
John Koleszar's avatar
John Koleszar committed
210
    target_index = i;
211
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
212 213 214 215
      break;
  }

  return target_index - start_index;
216 217
}

218 219 220 221 222 223 224 225 226 227 228 229 230 231
// 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
232 233
  base_bits_per_mb = vp9_rc_bits_per_mb(cpi->common.frame_type,
                                        base_q_index, 1.0);
234 235 236 237 238 239 240

  // 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;
241 242
    if (vp9_rc_bits_per_mb(cpi->common.frame_type,
                           i, 1.0) <= target_bits_per_mb )
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
      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 ||
263
      (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
    // 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);
    }
  }
}
290
static void configure_static_seg_features(VP9_COMP *cpi) {
291
  VP9_COMMON *cm = &cpi->common;
292
  struct segmentation *seg = &cm->seg;
293

294
  int high_q = (int)(cpi->rc.avg_q > 48.0);
John Koleszar's avatar
John Koleszar committed
295
  int qi_delta;
296

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

John Koleszar's avatar
John Koleszar committed
305
    // Disable segmentation
306
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
307

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

John Koleszar's avatar
John Koleszar committed
318
    // Disable segmentation and individual segment features by default
319
    vp9_disable_segmentation((VP9_PTR)cpi);
320
    vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
321

John Koleszar's avatar
John Koleszar committed
322 323
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
324
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
325

John Koleszar's avatar
John Koleszar committed
326 327
    // If segmentation was enabled set those features needed for the
    // arf itself.
328 329 330
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
331

332 333
      qi_delta = vp9_compute_qdelta(
          cpi, cpi->rc.avg_q, (cpi->rc.avg_q * 0.875));
334 335
      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
336

337 338
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
339

John Koleszar's avatar
John Koleszar committed
340
      // Where relevant assume segment data is delta data
341
      seg->abs_delta = SEGMENT_DELTADATA;
342
    }
343
  } else if (seg->enabled) {
344 345
    // All other frames if segmentation has been enabled

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

354 355
        qi_delta = vp9_compute_qdelta(cpi, cpi->rc.avg_q,
                                      (cpi->rc.avg_q * 1.125));
356 357
        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
358

359 360
        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
361

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

372
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
373

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

376 377
        seg->update_map = 0;
        seg->update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
378

379
        vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
380
      }
381
    } else if (cpi->rc.is_src_frame_alt_ref) {
382 383 384
      // 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
385

Paul Wilkins's avatar
Paul Wilkins committed
386
      // Enable ref frame features for segment 0 as well
387 388
      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
389

Paul Wilkins's avatar
Paul Wilkins committed
390
      // All mbs should use ALTREF_FRAME
391 392 393 394
      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
395

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

John Koleszar's avatar
John Koleszar committed
406
      // No updates.. leave things as they are.
407 408
      seg->update_map = 0;
      seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
409 410
    }
  }
411 412 413
}

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

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

422 423
  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
424
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
425
      map_index++;
426 427
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
428 429
  }
  fprintf(statsfile, "\n");
430

John Koleszar's avatar
John Koleszar committed
431
  fclose(statsfile);
432 433
}

434
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
435 436
  VP9_COMMON *const cm = &cpi->common;
  int row, col;
437
  MODE_INFO **mi_8x8, **mi_8x8_ptr = cm->mi_grid_visible;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
438 439
  uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;

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

453
static void set_rd_speed_thresholds(VP9_COMP *cpi) {
454 455 456 457
  SPEED_FEATURES *sf = &cpi->sf;
  int i;

  // Set baseline threshold values
458
  for (i = 0; i < MAX_MODES; ++i)
459
    sf->thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
460 461

  sf->thresh_mult[THR_NEARESTMV] = 0;
462 463 464
  sf->thresh_mult[THR_NEARESTG] = 0;
  sf->thresh_mult[THR_NEARESTA] = 0;

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

Paul Wilkins's avatar
Paul Wilkins committed
467
  sf->thresh_mult[THR_NEWMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
468
  sf->thresh_mult[THR_NEWA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
469 470 471
  sf->thresh_mult[THR_NEWG] += 1000;

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

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

499 500 501 502 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
  /* 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;
  }
533
}
534

535
static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
536 537
  SPEED_FEATURES *sf = &cpi->sf;
  int i;
538

539
  for (i = 0; i < MAX_REFS; ++i)
540
    sf->thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0;
541 542 543 544 545 546 547 548

  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;

549 550 551 552 553 554
  // 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;
  }

555 556 557 558 559 560 561 562 563 564 565 566 567
  // 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;
568 569
}

570 571 572 573 574
static void set_good_speed_feature(VP9_COMMON *cm,
                                   SPEED_FEATURES *sf,
                                   int speed) {
  int i;
  sf->adaptive_rd_thresh = 1;
575
  sf->recode_loop = ((speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW);
576 577 578 579 580 581 582 583 584 585 586 587 588 589
  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;
590
    sf->adaptive_pred_interp_filter = 1;
591 592
    sf->auto_mv_step_size = 1;
    sf->adaptive_rd_thresh = 2;
593
    sf->recode_loop = ALLOW_RECODE_KFARFGF;
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615
    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;
616
    sf->adaptive_pred_interp_filter = 2;
617 618 619 620 621 622
    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
623
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
624 625 626 627 628
    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;
629
    sf->recode_loop = ALLOW_RECODE_KFARFGF;
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
    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;
653
    sf->adaptive_pred_interp_filter = 2;
654 655 656 657 658 659
    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
660
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687
    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;
688
    sf->adaptive_pred_interp_filter = 2;
689 690 691 692 693 694
    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
695
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
696 697 698 699 700 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
    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;
  }
}
741 742 743 744 745
static void set_rt_speed_feature(VP9_COMMON *cm,
                                 SPEED_FEATURES *sf,
                                 int speed) {
  sf->static_segmentation = 0;
  sf->adaptive_rd_thresh = 1;
746
  sf->recode_loop = ((speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW);
747 748
  sf->encode_breakout_thresh = 1;

Yaowu Xu's avatar
Yaowu Xu committed
749
  if (speed == 1) {
750 751 752 753 754 755 756
    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
757
        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
758 759 760 761 762
    else
      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;

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

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

Yaowu Xu's avatar
Yaowu Xu committed
797
    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
798 799 800 801 802
    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;
803
    sf->recode_loop = ALLOW_RECODE_KFARFGF;
804 805 806 807 808 809
    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;
810
    sf->encode_breakout_thresh = 200;
811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
  }
  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;
833
    sf->encode_breakout_thresh = 400;
834 835
  }
  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
    sf->encode_breakout_thresh = 700;
840 841 842
  }
  if (speed >= 5) {
    int i;
Yaowu Xu's avatar
Yaowu Xu committed
843
    sf->adaptive_rd_thresh = 5;
Yaowu Xu's avatar
Yaowu Xu committed
844 845
    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
846
    sf->subpel_force_stop = 1;
847
    for (i = 0; i < TX_SIZES; i++) {
Yaowu Xu's avatar
Yaowu Xu committed
848
      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
849 850
      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
    }
851
    sf->frame_parameter_update = 0;
852
    sf->encode_breakout_thresh = 1000;
853
  }
854
  if (speed >= 6) {
855
    sf->always_this_block_size = BLOCK_16X16;
856
    sf->use_pick_mode = 1;
857
    sf->encode_breakout_thresh = 1000;
858
  }
859 860
}

861
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
862
  SPEED_FEATURES *sf = &cpi->sf;
863
  VP9_COMMON *cm = &cpi->common;
864
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
865
  int i;
866

867 868 869
  // Convert negative speed to positive
  if (speed < 0)
    speed = -speed;
John Koleszar's avatar
John Koleszar committed
870

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

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

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

933
  // Set rd thresholds based on mode and speed setting
934 935
  set_rd_speed_thresholds(cpi);
  set_rd_speed_thresholds_sub8x8(cpi);
John Koleszar's avatar
John Koleszar committed
936 937 938 939 940 941

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

Marco Paniconi's avatar
Marco Paniconi committed
943 944
  // No recode for 1 pass.
  if (cpi->pass == 0) {
945
    sf->recode_loop = DISALLOW_RECODE;
Marco Paniconi's avatar
Marco Paniconi committed
946 947 948
    sf->optimize_coefficients = 0;
  }

949
  cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
Yaowu Xu's avatar
Yaowu Xu committed
950
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
951
    cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
John Koleszar's avatar
John Koleszar committed
952
  }
John Koleszar's avatar
John Koleszar committed
953

954
  if (cpi->sf.subpel_search_method == SUBPEL_TREE) {
955 956
    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
957
  }
John Koleszar's avatar
John Koleszar committed
958

959
  cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1;
960 961 962 963

  if (cpi->encode_breakout && cpi->oxcf.mode == MODE_REALTIME &&
      sf->encode_breakout_thresh > cpi->encode_breakout)
    cpi->encode_breakout = sf->encode_breakout_thresh;
John Koleszar's avatar
John Koleszar committed
964
}
965

966
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
967 968
  VP9_COMMON *cm = &cpi->common;

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

976 977 978
  if (vp9_realloc_frame_buf