vp9_onyx_if.c 130 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
11
 */


12
#include "vpx_config.h"
13
#include "vp9/common/vp9_filter.h"
14
#include "vp9/common/vp9_onyxc_int.h"
15
#include "vp9/common/vp9_reconinter.h"
16
#include "vp9/encoder/vp9_onyx_int.h"
17
#include "vp9/common/vp9_systemdependent.h"
18
#include "vp9/encoder/vp9_quantize.h"
19
#include "vp9/common/vp9_alloccommon.h"
20
21
22
#include "vp9/encoder/vp9_mcomp.h"
#include "vp9/encoder/vp9_firstpass.h"
#include "vp9/encoder/vp9_psnr.h"
Johann's avatar
Johann committed
23
#include "vpx_scale/vpx_scale.h"
24
#include "vp9/common/vp9_extend.h"
25
#include "vp9/encoder/vp9_ratectrl.h"
26
#include "vp9/common/vp9_quant_common.h"
27
#include "vp9/common/vp9_tile_common.h"
28
#include "vp9/encoder/vp9_segmentation.h"
29
#include "./vp9_rtcd.h"
30
#include "./vpx_scale_rtcd.h"
31
#if CONFIG_POSTPROC
32
#include "vp9/common/vp9_postproc.h"
33
#endif
John Koleszar's avatar
John Koleszar committed
34
35
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/vpx_timer.h"
36

37
#include "vp9/common/vp9_seg_common.h"
38
#include "vp9/encoder/vp9_mbgraph.h"
39
40
#include "vp9/common/vp9_pred_common.h"
#include "vp9/encoder/vp9_rdopt.h"
41
#include "vp9/encoder/vp9_bitstream.h"
42
43
#include "vp9/encoder/vp9_picklpf.h"
#include "vp9/common/vp9_mvref_common.h"
44
#include "vp9/encoder/vp9_temporal_filter.h"
Paul Wilkins's avatar
Paul Wilkins committed
45

John Koleszar's avatar
John Koleszar committed
46
47
48
49
50
#include <math.h>
#include <stdio.h>
#include <limits.h>

extern void print_tree_update_probs();
51

52
static void set_default_lf_deltas(VP9_COMP *cpi);
John Koleszar's avatar
John Koleszar committed
53

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

56
57
#define SEARCH_BEST_FILTER 0            /* to search exhaustively for
                                           best filter */
58
#define RESET_FOREACH_FILTER 0          /* whether to reset the encoder state
59
60
61
62
63
64
65
66
67
                                           before trying each new filter */
#define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */

#define ALTREF_HIGH_PRECISION_MV 1      /* whether to use high precision mv
                                           for altref computation */
#define HIGH_PRECISION_MV_QTHRESH 200   /* Q threshold for use of high precision
                                           mv. Choose a very high value for
                                           now so that HIGH_PRECISION is always
                                           chosen */
68

69
#if CONFIG_INTERNAL_STATS
John Koleszar's avatar
John Koleszar committed
70
71
#include "math.h"

72
extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
73
74
                            YV12_BUFFER_CONFIG *dest, int lumamask,
                            double *weight);
John Koleszar's avatar
John Koleszar committed
75

76

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


#endif

John Koleszar's avatar
John Koleszar committed
84
// #define OUTPUT_YUV_REC
John Koleszar's avatar
John Koleszar committed
85
86
87
88

#ifdef OUTPUT_YUV_SRC
FILE *yuv_file;
#endif
89
90
91
#ifdef OUTPUT_YUV_REC
FILE *yuv_rec_file;
#endif
John Koleszar's avatar
John Koleszar committed
92
93
94

#if 0
FILE *framepsnr;
Yaowu Xu's avatar
Yaowu Xu committed
95
FILE *kf_list;
John Koleszar's avatar
John Koleszar committed
96
97
98
99
100
FILE *keyfile;
#endif


#ifdef ENTROPY_STATS
101
102
103
extern int intra_mode_stats[VP9_INTRA_MODES]
                           [VP9_INTRA_MODES]
                           [VP9_INTRA_MODES];
John Koleszar's avatar
John Koleszar committed
104
105
#endif

