vp9_onyx_if.c 127 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


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

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

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

extern void print_tree_update_probs();
51

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

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

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

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

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

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

76

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


#endif

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

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

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


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

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

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

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

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

127
// Tables relating active max Q to active min Q
128
129
130
131
132
133
134
135
136
137
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))
138
static int calculate_minq_index(double maxq,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
139
                                double x3, double x2, double x1, double c) {
John Koleszar's avatar
John Koleszar committed
140
  int i;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
141
142
  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
                                maxq);
John Koleszar's avatar
John Koleszar committed
143

Paul Wilkins's avatar
Paul Wilkins committed
144
145
146
147
148
  // Special case handling to deal with the step from q2.0
  // down to lossless mode represented by q 1.0.
  if (minqtarget <= 2.0)
    return 0;

John Koleszar's avatar
John Koleszar committed
149
  for (i = 0; i < QINDEX_RANGE; i++) {
150
    if (minqtarget <= vp9_convert_qindex_to_q(i))
John Koleszar's avatar
John Koleszar committed
151
152
      return i;
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
153

John Koleszar's avatar
John Koleszar committed
154
  return QINDEX_RANGE - 1;
155
}
156

157
static void init_minq_luts(void) {
John Koleszar's avatar
John Koleszar committed
158
159
160
  int i;

  for (i = 0; i < QINDEX_RANGE; i++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
161
    const double maxq = vp9_convert_qindex_to_q(i);
John Koleszar's avatar
John Koleszar committed
162
163
164


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
165
166
167
                                                 0.000001,
                                                 -0.0004,
                                                 0.15,
John Koleszar's avatar
John Koleszar committed
168
169
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
170
171
172
                                                  0.000002,
                                                  -0.0012,
                                                  0.5,
John Koleszar's avatar
John Koleszar committed
173
                                                  0.0);
174

John Koleszar's avatar
John Koleszar committed
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
    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);

  }
192
}
193

194
195
196
197
198
199
200
201
202
static void set_mvcost(MACROBLOCK *mb) {
  if (mb->e_mbd.allow_high_precision_mv) {
    mb->mvcost = mb->nmvcost_hp;
    mb->mvsadcost = mb->nmvsadcost_hp;
  } else {
    mb->mvcost = mb->nmvcost;
    mb->mvsadcost = mb->nmvsadcost;
  }
}
Paul Wilkins's avatar
Paul Wilkins committed
203

204
void vp9_initialize_enc() {
John Koleszar's avatar
John Koleszar committed
205
206
207
  static int init_done = 0;

  if (!init_done) {
208
    vp9_initialize_common();
209
    vp9_tokenize_initialize();
210
    vp9_init_quant_tables();
211
    vp9_init_me_luts();
John Koleszar's avatar
John Koleszar committed
212
    init_minq_luts();
Deb Mukherjee's avatar
Deb Mukherjee committed
213
    // init_base_skip_probs();
John Koleszar's avatar
John Koleszar committed
214
215
    init_done = 1;
  }
John Koleszar's avatar
John Koleszar committed
216
217
}

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

John Koleszar's avatar
John Koleszar committed
221
  // Set up default state for MB feature flags
222
  xd->segmentation_enabled = 0;
223

John Koleszar's avatar
John Koleszar committed
224
225
226
  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
227

228
  vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
229

John Koleszar's avatar
John Koleszar committed
230
231
232
233
234
235
  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
236

John Koleszar's avatar
John Koleszar committed
237
  set_default_lf_deltas(cpi);
John Koleszar's avatar
John Koleszar committed
238
239
}

240
static void dealloc_compressor_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
241
242
243
244
245
246
247
  // 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
248

John Koleszar's avatar
John Koleszar committed
249
250
  vpx_free(cpi->active_map);
  cpi->active_map = 0;
John Koleszar's avatar
John Koleszar committed
251

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

254
255
256
  vp9_free_frame_buffer(&cpi->last_frame_uf);
  vp9_free_frame_buffer(&cpi->scaled_source);
  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
257
  vp9_lookahead_destroy(cpi->lookahead);
John Koleszar's avatar
John Koleszar committed
258

