vp9_onyx_if.c 136 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
#include "vp9/encoder/vp9_firstpass.h"
Jim Bankoski's avatar
Jim Bankoski committed
28
29
30
#include "vp9/encoder/vp9_mbgraph.h"
#include "vp9/encoder/vp9_onyx_int.h"
#include "vp9/encoder/vp9_picklpf.h"
31
32
#include "vp9/encoder/vp9_psnr.h"
#include "vp9/encoder/vp9_ratectrl.h"
33
#include "vp9/encoder/vp9_rdopt.h"
Jim Bankoski's avatar
Jim Bankoski committed
34
#include "vp9/encoder/vp9_segmentation.h"
35
#include "vp9/encoder/vp9_temporal_filter.h"
36
#include "vp9/encoder/vp9_vaq.h"
Paul Wilkins's avatar
Paul Wilkins committed
37

Jim Bankoski's avatar
Jim Bankoski committed
38
39
#include "vpx_ports/vpx_timer.h"

John Koleszar's avatar
John Koleszar committed
40
41

extern void print_tree_update_probs();
42

43
static void set_default_lf_deltas(struct loopfilter *lf);
John Koleszar's avatar
John Koleszar committed
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
// Tables relating active max Q to active min Q
116
117
118
119
120
static int kf_low_motion_minq[QINDEX_RANGE];
static int kf_high_motion_minq[QINDEX_RANGE];
static int gf_low_motion_minq[QINDEX_RANGE];
static int gf_high_motion_minq[QINDEX_RANGE];
static int inter_minq[QINDEX_RANGE];
121
122
static int afq_low_motion_minq[QINDEX_RANGE];
static int afq_high_motion_minq[QINDEX_RANGE];
123

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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;
  }
}

150
151
152
153
// Functions to compute the active minq lookup table entries based on a
// formulaic approach to facilitate easier adjustment of the Q tables.
// The formulae were derived from computing a 3rd order polynomial best
// fit to the original data (after plotting real maxq vs minq (not q index))
154
static int calculate_minq_index(double maxq,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
155
                                double x3, double x2, double x1, double c) {
John Koleszar's avatar
John Koleszar committed
156
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
157
158
  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
                                maxq);
John Koleszar's avatar
John Koleszar committed
159

Paul Wilkins's avatar
Paul Wilkins committed
160
161
162
163
164
  // Special case handling to deal with the step from q2.0
  // down to lossless mode represented by q 1.0.
  if (minqtarget <= 2.0)
    return 0;

John Koleszar's avatar
John Koleszar committed
165
  for (i = 0; i < QINDEX_RANGE; i++) {
166
    if (minqtarget <= vp9_convert_qindex_to_q(i))
John Koleszar's avatar
John Koleszar committed
167
168
      return i;
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
169

John Koleszar's avatar
John Koleszar committed
170
  return QINDEX_RANGE - 1;
171
}
172

173
static void init_minq_luts(void) {
John Koleszar's avatar
John Koleszar committed
174
175
176
  int i;

  for (i = 0; i < QINDEX_RANGE; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
177
    const double maxq = vp9_convert_qindex_to_q(i);
John Koleszar's avatar
John Koleszar committed
178
179
180


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
181
182
183
                                                 0.000001,
                                                 -0.0004,
                                                 0.15,
John Koleszar's avatar
John Koleszar committed
184
185
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
186
187
188
                                                  0.000002,
                                                  -0.0012,
                                                  0.5,
John Koleszar's avatar
John Koleszar committed
189
                                                  0.0);
190

John Koleszar's avatar
John Koleszar committed
191
192
193
    gf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.0000015,
                                                 -0.0009,
194
                                                 0.32,
John Koleszar's avatar
John Koleszar committed
195
196
197
198
                                                 0.0);
    gf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000021,
                                                  -0.00125,
199
                                                  0.50,
John Koleszar's avatar
John Koleszar committed
200
201
202
203
                                                  0.0);
    inter_minq[i] = calculate_minq_index(maxq,
                                         0.00000271,
                                         -0.00113,
204
                                         0.75,
John Koleszar's avatar
John Koleszar committed
205
                                         0.0);
206
207
208
209
210
211
212
213
    afq_low_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000015,
                                                  -0.0009,
                                                  0.33,
                                                  0.0);
    afq_high_motion_minq[i] = calculate_minq_index(maxq,
                                                   0.0000021,
                                                   -0.00125,
214
                                                   0.55,
215
                                                   0.0);