106
107
108
109
#ifdef NMV_STATS
extern void init_nmvstats();
extern void print_nmvstats();
#endif
110
111
112
#ifdef MODE_STATS
extern void init_tx_count_stats();
extern void write_tx_count_stats();
113
114
extern void init_switchable_interp_stats();
extern void write_switchable_interp_stats();
115
#endif
116

John Koleszar's avatar
John Koleszar committed
117
118
119
120
#ifdef SPEEDSTATS
unsigned int frames_at_speed[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#endif

121
122
123
#if defined(SECTIONBITS_OUTPUT)
extern unsigned __int64 Sectionbits[500];
#endif
John Koleszar's avatar
John Koleszar committed
124

125
extern void vp9_init_quantizer(VP9_COMP *cpi);
Paul Wilkins's avatar
Paul Wilkins committed
126

127
// Tables relating active max Q to active min Q
128
129
130
131
132
133
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];

134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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;
  }
}

160
161
162
163
// 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))
164
static int calculate_minq_index(double maxq,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
165
                                double x3, double x2, double x1, double c) {
John Koleszar's avatar
John Koleszar committed
166
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
167
168
  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
                                maxq);
John Koleszar's avatar
John Koleszar committed
169

Paul Wilkins's avatar
Paul Wilkins committed
170
171
172
173
174
  // 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
175
  for (i = 0; i < QINDEX_RANGE; i++) {
176
    if (minqtarget <= vp9_convert_qindex_to_q(i))
John Koleszar's avatar
John Koleszar committed
177
178
      return i;
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
179

John Koleszar's avatar
John Koleszar committed
180
  return QINDEX_RANGE - 1;
181
}
182

183
static void init_minq_luts(void) {
John Koleszar's avatar
John Koleszar committed
184
185
186
  int i;

  for (i = 0; i < QINDEX_RANGE; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
187
    const double maxq = vp9_convert_qindex_to_q(i);
John Koleszar's avatar
John Koleszar committed
188
189
190


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
191
192
193
                                                 0.000001,
                                                 -0.0004,
                                                 0.15,
John Koleszar's avatar
John Koleszar committed
194
195
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
196
197
198
                                                  0.000002,
                                                  -0.0012,
                                                  0.5,
John Koleszar's avatar
John Koleszar committed
199
                                                  0.0);
200

John Koleszar's avatar
John Koleszar committed
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
    gf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.0000015,
                                                 -0.0009,
                                                 0.33,
                                                 0.0);
    gf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000021,
                                                  -0.00125,
                                                  0.45,
                                                  0.0);
    inter_minq[i] = calculate_minq_index(maxq,
                                         0.00000271,
                                         -0.00113,
                                         0.697,
                                         0.0);

  }
218
}
219

220
221
222
223
224
225
226
227
228
static void set_mvcost(MACROBLOCK *mb) {
  if (mb->e_mbd.allow_high_precision_mv) {
    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
229

230
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
231
232
233
  static int init_done = 0;

  if (!init_done) {
234
    vp9_initialize_common();
235
    vp9_tokenize_initialize();
236
    vp9_init_quant_tables();
237
    vp9_init_me_luts();
John Koleszar's avatar
John Koleszar committed
238
    init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
239
    // init_base_skip_probs();
John Koleszar's avatar
John Koleszar committed
240
241
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
242
243
}

244
static void setup_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
245
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
246
  struct loopfilter *lf = &xd->lf;
Paul Wilkins's avatar
Paul Wilkins committed
247

John Koleszar's avatar
John Koleszar committed
248
  // Set up default state for MB feature flags
249
  xd->seg.enabled = 0;
250

251
252
253
  xd->seg.update_map = 0;
  xd->seg.update_data = 0;
  vpx_memset(xd->seg.tree_probs, 255, sizeof(xd->seg.tree_probs));
Paul Wilkins's avatar
Paul Wilkins committed
254

255
  vp9_clearall_segfeatures(&xd->seg);
Paul Wilkins's avatar
Paul Wilkins committed
256

257
258
259
260
261
262
  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
263

John Koleszar's avatar
John Koleszar committed
264
  set_default_lf_deltas(cpi);
John Koleszar's avatar
John Koleszar committed
265
266
}

267
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
268
269
270
271
272
273
274
  // 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
275

John Koleszar's avatar
John Koleszar committed
276
277
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
278

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

281
282
283
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
284
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
285

John Koleszar's avatar
John Koleszar committed
286
287
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
288

John Koleszar's avatar
John Koleszar committed
289
290
291
292
293
  // 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;
294

John Koleszar's avatar
John Koleszar committed
295
296
  vpx_free(cpi->mb.pip);
  cpi->mb.pip = 0;
John Koleszar's avatar
John Koleszar committed
297
298
}