John Koleszar's avatar
John Koleszar committed
259
260
  vpx_free(cpi->tok);
  cpi->tok = 0;
John Koleszar's avatar
John Koleszar committed
261

John Koleszar's avatar
John Koleszar committed
262
263
264
265
266
  // 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;
267

John Koleszar's avatar
John Koleszar committed
268
269
  vpx_free(cpi->mb.pip);
  cpi->mb.pip = 0;
John Koleszar's avatar
John Koleszar committed
270
271
}

272
273
274
// Computes a q delta (in "q index" terms) to get from a starting q value
// to a target value
// target q value
275
static int compute_qdelta(VP9_COMP *cpi, double qstart, double qtarget) {
John Koleszar's avatar
John Koleszar committed
276
277
278
279
280
281
282
  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;
283
    if (vp9_convert_qindex_to_q(i) >= qstart)
John Koleszar's avatar
John Koleszar committed
284
285
286
287
288
289
      break;
  }

  // Convert the q target to an index
  for (i = cpi->best_quality; i < cpi->worst_quality; i++) {
    target_index = i;
290
    if (vp9_convert_qindex_to_q(i) >= qtarget)
John Koleszar's avatar
John Koleszar committed
291
292
293
294
      break;
  }

  return target_index - start_index;
295
296
}

297
static void configure_static_seg_features(VP9_COMP *cpi) {
298
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
299
  MACROBLOCKD *xd = &cpi->mb.e_mbd;
300

John Koleszar's avatar
John Koleszar committed
301
302
  int high_q = (int)(cpi->avg_q > 48.0);
  int qi_delta;
303

John Koleszar's avatar
John Koleszar committed
304
305
306
  // Disable and clear down for KF
  if (cm->frame_type == KEY_FRAME) {
    // Clear down the global segmentation map
307
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
John Koleszar's avatar
John Koleszar committed
308
309
310
    xd->update_mb_segmentation_map = 0;
    xd->update_mb_segmentation_data = 0;
    cpi->static_mb_pct = 0;
311

John Koleszar's avatar
John Koleszar committed
312
    // Disable segmentation
313
    vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
314

John Koleszar's avatar
John Koleszar committed
315
    // Clear down the segment features.
316
    vp9_clearall_segfeatures(xd);
317
318
  } else if (cpi->refresh_alt_ref_frame) {
    // If this is an alt ref frame
John Koleszar's avatar
John Koleszar committed
319
    // Clear down the global segmentation map
320
    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
John Koleszar's avatar
John Koleszar committed
321
322
323
    xd->update_mb_segmentation_map = 0;
    xd->update_mb_segmentation_data = 0;
    cpi->static_mb_pct = 0;
Paul Wilkins's avatar
Paul Wilkins committed
324

John Koleszar's avatar
John Koleszar committed
325
    // Disable segmentation and individual segment features by default
326
    vp9_disable_segmentation((VP9_PTR)cpi);
327
    vp9_clearall_segfeatures(xd);
Paul Wilkins's avatar
Paul Wilkins committed
328

John Koleszar's avatar
John Koleszar committed
329
330
    // Scan frames from current to arf frame.
    // This function re-enables segmentation if appropriate.
331
    vp9_update_mbgraph_stats(cpi);
Paul Wilkins's avatar
Paul Wilkins committed
332

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

John Koleszar's avatar
John Koleszar committed
339
      qi_delta = compute_qdelta(cpi, cpi->avg_q, (cpi->avg_q * 0.875));
340
341
      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
342

343
344
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
      vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_LF);
345

John Koleszar's avatar
John Koleszar committed
346
347
      // Where relevant assume segment data is delta data
      xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
Paul Wilkins's avatar
Paul Wilkins committed
348

349
    }
