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"
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"
Paul Wilkins's avatar
Paul Wilkins committed
39

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

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

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

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

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

56 57 58 59 60 61
// 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

62
#if CONFIG_INTERNAL_STATS
63
extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
64 65
                            YV12_BUFFER_CONFIG *dest, int lumamask,
                            double *weight);
John Koleszar's avatar
John Koleszar committed
66

67

68
extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
69 70
                             YV12_BUFFER_CONFIG *dest, double *ssim_y,
                             double *ssim_u, double *ssim_v);
John Koleszar's avatar
John Koleszar committed
71 72 73 74


#endif

John Koleszar's avatar
John Koleszar committed
75
// #define OUTPUT_YUV_REC
John Koleszar's avatar
John Koleszar committed
76 77 78 79

#ifdef OUTPUT_YUV_SRC
FILE *yuv_file;
#endif
80 81 82
#ifdef OUTPUT_YUV_REC
FILE *yuv_rec_file;
#endif
John Koleszar's avatar
John Koleszar committed
83 84 85

#if 0
FILE *framepsnr;
Yaowu Xu's avatar
Yaowu Xu committed
86
FILE *kf_list;
John Koleszar's avatar
John Koleszar committed
87 88 89 90 91
FILE *keyfile;
#endif


#ifdef ENTROPY_STATS
92 93 94
extern int intra_mode_stats[INTRA_MODES]
                           [INTRA_MODES]
                           [INTRA_MODES];
John Koleszar's avatar
John Koleszar committed
95 96
#endif

97 98 99
#ifdef MODE_STATS
extern void init_tx_count_stats();
extern void write_tx_count_stats();
100 101
extern void init_switchable_interp_stats();
extern void write_switchable_interp_stats();
102
#endif
103

John Koleszar's avatar
John Koleszar committed
104
#ifdef SPEEDSTATS
Jim Bankoski's avatar
Jim Bankoski committed
105 106
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
107 108
#endif

109 110 111
#if defined(SECTIONBITS_OUTPUT)
extern unsigned __int64 Sectionbits[500];
#endif
John Koleszar's avatar
John Koleszar committed
112

113
extern void vp9_init_quantizer(VP9_COMP *cpi);
Paul Wilkins's avatar
Paul Wilkins committed
114

115 116 117
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};

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
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
144
static void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
145
  MACROBLOCK *const mb = &cpi->mb;
Deb Mukherjee's avatar
Deb Mukherjee committed
146
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
147
  if (cpi->common.allow_high_precision_mv) {
148 149 150 151 152 153 154
    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
155

156
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
157 158 159
  static int init_done = 0;

  if (!init_done) {
160
    vp9_initialize_common();
161
    vp9_coef_tree_initialize();
162
    vp9_tokenize_initialize();
163
    vp9_init_quant_tables();
164
    vp9_init_me_luts();
165
    vp9_rc_init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
166
    // init_base_skip_probs();
167
    vp9_entropy_mv_init();
168
    vp9_entropy_mode_init();
John Koleszar's avatar
John Koleszar committed
169 170
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
171 172
}

Yaowu Xu's avatar
Yaowu Xu committed
173
static void reset_segment_features(VP9_COMMON *cm) {
174
  struct segmentation *const seg = &cm->seg;
Paul Wilkins's avatar
Paul Wilkins committed
175

John Koleszar's avatar
John Koleszar committed
176
  // Set up default state for MB feature flags
177 178 179 180 181
  seg->enabled = 0;
  seg->update_map = 0;
  seg->update_data = 0;
  vpx_memset(seg->tree_probs, 255, sizeof(seg->tree_probs));
  vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
182 183
}

184
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
185 186 187 188 189 190 191
  // 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
192

193 194
  vpx_free(cpi->complexity_map);
  cpi->complexity_map = 0;
John Koleszar's avatar
John Koleszar committed
195 196
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
197

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

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

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

John Koleszar's avatar
John Koleszar committed
208 209 210 211 212
  // 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;
213

214 215 216
  vpx_free(cpi->above_context[0]);
  cpi->above_context[0] = NULL;

217 218
  vpx_free(cpi->above_seg_context);
  cpi->above_seg_context = NULL;
John Koleszar's avatar
John Koleszar committed
219 220
}

