vp9_onyx_if.c 137 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
#include "vpx_mem/vpx_mem.h"
35
#include "vp9/common/vp9_swapyv12buffer.h"
John Koleszar's avatar
John Koleszar committed
36
#include "vpx_ports/vpx_timer.h"
37

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

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

extern void print_tree_update_probs();
52

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

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

57
58
#define SEARCH_BEST_FILTER 0            /* to search exhaustively for
                                           best filter */
59
#define RESET_FOREACH_FILTER 0          /* whether to reset the encoder state
60
61
62
63
64
65
66
67
68
                                           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 */
69

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

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

77

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


#endif

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

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

#if 0
FILE *framepsnr;
Yaowu Xu's avatar
Yaowu Xu committed
96
FILE *kf_list;
John Koleszar's avatar
John Koleszar committed
97
98
99
100
101
102
103
104
105
106
FILE *keyfile;
#endif

#if 0
extern int skip_true_count;
extern int skip_false_count;
#endif


#ifdef ENTROPY_STATS
107
108
109
extern int intra_mode_stats[VP9_KF_BINTRAMODES]
                           [VP9_KF_BINTRAMODES]
                           [VP9_KF_BINTRAMODES];
John Koleszar's avatar
John Koleszar committed
110
111
#endif

112
113
114
115
116
#ifdef NMV_STATS
extern void init_nmvstats();
extern void print_nmvstats();
#endif

117
118
119
120
121
122
#if CONFIG_CODE_ZEROGROUP
#ifdef ZPC_STATS
extern void init_zpcstats();
extern void print_zpcstats();
#endif
#endif
123

John Koleszar's avatar
John Koleszar committed
124
125
126
127
#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

128
129
130
#if defined(SECTIONBITS_OUTPUT)
extern unsigned __int64 Sectionbits[500];
#endif
John Koleszar's avatar
John Koleszar committed
131
#ifdef MODE_STATS
John Koleszar's avatar
John Koleszar committed
132
extern int64_t Sectionbits[500];
133
134
135
136
extern unsigned int y_modes[VP9_YMODES];
extern unsigned int i8x8_modes[VP9_I8X8_MODES];
extern unsigned int uv_modes[VP9_UV_MODES];
extern unsigned int uv_modes_y[VP9_YMODES][VP9_UV_MODES];
137
extern unsigned int b_modes[B_MODE_COUNT];
John Koleszar's avatar
John Koleszar committed
138
extern unsigned int inter_y_modes[MB_MODE_COUNT];
139
extern unsigned int inter_uv_modes[VP9_UV_MODES];
140
extern unsigned int inter_b_modes[B_MODE_COUNT];
John Koleszar's avatar
John Koleszar committed
141
142
#endif

143
extern void vp9_init_quantizer(VP9_COMP *cpi);
Paul Wilkins's avatar
Paul Wilkins committed
144

145
static int base_skip_false_prob[QINDEX_RANGE][3];
146

147
// Tables relating active max Q to active min Q
148
149
150
151
152
153
154
155
156
157
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];

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

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

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

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

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


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

John Koleszar's avatar
John Koleszar committed
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
    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);

  }
207
}
208

209
210
211
212
213
214
215
216
217
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;
  }
}
218
static void init_base_skip_probs(void) {
John Koleszar's avatar
John Koleszar committed
219
  int i;
Paul Wilkins's avatar
Paul Wilkins committed
220

John Koleszar's avatar
John Koleszar committed
221
  for (i = 0; i < QINDEX_RANGE; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
222
    const double q = vp9_convert_qindex_to_q(i);
Paul Wilkins's avatar
Paul Wilkins committed
223

John Koleszar's avatar
John Koleszar committed
224
225
    // Exponential decay caluclation of baseline skip prob with clamping
    // Based on crude best fit of old table.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
226
    const int t = (int)(564.25 * pow(2.71828, (-0.012 * q)));
227

228
229
230
    base_skip_false_prob[i][1] = clip_prob(t);
    base_skip_false_prob[i][2] = clip_prob(t * 3 / 4);
    base_skip_false_prob[i][0] = clip_prob(t * 5 / 4);
John Koleszar's avatar
John Koleszar committed
231
  }
Paul Wilkins's avatar
Paul Wilkins committed
232
}
233