299
300
301
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
302
static int compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
303
304
305
306
307
308
309
  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;
310
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
311
312
313
314
315
316
      break;
  }

  // Convert the q target to an index
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    target_index = i;
317
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
318
319
320
321
      break;
  }

  return target_index - start_index;
322
323
}

324
static void configure_static_seg_features(VP9_COMP *cpi) {
325
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
326
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
327

John Koleszar's avatar
John Koleszar committed
328
329
  int high_q = (int)(cpi->avg_q > 48.0);
  int qi_delta;
330

John Koleszar's avatar
John Koleszar committed
331
332
333
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
334
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
335
336
    xd->seg.update_map = 0;
    xd->seg.update_data = 0;
John Koleszar's avatar
John Koleszar committed
337
    cpi->static_mb_pct = 0;
338

John Koleszar's avatar
John Koleszar committed
339
    // Disable segmentation
340
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
341

John Koleszar's avatar
John Koleszar committed
342
    // Clear down the segment features.
343
    vp9_clearall_segfeatures(&xd->seg);
344
345
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
346
    // Clear down the global segmentation map
347
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
348
349
    xd->seg.update_map = 0;
    xd->seg.update_data = 0;
John Koleszar's avatar
John Koleszar committed
350
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
351

John Koleszar's avatar
John Koleszar committed
352
    // Disable segmentation and individual segment features by default
353
    vp9_disable_segmentation((VP9_PTR)cpi);
354
    vp9_clearall_segfeatures(&xd->seg);
Paul Wilkins's avatar
Paul Wilkins committed
355

John Koleszar's avatar
John Koleszar committed
356
357
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
358
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
359

John Koleszar's avatar
John Koleszar committed
360
361
    // If segmentation was enabled set those features needed for the
    // arf itself.
362
363
364
    if (xd->seg.enabled) {
      xd->seg.update_map = 1;
      xd->seg.update_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
365

John Koleszar's avatar
John Koleszar committed
366
      qi_delta = compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
367
368
      vp9_set_segdata(&xd->seg, 1, SEG_LVL_ALT_Q, (qi_delta - 2));
      vp9_set_segdata(&xd->seg, 1, SEG_LVL_ALT_LF, -2);
Paul Wilkins's avatar
Paul Wilkins committed
369

370
371
      vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_ALT_LF);
372

John Koleszar's avatar
John Koleszar committed
373
      // Where relevant assume segment data is delta data
374
      xd->seg.abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
375

376
    }
377
  } else if (xd->seg.enabled) {
378
379
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
380
    // First normal frame in a valid gf or alt ref group
381
    if (cpi->frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
382
      // Set up segment features for normal frames in an arf group
John Koleszar's avatar
John Koleszar committed
383
      if (cpi->source_alt_ref_active) {
384
385
386
        xd->seg.update_map = 0;
        xd->seg.update_data = 1;
        xd->seg.abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
387

John Koleszar's avatar
John Koleszar committed
388
389
        qi_delta = compute_qdelta(cpi, cpi->avg_q,
                                  (cpi->avg_q * 1.125));
390
391
        vp9_set_segdata(&xd->seg, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
        vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_ALT_Q);
Paul Wilkins's avatar
Paul Wilkins committed
392

393
394
        vp9_set_segdata(&xd->seg, 1, SEG_LVL_ALT_LF, -2);
        vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_ALT_LF);
Paul Wilkins's avatar
Paul Wilkins committed
395

John Koleszar's avatar
John Koleszar committed
396
397
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
398
399
400
          vp9_set_segdata(&xd->seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
          vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_REF_FRAME);
          vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
401
        }
402
403
404
405
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

406
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
407

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

410
411
        xd->seg.update_map = 0;
        xd->seg.update_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
412

413
        vp9_clearall_segfeatures(&xd->seg);
John Koleszar's avatar
John Koleszar committed
414
      }