John Koleszar's avatar
John Koleszar committed
216
  }
217
}
218

219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
static int get_active_quality(int q,
                              int gfu_boost,
                              int low,
                              int high,
                              int *low_motion_minq,
                              int *high_motion_minq) {
  int active_best_quality;
  if (gfu_boost > high) {
    active_best_quality = low_motion_minq[q];
  } else if (gfu_boost < low) {
    active_best_quality = high_motion_minq[q];
  } else {
    const int gap = high - low;
    const int offset = high - gfu_boost;
    const int qdiff = high_motion_minq[q] - low_motion_minq[q];
    const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
    active_best_quality = low_motion_minq[q] + adjustment;
  }
  return active_best_quality;
}

240
241
242
static void set_mvcost(VP9_COMP *cpi) {
  MACROBLOCK *const mb = &cpi->mb;
  if (cpi->common.allow_high_precision_mv) {
243
244
245
246
247
248
249
    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
250

251
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
252
253
254
  static int init_done = 0;

  if (!init_done) {
255
    vp9_initialize_common();
256
    vp9_tokenize_initialize();
257
    vp9_init_quant_tables();
258
    vp9_init_me_luts();
John Koleszar's avatar
John Koleszar committed
259
    init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
260
    // init_base_skip_probs();
John Koleszar's avatar
John Koleszar committed
261
262
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
263
264
}

265
266
267
static void setup_features(VP9_COMMON *cm) {
  struct loopfilter *const lf = &cm->lf;
  struct segmentation *const seg = &cm->seg;
Paul Wilkins's avatar
Paul Wilkins committed
268

John Koleszar's avatar
John Koleszar committed
269
  // Set up default state for MB feature flags
270
  seg->enabled = 0;
271

272
273
274
  seg->update_map = 0;
  seg->update_data = 0;
  vpx_memset(seg->tree_probs, 255, sizeof(seg->tree_probs));
Paul Wilkins's avatar
Paul Wilkins committed
275

276
  vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
277

278
279
280
281
282
283
  lf->mode_ref_delta_enabled = 0;
  lf->mode_ref_delta_update = 0;
  vp9_zero(lf->ref_deltas);
  vp9_zero(lf->mode_deltas);
  vp9_zero(lf->last_ref_deltas);
  vp9_zero(lf->last_mode_deltas);
John Koleszar's avatar
John Koleszar committed
284

285
  set_default_lf_deltas(lf);
John Koleszar's avatar
John Koleszar committed
286
287
}

288
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
289
290
291
292
293
294
295
  // 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
296

John Koleszar's avatar
John Koleszar committed
297
298
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
299

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

302
303
304
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
305
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
306

John Koleszar's avatar
John Koleszar committed
307
308
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
309

John Koleszar's avatar
John Koleszar committed
310
311
312
313
314
  // 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;
John Koleszar's avatar
John Koleszar committed
315
316
}

317
318
319
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
320
int vp9_compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
321
322
323
324
325
326
327
  int i;
  int start_index = cpi->worst_quality;
  int target_index = cpi->worst_quality;

  // Convert the average q value to an index.
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    start_index = i;
328
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
329
330
331
332
333
334
      break;
  }

  // Convert the q target to an index
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    target_index = i;
335
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
336
337
338
339
      break;
  }

  return target_index - start_index;
340
341
}

342
static void configure_static_seg_features(VP9_COMP *cpi) {
343
  VP9_COMMON *cm = &cpi->common;
344
  struct segmentation *seg = &cm->seg;
345

John Koleszar's avatar
John Koleszar committed
346
347
  int high_q = (int)(cpi->avg_q > 48.0);
  int qi_delta;
348

John Koleszar's avatar
John Koleszar committed
349
350
351
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
352
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
353
354
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
355
    cpi->static_mb_pct = 0;
356

John Koleszar's avatar
John Koleszar committed
357
    // Disable segmentation
358
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
359

John Koleszar's avatar
John Koleszar committed
360
    // Clear down the segment features.
361
    vp9_clearall_segfeatures(seg);
362
363
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
364
    // Clear down the global segmentation map
365
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
366
367
    seg->update_map = 0;
    seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
368
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
369

John Koleszar's avatar
John Koleszar committed
370
    // Disable segmentation and individual segment features by default
371
    vp9_disable_segmentation((VP9_PTR)cpi);
372
    vp9_clearall_segfeatures(seg);
Paul Wilkins's avatar
Paul Wilkins committed
373

John Koleszar's avatar
John Koleszar committed
374
375
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
376
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
377

John Koleszar's avatar
John Koleszar committed
378
379
    // If segmentation was enabled set those features needed for the
    // arf itself.
380
381
382
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
383

384
      qi_delta = vp9_compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
385
386
      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
387

388
389
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
390

John Koleszar's avatar
John Koleszar committed
391
      // Where relevant assume segment data is delta data
392
      seg->abs_delta = SEGMENT_DELTADATA;
393
    }