350
351
352
  } else if (xd->segmentation_enabled) {
    // All other frames if segmentation has been enabled

John Koleszar's avatar
John Koleszar committed
353
354
    // 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
355
      // Set up segment features for normal frames in an arf group
John Koleszar's avatar
John Koleszar committed
356
357
358
359
      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
360

John Koleszar's avatar
John Koleszar committed
361
362
        qi_delta = compute_qdelta(cpi, cpi->avg_q,
                                  (cpi->avg_q * 1.125));
363
364
        vp9_set_segdata(xd, 1, SEG_LVL_ALT_Q, (qi_delta + 2));
        vp9_enable_segfeature(xd, 1, SEG_LVL_ALT_Q);
Paul Wilkins's avatar
Paul Wilkins committed
365

366
367
        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
368

John Koleszar's avatar
John Koleszar committed
369
370
        // Segment coding disabled for compred testing
        if (high_q || (cpi->static_mb_pct == 100)) {
371
          vp9_set_segdata(xd, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
372
          vp9_enable_segfeature(xd, 1, SEG_LVL_REF_FRAME);
Paul Wilkins's avatar
Paul Wilkins committed
373
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
374
        }
375
376
377
378
      } else {
        // Disable segmentation and clear down features if alt ref
        // is not active for this group

379
        vp9_disable_segmentation((VP9_PTR)cpi);
Paul Wilkins's avatar
Paul Wilkins committed
380

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

John Koleszar's avatar
John Koleszar committed
383
384
        xd->update_mb_segmentation_map = 0;
        xd->update_mb_segmentation_data = 0;
Paul Wilkins's avatar
Paul Wilkins committed
385

386
        vp9_clearall_segfeatures(xd);
John Koleszar's avatar
John Koleszar committed
387
      }
388
389
390
391
    } else if (cpi->is_src_frame_alt_ref) {
      // Special case where we are coding over the top of a previous
      // alt ref frame.
      // Segment coding disabled for compred testing
John Koleszar's avatar
John Koleszar committed
392

Paul Wilkins's avatar
Paul Wilkins committed
393
      // Enable ref frame features for segment 0 as well
394
395
      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
396

Paul Wilkins's avatar
Paul Wilkins committed
397
      // All mbs should use ALTREF_FRAME
398
399
400
401
      vp9_clear_segdata(xd, 0, SEG_LVL_REF_FRAME);
      vp9_set_segdata(xd, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
      vp9_clear_segdata(xd, 1, SEG_LVL_REF_FRAME);
      vp9_set_segdata(xd, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
John Koleszar's avatar
John Koleszar committed
402

Paul Wilkins's avatar
Paul Wilkins committed
403
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
John Koleszar's avatar
John Koleszar committed
404
      if (high_q) {
Paul Wilkins's avatar
Paul Wilkins committed
405
406
          vp9_enable_segfeature(xd, 0, SEG_LVL_SKIP);
          vp9_enable_segfeature(xd, 1, SEG_LVL_SKIP);
John Koleszar's avatar
John Koleszar committed
407
408
409
      }
      // Enable data udpate
      xd->update_mb_segmentation_data = 1;
410
411
412
    } else {
      // All other frames.

John Koleszar's avatar
John Koleszar committed
413
414
415
416
417
      // No updates.. leave things as they are.
      xd->update_mb_segmentation_map = 0;
      xd->update_mb_segmentation_data = 0;
    }
  }
418
419
}

Paul Wilkins's avatar
Paul Wilkins committed
420
421
422
423
#ifdef ENTROPY_STATS
void vp9_update_mode_context_stats(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
  int i, j;
424
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
425
      cm->fc.inter_mode_counts;
426
  int64_t (*mv_ref_stats)[VP9_INTER_MODES - 1][2] = cpi->mv_ref_stats;
Paul Wilkins's avatar
Paul Wilkins committed
427
428
429
430
431
432
433
434
435
436
437
438
439
  FILE *f;

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

  // Add in the values for this frame
  for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
440
    for (j = 0; j < VP9_INTER_MODES - 1; j++) {
441
442
      mv_ref_stats[i][j][0] += (int64_t)inter_mode_counts[i][j][0];
      mv_ref_stats[i][j][1] += (int64_t)inter_mode_counts[i][j][1];
Paul Wilkins's avatar
Paul Wilkins committed
443
444
445
446
447
448
449
450
451
452
453
454
455
456
    }
  }

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

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

  fprintf(f, "#include \"vp9_entropy.h\"\n");
457
458
459
  fprintf(
      f,
      "const int inter_mode_probs[INTER_MODE_CONTEXTS][VP9_INTER_MODES - 1] =");
