vp9_onyx_if.c 131 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
123
#if CONFIG_CODE_NONZEROCOUNT
#ifdef NZC_STATS
extern void init_nzcstats();
extern void print_nzcstats();
#endif
#endif

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
159
static int calculate_minq_index(double maxq,
                                double x3, double x2, double x, double c) {
John Koleszar's avatar
John Koleszar committed
160
161
162
163
164
165
166
167
168
169
170
171
  int i;
  double minqtarget;

  minqtarget = ((x3 * maxq * maxq * maxq) +
                (x2 * maxq * maxq) +
                (x * maxq) +
                c);

  if (minqtarget > maxq)
    minqtarget = maxq;

  for (i = 0; i < QINDEX_RANGE; i++) {
172
    if (minqtarget <= vp9_convert_qindex_to_q(i))
John Koleszar's avatar
John Koleszar committed
173
174
175
      return i;
  }
  return QINDEX_RANGE - 1;
176
}
177

178
static void init_minq_luts(void) {
John Koleszar's avatar
John Koleszar committed
179
180
181
182
  int i;
  double maxq;

  for (i = 0; i < QINDEX_RANGE; i++) {
183
    maxq = vp9_convert_qindex_to_q(i);
John Koleszar's avatar
John Koleszar committed
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.0000003,
                                                 -0.000015,
                                                 0.074,
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000004,
                                                  -0.000125,
                                                  0.14,
                                                  0.0);
    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);

  }
213
}
214

215
216
217
218
static void set_mvcost(MACROBLOCK *mb) {
  if (mb->e_mbd.allow_high_precision_mv) {
    mb->mvcost = mb->nmvcost_hp;
    mb->mvsadcost = mb->nmvsadcost_hp;
219

220
221
222
223
224
  } else {
    mb->mvcost = mb->nmvcost;
    mb->mvsadcost = mb->nmvsadcost;
  }
}
225
static void init_base_skip_probs(void) {
John Koleszar's avatar
John Koleszar committed
226
227
  int i;
  double q;
228
  int t;
Paul Wilkins's avatar
Paul Wilkins committed
229

John Koleszar's avatar
John Koleszar committed
230
  for (i = 0; i < QINDEX_RANGE; i++) {
231
    q = vp9_convert_qindex_to_q(i);
Paul Wilkins's avatar
Paul Wilkins committed
232

John Koleszar's avatar
John Koleszar committed
233
234
235
    // Exponential decay caluclation of baseline skip prob with clamping
    // Based on crude best fit of old table.
    t = (int)(564.25 * pow(2.71828, (-0.012 * q)));
236

237
238
239
    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
240
  }
Paul Wilkins's avatar
Paul Wilkins committed
241
}
242

243
244
static void update_base_skip_probs(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
Paul Wilkins's avatar
Paul Wilkins committed
245

John Koleszar's avatar
John Koleszar committed
246
  if (cm->frame_type != KEY_FRAME) {
247
    vp9_update_skip_probs(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
248

249
    if (cpi->refresh_alt_ref_frame) {
John Koleszar's avatar
John Koleszar committed
250
251
252
253
      int k;
      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;
254
    } else if (cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
255
256
257
258
259
260
261
262
263
      int k;
      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 {
      int k;
      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
264

John Koleszar's avatar
John Koleszar committed
265
266
267
268
      // update the baseline table for the current q
      for (k = 0; k < MBSKIP_CONTEXTS; ++k)
        cpi->base_skip_false_prob[cm->base_qindex][k] =
          cm->mbskip_pred_probs[k];
Paul Wilkins's avatar
Paul Wilkins committed
269
    }
John Koleszar's avatar
John Koleszar committed
270
  }
Paul Wilkins's avatar
Paul Wilkins committed
271
272

}
Paul Wilkins's avatar
Paul Wilkins committed
273

274
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
275
276
277
  static int init_done = 0;

  if (!init_done) {
278
    vp9_initialize_common();
279
    vp9_tokenize_initialize();
280
    vp9_init_quant_tables();
281
    vp9_init_me_luts();
John Koleszar's avatar
John Koleszar committed
282
283
284
285
    init_minq_luts();
    init_base_skip_probs();
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
286
287
288
289
290
}
#ifdef PACKET_TESTING
extern FILE *vpxlogc;
#endif

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

John Koleszar's avatar
John Koleszar committed
294
  // Set up default state for MB feature flags
295

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

John Koleszar's avatar
John Koleszar committed
298
299
300
  xd->update_mb_segmentation_map = 0;
  xd->update_mb_segmentation_data = 0;
  vpx_memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs));
