1/*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  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.
9 */
10
11#include <math.h>
12#include <stdio.h>
13#include <limits.h>
14
15#include "./vpx_config.h"
16#include "./vpx_scale_rtcd.h"
17#include "vpx/internal/vpx_psnr.h"
18#include "vpx_ports/vpx_timer.h"
19
20#include "vp9/common/vp9_alloccommon.h"
21#include "vp9/common/vp9_filter.h"
22#include "vp9/common/vp9_idct.h"
23#if CONFIG_VP9_POSTPROC
24#include "vp9/common/vp9_postproc.h"
25#endif
26#include "vp9/common/vp9_reconinter.h"
27#include "vp9/common/vp9_systemdependent.h"
28#include "vp9/common/vp9_tile_common.h"
29
30#include "vp9/encoder/vp9_aq_complexity.h"
31#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
32#include "vp9/encoder/vp9_aq_variance.h"
33#include "vp9/encoder/vp9_bitstream.h"
34#include "vp9/encoder/vp9_encodeframe.h"
35#include "vp9/encoder/vp9_encodemv.h"
36#include "vp9/encoder/vp9_firstpass.h"
37#include "vp9/encoder/vp9_mbgraph.h"
38#include "vp9/encoder/vp9_onyx_int.h"
39#include "vp9/encoder/vp9_picklpf.h"
40#include "vp9/encoder/vp9_ratectrl.h"
41#include "vp9/encoder/vp9_rdopt.h"
42#include "vp9/encoder/vp9_segmentation.h"
43#include "vp9/encoder/vp9_speed_features.h"
44#include "vp9/encoder/vp9_temporal_filter.h"
45#include "vp9/encoder/vp9_resize.h"
46#include "vp9/encoder/vp9_svc_layercontext.h"
47
48void vp9_coef_tree_initialize();
49
50#define DEFAULT_INTERP_FILTER SWITCHABLE
51
52#define SHARP_FILTER_QTHRESH 0          /* Q threshold for 8-tap sharp filter */
53
54#define ALTREF_HIGH_PRECISION_MV 1      // Whether to use high precision mv
55                                         //  for altref computation.
56#define HIGH_PRECISION_MV_QTHRESH 200   // Q threshold for high precision
57                                         // mv. Choose a very high value for
58                                         // now so that HIGH_PRECISION is always
59                                         // chosen.
60
61// Max rate target for 1080P and below encodes under normal circumstances
62// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
63#define MAX_MB_RATE 250
64#define MAXRATE_1080P 2025000
65
66#if CONFIG_INTERNAL_STATS
67extern double vp9_calc_ssim(YV12_BUFFER_CONFIG *source,
68                            YV12_BUFFER_CONFIG *dest, int lumamask,
69                            double *weight);
70
71
72extern double vp9_calc_ssimg(YV12_BUFFER_CONFIG *source,
73                             YV12_BUFFER_CONFIG *dest, double *ssim_y,
74                             double *ssim_u, double *ssim_v);
75
76
77#endif
78
79// #define OUTPUT_YUV_REC
80
81#ifdef OUTPUT_YUV_SRC
82FILE *yuv_file;
83#endif
84#ifdef OUTPUT_YUV_REC
85FILE *yuv_rec_file;
86#endif
87
88#if 0
89FILE *framepsnr;
90FILE *kf_list;
91FILE *keyfile;
92#endif
93
94void vp9_init_quantizer(VP9_COMP *cpi);
95
96static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
97  switch (mode) {
98    case NORMAL:
99      *hr = 1;
100      *hs = 1;
101      break;
102    case FOURFIVE:
103      *hr = 4;
104      *hs = 5;
105      break;
106    case THREEFIVE:
107      *hr = 3;
108      *hs = 5;
109    break;
110    case ONETWO:
111      *hr = 1;
112      *hs = 2;
113    break;
114    default:
115      *hr = 1;
116      *hs = 1;
117       assert(0);
118      break;
119  }
120}
121
122static void set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
123  MACROBLOCK *const mb = &cpi->mb;
124  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
125  if (cpi->common.allow_high_precision_mv) {
126    mb->mvcost = mb->nmvcost_hp;
127    mb->mvsadcost = mb->nmvsadcost_hp;
128  } else {
129    mb->mvcost = mb->nmvcost;
130    mb->mvsadcost = mb->nmvsadcost;
131  }
132}
133
134static void setup_key_frame(VP9_COMP *cpi) {
135  vp9_setup_past_independence(&cpi->common);
136
137  // All buffers are implicitly updated on key frames.
138  cpi->refresh_golden_frame = 1;
139  cpi->refresh_alt_ref_frame = 1;
140}
141
142static void setup_inter_frame(VP9_COMMON *cm) {
143  if (cm->error_resilient_mode || cm->intra_only)
144    vp9_setup_past_independence(cm);
145
146  assert(cm->frame_context_idx < FRAME_CONTEXTS);
147  cm->fc = cm->frame_contexts[cm->frame_context_idx];
148}
149
150void vp9_initialize_enc() {
151  static int init_done = 0;
152
153  if (!init_done) {
154    vp9_init_neighbors();
155    vp9_init_quant_tables();
156
157    vp9_coef_tree_initialize();
158    vp9_tokenize_initialize();
159    vp9_init_me_luts();
160    vp9_rc_init_minq_luts();
161    vp9_entropy_mv_init();
162    vp9_entropy_mode_init();
163    init_done = 1;
164  }
165}
166
167static void dealloc_compressor_data(VP9_COMP *cpi) {
168  VP9_COMMON *const cm = &cpi->common;
169  int i;
170
171  // Delete sementation map
172  vpx_free(cpi->segmentation_map);
173  cpi->segmentation_map = NULL;
174  vpx_free(cm->last_frame_seg_map);
175  cm->last_frame_seg_map = NULL;
176  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
177  cpi->coding_context.last_frame_seg_map_copy = NULL;
178
179  vpx_free(cpi->complexity_map);
180  cpi->complexity_map = NULL;
181
182  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
183  cpi->cyclic_refresh = NULL;
184
185  vpx_free(cpi->active_map);
186  cpi->active_map = NULL;
187
188  vp9_free_frame_buffers(cm);
189
190  vp9_free_frame_buffer(&cpi->last_frame_uf);
191  vp9_free_frame_buffer(&cpi->scaled_source);
192  vp9_free_frame_buffer(&cpi->scaled_last_source);
193  vp9_free_frame_buffer(&cpi->alt_ref_buffer);
194  vp9_lookahead_destroy(cpi->lookahead);
195
196  vpx_free(cpi->tok);
197  cpi->tok = 0;
198
199  // Activity mask based per mb zbin adjustments
200  vpx_free(cpi->mb_activity_map);
201  cpi->mb_activity_map = 0;
202  vpx_free(cpi->mb_norm_activity_map);
203  cpi->mb_norm_activity_map = 0;
204
205  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
206    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
207    vpx_free(lc->rc_twopass_stats_in.buf);
208    lc->rc_twopass_stats_in.buf = NULL;
209    lc->rc_twopass_stats_in.sz = 0;
210  }
211}
212
213// Computes a q delta (in "q index" terms) to get from a starting q value
214// to a target q value
215int vp9_compute_qdelta(const VP9_COMP *cpi, double qstart, double qtarget) {
216  const RATE_CONTROL *const rc = &cpi->rc;
217  int start_index = rc->worst_quality;
218  int target_index = rc->worst_quality;
219  int i;
220
221  // Convert the average q value to an index.
222  for (i = rc->best_quality; i < rc->worst_quality; ++i) {
223    start_index = i;
224    if (vp9_convert_qindex_to_q(i) >= qstart)
225      break;
226  }
227
228  // Convert the q target to an index
229  for (i = rc->best_quality; i < rc->worst_quality; ++i) {
230    target_index = i;
231    if (vp9_convert_qindex_to_q(i) >= qtarget)
232      break;
233  }
234
235  return target_index - start_index;
236}
237
238// Computes a q delta (in "q index" terms) to get from a starting q value
239// to a value that should equate to the given rate ratio.
240int vp9_compute_qdelta_by_rate(VP9_COMP *cpi, int qindex,
241                               double rate_target_ratio) {
242  const FRAME_TYPE frame_type = cpi->common.frame_type;
243  const RATE_CONTROL *const rc = &cpi->rc;
244  int target_index = rc->worst_quality;
245  int i;
246
247  // Look up the current projected bits per block for the base index
248  const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0);
249
250  // Find the target bits per mb based on the base value and given ratio.
251  const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb);
252
253  // Convert the q target to an index
254  for (i = rc->best_quality; i < rc->worst_quality; ++i) {
255    target_index = i;
256    if (vp9_rc_bits_per_mb(frame_type, i, 1.0) <= target_bits_per_mb )
257      break;
258  }
259
260  return target_index - qindex;
261}
262
263static void configure_static_seg_features(VP9_COMP *cpi) {
264  VP9_COMMON *const cm = &cpi->common;
265  const RATE_CONTROL *const rc = &cpi->rc;
266  struct segmentation *const seg = &cm->seg;
267
268  int high_q = (int)(rc->avg_q > 48.0);
269  int qi_delta;
270
271  // Disable and clear down for KF
272  if (cm->frame_type == KEY_FRAME) {
273    // Clear down the global segmentation map
274    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
275    seg->update_map = 0;
276    seg->update_data = 0;
277    cpi->static_mb_pct = 0;
278
279    // Disable segmentation
280    vp9_disable_segmentation(seg);
281
282    // Clear down the segment features.
283    vp9_clearall_segfeatures(seg);
284  } else if (cpi->refresh_alt_ref_frame) {
285    // If this is an alt ref frame
286    // Clear down the global segmentation map
287    vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
288    seg->update_map = 0;
289    seg->update_data = 0;
290    cpi->static_mb_pct = 0;
291
292    // Disable segmentation and individual segment features by default
293    vp9_disable_segmentation(seg);
294    vp9_clearall_segfeatures(seg);
295
296    // Scan frames from current to arf frame.
297    // This function re-enables segmentation if appropriate.
298    vp9_update_mbgraph_stats(cpi);
299
300    // If segmentation was enabled set those features needed for the
301    // arf itself.
302    if (seg->enabled) {
303      seg->update_map = 1;
304      seg->update_data = 1;
305
306      qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 0.875);
307      vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
308      vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
309
310      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
311      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
312
313      // Where relevant assume segment data is delta data
314      seg->abs_delta = SEGMENT_DELTADATA;
315    }
316  } else if (seg->enabled) {
317    // All other frames if segmentation has been enabled
318
319    // First normal frame in a valid gf or alt ref group
320    if (rc->frames_since_golden == 0) {
321      // Set up segment features for normal frames in an arf group
322      if (rc->source_alt_ref_active) {
323        seg->update_map = 0;
324        seg->update_data = 1;
325        seg->abs_delta = SEGMENT_DELTADATA;
326
327        qi_delta = vp9_compute_qdelta(cpi, rc->avg_q, rc->avg_q * 1.125);
328        vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
329        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
330
331        vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
332        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
333
334        // Segment coding disabled for compred testing
335        if (high_q || (cpi->static_mb_pct == 100)) {
336          vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
337          vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
338          vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
339        }
340      } else {
341        // Disable segmentation and clear down features if alt ref
342        // is not active for this group
343
344        vp9_disable_segmentation(seg);
345
346        vpx_memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
347
348        seg->update_map = 0;
349        seg->update_data = 0;
350
351        vp9_clearall_segfeatures(seg);
352      }
353    } else if (rc->is_src_frame_alt_ref) {
354      // Special case where we are coding over the top of a previous
355      // alt ref frame.
356      // Segment coding disabled for compred testing
357
358      // Enable ref frame features for segment 0 as well
359      vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
360      vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
361
362      // All mbs should use ALTREF_FRAME
363      vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
364      vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
365      vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
366      vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
367
368      // Skip all MBs if high Q (0,0 mv and skip coeffs)
369      if (high_q) {
370        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
371        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
372      }
373      // Enable data update
374      seg->update_data = 1;
375    } else {
376      // All other frames.
377
378      // No updates.. leave things as they are.
379      seg->update_map = 0;
380      seg->update_data = 0;
381    }
382  }
383}
384
385// DEBUG: Print out the segment id of each MB in the current frame.
386static void print_seg_map(VP9_COMP *cpi) {
387  VP9_COMMON *cm = &cpi->common;
388  int row, col;
389  int map_index = 0;
390  FILE *statsfile = fopen("segmap.stt", "a");
391
392  fprintf(statsfile, "%10d\n", cm->current_video_frame);
393
394  for (row = 0; row < cpi->common.mi_rows; row++) {
395    for (col = 0; col < cpi->common.mi_cols; col++) {
396      fprintf(statsfile, "%10d", cpi->segmentation_map[map_index]);
397      map_index++;
398    }
399    fprintf(statsfile, "\n");
400  }
401  fprintf(statsfile, "\n");
402
403  fclose(statsfile);
404}
405
406static void update_reference_segmentation_map(VP9_COMP *cpi) {
407  VP9_COMMON *const cm = &cpi->common;
408  MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
409  uint8_t *cache_ptr = cm->last_frame_seg_map;
410  int row, col;
411
412  for (row = 0; row < cm->mi_rows; row++) {
413    MODE_INFO **mi_8x8 = mi_8x8_ptr;
414    uint8_t *cache = cache_ptr;
415    for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
416      cache[0] = mi_8x8[0]->mbmi.segment_id;
417    mi_8x8_ptr += cm->mi_stride;
418    cache_ptr += cm->mi_cols;
419  }
420}
421static int is_slowest_mode(int mode) {
422  return (mode == MODE_SECONDPASS_BEST || mode == MODE_BESTQUALITY);
423}
424
425static void set_rd_speed_thresholds(VP9_COMP *cpi) {
426  int i;
427
428  // Set baseline threshold values
429  for (i = 0; i < MAX_MODES; ++i)
430  cpi->rd_thresh_mult[i] = is_slowest_mode(cpi->oxcf.mode) ? -500 : 0;
431
432  cpi->rd_thresh_mult[THR_NEARESTMV] = 0;
433  cpi->rd_thresh_mult[THR_NEARESTG] = 0;
434  cpi->rd_thresh_mult[THR_NEARESTA] = 0;
435
436  cpi->rd_thresh_mult[THR_DC] += 1000;
437
438  cpi->rd_thresh_mult[THR_NEWMV] += 1000;
439  cpi->rd_thresh_mult[THR_NEWA] += 1000;
440  cpi->rd_thresh_mult[THR_NEWG] += 1000;
441
442  cpi->rd_thresh_mult[THR_NEARMV] += 1000;
443  cpi->rd_thresh_mult[THR_NEARA] += 1000;
444  cpi->rd_thresh_mult[THR_COMP_NEARESTLA] += 1000;
445  cpi->rd_thresh_mult[THR_COMP_NEARESTGA] += 1000;
446
447  cpi->rd_thresh_mult[THR_TM] += 1000;
448
449  cpi->rd_thresh_mult[THR_COMP_NEARLA] += 1500;
450  cpi->rd_thresh_mult[THR_COMP_NEWLA] += 2000;
451  cpi->rd_thresh_mult[THR_NEARG] += 1000;
452  cpi->rd_thresh_mult[THR_COMP_NEARGA] += 1500;
453  cpi->rd_thresh_mult[THR_COMP_NEWGA] += 2000;
454
455  cpi->rd_thresh_mult[THR_ZEROMV] += 2000;
456  cpi->rd_thresh_mult[THR_ZEROG] += 2000;
457  cpi->rd_thresh_mult[THR_ZEROA] += 2000;
458  cpi->rd_thresh_mult[THR_COMP_ZEROLA] += 2500;
459  cpi->rd_thresh_mult[THR_COMP_ZEROGA] += 2500;
460
461  cpi->rd_thresh_mult[THR_H_PRED] += 2000;
462  cpi->rd_thresh_mult[THR_V_PRED] += 2000;
463  cpi->rd_thresh_mult[THR_D45_PRED ] += 2500;
464  cpi->rd_thresh_mult[THR_D135_PRED] += 2500;
465  cpi->rd_thresh_mult[THR_D117_PRED] += 2500;
466  cpi->rd_thresh_mult[THR_D153_PRED] += 2500;
467  cpi->rd_thresh_mult[THR_D207_PRED] += 2500;
468  cpi->rd_thresh_mult[THR_D63_PRED] += 2500;
469
470  /* disable frame modes if flags not set */
471  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
472    cpi->rd_thresh_mult[THR_NEWMV    ] = INT_MAX;
473    cpi->rd_thresh_mult[THR_NEARESTMV] = INT_MAX;
474    cpi->rd_thresh_mult[THR_ZEROMV   ] = INT_MAX;
475    cpi->rd_thresh_mult[THR_NEARMV   ] = INT_MAX;
476  }
477  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
478    cpi->rd_thresh_mult[THR_NEARESTG ] = INT_MAX;
479    cpi->rd_thresh_mult[THR_ZEROG    ] = INT_MAX;
480    cpi->rd_thresh_mult[THR_NEARG    ] = INT_MAX;
481    cpi->rd_thresh_mult[THR_NEWG     ] = INT_MAX;
482  }
483  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
484    cpi->rd_thresh_mult[THR_NEARESTA ] = INT_MAX;
485    cpi->rd_thresh_mult[THR_ZEROA    ] = INT_MAX;
486    cpi->rd_thresh_mult[THR_NEARA    ] = INT_MAX;
487    cpi->rd_thresh_mult[THR_NEWA     ] = INT_MAX;
488  }
489
490  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
491      (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
492    cpi->rd_thresh_mult[THR_COMP_ZEROLA   ] = INT_MAX;
493    cpi->rd_thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
494    cpi->rd_thresh_mult[THR_COMP_NEARLA   ] = INT_MAX;
495    cpi->rd_thresh_mult[THR_COMP_NEWLA    ] = INT_MAX;
496  }
497  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
498      (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
499    cpi->rd_thresh_mult[THR_COMP_ZEROGA   ] = INT_MAX;
500    cpi->rd_thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
501    cpi->rd_thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
502    cpi->rd_thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
503  }
504}
505
506static void set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
507  const SPEED_FEATURES *const sf = &cpi->sf;
508  int i;
509
510  for (i = 0; i < MAX_REFS; ++i)
511    cpi->rd_thresh_mult_sub8x8[i] = is_slowest_mode(cpi->oxcf.mode)  ? -500 : 0;
512
513  cpi->rd_thresh_mult_sub8x8[THR_LAST] += 2500;
514  cpi->rd_thresh_mult_sub8x8[THR_GOLD] += 2500;
515  cpi->rd_thresh_mult_sub8x8[THR_ALTR] += 2500;
516  cpi->rd_thresh_mult_sub8x8[THR_INTRA] += 2500;
517  cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] += 4500;
518  cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] += 4500;
519
520  // Check for masked out split cases.
521  for (i = 0; i < MAX_REFS; i++)
522    if (sf->disable_split_mask & (1 << i))
523      cpi->rd_thresh_mult_sub8x8[i] = INT_MAX;
524
525  // disable mode test if frame flag is not set
526  if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
527    cpi->rd_thresh_mult_sub8x8[THR_LAST] = INT_MAX;
528  if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
529    cpi->rd_thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
530  if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
531    cpi->rd_thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
532  if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
533      (VP9_LAST_FLAG | VP9_ALT_FLAG))
534    cpi->rd_thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
535  if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
536      (VP9_GOLD_FLAG | VP9_ALT_FLAG))
537    cpi->rd_thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
538}
539
540static void set_speed_features(VP9_COMP *cpi) {
541#if CONFIG_INTERNAL_STATS
542  int i;
543  for (i = 0; i < MAX_MODES; ++i)
544    cpi->mode_chosen_counts[i] = 0;
545#endif
546
547  vp9_set_speed_features(cpi);
548
549  // Set rd thresholds based on mode and speed setting
550  set_rd_speed_thresholds(cpi);
551  set_rd_speed_thresholds_sub8x8(cpi);
552
553  cpi->mb.fwd_txm4x4 = vp9_fdct4x4;
554  if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
555    cpi->mb.fwd_txm4x4 = vp9_fwht4x4;
556  }
557}
558
559static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
560  VP9_COMMON *cm = &cpi->common;
561  const VP9_CONFIG *oxcf = &cpi->oxcf;
562
563  cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
564                                      cm->subsampling_x, cm->subsampling_y,
565                                      oxcf->lag_in_frames);
566  if (!cpi->lookahead)
567    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
568                       "Failed to allocate lag buffers");
569
570  if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
571                               oxcf->width, oxcf->height,
572                               cm->subsampling_x, cm->subsampling_y,
573                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
574    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
575                       "Failed to allocate altref buffer");
576}
577
578void vp9_alloc_compressor_data(VP9_COMP *cpi) {
579  VP9_COMMON *cm = &cpi->common;
580
581  if (vp9_alloc_frame_buffers(cm, cm->width, cm->height))
582    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
583                       "Failed to allocate frame buffers");
584
585  if (vp9_alloc_frame_buffer(&cpi->last_frame_uf,
586                             cm->width, cm->height,
587                             cm->subsampling_x, cm->subsampling_y,
588                             VP9_ENC_BORDER_IN_PIXELS))
589    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
590                       "Failed to allocate last frame buffer");
591
592  if (vp9_alloc_frame_buffer(&cpi->scaled_source,
593                             cm->width, cm->height,
594                             cm->subsampling_x, cm->subsampling_y,
595                             VP9_ENC_BORDER_IN_PIXELS))
596    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
597                       "Failed to allocate scaled source buffer");
598
599  if (vp9_alloc_frame_buffer(&cpi->scaled_last_source,
600                             cm->width, cm->height,
601                             cm->subsampling_x, cm->subsampling_y,
602                             VP9_ENC_BORDER_IN_PIXELS))
603    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
604                       "Failed to allocate scaled last source buffer");
605
606  vpx_free(cpi->tok);
607
608  {
609    unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
610
611    CHECK_MEM_ERROR(cm, cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
612  }
613
614  vpx_free(cpi->mb_activity_map);
615  CHECK_MEM_ERROR(cm, cpi->mb_activity_map,
616                  vpx_calloc(sizeof(unsigned int),
617                             cm->mb_rows * cm->mb_cols));
618
619  vpx_free(cpi->mb_norm_activity_map);
620  CHECK_MEM_ERROR(cm, cpi->mb_norm_activity_map,
621                  vpx_calloc(sizeof(unsigned int),
622                             cm->mb_rows * cm->mb_cols));
623}
624
625
626static void update_frame_size(VP9_COMP *cpi) {
627  VP9_COMMON *const cm = &cpi->common;
628  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
629
630  vp9_update_frame_size(cm);
631
632  // Update size of buffers local to this frame
633  if (vp9_realloc_frame_buffer(&cpi->last_frame_uf,
634                               cm->width, cm->height,
635                               cm->subsampling_x, cm->subsampling_y,
636                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
637    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
638                       "Failed to reallocate last frame buffer");
639
640  if (vp9_realloc_frame_buffer(&cpi->scaled_source,
641                               cm->width, cm->height,
642                               cm->subsampling_x, cm->subsampling_y,
643                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
644    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
645                       "Failed to reallocate scaled source buffer");
646
647  if (vp9_realloc_frame_buffer(&cpi->scaled_last_source,
648                               cm->width, cm->height,
649                               cm->subsampling_x, cm->subsampling_y,
650                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
651    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
652                       "Failed to reallocate scaled last source buffer");
653
654  {
655    int y_stride = cpi->scaled_source.y_stride;
656
657    if (cpi->sf.search_method == NSTEP) {
658      vp9_init3smotion_compensation(&cpi->mb, y_stride);
659    } else if (cpi->sf.search_method == DIAMOND) {
660      vp9_init_dsmotion_compensation(&cpi->mb, y_stride);
661    }
662  }
663
664  init_macroblockd(cm, xd);
665}
666
667// Table that converts 0-63 Q range values passed in outside to the Qindex
668// range used internally.
669const int q_trans[] = {
670  0,    4,   8,  12,  16,  20,  24,  28,
671  32,   36,  40,  44,  48,  52,  56,  60,
672  64,   68,  72,  76,  80,  84,  88,  92,
673  96,  100, 104, 108, 112, 116, 120, 124,
674  128, 132, 136, 140, 144, 148, 152, 156,
675  160, 164, 168, 172, 176, 180, 184, 188,
676  192, 196, 200, 204, 208, 212, 216, 220,
677  224, 228, 232, 236, 240, 244, 249, 255,
678};
679
680int vp9_reverse_trans(int x) {
681  int i;
682
683  for (i = 0; i < 64; i++)
684    if (q_trans[i] >= x)
685      return i;
686
687  return 63;
688};
689
690void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
691  VP9_COMMON *const cm = &cpi->common;
692  RATE_CONTROL *const rc = &cpi->rc;
693  VP9_CONFIG *const oxcf = &cpi->oxcf;
694  int vbr_max_bits;
695
696  oxcf->framerate = framerate < 0.1 ? 30 : framerate;
697  cpi->output_framerate = cpi->oxcf.framerate;
698  rc->av_per_frame_bandwidth = (int)(oxcf->target_bandwidth /
699                                     cpi->output_framerate);
700  rc->min_frame_bandwidth = (int)(rc->av_per_frame_bandwidth *
701                                  oxcf->two_pass_vbrmin_section / 100);
702
703  rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
704
705  // A maximum bitrate for a frame is defined.
706  // The baseline for this aligns with HW implementations that
707  // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
708  // per 16x16 MB (averaged over a frame). However this limit is extended if
709  // a very high rate is given on the command line or the the rate cannnot
710  // be acheived because of a user specificed max q (e.g. when the user
711  // specifies lossless encode.
712  //
713  vbr_max_bits = (int)(((int64_t)rc->av_per_frame_bandwidth *
714      oxcf->two_pass_vbrmax_section) / 100);
715  rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
716                                vbr_max_bits);
717
718  // Set Maximum gf/arf interval
719  rc->max_gf_interval = 16;
720
721  // Extended interval for genuinely static scenes
722  rc->static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
723
724  // Special conditions when alt ref frame enabled in lagged compress mode
725  if (oxcf->play_alternate && oxcf->lag_in_frames) {
726    if (rc->max_gf_interval > oxcf->lag_in_frames - 1)
727      rc->max_gf_interval = oxcf->lag_in_frames - 1;
728
729    if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
730      rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
731  }
732
733  if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
734    rc->max_gf_interval = rc->static_scene_max_gf_interval;
735}
736
737int64_t vp9_rescale(int64_t val, int64_t num, int denom) {
738  int64_t llnum = num;
739  int64_t llden = denom;
740  int64_t llval = val;
741
742  return (llval * llnum / llden);
743}
744
745static void set_tile_limits(VP9_COMP *cpi) {
746  VP9_COMMON *const cm = &cpi->common;
747
748  int min_log2_tile_cols, max_log2_tile_cols;
749  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
750
751  cm->log2_tile_cols = clamp(cpi->oxcf.tile_columns,
752                             min_log2_tile_cols, max_log2_tile_cols);
753  cm->log2_tile_rows = cpi->oxcf.tile_rows;
754}
755
756static void init_rate_control(const VP9_CONFIG *oxcf, int pass,
757                              RATE_CONTROL *rc) {
758  if (pass == 0 && oxcf->end_usage == USAGE_STREAM_FROM_SERVER) {
759    rc->avg_frame_qindex[0] = oxcf->worst_allowed_q;
760    rc->avg_frame_qindex[1] = oxcf->worst_allowed_q;
761    rc->avg_frame_qindex[2] = oxcf->worst_allowed_q;
762  } else {
763    rc->avg_frame_qindex[0] = (oxcf->worst_allowed_q +
764                                   oxcf->best_allowed_q) / 2;
765    rc->avg_frame_qindex[1] = (oxcf->worst_allowed_q +
766                                   oxcf->best_allowed_q) / 2;
767    rc->avg_frame_qindex[2] = (oxcf->worst_allowed_q +
768                                   oxcf->best_allowed_q) / 2;
769  }
770
771  rc->last_q[0] = oxcf->best_allowed_q;
772  rc->last_q[1] = oxcf->best_allowed_q;
773  rc->last_q[2] = oxcf->best_allowed_q;
774
775  rc->buffer_level =    oxcf->starting_buffer_level;
776  rc->bits_off_target = oxcf->starting_buffer_level;
777
778  rc->rolling_target_bits      = rc->av_per_frame_bandwidth;
779  rc->rolling_actual_bits      = rc->av_per_frame_bandwidth;
780  rc->long_rolling_target_bits = rc->av_per_frame_bandwidth;
781  rc->long_rolling_actual_bits = rc->av_per_frame_bandwidth;
782
783  rc->total_actual_bits = 0;
784  rc->total_target_vs_actual = 0;
785}
786
787static void init_config(struct VP9_COMP *cpi, VP9_CONFIG *oxcf) {
788  VP9_COMMON *const cm = &cpi->common;
789  int i;
790
791  cpi->oxcf = *oxcf;
792
793  cm->version = oxcf->version;
794
795  cm->width = oxcf->width;
796  cm->height = oxcf->height;
797  cm->subsampling_x = 0;
798  cm->subsampling_y = 0;
799  vp9_alloc_compressor_data(cpi);
800
801  // Spatial scalability.
802  cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
803  // Temporal scalability.
804  cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
805
806  if ((cpi->svc.number_temporal_layers > 1 &&
807      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
808      (cpi->svc.number_spatial_layers > 1 &&
809      cpi->oxcf.mode == MODE_SECONDPASS_BEST)) {
810    vp9_init_layer_context(cpi);
811  }
812
813  // change includes all joint functionality
814  vp9_change_config(cpi, oxcf);
815
816  cpi->static_mb_pct = 0;
817
818  cpi->lst_fb_idx = 0;
819  cpi->gld_fb_idx = 1;
820  cpi->alt_fb_idx = 2;
821
822  set_tile_limits(cpi);
823
824  cpi->fixed_divide[0] = 0;
825  for (i = 1; i < 512; i++)
826    cpi->fixed_divide[i] = 0x80000 / i;
827}
828
829void vp9_change_config(struct VP9_COMP *cpi, const VP9_CONFIG *oxcf) {
830  VP9_COMMON *const cm = &cpi->common;
831  RATE_CONTROL *const rc = &cpi->rc;
832
833  if (cm->version != oxcf->version)
834    cm->version = oxcf->version;
835
836  cpi->oxcf = *oxcf;
837
838  if (cpi->oxcf.cpu_used == -6)
839    cpi->oxcf.play_alternate = 0;
840
841  switch (cpi->oxcf.mode) {
842      // Real time and one pass deprecated in test code base
843    case MODE_GOODQUALITY:
844      cpi->pass = 0;
845      cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
846      break;
847
848    case MODE_BESTQUALITY:
849      cpi->pass = 0;
850      break;
851
852    case MODE_FIRSTPASS:
853      cpi->pass = 1;
854      break;
855
856    case MODE_SECONDPASS:
857      cpi->pass = 2;
858      cpi->oxcf.cpu_used = clamp(cpi->oxcf.cpu_used, -5, 5);
859      break;
860
861    case MODE_SECONDPASS_BEST:
862      cpi->pass = 2;
863      break;
864
865    case MODE_REALTIME:
866      cpi->pass = 0;
867      break;
868  }
869
870  cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
871  cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
872  cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
873
874  cpi->oxcf.lossless = oxcf->lossless;
875  if (cpi->oxcf.lossless) {
876    // In lossless mode, make sure right quantizer range and correct transform
877    // is set.
878    cpi->oxcf.worst_allowed_q = 0;
879    cpi->oxcf.best_allowed_q = 0;
880    cpi->mb.e_mbd.itxm_add = vp9_iwht4x4_add;
881  } else {
882    cpi->mb.e_mbd.itxm_add = vp9_idct4x4_add;
883  }
884  rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
885  cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
886
887  cpi->refresh_golden_frame = 0;
888  cpi->refresh_last_frame = 1;
889  cm->refresh_frame_context = 1;
890  cm->reset_frame_context = 0;
891
892  vp9_reset_segment_features(&cm->seg);
893  set_high_precision_mv(cpi, 0);
894
895  {
896    int i;
897
898    for (i = 0; i < MAX_SEGMENTS; i++)
899      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
900  }
901  cpi->encode_breakout = cpi->oxcf.encode_breakout;
902
903  // local file playback mode == really big buffer
904  if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
905    cpi->oxcf.starting_buffer_level   = 60000;
906    cpi->oxcf.optimal_buffer_level    = 60000;
907    cpi->oxcf.maximum_buffer_size     = 240000;
908  }
909
910  // Convert target bandwidth from Kbit/s to Bit/s
911  cpi->oxcf.target_bandwidth       *= 1000;
912
913  cpi->oxcf.starting_buffer_level =
914      vp9_rescale(cpi->oxcf.starting_buffer_level,
915                  cpi->oxcf.target_bandwidth, 1000);
916
917  // Set or reset optimal and maximum buffer levels.
918  if (cpi->oxcf.optimal_buffer_level == 0)
919    cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
920  else
921    cpi->oxcf.optimal_buffer_level =
922        vp9_rescale(cpi->oxcf.optimal_buffer_level,
923                    cpi->oxcf.target_bandwidth, 1000);
924
925  if (cpi->oxcf.maximum_buffer_size == 0)
926    cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
927  else
928    cpi->oxcf.maximum_buffer_size =
929        vp9_rescale(cpi->oxcf.maximum_buffer_size,
930                    cpi->oxcf.target_bandwidth, 1000);
931  // Under a configuration change, where maximum_buffer_size may change,
932  // keep buffer level clipped to the maximum allowed buffer size.
933  rc->bits_off_target = MIN(rc->bits_off_target, cpi->oxcf.maximum_buffer_size);
934  rc->buffer_level = MIN(rc->buffer_level, cpi->oxcf.maximum_buffer_size);
935
936  // Set up frame rate and related parameters rate control values.
937  vp9_new_framerate(cpi, cpi->oxcf.framerate);
938
939  // Set absolute upper and lower quality limits
940  rc->worst_quality = cpi->oxcf.worst_allowed_q;
941  rc->best_quality = cpi->oxcf.best_allowed_q;
942
943  // active values should only be modified if out of new range
944
945  cpi->cq_target_quality = cpi->oxcf.cq_level;
946
947  cm->interp_filter = DEFAULT_INTERP_FILTER;
948
949  cm->display_width = cpi->oxcf.width;
950  cm->display_height = cpi->oxcf.height;
951
952  // VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
953  cpi->oxcf.sharpness = MIN(7, cpi->oxcf.sharpness);
954
955  cpi->common.lf.sharpness_level = cpi->oxcf.sharpness;
956
957  if (cpi->initial_width) {
958    // Increasing the size of the frame beyond the first seen frame, or some
959    // otherwise signaled maximum size, is not supported.
960    // TODO(jkoleszar): exit gracefully.
961    assert(cm->width <= cpi->initial_width);
962    assert(cm->height <= cpi->initial_height);
963  }
964  update_frame_size(cpi);
965
966  if ((cpi->svc.number_temporal_layers > 1 &&
967      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
968      (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
969    vp9_update_layer_context_change_config(cpi,
970                                           (int)cpi->oxcf.target_bandwidth);
971  }
972
973  cpi->speed = abs(cpi->oxcf.cpu_used);
974
975  // Limit on lag buffers as these are not currently dynamically allocated.
976  if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS)
977    cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
978
979#if CONFIG_MULTIPLE_ARF
980  vp9_zero(cpi->alt_ref_source);
981#else
982  cpi->alt_ref_source = NULL;
983#endif
984  rc->is_src_frame_alt_ref = 0;
985
986#if 0
987  // Experimental RD Code
988  cpi->frame_distortion = 0;
989  cpi->last_frame_distortion = 0;
990#endif
991
992  set_tile_limits(cpi);
993
994  cpi->ext_refresh_frame_flags_pending = 0;
995  cpi->ext_refresh_frame_context_pending = 0;
996}
997
998#define M_LOG2_E 0.693147180559945309417
999#define log2f(x) (log (x) / (float) M_LOG2_E)
1000
1001static void cal_nmvjointsadcost(int *mvjointsadcost) {
1002  mvjointsadcost[0] = 600;
1003  mvjointsadcost[1] = 300;
1004  mvjointsadcost[2] = 300;
1005  mvjointsadcost[3] = 300;
1006}
1007
1008static void cal_nmvsadcosts(int *mvsadcost[2]) {
1009  int i = 1;
1010
1011  mvsadcost[0][0] = 0;
1012  mvsadcost[1][0] = 0;
1013
1014  do {
1015    double z = 256 * (2 * (log2f(8 * i) + .6));
1016    mvsadcost[0][i] = (int)z;
1017    mvsadcost[1][i] = (int)z;
1018    mvsadcost[0][-i] = (int)z;
1019    mvsadcost[1][-i] = (int)z;
1020  } while (++i <= MV_MAX);
1021}
1022
1023static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
1024  int i = 1;
1025
1026  mvsadcost[0][0] = 0;
1027  mvsadcost[1][0] = 0;
1028
1029  do {
1030    double z = 256 * (2 * (log2f(8 * i) + .6));
1031    mvsadcost[0][i] = (int)z;
1032    mvsadcost[1][i] = (int)z;
1033    mvsadcost[0][-i] = (int)z;
1034    mvsadcost[1][-i] = (int)z;
1035  } while (++i <= MV_MAX);
1036}
1037
1038static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk,
1039                               PICK_MODE_CONTEXT *ctx) {
1040  int num_pix = num_4x4_blk << 4;
1041  int i, k;
1042  ctx->num_4x4_blk = num_4x4_blk;
1043
1044  CHECK_MEM_ERROR(cm, ctx->zcoeff_blk,
1045                  vpx_calloc(num_4x4_blk, sizeof(uint8_t)));
1046  for (i = 0; i < MAX_MB_PLANE; ++i) {
1047    for (k = 0; k < 3; ++k) {
1048      CHECK_MEM_ERROR(cm, ctx->coeff[i][k],
1049                      vpx_memalign(16, num_pix * sizeof(int16_t)));
1050      CHECK_MEM_ERROR(cm, ctx->qcoeff[i][k],
1051                      vpx_memalign(16, num_pix * sizeof(int16_t)));
1052      CHECK_MEM_ERROR(cm, ctx->dqcoeff[i][k],
1053                      vpx_memalign(16, num_pix * sizeof(int16_t)));
1054      CHECK_MEM_ERROR(cm, ctx->eobs[i][k],
1055                      vpx_memalign(16, num_pix * sizeof(uint16_t)));
1056      ctx->coeff_pbuf[i][k]   = ctx->coeff[i][k];
1057      ctx->qcoeff_pbuf[i][k]  = ctx->qcoeff[i][k];
1058      ctx->dqcoeff_pbuf[i][k] = ctx->dqcoeff[i][k];
1059      ctx->eobs_pbuf[i][k]    = ctx->eobs[i][k];
1060    }
1061  }
1062}
1063
1064static void free_mode_context(PICK_MODE_CONTEXT *ctx) {
1065  int i, k;
1066  vpx_free(ctx->zcoeff_blk);
1067  ctx->zcoeff_blk = 0;
1068  for (i = 0; i < MAX_MB_PLANE; ++i) {
1069    for (k = 0; k < 3; ++k) {
1070      vpx_free(ctx->coeff[i][k]);
1071      ctx->coeff[i][k] = 0;
1072      vpx_free(ctx->qcoeff[i][k]);
1073      ctx->qcoeff[i][k] = 0;
1074      vpx_free(ctx->dqcoeff[i][k]);
1075      ctx->dqcoeff[i][k] = 0;
1076      vpx_free(ctx->eobs[i][k]);
1077      ctx->eobs[i][k] = 0;
1078    }
1079  }
1080}
1081
1082static void init_pick_mode_context(VP9_COMP *cpi) {
1083  int i;
1084  VP9_COMMON *const cm = &cpi->common;
1085  MACROBLOCK *const x  = &cpi->mb;
1086
1087  for (i = 0; i < BLOCK_SIZES; ++i) {
1088    const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1089    const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1090    const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1091    if (i < BLOCK_16X16) {
1092      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1093        for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1094          for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1095            PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1096            alloc_mode_context(cm, num_4x4_blk, ctx);
1097          }
1098        }
1099      }
1100    } else if (i < BLOCK_32X32) {
1101      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1102        for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1103          PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1104          ctx->num_4x4_blk = num_4x4_blk;
1105          alloc_mode_context(cm, num_4x4_blk, ctx);
1106        }
1107      }
1108    } else if (i < BLOCK_64X64) {
1109      for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1110        PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1111        ctx->num_4x4_blk = num_4x4_blk;
1112        alloc_mode_context(cm, num_4x4_blk, ctx);
1113      }
1114    } else {
1115      PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1116      ctx->num_4x4_blk = num_4x4_blk;
1117      alloc_mode_context(cm, num_4x4_blk, ctx);
1118    }
1119  }
1120}
1121
1122static void free_pick_mode_context(MACROBLOCK *x) {
1123  int i;
1124
1125  for (i = 0; i < BLOCK_SIZES; ++i) {
1126    const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1127    const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1128    const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1129    if (i < BLOCK_16X16) {
1130      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1131        for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index) {
1132          for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index) {
1133            PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1134            free_mode_context(ctx);
1135          }
1136        }
1137      }
1138    } else if (i < BLOCK_32X32) {
1139      for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index) {
1140        for (x->mb_index = 0; x->mb_index < 64 / num_4x4_blk; ++x->mb_index) {
1141          PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1142          free_mode_context(ctx);
1143        }
1144      }
1145    } else if (i < BLOCK_64X64) {
1146      for (x->sb_index = 0; x->sb_index < 256 / num_4x4_blk; ++x->sb_index) {
1147        PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1148        free_mode_context(ctx);
1149      }
1150    } else {
1151      PICK_MODE_CONTEXT *ctx = get_block_context(x, i);
1152      free_mode_context(ctx);
1153    }
1154  }
1155}
1156
1157VP9_COMP *vp9_create_compressor(VP9_CONFIG *oxcf) {
1158  int i, j;
1159  VP9_COMP *const cpi = vpx_memalign(32, sizeof(VP9_COMP));
1160  VP9_COMMON *const cm = cpi != NULL ? &cpi->common : NULL;
1161  RATE_CONTROL *const rc = cpi != NULL ? &cpi->rc : NULL;
1162
1163  if (!cm)
1164    return NULL;
1165
1166  vp9_zero(*cpi);
1167
1168  if (setjmp(cm->error.jmp)) {
1169    cm->error.setjmp = 0;
1170    vp9_remove_compressor(cpi);
1171    return 0;
1172  }
1173
1174  cm->error.setjmp = 1;
1175
1176  CHECK_MEM_ERROR(cm, cpi->mb.ss, vpx_calloc(sizeof(search_site),
1177                                             (MAX_MVSEARCH_STEPS * 8) + 1));
1178
1179  vp9_rtcd();
1180
1181  cpi->use_svc = 0;
1182
1183  init_config(cpi, oxcf);
1184  init_rate_control(&cpi->oxcf, cpi->pass, &cpi->rc);
1185  init_pick_mode_context(cpi);
1186
1187  cm->current_video_frame = 0;
1188
1189  // Set reference frame sign bias for ALTREF frame to 1 (for now)
1190  cm->ref_frame_sign_bias[ALTREF_FRAME] = 1;
1191
1192  rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1193
1194  cpi->gold_is_last = 0;
1195  cpi->alt_is_last = 0;
1196  cpi->gold_is_alt = 0;
1197
1198  // Create the encoder segmentation map and set all entries to 0
1199  CHECK_MEM_ERROR(cm, cpi->segmentation_map,
1200                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1201
1202  // Create a complexity map used for rd adjustment
1203  CHECK_MEM_ERROR(cm, cpi->complexity_map,
1204                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1205
1206  // Create a map used for cyclic background refresh.
1207  CHECK_MEM_ERROR(cm, cpi->cyclic_refresh,
1208                  vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
1209
1210  // And a place holder structure is the coding context
1211  // for use if we want to save and restore it
1212  CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy,
1213                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
1214
1215  CHECK_MEM_ERROR(cm, cpi->active_map, vpx_calloc(cm->MBs, 1));
1216  vpx_memset(cpi->active_map, 1, cm->MBs);
1217  cpi->active_map_enabled = 0;
1218
1219  for (i = 0; i < (sizeof(cpi->mbgraph_stats) /
1220                   sizeof(cpi->mbgraph_stats[0])); i++) {
1221    CHECK_MEM_ERROR(cm, cpi->mbgraph_stats[i].mb_stats,
1222                    vpx_calloc(cm->MBs *
1223                               sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
1224  }
1225
1226  /*Initialize the feed-forward activity masking.*/
1227  cpi->activity_avg = 90 << 12;
1228  cpi->key_frame_frequency = cpi->oxcf.key_freq;
1229
1230  rc->frames_since_key = 8;  // Sensible default for first frame.
1231  rc->this_key_frame_forced = 0;
1232  rc->next_key_frame_forced = 0;
1233
1234  rc->source_alt_ref_pending = 0;
1235  rc->source_alt_ref_active = 0;
1236  cpi->refresh_alt_ref_frame = 0;
1237
1238#if CONFIG_MULTIPLE_ARF
1239  // Turn multiple ARF usage on/off. This is a quick hack for the initial test
1240  // version. It should eventually be set via the codec API.
1241  cpi->multi_arf_enabled = 1;
1242
1243  if (cpi->multi_arf_enabled) {
1244    cpi->sequence_number = 0;
1245    cpi->frame_coding_order_period = 0;
1246    vp9_zero(cpi->frame_coding_order);
1247    vp9_zero(cpi->arf_buffer_idx);
1248  }
1249#endif
1250
1251  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1252#if CONFIG_INTERNAL_STATS
1253  cpi->b_calculate_ssimg = 0;
1254
1255  cpi->count = 0;
1256  cpi->bytes = 0;
1257
1258  if (cpi->b_calculate_psnr) {
1259    cpi->total_y = 0.0;
1260    cpi->total_u = 0.0;
1261    cpi->total_v = 0.0;
1262    cpi->total = 0.0;
1263    cpi->total_sq_error = 0;
1264    cpi->total_samples = 0;
1265
1266    cpi->totalp_y = 0.0;
1267    cpi->totalp_u = 0.0;
1268    cpi->totalp_v = 0.0;
1269    cpi->totalp = 0.0;
1270    cpi->totalp_sq_error = 0;
1271    cpi->totalp_samples = 0;
1272
1273    cpi->tot_recode_hits = 0;
1274    cpi->summed_quality = 0;
1275    cpi->summed_weights = 0;
1276    cpi->summedp_quality = 0;
1277    cpi->summedp_weights = 0;
1278  }
1279
1280  if (cpi->b_calculate_ssimg) {
1281    cpi->total_ssimg_y = 0;
1282    cpi->total_ssimg_u = 0;
1283    cpi->total_ssimg_v = 0;
1284    cpi->total_ssimg_all = 0;
1285  }
1286
1287#endif
1288
1289  cpi->first_time_stamp_ever = INT64_MAX;
1290
1291  rc->frames_till_gf_update_due = 0;
1292
1293  rc->ni_av_qi = cpi->oxcf.worst_allowed_q;
1294  rc->ni_tot_qi = 0;
1295  rc->ni_frames = 0;
1296  rc->tot_q = 0.0;
1297  rc->avg_q = vp9_convert_qindex_to_q(cpi->oxcf.worst_allowed_q);
1298
1299  rc->rate_correction_factor = 1.0;
1300  rc->key_frame_rate_correction_factor = 1.0;
1301  rc->gf_rate_correction_factor = 1.0;
1302
1303  cal_nmvjointsadcost(cpi->mb.nmvjointsadcost);
1304  cpi->mb.nmvcost[0] = &cpi->mb.nmvcosts[0][MV_MAX];
1305  cpi->mb.nmvcost[1] = &cpi->mb.nmvcosts[1][MV_MAX];
1306  cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX];
1307  cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX];
1308  cal_nmvsadcosts(cpi->mb.nmvsadcost);
1309
1310  cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX];
1311  cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX];
1312  cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
1313  cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
1314  cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
1315
1316#ifdef OUTPUT_YUV_SRC
1317  yuv_file = fopen("bd.yuv", "ab");
1318#endif
1319#ifdef OUTPUT_YUV_REC
1320  yuv_rec_file = fopen("rec.yuv", "wb");
1321#endif
1322
1323#if 0
1324  framepsnr = fopen("framepsnr.stt", "a");
1325  kf_list = fopen("kf_list.stt", "w");
1326#endif
1327
1328  cpi->output_pkt_list = oxcf->output_pkt_list;
1329
1330  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
1331
1332  if (cpi->pass == 1) {
1333    vp9_init_first_pass(cpi);
1334  } else if (cpi->pass == 2) {
1335    const size_t packet_sz = sizeof(FIRSTPASS_STATS);
1336    const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
1337
1338    if (cpi->svc.number_spatial_layers > 1
1339        && cpi->svc.number_temporal_layers == 1) {
1340      FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
1341      FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0};
1342      int i;
1343
1344      for (i = 0; i < oxcf->ss_number_layers; ++i) {
1345        FIRSTPASS_STATS *const last_packet_for_layer =
1346            &stats[packets - oxcf->ss_number_layers + i];
1347        const int layer_id = (int)last_packet_for_layer->spatial_layer_id;
1348        const int packets_in_layer = (int)last_packet_for_layer->count + 1;
1349        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) {
1350          LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id];
1351
1352          vpx_free(lc->rc_twopass_stats_in.buf);
1353
1354          lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz;
1355          CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf,
1356                          vpx_malloc(lc->rc_twopass_stats_in.sz));
1357          lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf;
1358          lc->twopass.stats_in = lc->twopass.stats_in_start;
1359          lc->twopass.stats_in_end = lc->twopass.stats_in_start
1360                                     + packets_in_layer - 1;
1361          stats_copy[layer_id] = lc->rc_twopass_stats_in.buf;
1362        }
1363      }
1364
1365      for (i = 0; i < packets; ++i) {
1366        const int layer_id = (int)stats[i].spatial_layer_id;
1367        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers
1368            && stats_copy[layer_id] != NULL) {
1369          *stats_copy[layer_id] = stats[i];
1370          ++stats_copy[layer_id];
1371        }
1372      }
1373
1374      vp9_init_second_pass_spatial_svc(cpi);
1375    } else {
1376      cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
1377      cpi->twopass.stats_in = cpi->twopass.stats_in_start;
1378      cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
1379
1380      vp9_init_second_pass(cpi);
1381    }
1382  }
1383
1384  set_speed_features(cpi);
1385
1386  // Default rd threshold factors for mode selection
1387  for (i = 0; i < BLOCK_SIZES; ++i) {
1388    for (j = 0; j < MAX_MODES; ++j)
1389      cpi->rd_thresh_freq_fact[i][j] = 32;
1390    for (j = 0; j < MAX_REFS; ++j)
1391      cpi->rd_thresh_freq_sub8x8[i][j] = 32;
1392  }
1393
1394#define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SVFHH, SVFHV, SVFHHV, \
1395            SDX3F, SDX8F, SDX4DF)\
1396    cpi->fn_ptr[BT].sdf            = SDF; \
1397    cpi->fn_ptr[BT].sdaf           = SDAF; \
1398    cpi->fn_ptr[BT].vf             = VF; \
1399    cpi->fn_ptr[BT].svf            = SVF; \
1400    cpi->fn_ptr[BT].svaf           = SVAF; \
1401    cpi->fn_ptr[BT].svf_halfpix_h  = SVFHH; \
1402    cpi->fn_ptr[BT].svf_halfpix_v  = SVFHV; \
1403    cpi->fn_ptr[BT].svf_halfpix_hv = SVFHHV; \
1404    cpi->fn_ptr[BT].sdx3f          = SDX3F; \
1405    cpi->fn_ptr[BT].sdx8f          = SDX8F; \
1406    cpi->fn_ptr[BT].sdx4df         = SDX4DF;
1407
1408  BFP(BLOCK_32X16, vp9_sad32x16, vp9_sad32x16_avg,
1409      vp9_variance32x16, vp9_sub_pixel_variance32x16,
1410      vp9_sub_pixel_avg_variance32x16, NULL, NULL,
1411      NULL, NULL, NULL,
1412      vp9_sad32x16x4d)
1413
1414  BFP(BLOCK_16X32, vp9_sad16x32, vp9_sad16x32_avg,
1415      vp9_variance16x32, vp9_sub_pixel_variance16x32,
1416      vp9_sub_pixel_avg_variance16x32, NULL, NULL,
1417      NULL, NULL, NULL,
1418      vp9_sad16x32x4d)
1419
1420  BFP(BLOCK_64X32, vp9_sad64x32, vp9_sad64x32_avg,
1421      vp9_variance64x32, vp9_sub_pixel_variance64x32,
1422      vp9_sub_pixel_avg_variance64x32, NULL, NULL,
1423      NULL, NULL, NULL,
1424      vp9_sad64x32x4d)
1425
1426  BFP(BLOCK_32X64, vp9_sad32x64, vp9_sad32x64_avg,
1427      vp9_variance32x64, vp9_sub_pixel_variance32x64,
1428      vp9_sub_pixel_avg_variance32x64, NULL, NULL,
1429      NULL, NULL, NULL,
1430      vp9_sad32x64x4d)
1431
1432  BFP(BLOCK_32X32, vp9_sad32x32, vp9_sad32x32_avg,
1433      vp9_variance32x32, vp9_sub_pixel_variance32x32,
1434      vp9_sub_pixel_avg_variance32x32, vp9_variance_halfpixvar32x32_h,
1435      vp9_variance_halfpixvar32x32_v,
1436      vp9_variance_halfpixvar32x32_hv, vp9_sad32x32x3, vp9_sad32x32x8,
1437      vp9_sad32x32x4d)
1438
1439  BFP(BLOCK_64X64, vp9_sad64x64, vp9_sad64x64_avg,
1440      vp9_variance64x64, vp9_sub_pixel_variance64x64,
1441      vp9_sub_pixel_avg_variance64x64, vp9_variance_halfpixvar64x64_h,
1442      vp9_variance_halfpixvar64x64_v,
1443      vp9_variance_halfpixvar64x64_hv, vp9_sad64x64x3, vp9_sad64x64x8,
1444      vp9_sad64x64x4d)
1445
1446  BFP(BLOCK_16X16, vp9_sad16x16, vp9_sad16x16_avg,
1447      vp9_variance16x16, vp9_sub_pixel_variance16x16,
1448      vp9_sub_pixel_avg_variance16x16, vp9_variance_halfpixvar16x16_h,
1449      vp9_variance_halfpixvar16x16_v,
1450      vp9_variance_halfpixvar16x16_hv, vp9_sad16x16x3, vp9_sad16x16x8,
1451      vp9_sad16x16x4d)
1452
1453  BFP(BLOCK_16X8, vp9_sad16x8, vp9_sad16x8_avg,
1454      vp9_variance16x8, vp9_sub_pixel_variance16x8,
1455      vp9_sub_pixel_avg_variance16x8, NULL, NULL, NULL,
1456      vp9_sad16x8x3, vp9_sad16x8x8, vp9_sad16x8x4d)
1457
1458  BFP(BLOCK_8X16, vp9_sad8x16, vp9_sad8x16_avg,
1459      vp9_variance8x16, vp9_sub_pixel_variance8x16,
1460      vp9_sub_pixel_avg_variance8x16, NULL, NULL, NULL,
1461      vp9_sad8x16x3, vp9_sad8x16x8, vp9_sad8x16x4d)
1462
1463  BFP(BLOCK_8X8, vp9_sad8x8, vp9_sad8x8_avg,
1464      vp9_variance8x8, vp9_sub_pixel_variance8x8,
1465      vp9_sub_pixel_avg_variance8x8, NULL, NULL, NULL,
1466      vp9_sad8x8x3, vp9_sad8x8x8, vp9_sad8x8x4d)
1467
1468  BFP(BLOCK_8X4, vp9_sad8x4, vp9_sad8x4_avg,
1469      vp9_variance8x4, vp9_sub_pixel_variance8x4,
1470      vp9_sub_pixel_avg_variance8x4, NULL, NULL,
1471      NULL, NULL, vp9_sad8x4x8,
1472      vp9_sad8x4x4d)
1473
1474  BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg,
1475      vp9_variance4x8, vp9_sub_pixel_variance4x8,
1476      vp9_sub_pixel_avg_variance4x8, NULL, NULL,
1477      NULL, NULL, vp9_sad4x8x8,
1478      vp9_sad4x8x4d)
1479
1480  BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg,
1481      vp9_variance4x4, vp9_sub_pixel_variance4x4,
1482      vp9_sub_pixel_avg_variance4x4, NULL, NULL, NULL,
1483      vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
1484
1485  cpi->full_search_sad = vp9_full_search_sad;
1486  cpi->diamond_search_sad = vp9_diamond_search_sad;
1487  cpi->refining_search_sad = vp9_refining_search_sad;
1488
1489  /* vp9_init_quantizer() is first called here. Add check in
1490   * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
1491   * called later when needed. This will avoid unnecessary calls of
1492   * vp9_init_quantizer() for every frame.
1493   */
1494  vp9_init_quantizer(cpi);
1495
1496  vp9_loop_filter_init(cm);
1497
1498  cm->error.setjmp = 0;
1499
1500  vp9_zero(cpi->common.counts.uv_mode);
1501
1502#ifdef MODE_TEST_HIT_STATS
1503  vp9_zero(cpi->mode_test_hits);
1504#endif
1505
1506  return cpi;
1507}
1508
1509void vp9_remove_compressor(VP9_COMP *cpi) {
1510  int i;
1511
1512  if (!cpi)
1513    return;
1514
1515  if (cpi && (cpi->common.current_video_frame > 0)) {
1516#if CONFIG_INTERNAL_STATS
1517
1518    vp9_clear_system_state();
1519
1520    // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1521    if (cpi->pass != 1) {
1522      FILE *f = fopen("opsnr.stt", "a");
1523      double time_encoded = (cpi->last_end_time_stamp_seen
1524                             - cpi->first_time_stamp_ever) / 10000000.000;
1525      double total_encode_time = (cpi->time_receive_data +
1526                                  cpi->time_compress_data)   / 1000.000;
1527      double dr = (double)cpi->bytes * (double) 8 / (double)1000
1528                  / time_encoded;
1529
1530      if (cpi->b_calculate_psnr) {
1531        const double total_psnr =
1532            vpx_sse_to_psnr((double)cpi->total_samples, 255.0,
1533                            (double)cpi->total_sq_error);
1534        const double totalp_psnr =
1535            vpx_sse_to_psnr((double)cpi->totalp_samples, 255.0,
1536                            (double)cpi->totalp_sq_error);
1537        const double total_ssim = 100 * pow(cpi->summed_quality /
1538                                                cpi->summed_weights, 8.0);
1539        const double totalp_ssim = 100 * pow(cpi->summedp_quality /
1540                                                cpi->summedp_weights, 8.0);
1541
1542        fprintf(f, "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
1543                "VPXSSIM\tVPSSIMP\t  Time(ms)\n");
1544        fprintf(f, "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%8.0f\n",
1545                dr, cpi->total / cpi->count, total_psnr,
1546                cpi->totalp / cpi->count, totalp_psnr, total_ssim, totalp_ssim,
1547                total_encode_time);
1548      }
1549
1550      if (cpi->b_calculate_ssimg) {
1551        fprintf(f, "BitRate\tSSIM_Y\tSSIM_U\tSSIM_V\tSSIM_A\t  Time(ms)\n");
1552        fprintf(f, "%7.2f\t%6.4f\t%6.4f\t%6.4f\t%6.4f\t%8.0f\n", dr,
1553                cpi->total_ssimg_y / cpi->count,
1554                cpi->total_ssimg_u / cpi->count,
1555                cpi->total_ssimg_v / cpi->count,
1556                cpi->total_ssimg_all / cpi->count, total_encode_time);
1557      }
1558
1559      fclose(f);
1560    }
1561
1562#endif
1563
1564#ifdef MODE_TEST_HIT_STATS
1565    if (cpi->pass != 1) {
1566      double norm_per_pixel_mode_tests = 0;
1567      double norm_counts[BLOCK_SIZES];
1568      int i;
1569      int sb64_per_frame;
1570      int norm_factors[BLOCK_SIZES] =
1571        {256, 128, 128, 64, 32, 32, 16, 8, 8, 4, 2, 2, 1};
1572      FILE *f = fopen("mode_hit_stats.stt", "a");
1573
1574      // On average, how many mode tests do we do
1575      for (i = 0; i < BLOCK_SIZES; ++i) {
1576        norm_counts[i] = (double)cpi->mode_test_hits[i] /
1577                         (double)norm_factors[i];
1578        norm_per_pixel_mode_tests += norm_counts[i];
1579      }
1580      // Convert to a number per 64x64 and per frame
1581      sb64_per_frame = ((cpi->common.height + 63) / 64) *
1582                       ((cpi->common.width + 63) / 64);
1583      norm_per_pixel_mode_tests =
1584        norm_per_pixel_mode_tests /
1585        (double)(cpi->common.current_video_frame * sb64_per_frame);
1586
1587      fprintf(f, "%6.4f\n", norm_per_pixel_mode_tests);
1588      fclose(f);
1589    }
1590#endif
1591
1592#if 0
1593    {
1594      printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
1595      printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
1596      printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
1597             cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
1598             cpi->time_compress_data / 1000,
1599             (cpi->time_receive_data + cpi->time_compress_data) / 1000);
1600    }
1601#endif
1602  }
1603
1604  free_pick_mode_context(&cpi->mb);
1605  dealloc_compressor_data(cpi);
1606  vpx_free(cpi->mb.ss);
1607  vpx_free(cpi->tok);
1608
1609  for (i = 0; i < sizeof(cpi->mbgraph_stats) /
1610                  sizeof(cpi->mbgraph_stats[0]); ++i) {
1611    vpx_free(cpi->mbgraph_stats[i].mb_stats);
1612  }
1613
1614  vp9_remove_common(&cpi->common);
1615  vpx_free(cpi);
1616
1617#ifdef OUTPUT_YUV_SRC
1618  fclose(yuv_file);
1619#endif
1620#ifdef OUTPUT_YUV_REC
1621  fclose(yuv_rec_file);
1622#endif
1623
1624#if 0
1625
1626  if (keyfile)
1627    fclose(keyfile);
1628
1629  if (framepsnr)
1630    fclose(framepsnr);
1631
1632  if (kf_list)
1633    fclose(kf_list);
1634
1635#endif
1636}
1637
1638
1639static uint64_t calc_plane_error(const uint8_t *orig, int orig_stride,
1640                                 const uint8_t *recon, int recon_stride,
1641                                 unsigned int cols, unsigned int rows) {
1642  unsigned int row, col;
1643  uint64_t total_sse = 0;
1644  int diff;
1645
1646  for (row = 0; row + 16 <= rows; row += 16) {
1647    for (col = 0; col + 16 <= cols; col += 16) {
1648      unsigned int sse;
1649
1650      vp9_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
1651      total_sse += sse;
1652    }
1653
1654    /* Handle odd-sized width */
1655    if (col < cols) {
1656      unsigned int border_row, border_col;
1657      const uint8_t *border_orig = orig;
1658      const uint8_t *border_recon = recon;
1659
1660      for (border_row = 0; border_row < 16; border_row++) {
1661        for (border_col = col; border_col < cols; border_col++) {
1662          diff = border_orig[border_col] - border_recon[border_col];
1663          total_sse += diff * diff;
1664        }
1665
1666        border_orig += orig_stride;
1667        border_recon += recon_stride;
1668      }
1669    }
1670
1671    orig += orig_stride * 16;
1672    recon += recon_stride * 16;
1673  }
1674
1675  /* Handle odd-sized height */
1676  for (; row < rows; row++) {
1677    for (col = 0; col < cols; col++) {
1678      diff = orig[col] - recon[col];
1679      total_sse += diff * diff;
1680    }
1681
1682    orig += orig_stride;
1683    recon += recon_stride;
1684  }
1685
1686  return total_sse;
1687}
1688
1689typedef struct {
1690  double psnr[4];       // total/y/u/v
1691  uint64_t sse[4];      // total/y/u/v
1692  uint32_t samples[4];  // total/y/u/v
1693} PSNR_STATS;
1694
1695static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
1696                      PSNR_STATS *psnr) {
1697  const int widths[3]        = {a->y_width,  a->uv_width,  a->uv_width };
1698  const int heights[3]       = {a->y_height, a->uv_height, a->uv_height};
1699  const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer };
1700  const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride};
1701  const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer };
1702  const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride};
1703  int i;
1704  uint64_t total_sse = 0;
1705  uint32_t total_samples = 0;
1706
1707  for (i = 0; i < 3; ++i) {
1708    const int w = widths[i];
1709    const int h = heights[i];
1710    const uint32_t samples = w * h;
1711    const uint64_t sse = calc_plane_error(a_planes[i], a_strides[i],
1712                                          b_planes[i], b_strides[i],
1713                                          w, h);
1714    psnr->sse[1 + i] = sse;
1715    psnr->samples[1 + i] = samples;
1716    psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, 255.0, (double)sse);
1717
1718    total_sse += sse;
1719    total_samples += samples;
1720  }
1721
1722  psnr->sse[0] = total_sse;
1723  psnr->samples[0] = total_samples;
1724  psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, 255.0,
1725                                  (double)total_sse);
1726}
1727
1728static void generate_psnr_packet(VP9_COMP *cpi) {
1729  struct vpx_codec_cx_pkt pkt;
1730  int i;
1731  PSNR_STATS psnr;
1732  calc_psnr(cpi->Source, cpi->common.frame_to_show, &psnr);
1733  for (i = 0; i < 4; ++i) {
1734    pkt.data.psnr.samples[i] = psnr.samples[i];
1735    pkt.data.psnr.sse[i] = psnr.sse[i];
1736    pkt.data.psnr.psnr[i] = psnr.psnr[i];
1737  }
1738  pkt.kind = VPX_CODEC_PSNR_PKT;
1739  vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
1740}
1741
1742int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
1743  if (ref_frame_flags > 7)
1744    return -1;
1745
1746  cpi->ref_frame_flags = ref_frame_flags;
1747  return 0;
1748}
1749
1750void vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) {
1751  cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0;
1752  cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0;
1753  cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0;
1754  cpi->ext_refresh_frame_flags_pending = 1;
1755}
1756
1757static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(VP9_COMP *cpi,
1758                                VP9_REFFRAME ref_frame_flag) {
1759  MV_REFERENCE_FRAME ref_frame = NONE;
1760  if (ref_frame_flag == VP9_LAST_FLAG)
1761    ref_frame = LAST_FRAME;
1762  else if (ref_frame_flag == VP9_GOLD_FLAG)
1763    ref_frame = GOLDEN_FRAME;
1764  else if (ref_frame_flag == VP9_ALT_FLAG)
1765    ref_frame = ALTREF_FRAME;
1766
1767  return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame);
1768}
1769
1770int vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1771                           YV12_BUFFER_CONFIG *sd) {
1772  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1773  if (cfg) {
1774    vp8_yv12_copy_frame(cfg, sd);
1775    return 0;
1776  } else {
1777    return -1;
1778  }
1779}
1780
1781int vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) {
1782  VP9_COMMON *cm = &cpi->common;
1783
1784  if (index < 0 || index >= REF_FRAMES)
1785    return -1;
1786
1787  *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf;
1788  return 0;
1789}
1790
1791int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1792                          YV12_BUFFER_CONFIG *sd) {
1793  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1794  if (cfg) {
1795    vp8_yv12_copy_frame(sd, cfg);
1796    return 0;
1797  } else {
1798    return -1;
1799  }
1800}
1801
1802int vp9_update_entropy(VP9_COMP * cpi, int update) {
1803  cpi->ext_refresh_frame_context = update;
1804  cpi->ext_refresh_frame_context_pending = 1;
1805  return 0;
1806}
1807
1808
1809#ifdef OUTPUT_YUV_SRC
1810void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s) {
1811  uint8_t *src = s->y_buffer;
1812  int h = s->y_height;
1813
1814  do {
1815    fwrite(src, s->y_width, 1,  yuv_file);
1816    src += s->y_stride;
1817  } while (--h);
1818
1819  src = s->u_buffer;
1820  h = s->uv_height;
1821
1822  do {
1823    fwrite(src, s->uv_width, 1,  yuv_file);
1824    src += s->uv_stride;
1825  } while (--h);
1826
1827  src = s->v_buffer;
1828  h = s->uv_height;
1829
1830  do {
1831    fwrite(src, s->uv_width, 1, yuv_file);
1832    src += s->uv_stride;
1833  } while (--h);
1834}
1835#endif
1836
1837#ifdef OUTPUT_YUV_REC
1838void vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
1839  YV12_BUFFER_CONFIG *s = cm->frame_to_show;
1840  uint8_t *src = s->y_buffer;
1841  int h = cm->height;
1842
1843  do {
1844    fwrite(src, s->y_width, 1,  yuv_rec_file);
1845    src += s->y_stride;
1846  } while (--h);
1847
1848  src = s->u_buffer;
1849  h = s->uv_height;
1850
1851  do {
1852    fwrite(src, s->uv_width, 1,  yuv_rec_file);
1853    src += s->uv_stride;
1854  } while (--h);
1855
1856  src = s->v_buffer;
1857  h = s->uv_height;
1858
1859  do {
1860    fwrite(src, s->uv_width, 1, yuv_rec_file);
1861    src += s->uv_stride;
1862  } while (--h);
1863
1864#if CONFIG_ALPHA
1865  if (s->alpha_buffer) {
1866    src = s->alpha_buffer;
1867    h = s->alpha_height;
1868    do {
1869      fwrite(src, s->alpha_width, 1,  yuv_rec_file);
1870      src += s->alpha_stride;
1871    } while (--h);
1872  }
1873#endif
1874
1875  fflush(yuv_rec_file);
1876}
1877#endif
1878
1879static void scale_and_extend_frame_nonnormative(YV12_BUFFER_CONFIG *src_fb,
1880                                                YV12_BUFFER_CONFIG *dst_fb) {
1881  const int in_w = src_fb->y_crop_width;
1882  const int in_h = src_fb->y_crop_height;
1883  const int out_w = dst_fb->y_crop_width;
1884  const int out_h = dst_fb->y_crop_height;
1885  const int in_w_uv = src_fb->uv_crop_width;
1886  const int in_h_uv = src_fb->uv_crop_height;
1887  const int out_w_uv = dst_fb->uv_crop_width;
1888  const int out_h_uv = dst_fb->uv_crop_height;
1889  int i;
1890
1891  uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1892    src_fb->alpha_buffer};
1893  int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1894    src_fb->alpha_stride};
1895
1896  uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1897    dst_fb->alpha_buffer};
1898  int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1899    dst_fb->alpha_stride};
1900
1901  for (i = 0; i < MAX_MB_PLANE; ++i) {
1902    if (i == 0 || i == 3) {
1903      // Y and alpha planes
1904      vp9_resize_plane(srcs[i], in_h, in_w, src_strides[i],
1905                       dsts[i], out_h, out_w, dst_strides[i]);
1906    } else {
1907      // Chroma planes
1908      vp9_resize_plane(srcs[i], in_h_uv, in_w_uv, src_strides[i],
1909                       dsts[i], out_h_uv, out_w_uv, dst_strides[i]);
1910    }
1911  }
1912  vp8_yv12_extend_frame_borders(dst_fb);
1913}
1914
1915static void scale_and_extend_frame(YV12_BUFFER_CONFIG *src_fb,
1916                                   YV12_BUFFER_CONFIG *dst_fb) {
1917  const int in_w = src_fb->y_crop_width;
1918  const int in_h = src_fb->y_crop_height;
1919  const int out_w = dst_fb->y_crop_width;
1920  const int out_h = dst_fb->y_crop_height;
1921  int x, y, i;
1922
1923  uint8_t *srcs[4] = {src_fb->y_buffer, src_fb->u_buffer, src_fb->v_buffer,
1924                      src_fb->alpha_buffer};
1925  int src_strides[4] = {src_fb->y_stride, src_fb->uv_stride, src_fb->uv_stride,
1926                        src_fb->alpha_stride};
1927
1928  uint8_t *dsts[4] = {dst_fb->y_buffer, dst_fb->u_buffer, dst_fb->v_buffer,
1929                      dst_fb->alpha_buffer};
1930  int dst_strides[4] = {dst_fb->y_stride, dst_fb->uv_stride, dst_fb->uv_stride,
1931                        dst_fb->alpha_stride};
1932
1933  for (y = 0; y < out_h; y += 16) {
1934    for (x = 0; x < out_w; x += 16) {
1935      for (i = 0; i < MAX_MB_PLANE; ++i) {
1936        const int factor = (i == 0 || i == 3 ? 1 : 2);
1937        const int x_q4 = x * (16 / factor) * in_w / out_w;
1938        const int y_q4 = y * (16 / factor) * in_h / out_h;
1939        const int src_stride = src_strides[i];
1940        const int dst_stride = dst_strides[i];
1941        uint8_t *src = srcs[i] + y / factor * in_h / out_h * src_stride +
1942                                 x / factor * in_w / out_w;
1943        uint8_t *dst = dsts[i] + y / factor * dst_stride + x / factor;
1944
1945        vp9_convolve8(src, src_stride, dst, dst_stride,
1946                      vp9_sub_pel_filters_8[x_q4 & 0xf], 16 * in_w / out_w,
1947                      vp9_sub_pel_filters_8[y_q4 & 0xf], 16 * in_h / out_h,
1948                      16 / factor, 16 / factor);
1949      }
1950    }
1951  }
1952
1953  vp8_yv12_extend_frame_borders(dst_fb);
1954}
1955
1956static int find_fp_qindex() {
1957  int i;
1958
1959  for (i = 0; i < QINDEX_RANGE; i++) {
1960    if (vp9_convert_qindex_to_q(i) >= 30.0) {
1961      break;
1962    }
1963  }
1964
1965  if (i == QINDEX_RANGE)
1966    i--;
1967
1968  return i;
1969}
1970
1971#define WRITE_RECON_BUFFER 0
1972#if WRITE_RECON_BUFFER
1973void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) {
1974  FILE *yframe;
1975  int i;
1976  char filename[255];
1977
1978  snprintf(filename, sizeof(filename), "cx\\y%04d.raw", this_frame);
1979  yframe = fopen(filename, "wb");
1980
1981  for (i = 0; i < frame->y_height; i++)
1982    fwrite(frame->y_buffer + i * frame->y_stride,
1983           frame->y_width, 1, yframe);
1984
1985  fclose(yframe);
1986  snprintf(filename, sizeof(filename), "cx\\u%04d.raw", this_frame);
1987  yframe = fopen(filename, "wb");
1988
1989  for (i = 0; i < frame->uv_height; i++)
1990    fwrite(frame->u_buffer + i * frame->uv_stride,
1991           frame->uv_width, 1, yframe);
1992
1993  fclose(yframe);
1994  snprintf(filename, sizeof(filename), "cx\\v%04d.raw", this_frame);
1995  yframe = fopen(filename, "wb");
1996
1997  for (i = 0; i < frame->uv_height; i++)
1998    fwrite(frame->v_buffer + i * frame->uv_stride,
1999           frame->uv_width, 1, yframe);
2000
2001  fclose(yframe);
2002}
2003#endif
2004
2005// Function to test for conditions that indicate we should loop
2006// back and recode a frame.
2007static int recode_loop_test(const VP9_COMP *cpi,
2008                            int high_limit, int low_limit,
2009                            int q, int maxq, int minq) {
2010  const VP9_COMMON *const cm = &cpi->common;
2011  const RATE_CONTROL *const rc = &cpi->rc;
2012  int force_recode = 0;
2013
2014  // Special case trap if maximum allowed frame size exceeded.
2015  if (rc->projected_frame_size > rc->max_frame_bandwidth) {
2016    force_recode = 1;
2017
2018  // Is frame recode allowed.
2019  // Yes if either recode mode 1 is selected or mode 2 is selected
2020  // and the frame is a key frame, golden frame or alt_ref_frame
2021  } else if ((cpi->sf.recode_loop == ALLOW_RECODE) ||
2022             ((cpi->sf.recode_loop == ALLOW_RECODE_KFARFGF) &&
2023              (cm->frame_type == KEY_FRAME ||
2024               cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
2025    // General over and under shoot tests
2026    if ((rc->projected_frame_size > high_limit && q < maxq) ||
2027        (rc->projected_frame_size < low_limit && q > minq)) {
2028      force_recode = 1;
2029    } else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2030      // Deal with frame undershoot and whether or not we are
2031      // below the automatically set cq level.
2032      if (q > cpi->cq_target_quality &&
2033          rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
2034        force_recode = 1;
2035      }
2036    }
2037  }
2038  return force_recode;
2039}
2040
2041void vp9_update_reference_frames(VP9_COMP *cpi) {
2042  VP9_COMMON * const cm = &cpi->common;
2043
2044  // At this point the new frame has been encoded.
2045  // If any buffer copy / swapping is signaled it should be done here.
2046  if (cm->frame_type == KEY_FRAME) {
2047    ref_cnt_fb(cm->frame_bufs,
2048               &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2049    ref_cnt_fb(cm->frame_bufs,
2050               &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2051  }
2052#if CONFIG_MULTIPLE_ARF
2053  else if (!cpi->multi_arf_enabled && cpi->refresh_golden_frame &&
2054      !cpi->refresh_alt_ref_frame) {
2055#else
2056  else if (cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame &&
2057           !cpi->use_svc) {
2058#endif
2059    /* Preserve the previously existing golden frame and update the frame in
2060     * the alt ref slot instead. This is highly specific to the current use of
2061     * alt-ref as a forward reference, and this needs to be generalized as
2062     * other uses are implemented (like RTC/temporal scaling)
2063     *
2064     * The update to the buffer in the alt ref slot was signaled in
2065     * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated
2066     * as the golden frame next time.
2067     */
2068    int tmp;
2069
2070    ref_cnt_fb(cm->frame_bufs,
2071               &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
2072
2073    tmp = cpi->alt_fb_idx;
2074    cpi->alt_fb_idx = cpi->gld_fb_idx;
2075    cpi->gld_fb_idx = tmp;
2076  }  else { /* For non key/golden frames */
2077    if (cpi->refresh_alt_ref_frame) {
2078      int arf_idx = cpi->alt_fb_idx;
2079#if CONFIG_MULTIPLE_ARF
2080      if (cpi->multi_arf_enabled) {
2081        arf_idx = cpi->arf_buffer_idx[cpi->sequence_number + 1];
2082      }
2083#endif
2084      ref_cnt_fb(cm->frame_bufs,
2085                 &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
2086    }
2087
2088    if (cpi->refresh_golden_frame) {
2089      ref_cnt_fb(cm->frame_bufs,
2090                 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
2091    }
2092  }
2093
2094  if (cpi->refresh_last_frame) {
2095    ref_cnt_fb(cm->frame_bufs,
2096               &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
2097  }
2098}
2099
2100static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
2101  MACROBLOCKD *xd = &cpi->mb.e_mbd;
2102  struct loopfilter *lf = &cm->lf;
2103  if (xd->lossless) {
2104      lf->filter_level = 0;
2105  } else {
2106    struct vpx_usec_timer timer;
2107
2108    vp9_clear_system_state();
2109
2110    vpx_usec_timer_start(&timer);
2111
2112    vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
2113
2114    vpx_usec_timer_mark(&timer);
2115    cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
2116  }
2117
2118  if (lf->filter_level > 0) {
2119    vp9_loop_filter_frame(cm, xd, lf->filter_level, 0, 0);
2120  }
2121
2122  vp9_extend_frame_inner_borders(cm->frame_to_show);
2123}
2124
2125void vp9_scale_references(VP9_COMP *cpi) {
2126  VP9_COMMON *cm = &cpi->common;
2127  MV_REFERENCE_FRAME ref_frame;
2128
2129  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2130    const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2131    YV12_BUFFER_CONFIG *const ref = &cm->frame_bufs[idx].buf;
2132
2133    if (ref->y_crop_width != cm->width ||
2134        ref->y_crop_height != cm->height) {
2135      const int new_fb = get_free_fb(cm);
2136      vp9_realloc_frame_buffer(&cm->frame_bufs[new_fb].buf,
2137                               cm->width, cm->height,
2138                               cm->subsampling_x, cm->subsampling_y,
2139                               VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2140      scale_and_extend_frame(ref, &cm->frame_bufs[new_fb].buf);
2141      cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
2142    } else {
2143      cpi->scaled_ref_idx[ref_frame - 1] = idx;
2144      cm->frame_bufs[idx].ref_count++;
2145    }
2146  }
2147}
2148
2149static void release_scaled_references(VP9_COMP *cpi) {
2150  VP9_COMMON *cm = &cpi->common;
2151  int i;
2152
2153  for (i = 0; i < 3; i++)
2154    cm->frame_bufs[cpi->scaled_ref_idx[i]].ref_count--;
2155}
2156
2157static void full_to_model_count(unsigned int *model_count,
2158                                unsigned int *full_count) {
2159  int n;
2160  model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
2161  model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
2162  model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
2163  for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
2164    model_count[TWO_TOKEN] += full_count[n];
2165  model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
2166}
2167
2168static void full_to_model_counts(vp9_coeff_count_model *model_count,
2169                                 vp9_coeff_count *full_count) {
2170  int i, j, k, l;
2171
2172  for (i = 0; i < PLANE_TYPES; ++i)
2173    for (j = 0; j < REF_TYPES; ++j)
2174      for (k = 0; k < COEF_BANDS; ++k)
2175        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
2176          full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
2177}
2178
2179#if 0 && CONFIG_INTERNAL_STATS
2180static void output_frame_level_debug_stats(VP9_COMP *cpi) {
2181  VP9_COMMON *const cm = &cpi->common;
2182  FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
2183  int recon_err;
2184
2185  vp9_clear_system_state();
2186
2187  recon_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2188
2189  if (cpi->twopass.total_left_stats.coded_error != 0.0)
2190    fprintf(f, "%10u %10d %10d %10d %10d %10d "
2191        "%10"PRId64" %10"PRId64" %10d "
2192        "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf"
2193        "%6d %6d %5d %5d %5d "
2194        "%10"PRId64" %10.3lf"
2195        "%10lf %8u %10d %10d %10d\n",
2196        cpi->common.current_video_frame, cpi->rc.this_frame_target,
2197        cpi->rc.projected_frame_size,
2198        cpi->rc.projected_frame_size / cpi->common.MBs,
2199        (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
2200        cpi->rc.total_target_vs_actual,
2201        (cpi->oxcf.starting_buffer_level - cpi->rc.bits_off_target),
2202        cpi->rc.total_actual_bits, cm->base_qindex,
2203        vp9_convert_qindex_to_q(cm->base_qindex),
2204        (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
2205        cpi->rc.avg_q,
2206        vp9_convert_qindex_to_q(cpi->rc.ni_av_qi),
2207        vp9_convert_qindex_to_q(cpi->cq_target_quality),
2208        cpi->refresh_last_frame, cpi->refresh_golden_frame,
2209        cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
2210        cpi->twopass.bits_left,
2211        cpi->twopass.total_left_stats.coded_error,
2212        cpi->twopass.bits_left /
2213            (1 + cpi->twopass.total_left_stats.coded_error),
2214        cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
2215        cpi->twopass.kf_zeromotion_pct);
2216
2217  fclose(f);
2218
2219  if (0) {
2220    FILE *const fmodes = fopen("Modes.stt", "a");
2221    int i;
2222
2223    fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
2224            cm->frame_type, cpi->refresh_golden_frame,
2225            cpi->refresh_alt_ref_frame);
2226
2227    for (i = 0; i < MAX_MODES; ++i)
2228      fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
2229
2230    fprintf(fmodes, "\n");
2231
2232    fclose(fmodes);
2233  }
2234}
2235#endif
2236
2237static void encode_without_recode_loop(VP9_COMP *cpi,
2238                                       size_t *size,
2239                                       uint8_t *dest,
2240                                       int q) {
2241  VP9_COMMON *const cm = &cpi->common;
2242  vp9_clear_system_state();
2243  vp9_set_quantizer(cm, q);
2244
2245  // Set up entropy context depending on frame type. The decoder mandates
2246  // the use of the default context, index 0, for keyframes and inter
2247  // frames where the error_resilient_mode or intra_only flag is set. For
2248  // other inter-frames the encoder currently uses only two contexts;
2249  // context 1 for ALTREF frames and context 0 for the others.
2250  if (cm->frame_type == KEY_FRAME) {
2251    setup_key_frame(cpi);
2252  } else {
2253    if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
2254      cm->frame_context_idx = cpi->refresh_alt_ref_frame;
2255
2256    setup_inter_frame(cm);
2257  }
2258  // Variance adaptive and in frame q adjustment experiments are mutually
2259  // exclusive.
2260  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2261    vp9_vaq_frame_setup(cpi);
2262  } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
2263    vp9_setup_in_frame_q_adj(cpi);
2264  } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2265    vp9_cyclic_refresh_setup(cpi);
2266  }
2267  // transform / motion compensation build reconstruction frame
2268  vp9_encode_frame(cpi);
2269
2270  // Update the skip mb flag probabilities based on the distribution
2271  // seen in the last encoder iteration.
2272  // update_base_skip_probs(cpi);
2273  vp9_clear_system_state();
2274}
2275
2276static void encode_with_recode_loop(VP9_COMP *cpi,
2277                                    size_t *size,
2278                                    uint8_t *dest,
2279                                    int q,
2280                                    int bottom_index,
2281                                    int top_index) {
2282  VP9_COMMON *const cm = &cpi->common;
2283  RATE_CONTROL *const rc = &cpi->rc;
2284  int loop_count = 0;
2285  int loop = 0;
2286  int overshoot_seen = 0;
2287  int undershoot_seen = 0;
2288  int q_low = bottom_index, q_high = top_index;
2289  int frame_over_shoot_limit;
2290  int frame_under_shoot_limit;
2291
2292  // Decide frame size bounds
2293  vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
2294                                   &frame_under_shoot_limit,
2295                                   &frame_over_shoot_limit);
2296
2297  do {
2298    vp9_clear_system_state();
2299
2300    vp9_set_quantizer(cm, q);
2301
2302    if (loop_count == 0) {
2303      // Set up entropy context depending on frame type. The decoder mandates
2304      // the use of the default context, index 0, for keyframes and inter
2305      // frames where the error_resilient_mode or intra_only flag is set. For
2306      // other inter-frames the encoder currently uses only two contexts;
2307      // context 1 for ALTREF frames and context 0 for the others.
2308      if (cm->frame_type == KEY_FRAME) {
2309        setup_key_frame(cpi);
2310      } else {
2311        if (!cm->intra_only && !cm->error_resilient_mode && !cpi->use_svc)
2312          cpi->common.frame_context_idx = cpi->refresh_alt_ref_frame;
2313
2314        setup_inter_frame(cm);
2315      }
2316    }
2317
2318    // Variance adaptive and in frame q adjustment experiments are mutually
2319    // exclusive.
2320    if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
2321      vp9_vaq_frame_setup(cpi);
2322    } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
2323      vp9_setup_in_frame_q_adj(cpi);
2324    }
2325
2326    // transform / motion compensation build reconstruction frame
2327    vp9_encode_frame(cpi);
2328
2329    // Update the skip mb flag probabilities based on the distribution
2330    // seen in the last encoder iteration.
2331    // update_base_skip_probs(cpi);
2332
2333    vp9_clear_system_state();
2334
2335    // Dummy pack of the bitstream using up to date stats to get an
2336    // accurate estimate of output frame size to determine if we need
2337    // to recode.
2338    if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
2339      vp9_save_coding_context(cpi);
2340      cpi->dummy_packing = 1;
2341      if (!cpi->sf.use_nonrd_pick_mode)
2342        vp9_pack_bitstream(cpi, dest, size);
2343
2344      rc->projected_frame_size = (int)(*size) << 3;
2345      vp9_restore_coding_context(cpi);
2346
2347      if (frame_over_shoot_limit == 0)
2348        frame_over_shoot_limit = 1;
2349    }
2350
2351    if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2352      loop = 0;
2353    } else {
2354      if ((cm->frame_type == KEY_FRAME) &&
2355           rc->this_key_frame_forced &&
2356           (rc->projected_frame_size < rc->max_frame_bandwidth)) {
2357        int last_q = q;
2358        int kf_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2359
2360        int high_err_target = cpi->ambient_err;
2361        int low_err_target = cpi->ambient_err >> 1;
2362
2363        // Prevent possible divide by zero error below for perfect KF
2364        kf_err += !kf_err;
2365
2366        // The key frame is not good enough or we can afford
2367        // to make it better without undue risk of popping.
2368        if ((kf_err > high_err_target &&
2369             rc->projected_frame_size <= frame_over_shoot_limit) ||
2370            (kf_err > low_err_target &&
2371             rc->projected_frame_size <= frame_under_shoot_limit)) {
2372          // Lower q_high
2373          q_high = q > q_low ? q - 1 : q_low;
2374
2375          // Adjust Q
2376          q = (q * high_err_target) / kf_err;
2377          q = MIN(q, (q_high + q_low) >> 1);
2378        } else if (kf_err < low_err_target &&
2379                   rc->projected_frame_size >= frame_under_shoot_limit) {
2380          // The key frame is much better than the previous frame
2381          // Raise q_low
2382          q_low = q < q_high ? q + 1 : q_high;
2383
2384          // Adjust Q
2385          q = (q * low_err_target) / kf_err;
2386          q = MIN(q, (q_high + q_low + 1) >> 1);
2387        }
2388
2389        // Clamp Q to upper and lower limits:
2390        q = clamp(q, q_low, q_high);
2391
2392        loop = q != last_q;
2393      } else if (recode_loop_test(
2394          cpi, frame_over_shoot_limit, frame_under_shoot_limit,
2395          q, MAX(q_high, top_index), bottom_index)) {
2396        // Is the projected frame size out of range and are we allowed
2397        // to attempt to recode.
2398        int last_q = q;
2399        int retries = 0;
2400
2401        // Frame size out of permitted range:
2402        // Update correction factor & compute new Q to try...
2403
2404        // Frame is too large
2405        if (rc->projected_frame_size > rc->this_frame_target) {
2406          // Special case if the projected size is > the max allowed.
2407          if (rc->projected_frame_size >= rc->max_frame_bandwidth)
2408            q_high = rc->worst_quality;
2409
2410          // Raise Qlow as to at least the current value
2411          q_low = q < q_high ? q + 1 : q_high;
2412
2413          if (undershoot_seen || loop_count > 1) {
2414            // Update rate_correction_factor unless
2415            vp9_rc_update_rate_correction_factors(cpi, 1);
2416
2417            q = (q_high + q_low + 1) / 2;
2418          } else {
2419            // Update rate_correction_factor unless
2420            vp9_rc_update_rate_correction_factors(cpi, 0);
2421
2422            q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2423                                   bottom_index, MAX(q_high, top_index));
2424
2425            while (q < q_low && retries < 10) {
2426              vp9_rc_update_rate_correction_factors(cpi, 0);
2427              q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2428                                     bottom_index, MAX(q_high, top_index));
2429              retries++;
2430            }
2431          }
2432
2433          overshoot_seen = 1;
2434        } else {
2435          // Frame is too small
2436          q_high = q > q_low ? q - 1 : q_low;
2437
2438          if (overshoot_seen || loop_count > 1) {
2439            vp9_rc_update_rate_correction_factors(cpi, 1);
2440            q = (q_high + q_low) / 2;
2441          } else {
2442            vp9_rc_update_rate_correction_factors(cpi, 0);
2443            q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2444                                   bottom_index, top_index);
2445            // Special case reset for qlow for constrained quality.
2446            // This should only trigger where there is very substantial
2447            // undershoot on a frame and the auto cq level is above
2448            // the user passsed in value.
2449            if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
2450                q < q_low) {
2451              q_low = q;
2452            }
2453
2454            while (q > q_high && retries < 10) {
2455              vp9_rc_update_rate_correction_factors(cpi, 0);
2456              q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
2457                                     bottom_index, top_index);
2458              retries++;
2459            }
2460          }
2461
2462          undershoot_seen = 1;
2463        }
2464
2465        // Clamp Q to upper and lower limits:
2466        q = clamp(q, q_low, q_high);
2467
2468        loop = q != last_q;
2469      } else {
2470        loop = 0;
2471      }
2472    }
2473
2474    // Special case for overlay frame.
2475    if (rc->is_src_frame_alt_ref &&
2476        rc->projected_frame_size < rc->max_frame_bandwidth)
2477      loop = 0;
2478
2479    if (loop) {
2480      loop_count++;
2481
2482#if CONFIG_INTERNAL_STATS
2483      cpi->tot_recode_hits++;
2484#endif
2485    }
2486  } while (loop);
2487}
2488
2489static void get_ref_frame_flags(VP9_COMP *cpi) {
2490  if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
2491    cpi->gold_is_last = 1;
2492  else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
2493    cpi->gold_is_last = 0;
2494
2495  if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
2496    cpi->alt_is_last = 1;
2497  else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
2498    cpi->alt_is_last = 0;
2499
2500  if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
2501    cpi->gold_is_alt = 1;
2502  else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
2503    cpi->gold_is_alt = 0;
2504
2505  cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
2506
2507  if (cpi->gold_is_last)
2508    cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2509
2510  if (cpi->rc.frames_till_gf_update_due == INT_MAX)
2511    cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2512
2513  if (cpi->alt_is_last)
2514    cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2515
2516  if (cpi->gold_is_alt)
2517    cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2518}
2519
2520static void set_ext_overrides(VP9_COMP *cpi) {
2521  // Overrides the defaults with the externally supplied values with
2522  // vp9_update_reference() and vp9_update_entropy() calls
2523  // Note: The overrides are valid only for the next frame passed
2524  // to encode_frame_to_data_rate() function
2525  if (cpi->ext_refresh_frame_context_pending) {
2526    cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context;
2527    cpi->ext_refresh_frame_context_pending = 0;
2528  }
2529  if (cpi->ext_refresh_frame_flags_pending) {
2530    cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
2531    cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
2532    cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
2533    cpi->ext_refresh_frame_flags_pending = 0;
2534  }
2535}
2536
2537static void encode_frame_to_data_rate(VP9_COMP *cpi,
2538                                      size_t *size,
2539                                      uint8_t *dest,
2540                                      unsigned int *frame_flags) {
2541  VP9_COMMON *const cm = &cpi->common;
2542  TX_SIZE t;
2543  int q;
2544  int top_index;
2545  int bottom_index;
2546
2547  const SPEED_FEATURES *const sf = &cpi->sf;
2548  const unsigned int max_mv_def = MIN(cm->width, cm->height);
2549  struct segmentation *const seg = &cm->seg;
2550
2551  set_ext_overrides(cpi);
2552
2553  /* Scale the source buffer, if required. */
2554  if (cm->mi_cols * MI_SIZE != cpi->un_scaled_source->y_width ||
2555      cm->mi_rows * MI_SIZE != cpi->un_scaled_source->y_height) {
2556    scale_and_extend_frame_nonnormative(cpi->un_scaled_source,
2557                                        &cpi->scaled_source);
2558    cpi->Source = &cpi->scaled_source;
2559  } else {
2560    cpi->Source = cpi->un_scaled_source;
2561  }
2562
2563  // Scale the last source buffer, if required.
2564  if (cpi->unscaled_last_source != NULL) {
2565    if (cm->mi_cols * MI_SIZE != cpi->unscaled_last_source->y_width ||
2566        cm->mi_rows * MI_SIZE != cpi->unscaled_last_source->y_height) {
2567      scale_and_extend_frame_nonnormative(cpi->unscaled_last_source,
2568                                          &cpi->scaled_last_source);
2569      cpi->Last_Source = &cpi->scaled_last_source;
2570    } else {
2571      cpi->Last_Source = cpi->unscaled_last_source;
2572    }
2573  }
2574
2575  vp9_scale_references(cpi);
2576
2577  vp9_clear_system_state();
2578
2579  // Enable or disable mode based tweaking of the zbin.
2580  // For 2 pass only used where GF/ARF prediction quality
2581  // is above a threshold.
2582  cpi->zbin_mode_boost = 0;
2583  cpi->zbin_mode_boost_enabled = 0;
2584
2585  // Current default encoder behavior for the altref sign bias.
2586  cm->ref_frame_sign_bias[ALTREF_FRAME] = cpi->rc.source_alt_ref_active;
2587
2588  // Set default state for segment based loop filter update flags.
2589  cm->lf.mode_ref_delta_update = 0;
2590
2591  // Initialize cpi->mv_step_param to default based on max resolution.
2592  cpi->mv_step_param = vp9_init_search_range(cpi, max_mv_def);
2593  // Initialize cpi->max_mv_magnitude and cpi->mv_step_param if appropriate.
2594  if (sf->auto_mv_step_size) {
2595    if (frame_is_intra_only(cm)) {
2596      // Initialize max_mv_magnitude for use in the first INTER frame
2597      // after a key/intra-only frame.
2598      cpi->max_mv_magnitude = max_mv_def;
2599    } else {
2600      if (cm->show_frame)
2601        // Allow mv_steps to correspond to twice the max mv magnitude found
2602        // in the previous frame, capped by the default max_mv_magnitude based
2603        // on resolution.
2604        cpi->mv_step_param = vp9_init_search_range(cpi, MIN(max_mv_def, 2 *
2605                                 cpi->max_mv_magnitude));
2606      cpi->max_mv_magnitude = 0;
2607    }
2608  }
2609
2610  // Set various flags etc to special state if it is a key frame.
2611  if (frame_is_intra_only(cm)) {
2612    setup_key_frame(cpi);
2613    // Reset the loop filter deltas and segmentation map.
2614    vp9_reset_segment_features(&cm->seg);
2615
2616    // If segmentation is enabled force a map update for key frames.
2617    if (seg->enabled) {
2618      seg->update_map = 1;
2619      seg->update_data = 1;
2620    }
2621
2622    // The alternate reference frame cannot be active for a key frame.
2623    cpi->rc.source_alt_ref_active = 0;
2624
2625    cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
2626    cm->frame_parallel_decoding_mode =
2627      (cpi->oxcf.frame_parallel_decoding_mode != 0);
2628
2629    // By default, encoder assumes decoder can use prev_mi.
2630    cm->coding_use_prev_mi = 1;
2631    if (cm->error_resilient_mode) {
2632      cm->coding_use_prev_mi = 0;
2633      cm->frame_parallel_decoding_mode = 1;
2634      cm->reset_frame_context = 0;
2635      cm->refresh_frame_context = 0;
2636    } else if (cm->intra_only) {
2637      // Only reset the current context.
2638      cm->reset_frame_context = 2;
2639    }
2640  }
2641
2642  // Configure experimental use of segmentation for enhanced coding of
2643  // static regions if indicated.
2644  // Only allowed in second pass of two pass (as requires lagged coding)
2645  // and if the relevant speed feature flag is set.
2646  if (cpi->pass == 2 && cpi->sf.static_segmentation)
2647    configure_static_seg_features(cpi);
2648
2649  // For 1 pass CBR, check if we are dropping this frame.
2650  // Never drop on key frame.
2651  if (cpi->pass == 0 &&
2652      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
2653      cm->frame_type != KEY_FRAME) {
2654    if (vp9_rc_drop_frame(cpi)) {
2655      vp9_rc_postencode_update_drop_frame(cpi);
2656      ++cm->current_video_frame;
2657      return;
2658    }
2659  }
2660
2661  vp9_clear_system_state();
2662
2663  vp9_zero(cpi->rd_tx_select_threshes);
2664
2665#if CONFIG_VP9_POSTPROC
2666  if (cpi->oxcf.noise_sensitivity > 0) {
2667    int l = 0;
2668    switch (cpi->oxcf.noise_sensitivity) {
2669      case 1:
2670        l = 20;
2671        break;
2672      case 2:
2673        l = 40;
2674        break;
2675      case 3:
2676        l = 60;
2677        break;
2678      case 4:
2679      case 5:
2680        l = 100;
2681        break;
2682      case 6:
2683        l = 150;
2684        break;
2685    }
2686    vp9_denoise(cpi->Source, cpi->Source, l);
2687  }
2688#endif
2689
2690#ifdef OUTPUT_YUV_SRC
2691  vp9_write_yuv_frame(cpi->Source);
2692#endif
2693
2694  set_speed_features(cpi);
2695
2696  // Decide q and q bounds.
2697  q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index);
2698
2699  if (!frame_is_intra_only(cm)) {
2700    cm->interp_filter = DEFAULT_INTERP_FILTER;
2701    /* TODO: Decide this more intelligently */
2702    set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH);
2703  }
2704
2705  if (cpi->sf.recode_loop == DISALLOW_RECODE) {
2706    encode_without_recode_loop(cpi, size, dest, q);
2707  } else {
2708    encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index);
2709  }
2710
2711  // Special case code to reduce pulsing when key frames are forced at a
2712  // fixed interval. Note the reconstruction error if it is the frame before
2713  // the force key frame
2714  if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
2715    cpi->ambient_err = vp9_calc_ss_err(cpi->Source, get_frame_new_buffer(cm));
2716  }
2717
2718  // If the encoder forced a KEY_FRAME decision
2719  if (cm->frame_type == KEY_FRAME)
2720    cpi->refresh_last_frame = 1;
2721
2722  cm->frame_to_show = get_frame_new_buffer(cm);
2723
2724#if WRITE_RECON_BUFFER
2725  if (cm->show_frame)
2726    write_cx_frame_to_file(cm->frame_to_show,
2727                           cm->current_video_frame);
2728  else
2729    write_cx_frame_to_file(cm->frame_to_show,
2730                           cm->current_video_frame + 1000);
2731#endif
2732
2733  // Pick the loop filter level for the frame.
2734  loopfilter_frame(cpi, cm);
2735
2736#if WRITE_RECON_BUFFER
2737  if (cm->show_frame)
2738    write_cx_frame_to_file(cm->frame_to_show,
2739                           cm->current_video_frame + 2000);
2740  else
2741    write_cx_frame_to_file(cm->frame_to_show,
2742                           cm->current_video_frame + 3000);
2743#endif
2744
2745  // build the bitstream
2746  cpi->dummy_packing = 0;
2747  vp9_pack_bitstream(cpi, dest, size);
2748
2749  if (cm->seg.update_map)
2750    update_reference_segmentation_map(cpi);
2751
2752  release_scaled_references(cpi);
2753  vp9_update_reference_frames(cpi);
2754
2755  for (t = TX_4X4; t <= TX_32X32; t++)
2756    full_to_model_counts(cm->counts.coef[t], cpi->coef_counts[t]);
2757
2758  if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode)
2759    vp9_adapt_coef_probs(cm);
2760
2761  if (!frame_is_intra_only(cm)) {
2762    if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
2763      vp9_adapt_mode_probs(cm);
2764      vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
2765    }
2766  }
2767
2768#if 0
2769  output_frame_level_debug_stats(cpi);
2770#endif
2771  if (cpi->refresh_golden_frame == 1)
2772    cm->frame_flags |= FRAMEFLAGS_GOLDEN;
2773  else
2774    cm->frame_flags &= ~FRAMEFLAGS_GOLDEN;
2775
2776  if (cpi->refresh_alt_ref_frame == 1)
2777    cm->frame_flags |= FRAMEFLAGS_ALTREF;
2778  else
2779    cm->frame_flags &= ~FRAMEFLAGS_ALTREF;
2780
2781  get_ref_frame_flags(cpi);
2782
2783  vp9_rc_postencode_update(cpi, *size);
2784
2785  if (cm->frame_type == KEY_FRAME) {
2786    // Tell the caller that the frame was coded as a key frame
2787    *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
2788
2789#if CONFIG_MULTIPLE_ARF
2790    // Reset the sequence number.
2791    if (cpi->multi_arf_enabled) {
2792      cpi->sequence_number = 0;
2793      cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2794      cpi->new_frame_coding_order_period = -1;
2795    }
2796#endif
2797  } else {
2798    *frame_flags = cm->frame_flags&~FRAMEFLAGS_KEY;
2799
2800#if CONFIG_MULTIPLE_ARF
2801    /* Increment position in the coded frame sequence. */
2802    if (cpi->multi_arf_enabled) {
2803      ++cpi->sequence_number;
2804      if (cpi->sequence_number >= cpi->frame_coding_order_period) {
2805        cpi->sequence_number = 0;
2806        cpi->frame_coding_order_period = cpi->new_frame_coding_order_period;
2807        cpi->new_frame_coding_order_period = -1;
2808      }
2809      cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
2810      assert(cpi->this_frame_weight >= 0);
2811    }
2812#endif
2813  }
2814
2815  // Clear the one shot update flags for segmentation map and mode/ref loop
2816  // filter deltas.
2817  cm->seg.update_map = 0;
2818  cm->seg.update_data = 0;
2819  cm->lf.mode_ref_delta_update = 0;
2820
2821  // keep track of the last coded dimensions
2822  cm->last_width = cm->width;
2823  cm->last_height = cm->height;
2824
2825  // reset to normal state now that we are done.
2826  if (!cm->show_existing_frame)
2827    cm->last_show_frame = cm->show_frame;
2828
2829  if (cm->show_frame) {
2830    vp9_swap_mi_and_prev_mi(cm);
2831
2832    // Don't increment frame counters if this was an altref buffer
2833    // update not a real frame
2834    ++cm->current_video_frame;
2835    if (cpi->use_svc) {
2836      LAYER_CONTEXT *lc;
2837      if (cpi->svc.number_temporal_layers > 1) {
2838        lc = &cpi->svc.layer_context[cpi->svc.temporal_layer_id];
2839      } else {
2840        lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id];
2841      }
2842      ++lc->current_video_frame_in_layer;
2843    }
2844  }
2845
2846  // restore prev_mi
2847  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
2848  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
2849}
2850
2851static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2852                      unsigned int *frame_flags) {
2853  vp9_rc_get_svc_params(cpi);
2854  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2855}
2856
2857static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2858                        unsigned int *frame_flags) {
2859  if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
2860    vp9_rc_get_one_pass_cbr_params(cpi);
2861  } else {
2862    vp9_rc_get_one_pass_vbr_params(cpi);
2863  }
2864  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2865}
2866
2867static void Pass1Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
2868                        unsigned int *frame_flags) {
2869  (void) size;
2870  (void) dest;
2871  (void) frame_flags;
2872
2873  vp9_rc_get_first_pass_params(cpi);
2874  vp9_set_quantizer(&cpi->common, find_fp_qindex());
2875  vp9_first_pass(cpi);
2876}
2877
2878static void Pass2Encode(VP9_COMP *cpi, size_t *size,
2879                        uint8_t *dest, unsigned int *frame_flags) {
2880  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2881
2882  vp9_rc_get_second_pass_params(cpi);
2883  encode_frame_to_data_rate(cpi, size, dest, frame_flags);
2884
2885  vp9_twopass_postencode_update(cpi);
2886}
2887
2888static void check_initial_width(VP9_COMP *cpi, int subsampling_x,
2889                                int subsampling_y) {
2890  VP9_COMMON *const cm = &cpi->common;
2891
2892  if (!cpi->initial_width) {
2893    cm->subsampling_x = subsampling_x;
2894    cm->subsampling_y = subsampling_y;
2895    alloc_raw_frame_buffers(cpi);
2896    cpi->initial_width = cm->width;
2897    cpi->initial_height = cm->height;
2898  }
2899}
2900
2901
2902int vp9_receive_raw_frame(VP9_COMP *cpi, unsigned int frame_flags,
2903                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
2904                          int64_t end_time) {
2905  VP9_COMMON *cm = &cpi->common;
2906  struct vpx_usec_timer timer;
2907  int res = 0;
2908  const int subsampling_x = sd->uv_width  < sd->y_width;
2909  const int subsampling_y = sd->uv_height < sd->y_height;
2910
2911  check_initial_width(cpi, subsampling_x, subsampling_y);
2912  vpx_usec_timer_start(&timer);
2913  if (vp9_lookahead_push(cpi->lookahead,
2914                         sd, time_stamp, end_time, frame_flags))
2915    res = -1;
2916  vpx_usec_timer_mark(&timer);
2917  cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
2918
2919  if (cm->version == 0 && (subsampling_x != 1 || subsampling_y != 1)) {
2920    vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
2921                       "Non-4:2:0 color space requires profile >= 1");
2922    res = -1;
2923  }
2924
2925  return res;
2926}
2927
2928
2929static int frame_is_reference(const VP9_COMP *cpi) {
2930  const VP9_COMMON *cm = &cpi->common;
2931
2932  return cm->frame_type == KEY_FRAME ||
2933         cpi->refresh_last_frame ||
2934         cpi->refresh_golden_frame ||
2935         cpi->refresh_alt_ref_frame ||
2936         cm->refresh_frame_context ||
2937         cm->lf.mode_ref_delta_update ||
2938         cm->seg.update_map ||
2939         cm->seg.update_data;
2940}
2941
2942#if CONFIG_MULTIPLE_ARF
2943int is_next_frame_arf(VP9_COMP *cpi) {
2944  // Negative entry in frame_coding_order indicates an ARF at this position.
2945  return cpi->frame_coding_order[cpi->sequence_number + 1] < 0 ? 1 : 0;
2946}
2947#endif
2948
2949void adjust_frame_rate(VP9_COMP *cpi) {
2950  int64_t this_duration;
2951  int step = 0;
2952
2953  if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
2954    this_duration = cpi->source->ts_end - cpi->source->ts_start;
2955    step = 1;
2956  } else {
2957    int64_t last_duration = cpi->last_end_time_stamp_seen
2958        - cpi->last_time_stamp_seen;
2959
2960    this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
2961
2962    // do a step update if the duration changes by 10%
2963    if (last_duration)
2964      step = (int)((this_duration - last_duration) * 10 / last_duration);
2965  }
2966
2967  if (this_duration) {
2968    if (step) {
2969      vp9_new_framerate(cpi, 10000000.0 / this_duration);
2970    } else {
2971      // Average this frame's rate into the last second's average
2972      // frame rate. If we haven't seen 1 second yet, then average
2973      // over the whole interval seen.
2974      const double interval = MIN((double)(cpi->source->ts_end
2975                                   - cpi->first_time_stamp_ever), 10000000.0);
2976      double avg_duration = 10000000.0 / cpi->oxcf.framerate;
2977      avg_duration *= (interval - avg_duration + this_duration);
2978      avg_duration /= interval;
2979
2980      vp9_new_framerate(cpi, 10000000.0 / avg_duration);
2981    }
2982  }
2983  cpi->last_time_stamp_seen = cpi->source->ts_start;
2984  cpi->last_end_time_stamp_seen = cpi->source->ts_end;
2985}
2986
2987int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
2988                            size_t *size, uint8_t *dest,
2989                            int64_t *time_stamp, int64_t *time_end, int flush) {
2990  VP9_COMMON *const cm = &cpi->common;
2991  MACROBLOCKD *const xd = &cpi->mb.e_mbd;
2992  RATE_CONTROL *const rc = &cpi->rc;
2993  struct vpx_usec_timer  cmptimer;
2994  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
2995  MV_REFERENCE_FRAME ref_frame;
2996
2997  if (!cpi)
2998    return -1;
2999
3000  if (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2) {
3001    vp9_restore_layer_context(cpi);
3002  }
3003
3004  vpx_usec_timer_start(&cmptimer);
3005
3006  cpi->source = NULL;
3007  cpi->last_source = NULL;
3008
3009  set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
3010
3011  // Normal defaults
3012  cm->reset_frame_context = 0;
3013  cm->refresh_frame_context = 1;
3014  cpi->refresh_last_frame = 1;
3015  cpi->refresh_golden_frame = 0;
3016  cpi->refresh_alt_ref_frame = 0;
3017
3018  // Should we code an alternate reference frame.
3019  if (cpi->oxcf.play_alternate && rc->source_alt_ref_pending) {
3020    int frames_to_arf;
3021
3022#if CONFIG_MULTIPLE_ARF
3023    assert(!cpi->multi_arf_enabled ||
3024           cpi->frame_coding_order[cpi->sequence_number] < 0);
3025
3026    if (cpi->multi_arf_enabled && (cpi->pass == 2))
3027      frames_to_arf = (-cpi->frame_coding_order[cpi->sequence_number])
3028          - cpi->next_frame_in_order;
3029    else
3030#endif
3031      frames_to_arf = rc->frames_till_gf_update_due;
3032
3033    assert(frames_to_arf <= rc->frames_to_key);
3034
3035    if ((cpi->source = vp9_lookahead_peek(cpi->lookahead, frames_to_arf))) {
3036#if CONFIG_MULTIPLE_ARF
3037      cpi->alt_ref_source[cpi->arf_buffered] = cpi->source;
3038#else
3039      cpi->alt_ref_source = cpi->source;
3040#endif
3041
3042      if (cpi->oxcf.arnr_max_frames > 0) {
3043        // Produce the filtered ARF frame.
3044        // TODO(agrange) merge these two functions.
3045        vp9_configure_arnr_filter(cpi, frames_to_arf, rc->gfu_boost);
3046        vp9_temporal_filter_prepare(cpi, frames_to_arf);
3047        vp9_extend_frame_borders(&cpi->alt_ref_buffer);
3048        force_src_buffer = &cpi->alt_ref_buffer;
3049      }
3050
3051      cm->show_frame = 0;
3052      cpi->refresh_alt_ref_frame = 1;
3053      cpi->refresh_golden_frame = 0;
3054      cpi->refresh_last_frame = 0;
3055      rc->is_src_frame_alt_ref = 0;
3056
3057#if CONFIG_MULTIPLE_ARF
3058      if (!cpi->multi_arf_enabled)
3059#endif
3060        rc->source_alt_ref_pending = 0;
3061    } else {
3062      rc->source_alt_ref_pending = 0;
3063    }
3064  }
3065
3066  if (!cpi->source) {
3067#if CONFIG_MULTIPLE_ARF
3068    int i;
3069#endif
3070
3071    // Get last frame source.
3072    if (cm->current_video_frame > 0) {
3073      if ((cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
3074        return -1;
3075    }
3076
3077    if ((cpi->source = vp9_lookahead_pop(cpi->lookahead, flush))) {
3078      cm->show_frame = 1;
3079      cm->intra_only = 0;
3080
3081#if CONFIG_MULTIPLE_ARF
3082      // Is this frame the ARF overlay.
3083      rc->is_src_frame_alt_ref = 0;
3084      for (i = 0; i < cpi->arf_buffered; ++i) {
3085        if (cpi->source == cpi->alt_ref_source[i]) {
3086          rc->is_src_frame_alt_ref = 1;
3087          cpi->refresh_golden_frame = 1;
3088          break;
3089        }
3090      }
3091#else
3092      rc->is_src_frame_alt_ref = cpi->alt_ref_source &&
3093                                 (cpi->source == cpi->alt_ref_source);
3094#endif
3095      if (rc->is_src_frame_alt_ref) {
3096        // Current frame is an ARF overlay frame.
3097#if CONFIG_MULTIPLE_ARF
3098        cpi->alt_ref_source[i] = NULL;
3099#else
3100        cpi->alt_ref_source = NULL;
3101#endif
3102        // Don't refresh the last buffer for an ARF overlay frame. It will
3103        // become the GF so preserve last as an alternative prediction option.
3104        cpi->refresh_last_frame = 0;
3105      }
3106#if CONFIG_MULTIPLE_ARF
3107      ++cpi->next_frame_in_order;
3108#endif
3109    }
3110  }
3111
3112  if (cpi->source) {
3113    cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
3114                                                           : &cpi->source->img;
3115
3116  if (cpi->last_source != NULL) {
3117    cpi->unscaled_last_source = &cpi->last_source->img;
3118  } else {
3119    cpi->unscaled_last_source = NULL;
3120  }
3121
3122    *time_stamp = cpi->source->ts_start;
3123    *time_end = cpi->source->ts_end;
3124    *frame_flags = cpi->source->flags;
3125
3126#if CONFIG_MULTIPLE_ARF
3127    if (cm->frame_type != KEY_FRAME && cpi->pass == 2)
3128      rc->source_alt_ref_pending = is_next_frame_arf(cpi);
3129#endif
3130  } else {
3131    *size = 0;
3132    if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
3133      vp9_end_first_pass(cpi);    /* get last stats packet */
3134      cpi->twopass.first_pass_done = 1;
3135    }
3136    return -1;
3137  }
3138
3139  if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
3140    cpi->first_time_stamp_ever = cpi->source->ts_start;
3141    cpi->last_end_time_stamp_seen = cpi->source->ts_start;
3142  }
3143
3144  // adjust frame rates based on timestamps given
3145  if (cm->show_frame) {
3146    adjust_frame_rate(cpi);
3147  }
3148
3149  if (cpi->svc.number_temporal_layers > 1 &&
3150      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
3151    vp9_update_temporal_layer_framerate(cpi);
3152    vp9_restore_layer_context(cpi);
3153  }
3154
3155  // start with a 0 size frame
3156  *size = 0;
3157
3158  // Clear down mmx registers
3159  vp9_clear_system_state();
3160
3161  /* find a free buffer for the new frame, releasing the reference previously
3162   * held.
3163   */
3164  cm->frame_bufs[cm->new_fb_idx].ref_count--;
3165  cm->new_fb_idx = get_free_fb(cm);
3166
3167#if CONFIG_MULTIPLE_ARF
3168  /* Set up the correct ARF frame. */
3169  if (cpi->refresh_alt_ref_frame) {
3170    ++cpi->arf_buffered;
3171  }
3172  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
3173      (cpi->pass == 2)) {
3174    cpi->alt_fb_idx = cpi->arf_buffer_idx[cpi->sequence_number];
3175  }
3176#endif
3177
3178  cm->frame_flags = *frame_flags;
3179
3180  // Reset the frame pointers to the current frame size
3181  vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
3182                           cm->width, cm->height,
3183                           cm->subsampling_x, cm->subsampling_y,
3184                           VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
3185
3186  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3187    const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
3188    YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
3189    RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3190    ref_buf->buf = buf;
3191    ref_buf->idx = idx;
3192    vp9_setup_scale_factors_for_frame(&ref_buf->sf,
3193                                      buf->y_crop_width, buf->y_crop_height,
3194                                      cm->width, cm->height);
3195
3196    if (vp9_is_scaled(&ref_buf->sf))
3197      vp9_extend_frame_borders(buf);
3198  }
3199
3200  set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3201
3202  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
3203    vp9_vaq_init();
3204  }
3205
3206  if (cpi->pass == 1 &&
3207      (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3208    Pass1Encode(cpi, size, dest, frame_flags);
3209  } else if (cpi->pass == 2 &&
3210      (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) {
3211    Pass2Encode(cpi, size, dest, frame_flags);
3212  } else if (cpi->use_svc) {
3213    SvcEncode(cpi, size, dest, frame_flags);
3214  } else {
3215    // One pass encode
3216    Pass0Encode(cpi, size, dest, frame_flags);
3217  }
3218
3219  if (cm->refresh_frame_context)
3220    cm->frame_contexts[cm->frame_context_idx] = cm->fc;
3221
3222  // Frame was dropped, release scaled references.
3223  if (*size == 0) {
3224    release_scaled_references(cpi);
3225  }
3226
3227  if (*size > 0) {
3228    cpi->droppable = !frame_is_reference(cpi);
3229  }
3230
3231  // Save layer specific state.
3232  if ((cpi->svc.number_temporal_layers > 1 &&
3233      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ||
3234      (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) {
3235    vp9_save_layer_context(cpi);
3236  }
3237
3238  vpx_usec_timer_mark(&cmptimer);
3239  cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
3240
3241  if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame)
3242    generate_psnr_packet(cpi);
3243
3244#if CONFIG_INTERNAL_STATS
3245
3246  if (cpi->pass != 1) {
3247    cpi->bytes += (int)(*size);
3248
3249    if (cm->show_frame) {
3250      cpi->count++;
3251
3252      if (cpi->b_calculate_psnr) {
3253        YV12_BUFFER_CONFIG *orig = cpi->Source;
3254        YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
3255        YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
3256        PSNR_STATS psnr;
3257        calc_psnr(orig, recon, &psnr);
3258
3259        cpi->total += psnr.psnr[0];
3260        cpi->total_y += psnr.psnr[1];
3261        cpi->total_u += psnr.psnr[2];
3262        cpi->total_v += psnr.psnr[3];
3263        cpi->total_sq_error += psnr.sse[0];
3264        cpi->total_samples += psnr.samples[0];
3265
3266        {
3267          PSNR_STATS psnr2;
3268          double frame_ssim2 = 0, weight = 0;
3269#if CONFIG_VP9_POSTPROC
3270          vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer,
3271                      cm->lf.filter_level * 10 / 6);
3272#endif
3273          vp9_clear_system_state();
3274
3275          calc_psnr(orig, pp, &psnr2);
3276
3277          cpi->totalp += psnr2.psnr[0];
3278          cpi->totalp_y += psnr2.psnr[1];
3279          cpi->totalp_u += psnr2.psnr[2];
3280          cpi->totalp_v += psnr2.psnr[3];
3281          cpi->totalp_sq_error += psnr2.sse[0];
3282          cpi->totalp_samples += psnr2.samples[0];
3283
3284          frame_ssim2 = vp9_calc_ssim(orig, recon, 1, &weight);
3285
3286          cpi->summed_quality += frame_ssim2 * weight;
3287          cpi->summed_weights += weight;
3288
3289          frame_ssim2 = vp9_calc_ssim(orig, &cm->post_proc_buffer, 1, &weight);
3290
3291          cpi->summedp_quality += frame_ssim2 * weight;
3292          cpi->summedp_weights += weight;
3293#if 0
3294          {
3295            FILE *f = fopen("q_used.stt", "a");
3296            fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
3297                    cpi->common.current_video_frame, y2, u2, v2,
3298                    frame_psnr2, frame_ssim2);
3299            fclose(f);
3300          }
3301#endif
3302        }
3303      }
3304
3305      if (cpi->b_calculate_ssimg) {
3306        double y, u, v, frame_all;
3307        frame_all = vp9_calc_ssimg(cpi->Source, cm->frame_to_show, &y, &u, &v);
3308        cpi->total_ssimg_y += y;
3309        cpi->total_ssimg_u += u;
3310        cpi->total_ssimg_v += v;
3311        cpi->total_ssimg_all += frame_all;
3312      }
3313    }
3314  }
3315
3316#endif
3317  return 0;
3318}
3319
3320int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
3321                              vp9_ppflags_t *flags) {
3322  VP9_COMMON *cm = &cpi->common;
3323
3324  if (!cm->show_frame) {
3325    return -1;
3326  } else {
3327    int ret;
3328#if CONFIG_VP9_POSTPROC
3329    ret = vp9_post_proc_frame(cm, dest, flags);
3330#else
3331
3332    if (cm->frame_to_show) {
3333      *dest = *cm->frame_to_show;
3334      dest->y_width = cm->width;
3335      dest->y_height = cm->height;
3336      dest->uv_width = cm->width >> cm->subsampling_x;
3337      dest->uv_height = cm->height >> cm->subsampling_y;
3338      ret = 0;
3339    } else {
3340      ret = -1;
3341    }
3342
3343#endif  // !CONFIG_VP9_POSTPROC
3344    vp9_clear_system_state();
3345    return ret;
3346  }
3347}
3348
3349int vp9_set_roimap(VP9_COMP *cpi, unsigned char *map, unsigned int rows,
3350                   unsigned int cols, int delta_q[MAX_SEGMENTS],
3351                   int delta_lf[MAX_SEGMENTS],
3352                   unsigned int threshold[MAX_SEGMENTS]) {
3353  signed char feature_data[SEG_LVL_MAX][MAX_SEGMENTS];
3354  struct segmentation *seg = &cpi->common.seg;
3355  int i;
3356
3357  if (cpi->common.mb_rows != rows || cpi->common.mb_cols != cols)
3358    return -1;
3359
3360  if (!map) {
3361    vp9_disable_segmentation(seg);
3362    return 0;
3363  }
3364
3365  // Set the segmentation Map
3366  vp9_set_segmentation_map(cpi, map);
3367
3368  // Activate segmentation.
3369  vp9_enable_segmentation(seg);
3370
3371  // Set up the quant, LF and breakout threshold segment data
3372  for (i = 0; i < MAX_SEGMENTS; i++) {
3373    feature_data[SEG_LVL_ALT_Q][i] = delta_q[i];
3374    feature_data[SEG_LVL_ALT_LF][i] = delta_lf[i];
3375    cpi->segment_encode_breakout[i] = threshold[i];
3376  }
3377
3378  // Enable the loop and quant changes in the feature mask
3379  for (i = 0; i < MAX_SEGMENTS; i++) {
3380    if (delta_q[i])
3381      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
3382    else
3383      vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
3384
3385    if (delta_lf[i])
3386      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
3387    else
3388      vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
3389  }
3390
3391  // Initialize the feature data structure
3392  // SEGMENT_DELTADATA    0, SEGMENT_ABSDATA      1
3393  vp9_set_segment_data(seg, &feature_data[0][0], SEGMENT_DELTADATA);
3394
3395  return 0;
3396}
3397
3398int vp9_set_active_map(VP9_COMP *cpi, unsigned char *map,
3399                       unsigned int rows, unsigned int cols) {
3400  if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
3401    if (map) {
3402      vpx_memcpy(cpi->active_map, map, rows * cols);
3403      cpi->active_map_enabled = 1;
3404    } else {
3405      cpi->active_map_enabled = 0;
3406    }
3407
3408    return 0;
3409  } else {
3410    // cpi->active_map_enabled = 0;
3411    return -1;
3412  }
3413}
3414
3415int vp9_set_internal_size(VP9_COMP *cpi,
3416                          VPX_SCALING horiz_mode, VPX_SCALING vert_mode) {
3417  VP9_COMMON *cm = &cpi->common;
3418  int hr = 0, hs = 0, vr = 0, vs = 0;
3419
3420  if (horiz_mode > ONETWO || vert_mode > ONETWO)
3421    return -1;
3422
3423  Scale2Ratio(horiz_mode, &hr, &hs);
3424  Scale2Ratio(vert_mode, &vr, &vs);
3425
3426  // always go to the next whole number
3427  cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
3428  cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
3429
3430  assert(cm->width <= cpi->initial_width);
3431  assert(cm->height <= cpi->initial_height);
3432  update_frame_size(cpi);
3433  return 0;
3434}
3435
3436int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
3437                         unsigned int height) {
3438  VP9_COMMON *cm = &cpi->common;
3439
3440  check_initial_width(cpi, 1, 1);
3441
3442  if (width) {
3443    cm->width = width;
3444    if (cm->width * 5 < cpi->initial_width) {
3445      cm->width = cpi->initial_width / 5 + 1;
3446      printf("Warning: Desired width too small, changed to %d\n", cm->width);
3447    }
3448    if (cm->width > cpi->initial_width) {
3449      cm->width = cpi->initial_width;
3450      printf("Warning: Desired width too large, changed to %d\n", cm->width);
3451    }
3452  }
3453
3454  if (height) {
3455    cm->height = height;
3456    if (cm->height * 5 < cpi->initial_height) {
3457      cm->height = cpi->initial_height / 5 + 1;
3458      printf("Warning: Desired height too small, changed to %d\n", cm->height);
3459    }
3460    if (cm->height > cpi->initial_height) {
3461      cm->height = cpi->initial_height;
3462      printf("Warning: Desired height too large, changed to %d\n", cm->height);
3463    }
3464  }
3465
3466  assert(cm->width <= cpi->initial_width);
3467  assert(cm->height <= cpi->initial_height);
3468  update_frame_size(cpi);
3469  return 0;
3470}
3471
3472void vp9_set_svc(VP9_COMP *cpi, int use_svc) {
3473  cpi->use_svc = use_svc;
3474  return;
3475}
3476
3477int vp9_calc_ss_err(const YV12_BUFFER_CONFIG *source,
3478                    const YV12_BUFFER_CONFIG *reference) {
3479  int i, j;
3480  int total = 0;
3481
3482  const uint8_t *src = source->y_buffer;
3483  const uint8_t *ref = reference->y_buffer;
3484
3485  // Loop through the Y plane raw and reconstruction data summing
3486  // (square differences)
3487  for (i = 0; i < source->y_height; i += 16) {
3488    for (j = 0; j < source->y_width; j += 16) {
3489      unsigned int sse;
3490      total += vp9_mse16x16(src + j, source->y_stride,
3491                            ref + j, reference->y_stride, &sse);
3492    }
3493
3494    src += 16 * source->y_stride;
3495    ref += 16 * reference->y_stride;
3496  }
3497
3498  return total;
3499}
3500
3501
3502int vp9_get_quantizer(VP9_COMP *cpi) {
3503  return cpi->common.base_qindex;
3504}
3505