415
416
417
418
    } 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
419

Paul Wilkins's avatar
Paul Wilkins committed
420
      // Enable ref frame features for segment 0 as well
421
422
      vp9_enable_segfeature(&xd->seg, 0, SEG_LVL_REF_FRAME);
      vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_REF_FRAME);
John Koleszar's avatar
John Koleszar committed
423

Paul Wilkins's avatar
Paul Wilkins committed
424
      // All mbs should use ALTREF_FRAME
425
426
427
428
      vp9_clear_segdata(&xd->seg, 0, SEG_LVL_REF_FRAME);
      vp9_set_segdata(&xd->seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
      vp9_clear_segdata(&xd->seg, 1, SEG_LVL_REF_FRAME);
      vp9_set_segdata(&xd->seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
John Koleszar's avatar
John Koleszar committed
429

Paul Wilkins's avatar
Paul Wilkins committed
430
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
431
      if (high_q) {
432
433
          vp9_enable_segfeature(&xd->seg, 0, SEG_LVL_SKIP);
          vp9_enable_segfeature(&xd->seg, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
434
      }
Adrian Grange's avatar
Adrian Grange committed
435
      // Enable data update
436
      xd->seg.update_data = 1;
437
438
439
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
440
      // No updates.. leave things as they are.
441
442
      xd->seg.update_map = 0;
      xd->seg.update_data = 0;
John Koleszar's avatar
John Koleszar committed
443
444
    }
  }
445
446
}

Paul Wilkins's avatar
Paul Wilkins committed
447
448
449
450
#ifdef ENTROPY_STATS
void vp9_update_mode_context_stats(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
  int i, j;
451
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
452
      cm->fc.inter_mode_counts;
453
  int64_t (*mv_ref_stats)[VP9_INTER_MODES - 1][2] = cpi->mv_ref_stats;
Paul Wilkins's avatar
Paul Wilkins committed
454
455
456
457
458
459
460
461
462
463
464
465
466
  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++) {
467
    for (j = 0; j < VP9_INTER_MODES - 1; j++) {
468
469
      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
470
471
472
473
474
475
476
477
478
479
480
481
482
483
    }
  }

  // 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");
484
485
486
  fprintf(
      f,
      "const int inter_mode_probs[INTER_MODE_CONTEXTS][VP9_INTER_MODES - 1] =");
Paul Wilkins's avatar
Paul Wilkins committed
487
488
489
490
  fprintf(f, "{\n");
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
    fprintf(f, "  {/* %d */ ", j);
    fprintf(f, "    ");
491
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
Paul Wilkins's avatar
Paul Wilkins committed
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
      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

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

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

519
520
  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
521
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
522
      map_index++;
523
524
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
525
526
  }
  fprintf(statsfile, "\n");
527

John Koleszar's avatar
John Koleszar committed
528
  fclose(statsfile);
529
530
}

531
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
532
533
534
535
536
  VP9_COMMON *const cm = &cpi->common;
  int row, col;
  MODE_INFO *mi, *mi_ptr = cm->mi;
  uint8_t *cache_ptr = cm->last_frame_seg_map, *cache;

537
  for (row = 0; row < cm->mi_rows; row++) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
538
539
    mi = mi_ptr;
    cache = cache_ptr;
540
    for (col = 0; col < cm->mi_cols; col++, mi++, cache++)
Ronald S. Bultje's avatar
Ronald S. Bultje committed
541
542
      cache[0] = mi->mbmi.segment_id;
    mi_ptr += cm->mode_info_stride;
543
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
544
545
546
  }
}

547
static void set_default_lf_deltas(VP9_COMP *cpi) {
548
  struct loopfilter *lf = &cpi->mb.e_mbd.lf;
John Koleszar's avatar
John Koleszar committed
549

550
551
552
553
554
  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
555

John Koleszar's avatar
John Koleszar committed
556
  // Test of ref frame deltas
557
558
559
560
  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
561

562
563
  lf->mode_deltas[0] = 0;   // Zero
  lf->mode_deltas[1] = 0;   // New mv
John Koleszar's avatar
John Koleszar committed
564
565
}