234
235
static void update_base_skip_probs(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
236
  int k;
Paul Wilkins's avatar
Paul Wilkins committed
237

John Koleszar's avatar
John Koleszar committed
238
  if (cm->frame_type != KEY_FRAME) {
239
    vp9_update_skip_probs(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
240

241
    if (cpi->refresh_alt_ref_frame) {
John Koleszar's avatar
John Koleszar committed
242
243
244
      for (k = 0; k < MBSKIP_CONTEXTS; ++k)
        cpi->last_skip_false_probs[2][k] = cm->mbskip_pred_probs[k];
      cpi->last_skip_probs_q[2] = cm->base_qindex;
245
    } else if (cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
246
247
248
249
250
251
252
      for (k = 0; k < MBSKIP_CONTEXTS; ++k)
        cpi->last_skip_false_probs[1][k] = cm->mbskip_pred_probs[k];
      cpi->last_skip_probs_q[1] = cm->base_qindex;
    } else {
      for (k = 0; k < MBSKIP_CONTEXTS; ++k)
        cpi->last_skip_false_probs[0][k] = cm->mbskip_pred_probs[k];
      cpi->last_skip_probs_q[0] = cm->base_qindex;
Paul Wilkins's avatar
Paul Wilkins committed
253

John Koleszar's avatar
John Koleszar committed
254
255
256
      // update the baseline table for the current q
      for (k = 0; k < MBSKIP_CONTEXTS; ++k)
        cpi->base_skip_false_prob[cm->base_qindex][k] =
257
            cm->mbskip_pred_probs[k];
Paul Wilkins's avatar
Paul Wilkins committed
258
    }
John Koleszar's avatar
John Koleszar committed
259
  }
Paul Wilkins's avatar
Paul Wilkins committed
260
}
Paul Wilkins's avatar
Paul Wilkins committed
261

262
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
263
264
265
  static int init_done = 0;

  if (!init_done) {
266
    vp9_initialize_common();
267
    vp9_tokenize_initialize();
268
    vp9_init_quant_tables();
269
    vp9_init_me_luts();
John Koleszar's avatar
John Koleszar committed
270
271
272
273
    init_minq_luts();
    init_base_skip_probs();
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
274
275
276
277
278
}
#ifdef PACKET_TESTING
extern FILE *vpxlogc;
#endif

279
static void setup_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
280
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
Paul Wilkins's avatar
Paul Wilkins committed
281

John Koleszar's avatar
John Koleszar committed
282
  // Set up default state for MB feature flags
283

John Koleszar's avatar
John Koleszar committed
284
  xd->segmentation_enabled = 0;   // Default segmentation disabled
285

John Koleszar's avatar
John Koleszar committed
286
287
  xd->update_mb_segmentation_map = 0;
  xd->update_mb_segmentation_data = 0;
288
289
290
#if CONFIG_IMPLICIT_SEGMENTATION
  xd->allow_implicit_segment_update = 0;
#endif
John Koleszar's avatar
John Koleszar committed
291
  vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs));
Paul Wilkins's avatar
Paul Wilkins committed
292

293
  vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
294

John Koleszar's avatar
John Koleszar committed
295
296
297
298
299
300
  xd->mode_ref_lf_delta_enabled = 0;
  xd->mode_ref_lf_delta_update = 0;
  vpx_memset(xd->ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas));
  vpx_memset(xd->mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas));
  vpx_memset(xd->last_ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas));
  vpx_memset(xd->last_mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas));
John Koleszar's avatar
John Koleszar committed
301

John Koleszar's avatar
John Koleszar committed
302
  set_default_lf_deltas(cpi);
John Koleszar's avatar
John Koleszar committed
303
304
305
}


306
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
307
308
309
  // Delete last frame MV storage buffers
  vpx_free(cpi->lfmv);
  cpi->lfmv = 0;
310

John Koleszar's avatar
John Koleszar committed
311
312
  vpx_free(cpi->lf_ref_frame_sign_bias);
  cpi->lf_ref_frame_sign_bias = 0;
313

John Koleszar's avatar
John Koleszar committed
314
315
  vpx_free(cpi->lf_ref_frame);
  cpi->lf_ref_frame = 0;