394
  } else if (seg->enabled) {
395
396
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
397
    // First normal frame in a valid gf or alt ref group
398
    if (cpi->frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
399
      // Set up segment features for normal frames in an arf group
John Koleszar's avatar
John Koleszar committed
400
      if (cpi->source_alt_ref_active) {
401
402
403
        seg->update_map = 0;
        seg->update_data = 1;
        seg->abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
404

405
406
        qi_delta = vp9_compute_qdelta(cpi, cpi->avg_q,
                                      (cpi->avg_q * 1.125));
407
408
        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
409

410
411
        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
412

John Koleszar's avatar
John Koleszar committed
413
414
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
415
416
417
          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
418
        }
419
420
421
422
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

423
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
424

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

427
428
        seg->update_map = 0;
        seg->update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
429

430
        vp9_clearall_segfeatures(seg);
John Koleszar's avatar
John Koleszar committed
431
      }
432
433
434
435
    } else if (cpi->is_src_frame_alt_ref) {
      // 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
436

Paul Wilkins's avatar
Paul Wilkins committed
437
      // Enable ref frame features for segment 0 as well
438
439
      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
440

Paul Wilkins's avatar
Paul Wilkins committed
441
      // All mbs should use ALTREF_FRAME
442
443
444
445
      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
446

Paul Wilkins's avatar
Paul Wilkins committed
447
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
448
      if (high_q) {
449
450
        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
451
      }
Adrian Grange's avatar
Adrian Grange committed
452
      // Enable data update
453
      seg->update_data = 1;
454
455
456
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
457
      // No updates.. leave things as they are.
458
459
      seg->update_map = 0;
      seg->update_data = 0;
John Koleszar's avatar
John Koleszar committed
460
461
    }
  }
462
463
}

Paul Wilkins's avatar
Paul Wilkins committed
464
465
466
467
#ifdef ENTROPY_STATS
void vp9_update_mode_context_stats(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
  int i, j;
468
  unsigned int (*inter_mode_counts)[INTER_MODES - 1][2] =
469
      cm->fc.inter_mode_counts;
470
  int64_t (*mv_ref_stats)[INTER_MODES - 1][2] = cpi->mv_ref_stats;
Paul Wilkins's avatar
Paul Wilkins committed
471
472
473
474
475
476
477
478
479
480
481
482
483
  FILE *f;

  // Read the past stats counters
  f = fopen("mode_context.bin",  "rb");
  if (!f) {
    vpx_memset(cpi->mv_ref_stats, 0, sizeof(cpi->mv_ref_stats));
  } else {
    fread(cpi->mv_ref_stats, sizeof(cpi->mv_ref_stats), 1, f);
    fclose(f);
  }

  // Add in the values for this frame
  for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
484
    for (j = 0; j < INTER_MODES - 1; j++) {
485
486
      mv_ref_stats[i][j][0] += (int64_t)inter_mode_counts[i][j][0];
      mv_ref_stats[i][j][1] += (int64_t)inter_mode_counts[i][j][1];
Paul Wilkins's avatar
Paul Wilkins committed
487
488
489
490
491
492
493
494
495
496
497
498
499
500
    }
  }

  // Write back the accumulated stats
  f = fopen("mode_context.bin",  "wb");
  fwrite(cpi->mv_ref_stats, sizeof(cpi->mv_ref_stats), 1, f);
  fclose(f);
}

void print_mode_context(VP9_COMP *cpi) {
  FILE *f = fopen("vp9_modecont.c", "a");
  int i, j;

  fprintf(f, "#include \"vp9_entropy.h\"\n");
501
502
  fprintf(
      f,
503
      "const int inter_mode_probs[INTER_MODE_CONTEXTS][INTER_MODES - 1] =");
Paul Wilkins's avatar
Paul Wilkins committed
504
505
506
507
  fprintf(f, "{\n");
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
    fprintf(f, "  {/* %d */ ", j);
    fprintf(f, "    ");
508
    for (i = 0; i < INTER_MODES - 1; i++) {
Paul Wilkins's avatar
Paul Wilkins committed
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
      int this_prob;
      int64_t count = cpi->mv_ref_stats[j][i][0] + cpi->mv_ref_stats[j][i][1];
      if (count)
        this_prob = ((cpi->mv_ref_stats[j][i][0] * 256) + (count >> 1)) / count;
      else
        this_prob = 128;

      // context probs
      fprintf(f, "%5d, ", this_prob);
    }
    fprintf(f, "  },\n");
  }

  fprintf(f, "};\n");
  fclose(f);
}
#endif  // ENTROPY_STATS

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

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