566
567
static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode, int speed) {
  SPEED_FEATURES *sf = &cpi->sf;
568
  int speed_multiplier = speed + 1;
569
570
571
  int i;

  // Set baseline threshold values
572
573
  for (i = 0; i < MAX_MODES; ++i)
    sf->thresh_mult[i] = mode == 0 ? -500 : 0;
574
575

  sf->thresh_mult[THR_NEARESTMV] = 0;
576
577
578
  sf->thresh_mult[THR_NEARESTG] = 0;
  sf->thresh_mult[THR_NEARESTA] = 0;

Paul Wilkins's avatar
Paul Wilkins committed
579
580
  sf->thresh_mult[THR_NEWMV] += speed_multiplier * 1000;
  sf->thresh_mult[THR_COMP_NEARESTLA] += speed_multiplier * 1000;
581
  sf->thresh_mult[THR_NEARMV] += speed_multiplier * 1000;
Paul Wilkins's avatar
Paul Wilkins committed
582
  sf->thresh_mult[THR_COMP_NEARESTGA] += speed_multiplier * 1000;
583

Paul Wilkins's avatar
Paul Wilkins committed
584
  sf->thresh_mult[THR_DC] += speed_multiplier * 1000;
585

Paul Wilkins's avatar
Paul Wilkins committed
586
587
588
  sf->thresh_mult[THR_NEWG] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEWA] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEARA] += speed_multiplier * 1000;
589

Paul Wilkins's avatar
Paul Wilkins committed
590
  sf->thresh_mult[THR_TM] += speed_multiplier * 1000;
591

592
  sf->thresh_mult[THR_COMP_NEARLA] += speed_multiplier * 1500;
Paul Wilkins's avatar
Paul Wilkins committed
593
594
  sf->thresh_mult[THR_COMP_NEWLA] += speed_multiplier * 2000;
  sf->thresh_mult[THR_NEARG] += speed_multiplier * 1000;
595
  sf->thresh_mult[THR_COMP_NEARGA] += speed_multiplier * 1500;
Paul Wilkins's avatar
Paul Wilkins committed
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
  sf->thresh_mult[THR_COMP_NEWGA] += speed_multiplier * 2000;

  sf->thresh_mult[THR_SPLITMV] += speed_multiplier * 2500;
  sf->thresh_mult[THR_SPLITG] += speed_multiplier * 2500;
  sf->thresh_mult[THR_SPLITA] += speed_multiplier * 2500;
  sf->thresh_mult[THR_COMP_SPLITLA] += speed_multiplier * 4500;
  sf->thresh_mult[THR_COMP_SPLITGA] += speed_multiplier * 4500;

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

  sf->thresh_mult[THR_B_PRED] += speed_multiplier * 2500;
  sf->thresh_mult[THR_H_PRED] += speed_multiplier * 2000;
  sf->thresh_mult[THR_V_PRED] += speed_multiplier * 2000;
  sf->thresh_mult[THR_D45_PRED ] += speed_multiplier * 2500;
  sf->thresh_mult[THR_D135_PRED] += speed_multiplier * 2500;
  sf->thresh_mult[THR_D117_PRED] += speed_multiplier * 2500;
  sf->thresh_mult[THR_D153_PRED] += speed_multiplier * 2500;
  sf->thresh_mult[THR_D27_PRED] += speed_multiplier * 2500;
  sf->thresh_mult[THR_D63_PRED] += speed_multiplier * 2500;
619