John Koleszar's avatar
John Koleszar committed
316

John Koleszar's avatar
John Koleszar committed
317
318
319
320
321
322
323
  // 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
324

John Koleszar's avatar
John Koleszar committed
325
326
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
327

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

John Koleszar's avatar
John Koleszar committed
330
331
332
  vp8_yv12_de_alloc_frame_buffer(&cpi->last_frame_uf);
  vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
  vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
333
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
334

John Koleszar's avatar
John Koleszar committed
335
336
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
337

John Koleszar's avatar
John Koleszar committed
338
339
340
341
342
  // 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;
343

John Koleszar's avatar
John Koleszar committed
344
345
  vpx_free(cpi->mb.pip);
  cpi->mb.pip = 0;
346

John Koleszar's avatar
John Koleszar committed
347
348
  vpx_free(cpi->twopass.total_stats);
  cpi->twopass.total_stats = 0;
349

John Koleszar's avatar
John Koleszar committed
350
351
  vpx_free(cpi->twopass.total_left_stats);
  cpi->twopass.total_left_stats = 0;
352

John Koleszar's avatar
John Koleszar committed
353
354
  vpx_free(cpi->twopass.this_frame_stats);
  cpi->twopass.this_frame_stats = 0;
John Koleszar's avatar
John Koleszar committed
355
356
}

357
358
359
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
360
static int compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
361
362
363
364
365
366
367
  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;
368
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
369
370
371
372
373
374
      break;
  }

  // Convert the q target to an index
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    target_index = i;
375
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
376
377
378
379
      break;
  }

  return target_index - start_index;
380
381
}

382
static void configure_static_seg_features(VP9_COMP *cpi) {
383
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
384
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
385

John Koleszar's avatar
John Koleszar committed
386
387
  int high_q = (int)(cpi->avg_q > 48.0);
  int qi_delta;
388

John Koleszar's avatar
John Koleszar committed
389
390
391
392
393
394
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
    vpx_memset(cpi->segmentation_map, 0, (cm->mb_rows * cm->mb_cols));
    xd->update_mb_segmentation_map = 0;
    xd->update_mb_segmentation_data = 0;
395
396
397
#if CONFIG_IMPLICIT_SEGMENTATION
  xd->allow_implicit_segment_update = 0;
#endif
John Koleszar's avatar
John Koleszar committed
398
    cpi->static_mb_pct = 0;
399

John Koleszar's avatar
John Koleszar committed
400
    // Disable segmentation
401
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
402

John Koleszar's avatar
John Koleszar committed
403
    // Clear down the segment features.
404
    vp9_clearall_segfeatures(xd);
405
406
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
407
408
409
410
    // Clear down the global segmentation map
    vpx_memset(cpi->segmentation_map, 0, (cm->mb_rows * cm->mb_cols));
    xd->update_mb_segmentation_map = 0;
    xd->update_mb_segmentation_data = 0;
411
412
413
#if CONFIG_IMPLICIT_SEGMENTATION
  xd->allow_implicit_segment_update = 0;
#endif
John Koleszar's avatar
John Koleszar committed
414
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
415

John Koleszar's avatar
John Koleszar committed
416
    // Disable segmentation and individual segment features by default
417
    vp9_disable_segmentation((VP9_PTR)cpi);
418
    vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
419

John Koleszar's avatar
John Koleszar committed
420
421
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
422
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
423

John Koleszar's avatar
John Koleszar committed
424
425
426
427
428
    // If segmentation was enabled set those features needed for the
    // arf itself.
    if (xd->segmentation_enabled) {
      xd->update_mb_segmentation_map = 1;
      xd->update_mb_segmentation_data = 1;
Paul Wilkins's avatar
Paul Wilkins committed
429

John Koleszar's avatar
John Koleszar committed
430
      qi_delta = compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
431
432
      vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, (qi_delta - 2));
      vp9_set_segdata(xd, 1, SEG_LVL_ALT_LF, -2);
Paul Wilkins's avatar
Paul Wilkins committed
433

434
435
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
436

John Koleszar's avatar
John Koleszar committed
437
438
      // Where relevant assume segment data is delta data
      xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
439

440
    }