Paul Wilkins's avatar
Paul Wilkins committed
301

302
  vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
303

John Koleszar's avatar
John Koleszar committed
304
305
306
307
308
309
  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
310

John Koleszar's avatar
John Koleszar committed
311
  set_default_lf_deltas(cpi);
John Koleszar's avatar
John Koleszar committed
312
313
314
315

}


316
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
317
318
  vpx_free(cpi->tplist);
  cpi->tplist = NULL;
319

John Koleszar's avatar
John Koleszar committed
320
321
322
  // Delete last frame MV storage buffers
  vpx_free(cpi->lfmv);
  cpi->lfmv = 0;
323

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

John Koleszar's avatar
John Koleszar committed
327
328
  vpx_free(cpi->lf_ref_frame);
  cpi->lf_ref_frame = 0;
John Koleszar's avatar
John Koleszar committed
329

John Koleszar's avatar
John Koleszar committed
330
331
332
333
334
335
336
  // 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
337

John Koleszar's avatar
John Koleszar committed
338
339
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
340

341
  vp9_de_alloc_frame_buffers(&cpi->common);
John Koleszar's avatar
John Koleszar committed
342

John Koleszar's avatar
John Koleszar committed
343
344
  vp8_yv12_de_alloc_frame_buffer(&cpi->last_frame_uf);
  vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
345
#if VP9_TEMPORAL_ALT_REF
John Koleszar's avatar
John Koleszar committed
346
  vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
John Koleszar's avatar
John Koleszar committed
347
#endif
348
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
349

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

John Koleszar's avatar
John Koleszar committed
353
354
355
  // Structure used to monitor GF usage
  vpx_free(cpi->gf_active_flags);
  cpi->gf_active_flags = 0;
356

John Koleszar's avatar
John Koleszar committed
357
358
359
360
361
  // 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;
362

John Koleszar's avatar
John Koleszar committed
363
364
  vpx_free(cpi->mb.pip);
  cpi->mb.pip = 0;
365

John Koleszar's avatar
John Koleszar committed
366
367
  vpx_free(cpi->twopass.total_stats);
  cpi->twopass.total_stats = 0;
368

John Koleszar's avatar
John Koleszar committed
369
370
  vpx_free(cpi->twopass.total_left_stats);
  cpi->twopass.total_left_stats = 0;
371

John Koleszar's avatar
John Koleszar committed
372
373
  vpx_free(cpi->twopass.this_frame_stats);
  cpi->twopass.this_frame_stats = 0;
John Koleszar's avatar
John Koleszar committed
374
375
}

376
377
378
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
379
static int compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
380
381
382
383
384
385
386
  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;
387
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
388
389
390
391
392
393
      break;
  }

  // Convert the q target to an index
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    target_index = i;
394
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
395
396
397
398
      break;
  }

  return target_index - start_index;
399
400
}

401
static void configure_static_seg_features(VP9_COMP *cpi) {
402
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
403
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
404

John Koleszar's avatar
John Koleszar committed
405
406
  int high_q = (int)(cpi->avg_q > 48.0);
  int qi_delta;
407

John Koleszar's avatar
John Koleszar committed
408
409
410
411
412
413
414
  // 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;
    cpi->static_mb_pct = 0;
415

John Koleszar's avatar
John Koleszar committed
416
    // Disable segmentation
417
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
418

John Koleszar's avatar
John Koleszar committed
419
    // Clear down the segment features.
420
    vp9_clearall_segfeatures(xd);
421
422
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
423
424
425
426
427
    // 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;
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
428

John Koleszar's avatar
John Koleszar committed
429
    // Disable segmentation and individual segment features by default
430
    vp9_disable_segmentation((VP9_PTR)cpi);
431
    vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
432

John Koleszar's avatar
John Koleszar committed
433
434
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
435
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
436

John Koleszar's avatar
John Koleszar committed
437
438
439
440
441
    // 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
442

John Koleszar's avatar
John Koleszar committed
443
      qi_delta = compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
444
445
      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
446

447
448
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
449

John Koleszar's avatar
John Koleszar committed
450
451
      // Where relevant assume segment data is delta data
      xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
452

453
    }
John Koleszar's avatar
John Koleszar committed
454
455
456
457
458
  }
  // 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
459
      // Set up segment features for normal frames in an arf group
John Koleszar's avatar
John Koleszar committed
460
461
462
463
      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
464

John Koleszar's avatar
John Koleszar committed
465
466
        qi_delta = compute_qdelta(cpi, cpi->avg_q,
                                  (cpi->avg_q * 1.125));
467
468
469
        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
470

471
472
        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
473