221 222 223
// 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
224
int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
225
  int i;
226 227
  int start_index = cpi->rc.worst_quality;
  int target_index = cpi->rc.worst_quality;
John Koleszar's avatar
John Koleszar committed
228 229

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

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

  return target_index - start_index;
244 245
}

246 247 248 249 250 251 252 253 254 255 256 257 258 259
// 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
260 261
  base_bits_per_mb = vp9_rc_bits_per_mb(cpi->common.frame_type,
                                        base_q_index, 1.0);
262 263 264 265 266 267 268

  // 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;
269 270
    if (vp9_rc_bits_per_mb(cpi->common.frame_type,
                           i, 1.0) <= target_bits_per_mb )
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
      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 ||
291
      (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
    // 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);
    }
  }
}
318
static void configure_static_seg_features(VP9_COMP *cpi) {
319
  VP9_COMMON *cm = &cpi->common;
320
  struct segmentation *seg = &cm->seg;
321

322
  int high_q = (int)(cpi->rc.avg_q > 48.0);
John Koleszar's avatar
John Koleszar committed
323
  int qi_delta;
324

John Koleszar's avatar
John Koleszar committed
325 326 327
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
328
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
329 330
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
331
    cpi->static_mb_pct = 0;
332

John Koleszar's avatar
John Koleszar committed
333
    // Disable segmentation
334
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
335

John Koleszar's avatar
John Koleszar committed
336
    // Clear down the segment features.
337
    vp9_clearall_segfeatures(seg);
338 339
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
340
    // Clear down the global segmentation map
341
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
342 343
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
344
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
345

John Koleszar's avatar
John Koleszar committed
346
    // Disable segmentation and individual segment features by default
347
    vp9_disable_segmentation((VP9_PTR)cpi);
348
    vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
349

John Koleszar's avatar
John Koleszar committed
350 351
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
352
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
353

John Koleszar's avatar
John Koleszar committed
354 355
    // If segmentation was enabled set those features needed for the
    // arf itself.
356 357 358
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
359

360 361
      qi_delta = vp9_compute_qdelta(
          cpi, cpi->rc.avg_q, (cpi->rc.avg_q * 0.875));
362 363
      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
364

365 366
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
367

John Koleszar's avatar
John Koleszar committed
368
      // Where relevant assume segment data is delta data
369
      seg->abs_delta = SEGMENT_DELTADATA;
370
    }
371
  } else if (seg->enabled) {
372 373
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
374
    // First normal frame in a valid gf or alt ref group
375
    if (cpi->rc.frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
376
      // Set up segment features for normal frames in an arf group
377
      if (cpi->rc.source_alt_ref_active) {
378 379 380
        seg->update_map = 0;
        seg->update_data = 1;
        seg->abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
381

382 383
        qi_delta = vp9_compute_qdelta(cpi, cpi->rc.avg_q,
                                      (cpi->rc.avg_q * 1.125));
384 385
        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
386

387 388
        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
389

John Koleszar's avatar
John Koleszar committed
390 391
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
392 393 394
          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
395
        }
396 397 398 399
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

400
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
401

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

404 405
        seg->update_map = 0;
        seg->update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
406

407
        vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
408
      }
409
    } else if (cpi->rc.is_src_frame_alt_ref) {
410 411 412
      // 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
413

Paul Wilkins's avatar
Paul Wilkins committed
414
      // Enable ref frame features for segment 0 as well
415 416
      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
417

Paul Wilkins's avatar
Paul Wilkins committed
418
      // All mbs should use ALTREF_FRAME
419 420 421 422
      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
423

Paul Wilkins's avatar
Paul Wilkins committed
424
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
425
      if (high_q) {
426 427
        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
428
      }
Adrian Grange's avatar
Adrian Grange committed
429
      // Enable data update
430
      seg->update_data = 1;
431 432 433
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
434
      // No updates.. leave things as they are.
435 436
      seg->update_map = 0;
      seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
437 438
    }
  }
439 440 441
}

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

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

450 451
  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
452
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
453
      map_index++;
454 455
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
456 457
  }
  fprintf(statsfile, "\n");