John Koleszar's avatar
John Koleszar committed
441
442
443
444
445
  }
  // All other frames if segmentation has been enabled
  else if (xd->segmentation_enabled) {
    // First normal frame in a valid gf or alt ref group
    if (cpi->common.frames_since_golden == 0) {
Paul Wilkins's avatar
Paul Wilkins committed
446
      // Set up segment features for normal frames in an arf group
John Koleszar's avatar
John Koleszar committed
447
448
449
450
      if (cpi->source_alt_ref_active) {
        xd->update_mb_segmentation_map = 0;
        xd->update_mb_segmentation_data = 1;
        xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
451

John Koleszar's avatar
John Koleszar committed
452
453
        qi_delta = compute_qdelta(cpi, cpi->avg_q,
                                  (cpi->avg_q * 1.125));
454
455
456
        vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
        vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, 0);
        vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
Paul Wilkins's avatar
Paul Wilkins committed
457

458
459
        vp9_set_segdata(xd, 1, SEG_LVL_ALT_LF, -2);
        vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
Paul Wilkins's avatar
Paul Wilkins committed
460

John Koleszar's avatar
John Koleszar committed
461
462
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
463
464
          vp9_set_segref(xd, 1, ALTREF_FRAME);
          vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
Paul Wilkins's avatar
Paul Wilkins committed
465
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
466
467
468
469
470
        }
      }
      // Disable segmentation and clear down features if alt ref
      // is not active for this group
      else {
471
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
472

John Koleszar's avatar
John Koleszar committed
473
474
        vpx_memset(cpi->segmentation_map, 0,
                   (cm->mb_rows * cm->mb_cols));
Paul Wilkins's avatar
Paul Wilkins committed
475

John Koleszar's avatar
John Koleszar committed
476
477
        xd->update_mb_segmentation_map = 0;
        xd->update_mb_segmentation_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
478

479
        vp9_clearall_segfeatures(xd);
John Koleszar's avatar
John Koleszar committed
480
481
482
483
      }
    }

    // Special case where we are coding over the top of a previous
Paul Wilkins's avatar
Paul Wilkins committed
484
    // alt ref frame.
John Koleszar's avatar
John Koleszar committed
485
486
    // Segment coding disabled for compred testing
    else if (cpi->is_src_frame_alt_ref) {
Paul Wilkins's avatar
Paul Wilkins committed
487
      // Enable ref frame features for segment 0 as well
488
489
      vp9_enable_segfeature(xd, 0, SEG_LVL_REF_FRAME);
      vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
John Koleszar's avatar
John Koleszar committed
490

Paul Wilkins's avatar
Paul Wilkins committed
491
      // All mbs should use ALTREF_FRAME
492
493
494
495
      vp9_clear_segref(xd, 0);
      vp9_set_segref(xd, 0, ALTREF_FRAME);
      vp9_clear_segref(xd, 1);
      vp9_set_segref(xd, 1, ALTREF_FRAME);
John Koleszar's avatar
John Koleszar committed
496

Paul Wilkins's avatar
Paul Wilkins committed
497
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
498
      if (high_q) {
Paul Wilkins's avatar
Paul Wilkins committed
499
500
          vp9_enable_segfeature(xd, 0, SEG_LVL_SKIP);
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
501
502
503
504
505
506
507
508
509
510
511
      }
      // Enable data udpate
      xd->update_mb_segmentation_data = 1;
    }
    // All other frames.
    else {
      // No updates.. leave things as they are.
      xd->update_mb_segmentation_map = 0;
      xd->update_mb_segmentation_data = 0;
    }
  }
512
513
}

514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
#if CONFIG_IMPLICIT_SEGMENTATION
static void configure_implicit_segmentation(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
  int i;
  int qi_delta;
  double q_target = cpi->active_worst_quality * 1.10;

  // Set the flags to allow implicit segment update but disallow explicit update
  xd->segmentation_enabled = 1;
  xd->allow_implicit_segment_update = 1;
  xd->update_mb_segmentation_map = 0;

  // For key frames clear down the segment map to a default state.
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
    vpx_memset(cpi->segmentation_map, 0, (cm->mb_rows * cm->mb_cols));

    // Clear down the segment features.
    vp9_clearall_segfeatures(xd);

    xd->update_mb_segmentation_data = 1;

    // Enable use of q deltas on segments
    for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
      qi_delta = compute_qdelta(cpi, cpi->active_worst_quality, q_target);
      vp9_set_segdata(xd, i, SEG_LVL_ALT_Q, qi_delta);
      q_target *= 0.95;
      vp9_enable_segfeature(xd, i, SEG_LVL_ALT_Q);
    }

    // Where relevant assume segment data is delta data
    xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
  } else {
    xd->update_mb_segmentation_data = 0;
  }
}
#endif

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

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