John Koleszar's avatar
John Koleszar committed
474
475
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
476
477
          vp9_set_segref(xd, 1, ALTREF_FRAME);
          vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
Paul Wilkins's avatar
Paul Wilkins committed
478
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
479
480
481
482
483
        }
      }
      // Disable segmentation and clear down features if alt ref
      // is not active for this group
      else {
484
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
485

John Koleszar's avatar
John Koleszar committed
486
487
        vpx_memset(cpi->segmentation_map, 0,
                   (cm->mb_rows * cm->mb_cols));
Paul Wilkins's avatar
Paul Wilkins committed
488

John Koleszar's avatar
John Koleszar committed
489
490
        xd->update_mb_segmentation_map = 0;
        xd->update_mb_segmentation_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
491

492
        vp9_clearall_segfeatures(xd);
John Koleszar's avatar
John Koleszar committed
493
494
495
496
      }
    }

    // Special case where we are coding over the top of a previous
Paul Wilkins's avatar
Paul Wilkins committed
497
    // alt ref frame.
John Koleszar's avatar
John Koleszar committed
498
499
    // Segment coding disabled for compred testing
    else if (cpi->is_src_frame_alt_ref) {
Paul Wilkins's avatar
Paul Wilkins committed
500
      // Enable ref frame features for segment 0 as well
501
502
      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
503

Paul Wilkins's avatar
Paul Wilkins committed
504
      // All mbs should use ALTREF_FRAME
505
506
507
508
      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
509

Paul Wilkins's avatar
Paul Wilkins committed
510
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
511
      if (high_q) {
Paul Wilkins's avatar
Paul Wilkins committed
512
513
          vp9_enable_segfeature(xd, 0, SEG_LVL_SKIP);
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
514
515
516
517
518
519
520
521
522
523
524
      }
      // 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;
    }
  }
525
526
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
532
  int row, col;
  int map_index = 0;
  FILE *statsfile;
533

John Koleszar's avatar
John Koleszar committed
534
  statsfile = fopen("segmap.stt", "a");
535

John Koleszar's avatar
John Koleszar committed
536
537
  fprintf(statsfile, "%10d\n",
          cm->current_video_frame);
538

John Koleszar's avatar
John Koleszar committed
539
540
541
542
543
  for (row = 0; row < cpi->common.mb_rows; row++) {
    for (col = 0; col < cpi->common.mb_cols; col++) {
      fprintf(statsfile, "%10d",
              cpi->segmentation_map[map_index]);
      map_index++;
544
545
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
546
547
  }
  fprintf(statsfile, "\n");
548

John Koleszar's avatar
John Koleszar committed
549
  fclose(statsfile);
550
551
}

552
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
553
554
555
556
557
558
559
560
561
562
  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;
    for (col = 0; col < cm->mb_cols; col++, mi++, cache++) {
      cache[0] = mi->mbmi.segment_id;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
563
    }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
564
565
    mi_ptr += cm->mode_info_stride;
    cache_ptr += cm->mb_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
566
567
568
  }
}

569
static void set_default_lf_deltas(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
570
571
  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
572

John Koleszar's avatar
John Koleszar committed
573
574
  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
575

John Koleszar's avatar
John Koleszar committed
576
577
578
579
580
  // 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
581

John Koleszar's avatar
John Koleszar committed
582
583
584
585
  cpi->mb.e_mbd.mode_lf_deltas[0] = 4;               // BPRED
  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
586
587
}

588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
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
  for (i = 0; i < MAX_MODES; ++i) {
    sf->thresh_mult[i] = (mode == 0) ? -500 : 0;
  }

  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;
614
615
616
617
618
619
  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;
620
621
622
623
624
625
626
627
628
629
630
631

  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;

632
633
634
  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;
635

636
637
638
  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;
639

640
641
642
  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;
643
644
645
646
647
648
649
650
651
652

  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
653
654
655
  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;
656

657
658
659
  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;
660

661
662
663
  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;