Paul Wilkins's avatar
Paul Wilkins committed
460
461
462
463
  fprintf(f, "{\n");
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
    fprintf(f, "  {/* %d */ ", j);
    fprintf(f, "    ");
464
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
Paul Wilkins's avatar
Paul Wilkins committed
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
      int this_prob;
      int64_t count = cpi->mv_ref_stats[j][i][0] + cpi->mv_ref_stats[j][i][1];
      if (count)
        this_prob = ((cpi->mv_ref_stats[j][i][0] * 256) + (count >> 1)) / count;
      else
        this_prob = 128;

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

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

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

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

492
493
  for (row = 0; row < cpi->common.mi_rows; row++) {
    for (col = 0; col < cpi->common.mi_cols; col++) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
494
      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
John Koleszar's avatar
John Koleszar committed
495
      map_index++;
496
497
    }
    fprintf(statsfile, "\n");
John Koleszar's avatar
John Koleszar committed
498
499
  }
  fprintf(statsfile, "\n");
500

John Koleszar's avatar
John Koleszar committed
501
  fclose(statsfile);
502
503
}

504
static void update_reference_segmentation_map(VP9_COMP *cpi) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
505
506
507
508
509
  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;

510
  for (row = 0; row < cm->mi_rows; row++) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
511
512
    mi = mi_ptr;
    cache = cache_ptr;
513
    for (col = 0; col < cm->mi_cols; col++, mi++, cache++)
Ronald S. Bultje's avatar
Ronald S. Bultje committed
514
515
      cache[0] = mi->mbmi.segment_id;
    mi_ptr += cm->mode_info_stride;
516
    cache_ptr += cm->mi_cols;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
517
518
519
  }
}

520
static void set_default_lf_deltas(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
521
522
  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
523

John Koleszar's avatar
John Koleszar committed
524
525
  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
526

John Koleszar's avatar
John Koleszar committed
527
528
529
530
531
  // 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
532

533
534
  cpi->mb.e_mbd.mode_lf_deltas[0] = 0;              // Zero
  cpi->mb.e_mbd.mode_lf_deltas[1] = 0;               // New mv
John Koleszar's avatar
John Koleszar committed
535
536
}

537
538
539
540
541
542
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
543
544
  for (i = 0; i < MAX_MODES; ++i)
    sf->thresh_mult[i] = mode == 0 ? -500 : 0;
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561

  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;
562
563
564
565
566
567
  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;
568
569
570
571
572
573
574
575
576
577
578

  sf->thresh_mult[THR_B_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;

579
580
  sf->thresh_mult[THR_COMP_ZEROLA   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_ZEROGA   ] += speed_multiplier * 1500;
581

582
583
  sf->thresh_mult[THR_COMP_NEARESTLA] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARESTGA] += speed_multiplier * 1500;
584

585
586
  sf->thresh_mult[THR_COMP_NEARLA   ] += speed_multiplier * 1500;
  sf->thresh_mult[THR_COMP_NEARGA   ] += speed_multiplier * 1500;
587
588
589
590
591
592
593

  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;

594
  if (cpi->sf.skip_lots_of_modes) {
Jim Bankoski's avatar
Jim Bankoski committed
595
596
597
    for (i = 0; i < MAX_MODES; ++i)
      sf->thresh_mult[i] = INT_MAX;

Jim Bankoski's avatar
Jim Bankoski committed
598
599
600
601
602
    sf->thresh_mult[THR_DC] = 0;
    sf->thresh_mult[THR_TM] = 0;
    sf->thresh_mult[THR_NEWMV] = 4000;
    sf->thresh_mult[THR_NEWG] = 4000;
    sf->thresh_mult[THR_NEWA] = 4000;
Jim Bankoski's avatar
Jim Bankoski committed
603
    sf->thresh_mult[THR_NEARESTMV] = 0;
Jim Bankoski's avatar
Jim Bankoski committed
604
605
606
607
608
    sf->thresh_mult[THR_NEARESTG] = 0;
    sf->thresh_mult[THR_NEARESTA] = 0;
    sf->thresh_mult[THR_NEARMV] = 2000;
    sf->thresh_mult[THR_NEARG] = 2000;
    sf->thresh_mult[THR_NEARA] = 2000;
Jim Bankoski's avatar
Jim Bankoski committed
609
    sf->thresh_mult[THR_COMP_NEARESTLA] = 2000;
Jim Bankoski's avatar
Jim Bankoski committed
610
611
612
    sf->thresh_mult[THR_SPLITMV] = 2500;
    sf->thresh_mult[THR_SPLITG] = 2500;
    sf->thresh_mult[THR_SPLITA] = 2500;
Jim Bankoski's avatar
Jim Bankoski committed
613
614
615
    sf->recode_loop = 0;
  }