John Koleszar's avatar
John Koleszar committed
562
563
  for (row = 0; row < cpi->common.mb_rows; row++) {
    for (col = 0; col < cpi->common.mb_cols; col++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
564
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
565
      map_index++;
566
567
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
568
569
  }
  fprintf(statsfile, "\n");
570

John Koleszar's avatar
John Koleszar committed
571
  fclose(statsfile);
572
573
}

574
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
575
576
577
578
579
580
581
582
  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;

  for (row = 0; row < cm->mb_rows; row++) {
    mi = mi_ptr;
    cache = cache_ptr;
583
    for (col = 0; col < cm->mb_cols; col++, mi++, cache++)
Ronald S. Bultje's avatar
Ronald S. Bultje committed
584
585
586
      cache[0] = mi->mbmi.segment_id;
    mi_ptr += cm->mode_info_stride;
    cache_ptr += cm->mb_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
587
588
589
  }
}

590
static void set_default_lf_deltas(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
591
592
  cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
  cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
John Koleszar's avatar
John Koleszar committed
593

John Koleszar's avatar
John Koleszar committed
594
595
  vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
  vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
John Koleszar's avatar
John Koleszar committed
596

John Koleszar's avatar
John Koleszar committed
597
598
599
600
601
  // Test of ref frame deltas
  cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
  cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
  cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
  cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
John Koleszar's avatar
John Koleszar committed
602

Yaowu Xu's avatar
Yaowu Xu committed
603
  cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               // I4X4_PRED
John Koleszar's avatar
John Koleszar committed
604
605
606
  cpi->mb.e_mbd.mode_lf_deltas[1] = -2;              // Zero
  cpi->mb.e_mbd.mode_lf_deltas[2] = 2;               // New mv
  cpi->mb.e_mbd.mode_lf_deltas[3] = 4;               // Split mv
John Koleszar's avatar
John Koleszar committed
607
608
}

609
610
611
612
613
614
static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode, int speed) {
  SPEED_FEATURES *sf = &cpi->sf;
  int speed_multiplier = speed + 1;
  int i;

  // Set baseline threshold values
615
616
  for (i = 0; i < MAX_MODES; ++i)
    sf->thresh_mult[i] = mode == 0 ? -500 : 0;
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633

  sf->thresh_mult[THR_ZEROMV   ] = 0;
  sf->thresh_mult[THR_ZEROG    ] = 0;
  sf->thresh_mult[THR_ZEROA    ] = 0;

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

  sf->thresh_mult[THR_NEARMV   ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEARG    ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEARA    ] += speed_multiplier * 1000;

  sf->thresh_mult[THR_DC       ] = 0;
  sf->thresh_mult[THR_TM       ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_V_PRED   ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_H_PRED   ] += speed_multiplier * 1000;
634
635
636
637
638
639
  sf->thresh_mult[THR_D45_PRED ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_D135_PRED] += speed_multiplier * 1500;
  sf->thresh_mult[THR_D117_PRED] += speed_multiplier * 1500;
  sf->thresh_mult[THR_D153_PRED] += speed_multiplier * 1500;
  sf->thresh_mult[THR_D27_PRED ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_D63_PRED ] += speed_multiplier * 1500;
640
641
642
643
644
645
646
647
648
649
650
651

  sf->thresh_mult[THR_B_PRED   ] += speed_multiplier * 2500;
  sf->thresh_mult[THR_I8X8_PRED] += speed_multiplier * 2500;

  sf->thresh_mult[THR_NEWMV    ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEWG     ] += speed_multiplier * 1000;
  sf->thresh_mult[THR_NEWA     ] += speed_multiplier * 1000;

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

652
653
654
  sf->thresh_mult[THR_COMP_ZEROLG   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_ZEROLA   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_ZEROGA   ] += speed_multiplier * 1500;
655

656
657
658
  sf->thresh_mult[THR_COMP_NEARESTLG] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARESTLA] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARESTGA] += speed_multiplier * 1500;