620
  if (cpi->sf.skip_lots_of_modes) {
Jim Bankoski's avatar
Jim Bankoski committed
621
622
623
    for (i = 0; i < MAX_MODES; ++i)
      sf->thresh_mult[i] = INT_MAX;

Paul Wilkins's avatar
Paul Wilkins committed
624
625
    sf->thresh_mult[THR_DC] = 2000;
    sf->thresh_mult[THR_TM] = 2000;
Jim Bankoski's avatar
Jim Bankoski committed
626
627
628
    sf->thresh_mult[THR_NEWMV] = 4000;
    sf->thresh_mult[THR_NEWG] = 4000;
    sf->thresh_mult[THR_NEWA] = 4000;
Jim Bankoski's avatar
Jim Bankoski committed
629
    sf->thresh_mult[THR_NEARESTMV] = 0;
Jim Bankoski's avatar
Jim Bankoski committed
630
631
632
633
634
    sf->thresh_mult[THR_NEARESTG] = 0;
    sf->thresh_mult[THR_NEARESTA] = 0;
    sf->thresh_mult[THR_NEARMV] = 2000;
    sf->thresh_mult[THR_NEARG] = 2000;
    sf->thresh_mult[THR_NEARA] = 2000;
Jim Bankoski's avatar
Jim Bankoski committed
635
    sf->thresh_mult[THR_COMP_NEARESTLA] = 2000;
Jim Bankoski's avatar
Jim Bankoski committed
636
637
638
    sf->thresh_mult[THR_SPLITMV] = 2500;
    sf->thresh_mult[THR_SPLITG] = 2500;
    sf->thresh_mult[THR_SPLITA] = 2500;
Jim Bankoski's avatar
Jim Bankoski committed
639
640
641
    sf->recode_loop = 0;
  }