664
665
666
667
668

  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
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
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

  /* 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;
  }
735
736
}

737
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
738
  SPEED_FEATURES *sf = &cpi->sf;
739
740
  int mode = cpi->compressor_speed;
  int speed = cpi->Speed;
John Koleszar's avatar
John Koleszar committed
741
742
743
  int i;

  // Only modes 0 and 1 supported for now in experimental code basae
744
745
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762

  // 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->improved_dct = 1;
  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
763
  sf->no_skip_block4x4_search = 1;
Yaowu Xu's avatar
Yaowu Xu committed
764
765
  if (cpi->oxcf.lossless)
    sf->optimize_coefficients = 0;
Yaowu Xu's avatar
Yaowu Xu committed
766
767
768
  else
    sf->optimize_coefficients = 1;

John Koleszar's avatar
John Koleszar committed
769
770
  sf->first_step = 0;
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
771
  sf->static_segmentation = 1;
772
773
  sf->splitmode_breakout = 0;
  sf->mb16_breakout = 0;
John Koleszar's avatar
John Koleszar committed
774

775
  switch (mode) {
John Koleszar's avatar
John Koleszar committed
776
    case 0: // best quality mode
John Koleszar's avatar
John Koleszar committed
777
778
779
      sf->search_best_filter = SEARCH_BEST_FILTER;
      break;

780
    case 1:
781
      sf->static_segmentation = 1;
782
783
784
      sf->splitmode_breakout = 1;
      sf->mb16_breakout = 0;

785
      if (speed > 0) {
John Koleszar's avatar
John Koleszar committed
786
787
788
        /* Disable coefficient optimization above speed 0 */
        sf->optimize_coefficients = 0;
        sf->no_skip_block4x4_search = 0;
789

John Koleszar's avatar
John Koleszar committed
790
        sf->first_step = 1;
791

John Koleszar's avatar
John Koleszar committed
792
793
794
        cpi->mode_check_freq[THR_SPLITG] = 2;
        cpi->mode_check_freq[THR_SPLITA] = 2;
        cpi->mode_check_freq[THR_SPLITMV] = 0;
795

John Koleszar's avatar
John Koleszar committed
796
797
798
799
        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
800

801
      if (speed > 1) {
John Koleszar's avatar
John Koleszar committed
802
803
804
        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
805

John Koleszar's avatar
John Koleszar committed
806
807
808
809
810
        cpi->mode_check_freq[THR_COMP_SPLITGA] = 4;
        cpi->mode_check_freq[THR_COMP_SPLITLG] = 4;
        cpi->mode_check_freq[THR_COMP_SPLITLA] = 2;
      }

811
      if (speed > 2) {
John Koleszar's avatar
John Koleszar committed
812
813
814
815
816
817
818
819
820
        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;

        sf->improved_dct = 0;
821

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

John Koleszar's avatar
John Koleszar committed
827
      break;
John Koleszar's avatar
John Koleszar committed
828

John Koleszar's avatar
John Koleszar committed
829
  }; /* switch */
830

831
832
  // Set rd thresholds based on mode and speed setting
  set_rd_speed_thresholds(cpi, mode, speed);
John Koleszar's avatar
John Koleszar committed
833
834
835
836
837
838
839

  // 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;
    sf->improved_dct = 0;
  }
840

Yaowu Xu's avatar
Yaowu Xu committed
841
842
843
844
  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
845
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
Yaowu Xu's avatar
Yaowu Xu committed
846
847
    cpi->mb.fwd_txm8x4    = vp9_short_walsh8x4;
    cpi->mb.fwd_txm4x4    = vp9_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
848
  }
John Koleszar's avatar
John Koleszar committed
849

850
851
852
853
  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
854

855
  vp9_init_quantizer(cpi);
John Koleszar's avatar
John Koleszar committed
856

John Koleszar's avatar
John Koleszar committed
857
  if (cpi->sf.iterative_sub_pixel == 1) {
858
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step_iteratively;
John Koleszar's avatar
John Koleszar committed
859
  } else if (cpi->sf.quarter_pixel_search) {
860
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step;
John Koleszar's avatar
John Koleszar committed
861
  } else if (cpi->sf.half_pixel_search) {
862
    cpi->find_fractional_mv_step = vp9_find_best_half_pixel_step;
John Koleszar's avatar
John Koleszar committed
863
  }
John Koleszar's avatar
John Koleszar committed
864

John Koleszar's avatar
John Koleszar committed
865
866
867
868
  if (cpi->sf.optimize_coefficients == 1 && cpi->pass != 1)
    cpi->mb.optimize = 1;
  else
    cpi->mb.optimize = 0;
John Koleszar's avatar
John Koleszar committed
869
870

#ifdef SPEEDSTATS
John Koleszar's avatar
John Koleszar committed
871
  frames_at_speed[cpi->Speed]++;
John Koleszar's avatar
John Koleszar committed
872
873
#endif
}
874

875
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
876
  cpi->lookahead = vp9_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
John Koleszar's avatar
John Koleszar committed
877
878
879
880
                                      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
881

882
#if VP9_TEMPORAL_ALT_REF
John Koleszar's avatar
John Koleszar committed
883

John Koleszar's avatar
John Koleszar committed
884
  if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer,