659

660
661
662
  sf->thresh_mult[THR_COMP_NEARLG   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARLA   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARGA   ] += speed_multiplier * 1500;
663
664
665
666
667
668
669
670
671
672

  sf->thresh_mult[THR_COMP_NEWLG    ] += speed_multiplier * 2000;
  sf->thresh_mult[THR_COMP_NEWLA    ] += speed_multiplier * 2000;
  sf->thresh_mult[THR_COMP_NEWGA    ] += speed_multiplier * 2000;

  sf->thresh_mult[THR_COMP_SPLITLA  ] += speed_multiplier * 4500;
  sf->thresh_mult[THR_COMP_SPLITGA  ] += speed_multiplier * 4500;
  sf->thresh_mult[THR_COMP_SPLITLG  ] += speed_multiplier * 4500;

#if CONFIG_COMP_INTERINTRA_PRED
673
674
675
  sf->thresh_mult[THR_COMP_INTERINTRA_ZEROL   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_ZEROG   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_ZEROA   ] += speed_multiplier * 1500;
676

677
678
679
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTL] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTG] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTA] += speed_multiplier * 1500;
680

681
682
683
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARL   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARG   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEARA   ] += speed_multiplier * 1500;
684
685
686
687
688

  sf->thresh_mult[THR_COMP_INTERINTRA_NEWL    ] += speed_multiplier * 2000;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEWG    ] += speed_multiplier * 2000;
  sf->thresh_mult[THR_COMP_INTERINTRA_NEWA    ] += speed_multiplier * 2000;
#endif
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754

  /* 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 CONFIG_COMP_INTERINTRA_PRED
    sf->thresh_mult[THR_COMP_INTERINTRA_ZEROL   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTL] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARL   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEWL    ] = INT_MAX;
#endif
  }
  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 CONFIG_COMP_INTERINTRA_PRED
    sf->thresh_mult[THR_COMP_INTERINTRA_ZEROG   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTG] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARG   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEWG    ] = INT_MAX;
#endif
  }
  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 CONFIG_COMP_INTERINTRA_PRED
    sf->thresh_mult[THR_COMP_INTERINTRA_ZEROA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARESTA] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEARA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_INTERINTRA_NEWA    ] = INT_MAX;
#endif
  }

  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_GOLD_FLAG)) !=
      (VP9_LAST_FLAG | VP9_GOLD_FLAG)) {
    sf->thresh_mult[THR_COMP_ZEROLG   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARESTLG] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARLG   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEWLG    ] = INT_MAX;
    sf->thresh_mult[THR_COMP_SPLITLG  ] = 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;
  }
755
756
}

757
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
758
  SPEED_FEATURES *sf = &cpi->sf;
759
760
  int mode = cpi->compressor_speed;
  int speed = cpi->Speed;
John Koleszar's avatar
John Koleszar committed
761
762
763
  int i;

  // Only modes 0 and 1 supported for now in experimental code basae
764
765
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781

  // 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;
Yaowu Xu's avatar
Yaowu Xu committed
782
  sf->no_skip_block4x4_search = 1;
783
  sf->optimize_coefficients = !cpi->oxcf.lossless;
John Koleszar's avatar
John Koleszar committed
784
785
  sf->first_step = 0;
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
786
787
788
#if CONFIG_MULTIPLE_ARF
  // Switch segmentation off.
  sf->static_segmentation = 0;
789
790
791
#else
#if CONFIG_IMPLICIT_SEGMENTATION
  sf->static_segmentation = 0;
792
#else
793
  sf->static_segmentation = 1;
794
#endif
795
#endif
796
797
  sf->splitmode_breakout = 0;
  sf->mb16_breakout = 0;
John Koleszar's avatar
John Koleszar committed
798

799
  switch (mode) {
John Koleszar's avatar
John Koleszar committed
800
    case 0: // best quality mode
John Koleszar's avatar
John Koleszar committed
801
802
803
      sf->search_best_filter = SEARCH_BEST_FILTER;
      break;

804
    case 1:
805
806
807
808
#if CONFIG_MULTIPLE_ARF
      // Switch segmentation off.
      sf->static_segmentation = 0;
#else
809
810
811
812
813
#if CONFIG_IMPLICIT_SEGMENTATION
  sf->static_segmentation = 0;
#else
  sf->static_segmentation = 1;
#endif
814
#endif
815
816
817
      sf->splitmode_breakout = 1;
      sf->mb16_breakout = 0;

818
      if (speed > 0) {
John Koleszar's avatar
John Koleszar committed
819
820
821
        /* Disable coefficient optimization above speed 0 */
        sf->optimize_coefficients = 0;
        sf->no_skip_block4x4_search = 0;