642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
  /* 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;
    sf->thresh_mult[THR_SPLITMV  ] = 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;
    sf->thresh_mult[THR_SPLITG   ] = 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;
    sf->thresh_mult[THR_SPLITA   ] = 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;
    sf->thresh_mult[THR_COMP_SPLITLA  ] = 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;
    sf->thresh_mult[THR_COMP_SPLITGA  ] = INT_MAX;
  }
681
682
683
684
685
686
687
688
689

  if (sf->disable_splitmv == 1) {
    sf->thresh_mult[THR_SPLITMV  ] = INT_MAX;
    sf->thresh_mult[THR_SPLITG   ] = INT_MAX;
    sf->thresh_mult[THR_SPLITA   ] = INT_MAX;

    sf->thresh_mult[THR_COMP_SPLITLA  ] = INT_MAX;
    sf->thresh_mult[THR_COMP_SPLITGA  ] = INT_MAX;
  }
690
691
}

692
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
693
  SPEED_FEATURES *sf = &cpi->sf;
694
  int mode = cpi->compressor_speed;
695
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
696
  int i;
697

John Koleszar's avatar
John Koleszar committed
698
  // Only modes 0 and 1 supported for now in experimental code basae
699
700
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716

  // Initialise default mode frequency sampling variables
  for (i = 0; i < MAX_MODES; i ++) {
    cpi->mode_check_freq[i] = 0;
    cpi->mode_test_hit_counts[i] = 0;
    cpi->mode_chosen_counts[i] = 0;
  }

  // best quality defaults
  sf->RD = 1;
  sf->search_method = NSTEP;
  sf->auto_filter = 1;
  sf->recode_loop = 1;
  sf->quarter_pixel_search = 1;
  sf->half_pixel_search = 1;
  sf->iterative_sub_pixel = 1;
717
  sf->optimize_coefficients = !cpi->oxcf.lossless;
718
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
719
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
720
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
721
  sf->comp_inter_joint_search_thresh = BLOCK_SIZE_AB4X4;
722
  sf->adaptive_rd_thresh = 0;
Jim Bankoski's avatar
Jim Bankoski committed
723
  sf->use_lastframe_partitioning = 0;
Deb Mukherjee's avatar
Deb Mukherjee committed
724
  sf->tx_size_search_method = USE_FULL_RD;
725
726
  sf->use_8tap_always = 0;
  sf->use_avoid_tested_higherror = 0;
Paul Wilkins's avatar
Paul Wilkins committed
727
  sf->reference_masking = 0;
728
  sf->skip_lots_of_modes = 0;
729
  sf->adjust_thresholds_by_speed = 0;
730
  sf->partition_by_variance = 0;
731
  sf->use_one_partition_size_always = 0;
Yaowu Xu's avatar
Yaowu Xu committed
732
  sf->less_rectangular_check = 0;
733
  sf->use_square_partition_only = 0;
734
735
736
  sf->auto_min_max_partition_size = 0;
  sf->auto_min_max_partition_interval = 0;
  sf->auto_min_max_partition_count = 0;
737
  // sf->use_max_partition_size = 0;
738
  sf->max_partition_size = BLOCK_64X64;
739
  // sf->use_min_partition_size = 0;
740
  sf->min_partition_size = BLOCK_4X4;
741
742
  sf->adjust_partitioning_from_last_frame = 0;
  sf->last_partitioning_redo_frequency = 4;
743
  sf->disable_splitmv = 0;
744
  sf->mode_search_skip_flags = 0;
745
  sf->last_chroma_intra_mode = TM_PRED;
746
  sf->use_rd_breakout = 0;
747
  sf->skip_encode_sb = 0;
748
  sf->use_uv_intra_rd_estimate = 0;
749
  sf->using_small_partition_info = 0;
Paul Wilkins's avatar
Paul Wilkins committed
750
751
752
753
  // Skip any mode not chosen at size < X for all sizes > X
  // Hence BLOCK_SIZE_SB64X64 (skip is off)
  sf->unused_mode_skip_lvl = BLOCK_SIZE_SB64X64;

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
  switch (mode) {
John Koleszar's avatar
John Koleszar committed
762
    case 0: // best quality mode
John Koleszar's avatar
John Koleszar committed
763
764
765
      sf->search_best_filter = SEARCH_BEST_FILTER;
      break;

766
    case 1:
767
768
769
#if CONFIG_MULTIPLE_ARF
      // Switch segmentation off.
      sf->static_segmentation = 0;
770
#else
Paul Wilkins's avatar
Paul Wilkins committed
771
      sf->static_segmentation = 0;
772
#endif
773
774
      sf->use_avoid_tested_higherror = 1;
      sf->adaptive_rd_thresh = 1;
Yaowu Xu's avatar
Yaowu Xu committed
775
      if (speed == 1) {
776
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
Yaowu Xu's avatar
Yaowu Xu committed
777
        sf->less_rectangular_check  = 1;
Deb Mukherjee's avatar
Deb Mukherjee committed
778
779
780
781
        sf->tx_size_search_method = ((cpi->common.frame_type == KEY_FRAME ||
                                      cpi->common.intra_only ||
                                      cpi->common.show_frame == 0) ?
                                     USE_FULL_RD :
782
783
784
785
                                     USE_LARGESTALL);
        sf->use_square_partition_only = !(cpi->common.frame_type == KEY_FRAME ||
                                   cpi->common.intra_only ||
                                   cpi->common.show_frame == 0);
786
787
        sf->disable_splitmv =
            (MIN(cpi->common.width, cpi->common.height) >= 720)? 1 : 0;
Paul Wilkins's avatar
Paul Wilkins committed
788
        sf->unused_mode_skip_lvl = BLOCK_SIZE_SB32X32;
789
790
791
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA;
792
        sf->use_uv_intra_rd_estimate = 1;
793
        sf->use_rd_breakout = 1;
794
        sf->skip_encode_sb = 1;
795
        sf->auto_mv_step_size = 1;
796
797

        sf->auto_min_max_partition_size = 1;
798
799
        // sf->use_max_partition_size = 1;
        // sf->use_min_partition_size = 1;
800
        sf->auto_min_max_partition_interval = 1;
Jim Bankoski's avatar
Jim Bankoski committed
801
      }
802
      if (speed == 2) {
Paul Wilkins's avatar
Paul Wilkins committed
803
        sf->adjust_thresholds_by_speed = 1;
Yaowu Xu's avatar
Yaowu Xu committed
804
        sf->less_rectangular_check  = 1;
805
        sf->use_square_partition_only = 1;
Paul Wilkins's avatar
Paul Wilkins committed
806
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
Jim Bankoski's avatar
Jim Bankoski committed
807
        sf->use_lastframe_partitioning = 1;
808
809
        sf->adjust_partitioning_from_last_frame = 1;
        sf->last_partitioning_redo_frequency = 3;
Paul Wilkins's avatar
Paul Wilkins committed
810
        sf->unused_mode_skip_lvl = BLOCK_SIZE_SB32X32;
811
812
813
814
815
816
817
818
819
        sf->tx_size_search_method = ((cpi->common.frame_type == KEY_FRAME ||
                                      cpi->common.intra_only ||
                                      cpi->common.show_frame == 0) ?
                                     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;
820
        sf->last_chroma_intra_mode = DC_PRED;
821
        sf->use_uv_intra_rd_estimate = 1;
822
        sf->use_rd_breakout = 1;
823
        sf->skip_encode_sb = 1;
824
        sf->using_small_partition_info = 1;
825
826
        sf->disable_splitmv =
            (MIN(cpi->common.width, cpi->common.height) >= 720)? 1 : 0;
827
        sf->auto_mv_step_size = 1;
828
      }
829
      if (speed == 3) {
Paul Wilkins's avatar
Paul Wilkins committed
830
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
831
        sf->partition_by_variance = 1;
Deb Mukherjee's avatar
Deb Mukherjee committed
832
833
834
835
836
        sf->tx_size_search_method = ((cpi->common.frame_type == KEY_FRAME ||
                                      cpi->common.intra_only ||
                                      cpi->common.show_frame == 0) ?
                                     USE_FULL_RD :
                                     USE_LARGESTALL);
837
838
839
840
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
                                     FLAG_SKIP_COMP_REFMISMATCH;
841
        sf->use_rd_breakout = 1;
842
        sf->skip_encode_sb = 1;
843
        sf->disable_splitmv = 1;
844
        sf->auto_mv_step_size = 1;
845
      }
846
      if (speed == 4) {
Paul Wilkins's avatar
Paul Wilkins committed
847
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
848
849
        sf->use_one_partition_size_always = 1;
        sf->always_this_block_size = BLOCK_SIZE_MB16X16;
Deb Mukherjee's avatar
Deb Mukherjee committed
850
851
852
853
854
        sf->tx_size_search_method = ((cpi->common.frame_type == KEY_FRAME ||
                                      cpi->common.intra_only ||
                                      cpi->common.show_frame == 0) ?
                                     USE_FULL_RD :
                                     USE_LARGESTALL);
855
856
857
858
        sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
                                     FLAG_SKIP_INTRA_BESTINTER |
                                     FLAG_SKIP_COMP_BESTINTRA |
                                     FLAG_SKIP_COMP_REFMISMATCH;
859
        sf->use_rd_breakout = 1;
Paul Wilkins's avatar
Paul Wilkins committed
860
        sf->optimize_coefficients = 0;
861
        sf->auto_mv_step_size = 1;
Paul Wilkins's avatar
Paul Wilkins committed
862
863
        // sf->reduce_first_step_size = 1;
        // sf->reference_masking = 1;
864
865

        sf->disable_splitmv = 1;
866
      }
867
868
869
      /*
      if (speed == 2) {
        sf->first_step = 0;
870
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_SB8X8;
871
872
        sf->use_max_partition_size = 1;
        sf->max_partition_size = BLOCK_SIZE_MB16X16;
873
874
      }
      if (speed == 3) {
875
        sf->first_step = 0;
876
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_SB8X8;
877
878
        sf->use_min_partition_size = 1;
        sf->min_partition_size = BLOCK_SIZE_SB8X8;
879
880
      }
      */