536
537
  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
538
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
539
      map_index++;
540
541
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
542
543
  }
  fprintf(statsfile, "\n");
544

John Koleszar's avatar
John Koleszar committed
545
  fclose(statsfile);
546
547
}

548
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
549
550
  VP9_COMMON *const cm = &cpi->common;
  int row, col;
551
  MODE_INFO **mi_8x8, **mi_8x8_ptr = cm->mi_grid_visible;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
552
553
  uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;

554
  for (row = 0; row < cm->mi_rows; row++) {
555
    mi_8x8 = mi_8x8_ptr;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
556
    cache = cache_ptr;
557
558
559
    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;
560
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
561
562
563
  }
}

564
static void set_default_lf_deltas(struct loopfilter *lf) {
565
566
567
568
569
  lf->mode_ref_delta_enabled = 1;
  lf->mode_ref_delta_update = 1;

  vp9_zero(lf->ref_deltas);
  vp9_zero(lf->mode_deltas);
John Koleszar's avatar
John Koleszar committed
570

John Koleszar's avatar
John Koleszar committed
571
  // Test of ref frame deltas
572
573
574
575
  lf->ref_deltas[INTRA_FRAME] = 2;
  lf->ref_deltas[LAST_FRAME] = 0;
  lf->ref_deltas[GOLDEN_FRAME] = -2;
  lf->ref_deltas[ALTREF_FRAME] = -2;
John Koleszar's avatar
John Koleszar committed
576

577
578
  lf->mode_deltas[0] = 0;   // Zero
  lf->mode_deltas[1] = 0;   // New mv
John Koleszar's avatar
John Koleszar committed
579
580
}