616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
  /* disable frame modes if flags not set */
  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
    sf->thresh_mult[THR_NEWMV    ] = INT_MAX;
    sf->thresh_mult[THR_NEARESTMV] = INT_MAX;
    sf->thresh_mult[THR_ZEROMV   ] = INT_MAX;
    sf->thresh_mult[THR_NEARMV   ] = INT_MAX;
    sf->thresh_mult[THR_SPLITMV  ] = INT_MAX;
  }
  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
    sf->thresh_mult[THR_NEARESTG ] = INT_MAX;
    sf->thresh_mult[THR_ZEROG    ] = INT_MAX;
    sf->thresh_mult[THR_NEARG    ] = INT_MAX;
    sf->thresh_mult[THR_NEWG     ] = INT_MAX;
    sf->thresh_mult[THR_SPLITG   ] = INT_MAX;
  }
  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_NEARESTA ] = INT_MAX;
    sf->thresh_mult[THR_ZEROA    ] = INT_MAX;
    sf->thresh_mult[THR_NEARA    ] = INT_MAX;
    sf->thresh_mult[THR_NEWA     ] = INT_MAX;
    sf->thresh_mult[THR_SPLITA   ] = INT_MAX;
  }

  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
      (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
    sf->thresh_mult[THR_COMP_SPLITLA  ] = INT_MAX;
  }
  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
      (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
    sf->thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
    sf->thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
    sf->thresh_mult[THR_COMP_SPLITGA  ] = INT_MAX;
  }
655
656
}