881

Deb Mukherjee's avatar
Deb Mukherjee committed
882
      break;
John Koleszar's avatar
John Koleszar committed
883

John Koleszar's avatar
John Koleszar committed
884
  }; /* switch */
885

886
  // Set rd thresholds based on mode and speed setting
887
888
889
890
  if (cpi->sf.adjust_thresholds_by_speed)
    set_rd_speed_thresholds(cpi, mode, speed);
  else
    set_rd_speed_thresholds(cpi, mode, 0);
John Koleszar's avatar
John Koleszar committed
891
892
893
894
895
896

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

Yaowu Xu's avatar
Yaowu Xu committed
898
899
900
901
  cpi->mb.fwd_txm16x16  = vp9_short_fdct16x16;
  cpi->mb.fwd_txm8x8    = vp9_short_fdct8x8;
  cpi->mb.fwd_txm8x4    = vp9_short_fdct8x4;
  cpi->mb.fwd_txm4x4    = vp9_short_fdct4x4;
Yaowu Xu's avatar
Yaowu Xu committed
902
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
Yaowu Xu's avatar
Yaowu Xu committed
903
904
    cpi->mb.fwd_txm8x4    = vp9_short_walsh8x4;
    cpi->mb.fwd_txm4x4    = vp9_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
905
  }
John Koleszar's avatar
John Koleszar committed
906

907
  cpi->mb.quantize_b_4x4      = vp9_regular_quantize_b_4x4;
Paul Wilkins's avatar
Paul Wilkins committed
908