458

John Koleszar's avatar
John Koleszar committed
459
  fclose(statsfile);
460 461
}

462
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
463 464
  VP9_COMMON *const cm = &cpi->common;
  int row, col;
465
  MODE_INFO **mi_8x8, **mi_8x8_ptr = cm->mi_grid_visible;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
466 467
  uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;

468
  for (row = 0; row < cm->mi_rows; row++) {
469
    mi_8x8 = mi_8x8_ptr;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
470
    cache = cache_ptr;
471 472 473
    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;
474
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
475 476 477
  }
}

Deb Mukherjee's avatar
Deb Mukherjee committed
478
static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode) {
479 480 481 482
  SPEED_FEATURES *sf = &cpi->sf;
  int i;

  // Set baseline threshold values
483 484
  for (i = 0; i < MAX_MODES; ++i)
    sf->thresh_mult[i] = mode == 0 ? -500 : 0;
485 486

  sf->thresh_mult[THR_NEARESTMV] = 0;
487 488 489
  sf->thresh_mult[THR_NEARESTG] = 0;
  sf->thresh_mult[THR_NEARESTA] = 0;

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

Paul Wilkins's avatar
Paul Wilkins committed
492
  sf->thresh_mult[THR_NEWMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
493
  sf->thresh_mult[THR_NEWA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
494 495 496
  sf->thresh_mult[THR_NEWG] += 1000;

  sf->thresh_mult[THR_NEARMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
497
  sf->thresh_mult[THR_NEARA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
498 499
  sf->thresh_mult[THR_COMP_NEARESTLA] += 1000;
  sf->thresh_mult[THR_COMP_NEARESTGA] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522

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

524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557
  /* 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;
  }
558
}
559

560 561 562
static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi, int mode) {
  SPEED_FEATURES *sf = &cpi->sf;
  int i;
563

564 565 566 567 568 569 570 571 572 573
  for (i = 0; i < MAX_REFS; ++i)
    sf->thresh_mult_sub8x8[i] = mode == 0 ? -500 : 0;

  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;

574 575 576 577 578 579
  // 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;
  }

580 581 582 583 584 585 586 587 588 589 590 591 592
  // 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;
593 594
}

595
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
596
  SPEED_FEATURES *sf = &cpi->sf;
597
  VP9_COMMON *cm = &cpi->common;
598
  int mode = cpi->compressor_speed;
599
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
600
  int i;
601

John Koleszar's avatar
John Koleszar committed
602
  // Only modes 0 and 1 supported for now in experimental code basae
603 604
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
605

606
  for (i = 0; i < MAX_MODES; ++i)
John Koleszar's avatar
John Koleszar committed
607 608 609 610 611 612 613
    cpi->mode_chosen_counts[i] = 0;

  // best quality defaults
  sf->RD = 1;
  sf->search_method = NSTEP;
  sf->auto_filter = 1;
  sf->recode_loop = 1;
614 615
  sf->subpel_search_method = SUBPEL_TREE;
  sf->subpel_iters_per_step = 2;
616
  sf->optimize_coefficients = !cpi->oxcf.lossless;
617
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
618
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
619
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
620
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
621
  sf->adaptive_rd_thresh = 0;
Paul Wilkins's avatar
Paul Wilkins committed
622
  sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
Deb Mukherjee's avatar
Deb Mukherjee committed
623
  sf->tx_size_search_method = USE_FULL_RD;
624
  sf->use_lp32x32fdct = 0;
Jingning Han's avatar
Jingning Han committed
625
  sf->adaptive_motion_search = 0;
626
  sf->adaptive_pred_filter_type = 0;
627
  sf->use_avoid_tested_higherror = 0;
Paul Wilkins's avatar
Paul Wilkins committed
628
  sf->reference_masking = 0;
629
  sf->use_one_partition_size_always = 0;
Yaowu Xu's avatar
Yaowu Xu committed
630
  sf->less_rectangular_check = 0;
631
  sf->use_square_partition_only = 0;
632 633 634
  sf->auto_min_max_partition_size = 0;
  sf->max_partition_size = BLOCK_64X64;
  sf->min_partition_size = BLOCK_4X4;
635 636
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
637
  sf->disable_split_mask = 0;
638
  sf->mode_search_skip_flags = 0;
639
  sf->disable_split_var_thresh = 0;
640
  sf->disable_filter_search_var_thresh = 0;
641 642 643 644
  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;
  }
645
  sf->use_rd_breakout = 0;
646
  sf->skip_encode_sb = 0;
647
  sf->use_uv_intra_rd_estimate = 0;
648
  sf->use_fast_lpf_pick = 0;
649
  sf->use_fast_coef_updates = 0;
650
  sf->using_small_partition_info = 0;
651 652
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set

653 654 655 656
#if CONFIG_MULTIPLE_ARF
  // Switch segmentation off.
  sf->static_segmentation = 0;
#else
657
  sf->static_segmentation = 0;
658
#endif
John Koleszar's avatar
John Koleszar committed
659

660
  switch (mode) {
Jim Bankoski's avatar
Jim Bankoski committed
661
    case 0:  // This is the best quality mode.
662
      cpi->diamond_search_sad = vp9_full_range_search;
John Koleszar's avatar
John Koleszar committed
663 664
      break;

665
    case 1:
666 667 668
#if CONFIG_MULTIPLE_ARF
      // Switch segmentation off.
      sf->static_segmentation = 0;
669
#else
Paul Wilkins's avatar
Paul Wilkins committed
670
      sf->static_segmentation = 0;
671
#endif
672
      sf->use_avoid_tested_higherror = 1;
Paul Wilkins's avatar
Paul Wilkins committed
673
      sf->adaptive_rd_thresh = 1;
Paul Wilkins's avatar
Paul Wilkins committed
674
      sf->recode_loop = (speed < 1);
675

Yaowu Xu's avatar
Yaowu Xu committed
676
      if (speed == 1) {
677
        sf->use_square_partition_only = !frame_is_intra_only(cm);
678
        sf->less_rectangular_check  = 1;
679
        sf->tx_size_search_method = frame_is_intra_only(cm)
680
                                     ? USE_FULL_RD : USE_LARGESTALL;
681

682 683
        if (MIN(cm->width, cm->height) >= 720)
          sf->disable_split_mask = cm->show_frame ?
684
              DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
685 686
        else
          sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
Paul Wilkins's avatar
Paul Wilkins committed
687 688 689

        sf->use_rd_breakout = 1;
        sf->adaptive_motion_search = 1;
690
        sf->adaptive_pred_filter_type = 1;
Paul Wilkins's avatar
Paul Wilkins committed
691 692
        sf->auto_mv_step_size = 1;
        sf->adaptive_rd_thresh = 2;
693
        sf->recode_loop = 2;
694 695 696
        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;
Paul Wilkins's avatar
Paul Wilkins committed
697 698
      }
      if (speed == 2) {
699
        sf->use_square_partition_only = !frame_is_intra_only(cm);
700
        sf->less_rectangular_check  = 1;
701
        sf->tx_size_search_method = frame_is_intra_only(cm)
702
                                     ? USE_FULL_RD : USE_LARGESTALL;
703

704 705
        if (MIN(cm->width, cm->height) >= 720)
          sf->disable_split_mask = cm->show_frame ?
706
              DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
707 708
        else
          sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
Paul Wilkins's avatar
Paul Wilkins committed
709

710

711 712
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
713 714
                                     FLAG_SKIP_COMP_BESTINTRA |
                                     FLAG_SKIP_INTRA_LOWVAR;
Paul Wilkins's avatar
Paul Wilkins committed
715

716
        sf->use_rd_breakout = 1;
Jingning Han's avatar
Jingning Han committed
717
        sf->adaptive_motion_search = 1;
718
        sf->adaptive_pred_filter_type = 2;
719
        sf->auto_mv_step_size = 1;
720

721
        sf->disable_filter_search_var_thresh = 50;
Paul Wilkins's avatar
Paul Wilkins committed
722 723 724 725 726 727
        sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

        sf->auto_min_max_partition_size = 1;
        sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
        sf->adjust_partitioning_from_last_frame = 1;
        sf->last_partitioning_redo_frequency = 3;
728

Paul Wilkins's avatar
Paul Wilkins committed
729
        sf->adaptive_rd_thresh = 2;
730
        sf->recode_loop = 2;
731
        sf->use_lp32x32fdct = 1;
Paul Wilkins's avatar
Paul Wilkins committed
732
        sf->mode_skip_start = 11;
733 734 735 736
        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;
Jim Bankoski's avatar
Jim Bankoski committed
737
      }
Paul Wilkins's avatar
Paul Wilkins committed
738
      if (speed == 3) {
739
        sf->use_square_partition_only = 1;
Paul Wilkins's avatar
Paul Wilkins committed
740
        sf->tx_size_search_method = USE_LARGESTALL;
741

742
        if (MIN(cm->width, cm->height) >= 720)
743 744 745
          sf->disable_split_mask = DISABLE_ALL_SPLIT;
        else
          sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
Paul Wilkins's avatar
Paul Wilkins committed
746

747 748 749
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
Paul Wilkins's avatar
Paul Wilkins committed
750 751
                                     FLAG_SKIP_INTRA_LOWVAR;

752
        sf->use_rd_breakout = 1;
Jingning Han's avatar
Jingning Han committed
753
        sf->adaptive_motion_search = 1;
754
        sf->adaptive_pred_filter_type = 2;
755
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
756

757
        sf->disable_filter_search_var_thresh = 100;
Paul Wilkins's avatar
Paul Wilkins committed
758 759
        sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

760
        sf->auto_min_max_partition_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
761 762 763 764 765
        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;
766
        sf->skip_encode_sb = 1;
Paul Wilkins's avatar
Paul Wilkins committed
767 768
        sf->use_lp32x32fdct = 1;
        sf->subpel_iters_per_step = 1;
769
        sf->use_fast_coef_updates = 2;
Paul Wilkins's avatar
Paul Wilkins committed
770 771

        sf->adaptive_rd_thresh = 4;
Paul Wilkins's avatar
Paul Wilkins committed
772
        sf->mode_skip_start = 6;
773
      }
Paul Wilkins's avatar
Paul Wilkins committed
774
      if (speed == 4) {
Paul Wilkins's avatar
Paul Wilkins committed
775
        sf->use_square_partition_only = 1;
Paul Wilkins's avatar
Paul Wilkins committed
776 777 778
        sf->tx_size_search_method = USE_LARGESTALL;
        sf->disable_split_mask = DISABLE_ALL_SPLIT;

779 780 781
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
782 783 784
                                     FLAG_SKIP_COMP_REFMISMATCH |
                                     FLAG_SKIP_INTRA_LOWVAR |
                                     FLAG_EARLY_TERMINATE;
Paul Wilkins's avatar
Paul Wilkins committed
785

786
        sf->use_rd_breakout = 1;
Paul Wilkins's avatar
Paul Wilkins committed
787
        sf->adaptive_motion_search = 1;
788
        sf->adaptive_pred_filter_type = 2;
789
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
790

791
        sf->disable_filter_search_var_thresh = 200;
Paul Wilkins's avatar
Paul Wilkins committed
792 793
        sf->comp_inter_joint_search_thresh = BLOCK_SIZES;

Paul Wilkins's avatar
Paul Wilkins committed
794
        sf->auto_min_max_partition_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
795 796 797 798 799
        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;
800
        sf->skip_encode_sb = 1;
Paul Wilkins's avatar
Paul Wilkins committed
801 802
        sf->use_lp32x32fdct = 1;
        sf->subpel_iters_per_step = 1;
803
        sf->use_fast_coef_updates = 2;
Paul Wilkins's avatar
Paul Wilkins committed
804

Paul Wilkins's avatar
Paul Wilkins committed
805
        sf->adaptive_rd_thresh = 4;
Paul Wilkins's avatar
Paul Wilkins committed
806
        sf->mode_skip_start = 6;
Paul Wilkins's avatar
Paul Wilkins committed
807 808 809 810 811 812

        /* sf->intra_y_mode_mask = INTRA_DC_ONLY;
        sf->intra_uv_mode_mask = INTRA_DC_ONLY;
        sf->search_method = BIGDIA;
        sf->disable_split_var_thresh = 64;
        sf->disable_filter_search_var_thresh = 64; */
813