657
void vp9_set_speed_features(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
658
  SPEED_FEATURES *sf = &cpi->sf;
659
  int mode = cpi->compressor_speed;
660
  int speed = cpi->speed;
John Koleszar's avatar
John Koleszar committed
661
662
663
  int i;

  // Only modes 0 and 1 supported for now in experimental code basae
664
665
  if (mode > 1)
    mode = 1;
John Koleszar's avatar
John Koleszar committed
666
667
668
669
670
671
672
673

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

Paul Wilkins's avatar
Paul Wilkins committed
674
675
676
677
678
679
  // Initialize cpi->max_mv_magnitude if appropriate.
  if ((cpi->common.frame_type == KEY_FRAME) || cpi->common.intra_only ||
    (cpi->common.show_frame == 0)) {
    cpi->max_mv_magnitude = 0;
  }

John Koleszar's avatar
John Koleszar committed
680
681
682
683
684
685
686
687
  // 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;
688
  sf->optimize_coefficients = !cpi->oxcf.lossless;
689
  sf->reduce_first_step_size = 0;
Paul Wilkins's avatar
Paul Wilkins committed
690
  sf->auto_mv_step_size = 0;
John Koleszar's avatar
John Koleszar committed
691
  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
692
  sf->comp_inter_joint_search_thresh = BLOCK_SIZE_AB4X4;
693
  sf->adpative_rd_thresh = 0;
Jim Bankoski's avatar
Jim Bankoski committed
694
  sf->use_lastframe_partitioning = 0;
695
696
697
698
699
  sf->use_largest_txform = 0;
  sf->use_8tap_always = 0;
  sf->use_avoid_tested_higherror = 0;
  sf->skip_lots_of_modes = 0;
  sf->adjust_thresholds_by_speed = 0;
700
  sf->partition_by_variance = 0;
701
  sf->use_one_partition_size_always = 0;
702
703
704
705
  sf->use_partitions_less_than = 0;
  sf->less_than_block_size = BLOCK_SIZE_MB16X16;
  sf->use_partitions_greater_than = 0;
  sf->greater_than_block_size = BLOCK_SIZE_SB8X8;
706

707
708
709
710
#if CONFIG_MULTIPLE_ARF
  // Switch segmentation off.
  sf->static_segmentation = 0;
#else
711
  sf->static_segmentation = 0;
712
#endif
John Koleszar's avatar
John Koleszar committed
713

714
  switch (mode) {
John Koleszar's avatar
John Koleszar committed
715
    case 0: // best quality mode
John Koleszar's avatar
John Koleszar committed
716
717
718
      sf->search_best_filter = SEARCH_BEST_FILTER;
      break;

719
    case 1:
720
721
722
#if CONFIG_MULTIPLE_ARF
      // Switch segmentation off.
      sf->static_segmentation = 0;
723
#else
Paul Wilkins's avatar
Paul Wilkins committed
724
      sf->static_segmentation = 0;
725
#endif
Paul Wilkins's avatar
Paul Wilkins committed
726
727
728
      sf->comp_inter_joint_search_thresh = BLOCK_SIZE_MB16X16;
      sf->auto_mv_step_size = 1;
      sf->use_avoid_tested_higherror = 1;
729
      sf->adpative_rd_thresh = 1;
Paul Wilkins's avatar
Paul Wilkins committed
730

Yaowu Xu's avatar
Yaowu Xu committed
731
      if (speed == 1) {
732
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
733
734
735
        sf->use_largest_txform = !(cpi->common.frame_type == KEY_FRAME ||
                                   cpi->common.intra_only ||
                                   cpi->common.show_frame == 0);
Jim Bankoski's avatar
Jim Bankoski committed
736
      }
737
      if (speed == 2) {
Paul Wilkins's avatar
Paul Wilkins committed
738
739
740
741
        sf->adjust_thresholds_by_speed = 1;
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
        sf->reduce_first_step_size = 1;
        sf->optimize_coefficients = 0;
Jim Bankoski's avatar
Jim Bankoski committed
742
        sf->use_lastframe_partitioning = 1;
743
      }
744
      if (speed == 3) {
Paul Wilkins's avatar
Paul Wilkins committed
745
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
746
        sf->partition_by_variance = 1;
Paul Wilkins's avatar
Paul Wilkins committed
747
        sf->reduce_first_step_size = 1;
748
      }
749
      if (speed == 4) {
Paul Wilkins's avatar
Paul Wilkins committed
750
751
        sf->reduce_first_step_size = 1;
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
752
753
754
        sf->use_one_partition_size_always = 1;
        sf->always_this_block_size = BLOCK_SIZE_MB16X16;
      }
Paul Wilkins's avatar
Paul Wilkins committed
755
/*      if (speed == 2) {
756
        sf->reduce_first_step_size = 0;
757
758
759
760
761
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_SB8X8;
        sf->use_partitions_less_than = 1;
        sf->less_than_block_size = BLOCK_SIZE_MB16X16;
      }
      if (speed == 3) {
762
        sf->reduce_first_step_size = 0;
763
764
765
        sf->comp_inter_joint_search_thresh = BLOCK_SIZE_SB8X8;
        sf->use_partitions_greater_than = 1;
        sf->greater_than_block_size = BLOCK_SIZE_SB8X8;
Paul Wilkins's avatar
Paul Wilkins committed
766
      }*/
767

Jim Bankoski's avatar
Jim Bankoski committed
768
     break;
John Koleszar's avatar
John Koleszar committed
769

John Koleszar's avatar
John Koleszar committed
770
  }; /* switch */
771

772
  // Set rd thresholds based on mode and speed setting
773
774
775
776
  if(cpi->sf.adjust_thresholds_by_speed)
    set_rd_speed_thresholds(cpi, mode, speed);
  else
    set_rd_speed_thresholds(cpi, mode, 0);
John Koleszar's avatar
John Koleszar committed
777
778
779
780
781
782

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

Yaowu Xu's avatar
Yaowu Xu committed
784
785
786
787
  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
788
  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
Yaowu Xu's avatar
Yaowu Xu committed
789
790
    cpi->mb.fwd_txm8x4    = vp9_short_walsh8x4;
    cpi->mb.fwd_txm4x4    = vp9_short_walsh4x4;
John Koleszar's avatar
John Koleszar committed
791
  }