Deb Mukherjee's avatar
Deb Mukherjee committed
581
static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode) {
582
583
584
585
  SPEED_FEATURES *sf = &cpi->sf;
  int i;

  // Set baseline threshold values
586
587
  for (i = 0; i < MAX_MODES; ++i)
    sf->thresh_mult[i] = mode == 0 ? -500 : 0;
588
589

  sf->thresh_mult[THR_NEARESTMV] = 0;
590
591
592
  sf->thresh_mult[THR_NEARESTG] = 0;
  sf->thresh_mult[THR_NEARESTA] = 0;

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

Paul Wilkins's avatar
Paul Wilkins committed
595
  sf->thresh_mult[THR_NEWMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
596
  sf->thresh_mult[THR_NEWA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
597
598
599
  sf->thresh_mult[THR_NEWG] += 1000;

  sf->thresh_mult[THR_NEARMV] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
600
  sf->thresh_mult[THR_NEARA] += 1000;
Paul Wilkins's avatar
Paul Wilkins committed
601
602
  sf->thresh_mult[THR_COMP_NEARESTLA] += 1000;
  sf->thresh_mult[THR_COMP_NEARESTGA] += 1000;
Deb Mukherjee's avatar
Deb Mukherjee committed
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625

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

627
628
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
658
659
660
  /* 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;
  }
661
}
662

663
664
665
static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi, int mode) {
  SPEED_FEATURES *sf = &cpi->sf;
  int i;
666

667
668
669
670
671
672
673
674
675
676
  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;

677
678
679
680
681
682
  // 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;
  }

683
684
685
686
687
688
689
690
691
692
693
694
695
  // 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;
696
697
}

698
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
699
  SPEED_FEATURES *sf = &cpi->sf;
700
  int mode = cpi->compressor_speed;
701
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
702
  int i;
703

John Koleszar's avatar
John Koleszar committed
704
  // Only modes 0 and 1 supported for now in experimental code basae
705
706
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
707

708
  for (i = 0; i < MAX_MODES; ++i)
John Koleszar's avatar
John Koleszar committed
709
710
711
712
713
714
715
    cpi->mode_chosen_counts[i] = 0;

  // best quality defaults
  sf->RD = 1;
  sf->search_method = NSTEP;
  sf->auto_filter = 1;
  sf->recode_loop = 1;
716
717
  sf->subpel_search_method = SUBPEL_TREE;
  sf->subpel_iters_per_step = 2;
718
  sf->optimize_coefficients = !cpi->oxcf.lossless;
719
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
720
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
721
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
722
  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
723
  sf->adaptive_rd_thresh = 0;
Paul Wilkins's avatar
Paul Wilkins committed
724
  sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
Deb Mukherjee's avatar
Deb Mukherjee committed
725
  sf->tx_size_search_method = USE_FULL_RD;
726
  sf->use_lp32x32fdct = 0;
Jingning Han's avatar
Jingning Han committed
727
  sf->adaptive_motion_search = 0;
728
  sf->use_avoid_tested_higherror = 0;
Paul Wilkins's avatar
Paul Wilkins committed
729
  sf->reference_masking = 0;
730
  sf->use_one_partition_size_always = 0;
Yaowu Xu's avatar
Yaowu Xu committed
731
  sf->less_rectangular_check = 0;
732
  sf->use_square_partition_only = 0;
733
734
735
  sf->auto_min_max_partition_size = 0;
  sf->max_partition_size = BLOCK_64X64;
  sf->min_partition_size = BLOCK_4X4;
736
737
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
738
  sf->disable_split_mask = 0;
739
  sf->mode_search_skip_flags = 0;
740
  sf->disable_split_var_thresh = 0;
741
  sf->disable_filter_search_var_thresh = 0;
742
743
744
745
  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;
  }
746
  sf->use_rd_breakout = 0;
747
  sf->skip_encode_sb = 0;
748
  sf->use_uv_intra_rd_estimate = 0;
749
  sf->use_fast_lpf_pick = 0;
750
  sf->use_fast_coef_updates = 0;
751
  sf->using_small_partition_info = 0;
752
753
  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set

754
755
756
757
#if CONFIG_MULTIPLE_ARF
  // Switch segmentation off.
  sf->static_segmentation = 0;
#else
758
  sf->static_segmentation = 0;
759
#endif
John Koleszar's avatar
John Koleszar committed
760

761
762
  sf->variance_adaptive_quantization = 0;

763
  switch (mode) {
Jim Bankoski's avatar
Jim Bankoski committed
764
    case 0:  // This is the best quality mode.
John Koleszar's avatar
John Koleszar committed
765
766
      break;

767
    case 1:
768
769
770
#if CONFIG_MULTIPLE_ARF
      // Switch segmentation off.
      sf->static_segmentation = 0;
771
#else
Paul Wilkins's avatar
Paul Wilkins committed
772
      sf->static_segmentation = 0;
773
#endif
774
      sf->use_avoid_tested_higherror = 1;
Paul Wilkins's avatar
Paul Wilkins committed
775
      sf->adaptive_rd_thresh = 1;
Paul Wilkins's avatar
Paul Wilkins committed
776
      sf->recode_loop = (speed < 1);
777

Yaowu Xu's avatar
Yaowu Xu committed
778
      if (speed == 1) {
779
        sf->use_square_partition_only = !frame_is_intra_only(&cpi->common);
780
        sf->less_rectangular_check  = 1;
781
        sf->tx_size_search_method = frame_is_intra_only(&cpi->common)
782
                                     ? USE_FULL_RD : USE_LARGESTALL;
783
784

        if (MIN(cpi->common.width, cpi->common.height) >= 720)
785
786
          sf->disable_split_mask = cpi->common.show_frame ?
              DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
787
788
        else
          sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
Paul Wilkins's avatar
Paul Wilkins committed
789
790
791
792
793

        sf->use_rd_breakout = 1;
        sf->adaptive_motion_search = 1;
        sf->auto_mv_step_size = 1;
        sf->adaptive_rd_thresh = 2;
794
        sf->recode_loop = 2;
795
796
797
        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
798
799
      }
      if (speed == 2) {
800
        sf->use_square_partition_only = !frame_is_intra_only(&cpi->common);
801
        sf->less_rectangular_check  = 1;
802
803
        sf->tx_size_search_method = frame_is_intra_only(&cpi->common)
                                     ? USE_FULL_RD : USE_LARGESTALL;
804
805

        if (MIN(cpi->common.width, cpi->common.height) >= 720)
806
807
          sf->disable_split_mask = cpi->common.show_frame ?
              DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
808
809
        else
          sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
Paul Wilkins's avatar
Paul Wilkins committed
810

811

812
813
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
814
815
                                     FLAG_SKIP_COMP_BESTINTRA |
                                     FLAG_SKIP_INTRA_LOWVAR;
Paul Wilkins's avatar
Paul Wilkins committed
816

817
        sf->use_rd_breakout = 1;
Jingning Han's avatar
Jingning Han committed
818
        sf->adaptive_motion_search = 1;
819
        sf->auto_mv_step_size = 1;
820

821
        sf->disable_filter_search_var_thresh = 16;
Paul Wilkins's avatar
Paul Wilkins committed
822
823
824
825
826
827
        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;
828

Paul Wilkins's avatar
Paul Wilkins committed
829
        sf->adaptive_rd_thresh = 2;
830
        sf->recode_loop = 2;
Paul Wilkins's avatar
Paul Wilkins committed
831
        sf->mode_skip_start = 11;
832
833
834
835
        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
836
      }
Paul Wilkins's avatar
Paul Wilkins committed
837
      if (speed == 3) {
838
        sf->use_square_partition_only = 1;
Paul Wilkins's avatar
Paul Wilkins committed
839
        sf->tx_size_search_method = USE_LARGESTALL;
840
841
842
843
844

        if (MIN(cpi->common.width, cpi->common.height) >= 720)
          sf->disable_split_mask = DISABLE_ALL_SPLIT;
        else
          sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
Paul Wilkins's avatar
Paul Wilkins committed
845

846
847
848
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
Paul Wilkins's avatar
Paul Wilkins committed
849
850
                                     FLAG_SKIP_INTRA_LOWVAR;

851
        sf->use_rd_breakout = 1;
Jingning Han's avatar
Jingning Han committed
852
        sf->adaptive_motion_search = 1;
853
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
854
855
856
857

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

858
        sf->auto_min_max_partition_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
859
860
861
862
863
864
865
866
        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;
867
        sf->use_fast_coef_updates = 2;
Paul Wilkins's avatar
Paul Wilkins committed
868
869

        sf->adaptive_rd_thresh = 4;
Paul Wilkins's avatar
Paul Wilkins committed
870
        sf->mode_skip_start = 6;
871
      }
Paul Wilkins's avatar
Paul Wilkins committed
872
      if (speed == 4) {
Paul Wilkins's avatar
Paul Wilkins committed
873
        sf->use_square_partition_only = 1;
Paul Wilkins's avatar
Paul Wilkins committed
874
875
876
        sf->tx_size_search_method = USE_LARGESTALL;
        sf->disable_split_mask = DISABLE_ALL_SPLIT;

877
878
879
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
880
881
882
                                     FLAG_SKIP_COMP_REFMISMATCH |
                                     FLAG_SKIP_INTRA_LOWVAR |
                                     FLAG_EARLY_TERMINATE;
Paul Wilkins's avatar
Paul Wilkins committed
883

884
        sf->use_rd_breakout = 1;
Paul Wilkins's avatar
Paul Wilkins committed
885
        sf->adaptive_motion_search = 1;
886
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
887
888
889
890

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

Paul Wilkins's avatar
Paul Wilkins committed
891
        sf->auto_min_max_partition_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
892
893
894
895
896
897
898
899
        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;
900
        sf->use_fast_coef_updates = 2;
Paul Wilkins's avatar
Paul Wilkins committed
901

Paul Wilkins's avatar
Paul Wilkins committed
902
        sf->adaptive_rd_thresh = 4;
Paul Wilkins's avatar
Paul Wilkins committed
903
        sf->mode_skip_start = 6;
Paul Wilkins's avatar
Paul Wilkins committed
904
905
906
907
908
909

        /* 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; */
910
      }
Paul Wilkins's avatar
Paul Wilkins committed
911
      if (speed == 5) {
912
        sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
913
        sf->use_one_partition_size_always = 1;
914
        sf->always_this_block_size = BLOCK_16X16;
915
        sf->tx_size_search_method = frame_is_intra_only(&cpi->common) ?
916
                                     USE_FULL_RD : USE_LARGESTALL;
917
918
919
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
920
921
922
                                     FLAG_SKIP_COMP_REFMISMATCH |
                                     FLAG_SKIP_INTRA_LOWVAR |
                                     FLAG_EARLY_TERMINATE;
923
        sf->use_rd_breakout = 1;
924
        sf->use_lp32x32fdct = 1;
Paul Wilkins's avatar
Paul Wilkins committed
925
        sf->optimize_coefficients = 0;
926
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
927