822

John Koleszar's avatar
John Koleszar committed
823
        sf->first_step = 1;
824

John Koleszar's avatar
John Koleszar committed
825
826
827
        cpi->mode_check_freq[THR_SPLITG] = 2;
        cpi->mode_check_freq[THR_SPLITA] = 2;
        cpi->mode_check_freq[THR_SPLITMV] = 0;
828

John Koleszar's avatar
John Koleszar committed
829
830
831
832
        cpi->mode_check_freq[THR_COMP_SPLITGA] = 2;
        cpi->mode_check_freq[THR_COMP_SPLITLG] = 2;
        cpi->mode_check_freq[THR_COMP_SPLITLA] = 0;
      }
John Koleszar's avatar
John Koleszar committed
833

834
      if (speed > 1) {
John Koleszar's avatar
John Koleszar committed
835
836
837
        cpi->mode_check_freq[THR_SPLITG] = 4;
        cpi->mode_check_freq[THR_SPLITA] = 4;
        cpi->mode_check_freq[THR_SPLITMV] = 2;
John Koleszar's avatar
John Koleszar committed
838

John Koleszar's avatar
John Koleszar committed
839
840
841
842
843
        cpi->mode_check_freq[THR_COMP_SPLITGA] = 4;
        cpi->mode_check_freq[THR_COMP_SPLITLG] = 4;
        cpi->mode_check_freq[THR_COMP_SPLITLA] = 2;
      }

844
      if (speed > 2) {
John Koleszar's avatar
John Koleszar committed
845
846
847
848
849
850
851
852
853
854
855
856
        cpi->mode_check_freq[THR_SPLITG] = 15;
        cpi->mode_check_freq[THR_SPLITA] = 15;
        cpi->mode_check_freq[THR_SPLITMV] = 7;

        cpi->mode_check_freq[THR_COMP_SPLITGA] = 15;
        cpi->mode_check_freq[THR_COMP_SPLITLG] = 15;
        cpi->mode_check_freq[THR_COMP_SPLITLA] = 7;

        // Only do recode loop on key frames, golden frames and
        // alt ref frames
        sf->recode_loop = 2;
      }
John Koleszar's avatar
John Koleszar committed
857

John Koleszar's avatar
John Koleszar committed
858
      break;
John Koleszar's avatar
John Koleszar committed
859

John Koleszar's avatar
John Koleszar committed
860
  }; /* switch */
861

862
863
  // Set rd thresholds based on mode and speed setting
  set_rd_speed_thresholds(cpi, mode, speed);
John Koleszar's avatar
John Koleszar committed
864
865
866
867
868
869

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

Yaowu Xu's avatar
Yaowu Xu committed
871
872
873
874
  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
875
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
Yaowu Xu's avatar
Yaowu Xu committed
876
877
    cpi->mb.fwd_txm8x4    = vp9_short_walsh8x4;
    cpi->mb.fwd_txm4x4    = vp9_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
878
  }
John Koleszar's avatar
John Koleszar committed
879

880
881
882
883
  cpi->mb.quantize_b_4x4      = vp9_regular_quantize_b_4x4;
  cpi->mb.quantize_b_4x4_pair = vp9_regular_quantize_b_4x4_pair;
  cpi->mb.quantize_b_8x8      = vp9_regular_quantize_b_8x8;
  cpi->mb.quantize_b_16x16    = vp9_regular_quantize_b_16x16;
Paul Wilkins's avatar
Paul Wilkins committed
884

885
  vp9_init_quantizer(cpi);