John Koleszar's avatar
John Koleszar committed
792

793
  cpi->mb.quantize_b_4x4      = vp9_regular_quantize_b_4x4;
Paul Wilkins's avatar
Paul Wilkins committed
794

795
  vp9_init_quantizer(cpi);
John Koleszar's avatar
John Koleszar committed
796

John Koleszar's avatar
John Koleszar committed
797
  if (cpi->sf.iterative_sub_pixel == 1) {
798
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step_iteratively;
John Koleszar's avatar
John Koleszar committed
799
  } else if (cpi->sf.quarter_pixel_search) {
800
    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_step;
John Koleszar's avatar
John Koleszar committed
801
  } else if (cpi->sf.half_pixel_search) {
802
    cpi->find_fractional_mv_step = vp9_find_best_half_pixel_step;
John Koleszar's avatar
John Koleszar committed
803
  }
John Koleszar's avatar
John Koleszar committed
804

805
  cpi->mb.optimize = cpi->sf.optimize_coefficients == 1 && cpi->pass != 1;
John Koleszar's avatar
John Koleszar committed
806
807

#ifdef SPEEDSTATS
808
  frames_at_speed[cpi->speed]++;
John Koleszar's avatar
John Koleszar committed
809
810
#endif
}
811

812
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
813
814
  VP9_COMMON *cm = &cpi->common;

815
  cpi->lookahead = vp9_lookahead_init(cpi->oxcf.width, cpi->oxcf.height,
816
                                      cm->subsampling_x, cm->subsampling_y,
John Koleszar's avatar
John Koleszar committed
817
818
819
820
                                      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
821

822
823
824
825
  if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
                               cpi->oxcf.width, cpi->oxcf.height,
                               cm->subsampling_x, cm->subsampling_y,
                               VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
826
827
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate altref buffer");
John Koleszar's avatar
John Koleszar committed
828
}
829

830
static int alloc_partition_data(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
831
  vpx_free(cpi->mb.pip);
832

833
  cpi->mb.pip = vpx_calloc((cpi->common.mode_info_stride) *
834
                           (cpi->common.mi_rows + 64 / MI_SIZE),
John Koleszar's avatar
John Koleszar committed
835
836
837
                           sizeof(PARTITION_INFO));
  if (!cpi->mb.pip)
    return 1;
838

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

John Koleszar's avatar
John Koleszar committed
841
  return 0;
842
843
}

844
845
void vp9_alloc_compressor_data(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
846

847
  if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
John Koleszar's avatar
John Koleszar committed
848
849
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffers");
John Koleszar's avatar
John Koleszar committed
850

851
  if (alloc_partition_data(cpi))
John Koleszar's avatar
John Koleszar committed
852
853
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate partition data");
854

855
856
857
858
  if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
                             cm->width, cm->height,
                             cm->subsampling_x, cm->subsampling_y,
                             VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
859
860
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate last frame buffer");
John Koleszar's avatar
John Koleszar committed
861

862
863
864
865
  if (vp9_alloc_frame_buffer(&cpi->scaled_source,
                             cm->width, cm->height,
                             cm->subsampling_x, cm->subsampling_y,
                             VP9BORDERINPIXELS))
John Koleszar's avatar
John Koleszar committed
866
867
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to allocate scaled source buffer");
John Koleszar's avatar
John Koleszar committed
868

John Koleszar's avatar
John Koleszar committed
869
  vpx_free(cpi->tok);
John Koleszar's avatar
John Koleszar committed
870

John Koleszar's avatar
John Koleszar committed
871
  {
872
    unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
John Koleszar's avatar
John Koleszar committed
873

John Koleszar's avatar
John Koleszar committed
874
875
    CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
  }
John Koleszar's avatar
John Koleszar committed
876

John Koleszar's avatar
John Koleszar committed
877
878
879
880
  // 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;
881

John Koleszar's avatar
John Koleszar committed
882
883
884
885
  vpx_free(cpi->mb_activity_map);
  CHECK_MEM_ERROR(cpi->mb_activity_map,
                  vpx_calloc(sizeof(unsigned int),
                             cm->mb_rows * cm->mb_cols));
886

John Koleszar's avatar
John Koleszar committed
887
888
889
890
  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));