John Koleszar's avatar
John Koleszar committed
885
886
                                  cpi->oxcf.Width, cpi->oxcf.Height,
                                  VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
887
888
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate altref buffer");
John Koleszar's avatar
John Koleszar committed
889
890
891

#endif
}
892

893
static int alloc_partition_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
894
  vpx_free(cpi->mb.pip);
895

John Koleszar's avatar
John Koleszar committed
896
897
898
899
900
  cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
                           (cpi->common.mb_rows + 1),
                           sizeof(PARTITION_INFO));
  if (!cpi->mb.pip)
    return 1;
901

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

John Koleszar's avatar
John Koleszar committed
904
  return 0;
905
906
}

907
908
void vp9_alloc_compressor_data(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
909

John Koleszar's avatar
John Koleszar committed
910
  if (vp9_alloc_frame_buffers(cm, cm->Width, cm->Height))
John Koleszar's avatar
John Koleszar committed
911
912
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffers");
John Koleszar's avatar
John Koleszar committed
913

914
  if (alloc_partition_data(cpi))
John Koleszar's avatar
John Koleszar committed
915
916
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate partition data");
917

John Koleszar's avatar
John Koleszar committed
918
  if (vp8_yv12_alloc_frame_buffer(&cpi->last_frame_uf,
John Koleszar's avatar
John Koleszar committed
919
                                  cm->Width, cm->Height, VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
920
921
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate last frame buffer");
John Koleszar's avatar
John Koleszar committed
922

John Koleszar's avatar
John Koleszar committed
923
  if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source,
John Koleszar's avatar
John Koleszar committed
924
                                  cm->Width, cm->Height, VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
925
926
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate scaled source buffer");
John Koleszar's avatar
John Koleszar committed
927

John Koleszar's avatar
John Koleszar committed
928
  vpx_free(cpi->tok);
John Koleszar's avatar
John Koleszar committed
929

John Koleszar's avatar
John Koleszar committed
930
  {
Jingning Han's avatar
Jingning Han committed
931
    unsigned int tokens = cm->mb_rows * cm->mb_cols * (24 * 16 + 1);
John Koleszar's avatar
John Koleszar committed
932

John Koleszar's avatar
John Koleszar committed
933
934
    CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
  }
John Koleszar's avatar
John Koleszar committed
935

John Koleszar's avatar
John Koleszar committed
936
937
938
939
  // 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;
940
941


John Koleszar's avatar
John Koleszar committed
942
943
944
945
946
  // Structures used to minitor GF usage
  vpx_free(cpi->gf_active_flags);
  CHECK_MEM_ERROR(cpi->gf_active_flags,
                  vpx_calloc(1, cm->mb_rows * cm->mb_cols));
  cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
947

John Koleszar's avatar
John Koleszar committed
948
949
950
951
  vpx_free(cpi->mb_activity_map);
  CHECK_MEM_ERROR(cpi->mb_activity_map,
                  vpx_calloc(sizeof(unsigned int),
                             cm->mb_rows * cm->mb_cols));
952

John Koleszar's avatar
John Koleszar committed
953
954
955
956
  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));
957

John Koleszar's avatar
John Koleszar committed
958
  vpx_free(cpi->twopass.total_stats);
959

John Koleszar's avatar
John Koleszar committed
960
  cpi->twopass.total_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
961

John Koleszar's avatar
John Koleszar committed
962
963
  vpx_free(cpi->twopass.total_left_stats);
  cpi->twopass.total_left_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
964

John Koleszar's avatar
John Koleszar committed
965
  vpx_free(cpi->twopass.this_frame_stats);
966

John Koleszar's avatar
John Koleszar committed
967
  cpi->twopass.this_frame_stats = vpx_calloc(1, sizeof(FIRSTPASS_STATS));
968

John Koleszar's avatar
John Koleszar committed
969
970
971
972
973
  if (!cpi->twopass.total_stats ||
      !cpi->twopass.total_left_stats ||
      !cpi->twopass.this_frame_stats)
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate firstpass stats");
Attila Nagy's avatar
Attila Nagy committed
974

John Koleszar's avatar
John Koleszar committed
975
  vpx_free(cpi->tplist);
James Berry's avatar
James Berry committed
976

Deb Mukherjee's avatar
Deb Mukherjee committed
977
978
  CHECK_MEM_ERROR(cpi->tplist,
                  vpx_malloc(sizeof(TOKENLIST) * (cpi->common.mb_rows)));
John Koleszar's avatar
John Koleszar committed
979
980
981
}


982
983
984
985
static void update_frame_size(VP9_COMP *cpi) {
  VP9_COMMON *