John Koleszar's avatar
John Koleszar committed
886

John Koleszar's avatar
John Koleszar committed
887
  if (cpi->sf.iterative_sub_pixel == 1) {
888
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step_iteratively;
John Koleszar's avatar
John Koleszar committed
889
  } else if (cpi->sf.quarter_pixel_search) {
890
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step;
John Koleszar's avatar
John Koleszar committed
891
  } else if (cpi->sf.half_pixel_search) {
892
    cpi->find_fractional_mv_step = vp9_find_best_half_pixel_step;
John Koleszar's avatar
John Koleszar committed
893
  }
John Koleszar's avatar
John Koleszar committed
894

895
  cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1;
John Koleszar's avatar
John Koleszar committed
896
897

#ifdef SPEEDSTATS
John Koleszar's avatar
John Koleszar committed
898
  frames_at_speed[cpi->Speed]++;
John Koleszar's avatar
John Koleszar committed
899
900
#endif
}
901

902
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
903
  cpi->lookahead = vp9_lookahead_init(cpi->oxcf.width, cpi->oxcf.height,
John Koleszar's avatar
John Koleszar committed
904
905
906
907
                                      cpi->oxcf.lag_in_frames);
  if (!cpi->lookahead)
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate lag buffers");
John Koleszar's avatar
John Koleszar committed
908

John Koleszar's avatar
John Koleszar committed
909
  if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
910
                                  cpi->oxcf.width, cpi->oxcf.height,
John Koleszar's avatar
John Koleszar committed
911
                                  VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
912
913
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate altref buffer");
John Koleszar's avatar
John Koleszar committed
914
}
915

916
static int alloc_partition_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
917
  vpx_free(cpi->mb.pip);
918

John Koleszar's avatar
John Koleszar committed
919
920
921
922
923
  cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
                           (cpi->common.mb_rows + 1),
                           sizeof(PARTITION_INFO));
  if (!cpi->mb.pip)
    return 1;
924

John Koleszar's avatar
John Koleszar committed
925
  cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
926

John Koleszar's avatar
John Koleszar committed
927
  return 0;
928
929
}

930
931
void vp9_alloc_compressor_data(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
932

933
  if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
John Koleszar's avatar
John Koleszar committed
934
935
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffers");
John Koleszar's avatar
John Koleszar committed
936

937
  if (alloc_partition_data(cpi))
John Koleszar's avatar
John Koleszar committed
938
939
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate partition data");
940

John Koleszar's avatar
John Koleszar committed
941
  if (vp8_yv12_alloc_frame_buffer(&cpi->last_frame_uf,
942
                                  cm->width, cm->height, VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
943
944
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate last frame buffer");
John Koleszar's avatar
John Koleszar committed
945

John Koleszar's avatar
John Koleszar committed
946
  if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
947
                                  cm->width, cm->height, VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
948
949
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate scaled source buffer");
John Koleszar's avatar
John Koleszar committed
950

John Koleszar's avatar
John Koleszar committed
951
  vpx_free(cpi->tok);
John Koleszar's avatar
John Koleszar committed
952

John Koleszar's avatar
John Koleszar committed
953
  {
954
    unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
John Koleszar's avatar
John Koleszar committed
955

John Koleszar's avatar
John Koleszar committed
956
957
    CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
  }
John Koleszar's avatar
John Koleszar committed
958

John Koleszar's avatar
John Koleszar committed
959
960
961
962
  // Data used for real time vc mode to see if gf needs refreshing
  cpi->inter_zz_count = 0;
  cpi->gf_bad_count = 0;
  cpi->gf_update_recommended = 0;
963

John Koleszar's avatar
John Koleszar committed
964
965
966
967
  vpx_free(cpi->mb_activity_map);
  CHECK_MEM_ERROR(cpi->mb_activity_map,
                  vpx_calloc(sizeof(unsigned int),
                             cm->mb_rows * cm->mb_cols));
968

John Koleszar's avatar
John Koleszar committed
969
970
971
972
  vpx_free(cpi->mb_norm_activity_map);
  CHECK_MEM_ERROR(cpi->mb_norm_activity_map,
                  vpx_calloc(sizeof(unsigned int),
                             cm->mb_rows * cm->mb_cols));
973