John Koleszar's avatar
John Koleszar committed
891
892
893
}


894
895
896
static void update_frame_size(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;

897
  vp9_update_frame_size(cm);
898

899
  // Update size of buffers local to this frame
900
901
902
903
  if (vp9_realloc_frame_buffer(&cpi->last_frame_uf,
                               cm->width, cm->height,
                               cm->subsampling_x, cm->subsampling_y,
                               VP9BORDERINPIXELS))
904
905
906
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to reallocate last frame buffer");

907
908
909
910
  if (vp9_realloc_frame_buffer(&cpi->scaled_source,
                               cm->width, cm->height,
                               cm->subsampling_x, cm->subsampling_y,
                               VP9BORDERINPIXELS))
911
912
    vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
                       "Failed to reallocate scaled source buffer");
913
914
915
916
917
918
919
920
921
922

  {
    int y_stride = cpi->scaled_source.y_stride;

    if (cpi->sf.search_method == NSTEP) {
      vp9_init3smotion_compensation(&cpi->mb, y_stride);
    } else if (cpi->sf.search_method == DIAMOND) {
      vp9_init_dsmotion_compensation(&cpi->mb, y_stride);
    }
  }
923
924
925
}


Paul Wilkins's avatar
Paul Wilkins committed
926
927
928
929
930
931
// TODO perhaps change number of steps expose to outside world when setting
// max and min limits. Also this will likely want refining for the extended Q
// range.
//
// Table that converts 0-63 Q range values passed in outside to the Qindex
// range used internally.
John Koleszar's avatar
John Koleszar committed
932
933
934
935
936
937
938
939
940
static const int q_trans[] = {
  0,    4,   8,  12,  16,  20,  24,  28,
  32,   36,  40,  44,  48,  52,  56,  60,
  64,   68,  72,  76,  80,  84,  88,  92,
  96,  100, 104, 108, 112, 116, 120, 124,
  128, 132, 136, 140, 144, 148, 152, 156,
  160, 164, 168, 172, 176, 180, 184, 188,
  192, 196, 200, 204, 208, 212, 216, 220,
  224, 228, 232, 236, 240, 244, 249, 255,
Paul Wilkins's avatar
Paul Wilkins committed
941
};
John Koleszar's avatar
John Koleszar committed
942

943
int vp9_reverse_trans(int x) {
John Koleszar's avatar
John Koleszar committed
944
  int i;
John Koleszar's avatar
John Koleszar committed
945

John Koleszar's avatar
John Koleszar committed
946
947
948
  for (i = 0; i < 64; i++)
    if (q_trans[i] >= x)
      return i;
John Koleszar's avatar
John Koleszar committed
949

John Koleszar's avatar
John Koleszar committed
950
  return 63;
John Koleszar's avatar
John Koleszar committed
951
};
952
void vp9_new_frame_rate(VP9_COMP *cpi, double framerate) {
953
  if (framerate < 0.1)
John Koleszar's avatar
John Koleszar committed
954
    framerate = 30;
955

John Koleszar's avatar
John Koleszar committed
956
957
958
959
960
  cpi->oxcf.frame_rate             = framerate;
  cpi->output_frame_rate            = cpi->oxcf.frame_rate;
  cpi->per_frame_bandwidth          = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
  cpi->av_per_frame_bandwidth        = (int)(cpi->oxcf.target_bandwidth / cpi->output_frame_rate);
  cpi->min_frame_bandwidth          = (int)(cpi->av_per_frame_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
John Koleszar's avatar
John Koleszar committed
961

962
963

  cpi->min_frame_bandwidth = MAX(cpi->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
964

John Koleszar's avatar
John Koleszar committed
965
  // Set Maximum gf/arf interval
966
  cpi->max_gf_interval = 16;
John Koleszar's avatar
John Koleszar committed
967