Home | History | Annotate | Download | only in encoder
      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 "./vp9_rtcd.h"
     16 #include "./vpx_config.h"
     17 #include "./vpx_dsp_rtcd.h"
     18 #include "./vpx_scale_rtcd.h"
     19 #include "vpx_dsp/psnr.h"
     20 #include "vpx_dsp/vpx_dsp_common.h"
     21 #include "vpx_dsp/vpx_filter.h"
     22 #if CONFIG_INTERNAL_STATS
     23 #include "vpx_dsp/ssim.h"
     24 #endif
     25 #include "vpx_ports/mem.h"
     26 #include "vpx_ports/system_state.h"
     27 #include "vpx_ports/vpx_timer.h"
     28 
     29 #include "vp9/common/vp9_alloccommon.h"
     30 #include "vp9/common/vp9_filter.h"
     31 #include "vp9/common/vp9_idct.h"
     32 #if CONFIG_VP9_POSTPROC
     33 #include "vp9/common/vp9_postproc.h"
     34 #endif
     35 #include "vp9/common/vp9_reconinter.h"
     36 #include "vp9/common/vp9_reconintra.h"
     37 #include "vp9/common/vp9_tile_common.h"
     38 #include "vp9/common/vp9_scan.h"
     39 
     40 #include "vp9/encoder/vp9_alt_ref_aq.h"
     41 #include "vp9/encoder/vp9_aq_360.h"
     42 #include "vp9/encoder/vp9_aq_complexity.h"
     43 #include "vp9/encoder/vp9_aq_cyclicrefresh.h"
     44 #include "vp9/encoder/vp9_aq_variance.h"
     45 #include "vp9/encoder/vp9_bitstream.h"
     46 #if CONFIG_INTERNAL_STATS
     47 #include "vp9/encoder/vp9_blockiness.h"
     48 #endif
     49 #include "vp9/encoder/vp9_context_tree.h"
     50 #include "vp9/encoder/vp9_encodeframe.h"
     51 #include "vp9/encoder/vp9_encodemb.h"
     52 #include "vp9/encoder/vp9_encodemv.h"
     53 #include "vp9/encoder/vp9_encoder.h"
     54 #include "vp9/encoder/vp9_ethread.h"
     55 #include "vp9/encoder/vp9_extend.h"
     56 #include "vp9/encoder/vp9_firstpass.h"
     57 #include "vp9/encoder/vp9_mbgraph.h"
     58 #if CONFIG_NON_GREEDY_MV
     59 #include "vp9/encoder/vp9_mcomp.h"
     60 #endif
     61 #include "vp9/encoder/vp9_multi_thread.h"
     62 #include "vp9/encoder/vp9_noise_estimate.h"
     63 #include "vp9/encoder/vp9_picklpf.h"
     64 #include "vp9/encoder/vp9_ratectrl.h"
     65 #include "vp9/encoder/vp9_rd.h"
     66 #include "vp9/encoder/vp9_resize.h"
     67 #include "vp9/encoder/vp9_segmentation.h"
     68 #include "vp9/encoder/vp9_skin_detection.h"
     69 #include "vp9/encoder/vp9_speed_features.h"
     70 #include "vp9/encoder/vp9_svc_layercontext.h"
     71 #include "vp9/encoder/vp9_temporal_filter.h"
     72 
     73 #define AM_SEGMENT_ID_INACTIVE 7
     74 #define AM_SEGMENT_ID_ACTIVE 0
     75 
     76 // Whether to use high precision mv for altref computation.
     77 #define ALTREF_HIGH_PRECISION_MV 1
     78 
     79 // Q threshold for high precision mv. Choose a very high value for now so that
     80 // HIGH_PRECISION is always chosen.
     81 #define HIGH_PRECISION_MV_QTHRESH 200
     82 
     83 #define FRAME_SIZE_FACTOR 128  // empirical params for context model threshold
     84 #define FRAME_RATE_FACTOR 8
     85 
     86 #ifdef OUTPUT_YUV_DENOISED
     87 FILE *yuv_denoised_file = NULL;
     88 #endif
     89 #ifdef OUTPUT_YUV_SKINMAP
     90 static FILE *yuv_skinmap_file = NULL;
     91 #endif
     92 #ifdef OUTPUT_YUV_REC
     93 FILE *yuv_rec_file;
     94 #endif
     95 #ifdef OUTPUT_YUV_SVC_SRC
     96 FILE *yuv_svc_src[3] = { NULL, NULL, NULL };
     97 #endif
     98 
     99 #if 0
    100 FILE *framepsnr;
    101 FILE *kf_list;
    102 FILE *keyfile;
    103 #endif
    104 
    105 #ifdef ENABLE_KF_DENOISE
    106 // Test condition for spatial denoise of source.
    107 static int is_spatial_denoise_enabled(VP9_COMP *cpi) {
    108   VP9_COMMON *const cm = &cpi->common;
    109   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
    110 
    111   return (oxcf->pass != 1) && !is_lossless_requested(&cpi->oxcf) &&
    112          frame_is_intra_only(cm);
    113 }
    114 #endif
    115 
    116 // compute adaptive threshold for skip recoding
    117 static int compute_context_model_thresh(const VP9_COMP *const cpi) {
    118   const VP9_COMMON *const cm = &cpi->common;
    119   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
    120   const int frame_size = (cm->width * cm->height) >> 10;
    121   const int bitrate = (int)(oxcf->target_bandwidth >> 10);
    122   const int qindex_factor = cm->base_qindex + (MAXQ >> 1);
    123 
    124   // This equation makes the threshold adaptive to frame size.
    125   // Coding gain obtained by recoding comes from alternate frames of large
    126   // content change. We skip recoding if the difference of previous and current
    127   // frame context probability model is less than a certain threshold.
    128   // The first component is the most critical part to guarantee adaptivity.
    129   // Other parameters are estimated based on normal setting of hd resolution
    130   // parameters. e.g frame_size = 1920x1080, bitrate = 8000, qindex_factor < 50
    131   const int thresh =
    132       ((FRAME_SIZE_FACTOR * frame_size - FRAME_RATE_FACTOR * bitrate) *
    133        qindex_factor) >>
    134       9;
    135 
    136   return thresh;
    137 }
    138 
    139 // compute the total cost difference between current
    140 // and previous frame context prob model.
    141 static int compute_context_model_diff(const VP9_COMMON *const cm) {
    142   const FRAME_CONTEXT *const pre_fc =
    143       &cm->frame_contexts[cm->frame_context_idx];
    144   const FRAME_CONTEXT *const cur_fc = cm->fc;
    145   const FRAME_COUNTS *counts = &cm->counts;
    146   vpx_prob pre_last_prob, cur_last_prob;
    147   int diff = 0;
    148   int i, j, k, l, m, n;
    149 
    150   // y_mode_prob
    151   for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
    152     for (j = 0; j < INTRA_MODES - 1; ++j) {
    153       diff += (int)counts->y_mode[i][j] *
    154               (pre_fc->y_mode_prob[i][j] - cur_fc->y_mode_prob[i][j]);
    155     }
    156     pre_last_prob = MAX_PROB - pre_fc->y_mode_prob[i][INTRA_MODES - 2];
    157     cur_last_prob = MAX_PROB - cur_fc->y_mode_prob[i][INTRA_MODES - 2];
    158 
    159     diff += (int)counts->y_mode[i][INTRA_MODES - 1] *
    160             (pre_last_prob - cur_last_prob);
    161   }
    162 
    163   // uv_mode_prob
    164   for (i = 0; i < INTRA_MODES; ++i) {
    165     for (j = 0; j < INTRA_MODES - 1; ++j) {
    166       diff += (int)counts->uv_mode[i][j] *
    167               (pre_fc->uv_mode_prob[i][j] - cur_fc->uv_mode_prob[i][j]);
    168     }
    169     pre_last_prob = MAX_PROB - pre_fc->uv_mode_prob[i][INTRA_MODES - 2];
    170     cur_last_prob = MAX_PROB - cur_fc->uv_mode_prob[i][INTRA_MODES - 2];
    171 
    172     diff += (int)counts->uv_mode[i][INTRA_MODES - 1] *
    173             (pre_last_prob - cur_last_prob);
    174   }
    175 
    176   // partition_prob
    177   for (i = 0; i < PARTITION_CONTEXTS; ++i) {
    178     for (j = 0; j < PARTITION_TYPES - 1; ++j) {
    179       diff += (int)counts->partition[i][j] *
    180               (pre_fc->partition_prob[i][j] - cur_fc->partition_prob[i][j]);
    181     }
    182     pre_last_prob = MAX_PROB - pre_fc->partition_prob[i][PARTITION_TYPES - 2];
    183     cur_last_prob = MAX_PROB - cur_fc->partition_prob[i][PARTITION_TYPES - 2];
    184 
    185     diff += (int)counts->partition[i][PARTITION_TYPES - 1] *
    186             (pre_last_prob - cur_last_prob);
    187   }
    188 
    189   // coef_probs
    190   for (i = 0; i < TX_SIZES; ++i) {
    191     for (j = 0; j < PLANE_TYPES; ++j) {
    192       for (k = 0; k < REF_TYPES; ++k) {
    193         for (l = 0; l < COEF_BANDS; ++l) {
    194           for (m = 0; m < BAND_COEFF_CONTEXTS(l); ++m) {
    195             for (n = 0; n < UNCONSTRAINED_NODES; ++n) {
    196               diff += (int)counts->coef[i][j][k][l][m][n] *
    197                       (pre_fc->coef_probs[i][j][k][l][m][n] -
    198                        cur_fc->coef_probs[i][j][k][l][m][n]);
    199             }
    200 
    201             pre_last_prob =
    202                 MAX_PROB -
    203                 pre_fc->coef_probs[i][j][k][l][m][UNCONSTRAINED_NODES - 1];
    204             cur_last_prob =
    205                 MAX_PROB -
    206                 cur_fc->coef_probs[i][j][k][l][m][UNCONSTRAINED_NODES - 1];
    207 
    208             diff += (int)counts->coef[i][j][k][l][m][UNCONSTRAINED_NODES] *
    209                     (pre_last_prob - cur_last_prob);
    210           }
    211         }
    212       }
    213     }
    214   }
    215 
    216   // switchable_interp_prob
    217   for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) {
    218     for (j = 0; j < SWITCHABLE_FILTERS - 1; ++j) {
    219       diff += (int)counts->switchable_interp[i][j] *
    220               (pre_fc->switchable_interp_prob[i][j] -
    221                cur_fc->switchable_interp_prob[i][j]);
    222     }
    223     pre_last_prob =
    224         MAX_PROB - pre_fc->switchable_interp_prob[i][SWITCHABLE_FILTERS - 2];
    225     cur_last_prob =
    226         MAX_PROB - cur_fc->switchable_interp_prob[i][SWITCHABLE_FILTERS - 2];
    227 
    228     diff += (int)counts->switchable_interp[i][SWITCHABLE_FILTERS - 1] *
    229             (pre_last_prob - cur_last_prob);
    230   }
    231 
    232   // inter_mode_probs
    233   for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
    234     for (j = 0; j < INTER_MODES - 1; ++j) {
    235       diff += (int)counts->inter_mode[i][j] *
    236               (pre_fc->inter_mode_probs[i][j] - cur_fc->inter_mode_probs[i][j]);
    237     }
    238     pre_last_prob = MAX_PROB - pre_fc->inter_mode_probs[i][INTER_MODES - 2];
    239     cur_last_prob = MAX_PROB - cur_fc->inter_mode_probs[i][INTER_MODES - 2];
    240 
    241     diff += (int)counts->inter_mode[i][INTER_MODES - 1] *
    242             (pre_last_prob - cur_last_prob);
    243   }
    244 
    245   // intra_inter_prob
    246   for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
    247     diff += (int)counts->intra_inter[i][0] *
    248             (pre_fc->intra_inter_prob[i] - cur_fc->intra_inter_prob[i]);
    249 
    250     pre_last_prob = MAX_PROB - pre_fc->intra_inter_prob[i];
    251     cur_last_prob = MAX_PROB - cur_fc->intra_inter_prob[i];
    252 
    253     diff += (int)counts->intra_inter[i][1] * (pre_last_prob - cur_last_prob);
    254   }
    255 
    256   // comp_inter_prob
    257   for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
    258     diff += (int)counts->comp_inter[i][0] *
    259             (pre_fc->comp_inter_prob[i] - cur_fc->comp_inter_prob[i]);
    260 
    261     pre_last_prob = MAX_PROB - pre_fc->comp_inter_prob[i];
    262     cur_last_prob = MAX_PROB - cur_fc->comp_inter_prob[i];
    263 
    264     diff += (int)counts->comp_inter[i][1] * (pre_last_prob - cur_last_prob);
    265   }
    266 
    267   // single_ref_prob
    268   for (i = 0; i < REF_CONTEXTS; ++i) {
    269     for (j = 0; j < 2; ++j) {
    270       diff += (int)counts->single_ref[i][j][0] *
    271               (pre_fc->single_ref_prob[i][j] - cur_fc->single_ref_prob[i][j]);
    272 
    273       pre_last_prob = MAX_PROB - pre_fc->single_ref_prob[i][j];
    274       cur_last_prob = MAX_PROB - cur_fc->single_ref_prob[i][j];
    275 
    276       diff +=
    277           (int)counts->single_ref[i][j][1] * (pre_last_prob - cur_last_prob);
    278     }
    279   }
    280 
    281   // comp_ref_prob
    282   for (i = 0; i < REF_CONTEXTS; ++i) {
    283     diff += (int)counts->comp_ref[i][0] *
    284             (pre_fc->comp_ref_prob[i] - cur_fc->comp_ref_prob[i]);
    285 
    286     pre_last_prob = MAX_PROB - pre_fc->comp_ref_prob[i];
    287     cur_last_prob = MAX_PROB - cur_fc->comp_ref_prob[i];
    288 
    289     diff += (int)counts->comp_ref[i][1] * (pre_last_prob - cur_last_prob);
    290   }
    291 
    292   // tx_probs
    293   for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
    294     // p32x32
    295     for (j = 0; j < TX_SIZES - 1; ++j) {
    296       diff += (int)counts->tx.p32x32[i][j] *
    297               (pre_fc->tx_probs.p32x32[i][j] - cur_fc->tx_probs.p32x32[i][j]);
    298     }
    299     pre_last_prob = MAX_PROB - pre_fc->tx_probs.p32x32[i][TX_SIZES - 2];
    300     cur_last_prob = MAX_PROB - cur_fc->tx_probs.p32x32[i][TX_SIZES - 2];
    301 
    302     diff += (int)counts->tx.p32x32[i][TX_SIZES - 1] *
    303             (pre_last_prob - cur_last_prob);
    304 
    305     // p16x16
    306     for (j = 0; j < TX_SIZES - 2; ++j) {
    307       diff += (int)counts->tx.p16x16[i][j] *
    308               (pre_fc->tx_probs.p16x16[i][j] - cur_fc->tx_probs.p16x16[i][j]);
    309     }
    310     pre_last_prob = MAX_PROB - pre_fc->tx_probs.p16x16[i][TX_SIZES - 3];
    311     cur_last_prob = MAX_PROB - cur_fc->tx_probs.p16x16[i][TX_SIZES - 3];
    312 
    313     diff += (int)counts->tx.p16x16[i][TX_SIZES - 2] *
    314             (pre_last_prob - cur_last_prob);
    315 
    316     // p8x8
    317     for (j = 0; j < TX_SIZES - 3; ++j) {
    318       diff += (int)counts->tx.p8x8[i][j] *
    319               (pre_fc->tx_probs.p8x8[i][j] - cur_fc->tx_probs.p8x8[i][j]);
    320     }
    321     pre_last_prob = MAX_PROB - pre_fc->tx_probs.p8x8[i][TX_SIZES - 4];
    322     cur_last_prob = MAX_PROB - cur_fc->tx_probs.p8x8[i][TX_SIZES - 4];
    323 
    324     diff +=
    325         (int)counts->tx.p8x8[i][TX_SIZES - 3] * (pre_last_prob - cur_last_prob);
    326   }
    327 
    328   // skip_probs
    329   for (i = 0; i < SKIP_CONTEXTS; ++i) {
    330     diff += (int)counts->skip[i][0] *
    331             (pre_fc->skip_probs[i] - cur_fc->skip_probs[i]);
    332 
    333     pre_last_prob = MAX_PROB - pre_fc->skip_probs[i];
    334     cur_last_prob = MAX_PROB - cur_fc->skip_probs[i];
    335 
    336     diff += (int)counts->skip[i][1] * (pre_last_prob - cur_last_prob);
    337   }
    338 
    339   // mv
    340   for (i = 0; i < MV_JOINTS - 1; ++i) {
    341     diff += (int)counts->mv.joints[i] *
    342             (pre_fc->nmvc.joints[i] - cur_fc->nmvc.joints[i]);
    343   }
    344   pre_last_prob = MAX_PROB - pre_fc->nmvc.joints[MV_JOINTS - 2];
    345   cur_last_prob = MAX_PROB - cur_fc->nmvc.joints[MV_JOINTS - 2];
    346 
    347   diff +=
    348       (int)counts->mv.joints[MV_JOINTS - 1] * (pre_last_prob - cur_last_prob);
    349 
    350   for (i = 0; i < 2; ++i) {
    351     const nmv_component_counts *nmv_count = &counts->mv.comps[i];
    352     const nmv_component *pre_nmv_prob = &pre_fc->nmvc.comps[i];
    353     const nmv_component *cur_nmv_prob = &cur_fc->nmvc.comps[i];
    354 
    355     // sign
    356     diff += (int)nmv_count->sign[0] * (pre_nmv_prob->sign - cur_nmv_prob->sign);
    357 
    358     pre_last_prob = MAX_PROB - pre_nmv_prob->sign;
    359     cur_last_prob = MAX_PROB - cur_nmv_prob->sign;
    360 
    361     diff += (int)nmv_count->sign[1] * (pre_last_prob - cur_last_prob);
    362 
    363     // classes
    364     for (j = 0; j < MV_CLASSES - 1; ++j) {
    365       diff += (int)nmv_count->classes[j] *
    366               (pre_nmv_prob->classes[j] - cur_nmv_prob->classes[j]);
    367     }
    368     pre_last_prob = MAX_PROB - pre_nmv_prob->classes[MV_CLASSES - 2];
    369     cur_last_prob = MAX_PROB - cur_nmv_prob->classes[MV_CLASSES - 2];
    370 
    371     diff += (int)nmv_count->classes[MV_CLASSES - 1] *
    372             (pre_last_prob - cur_last_prob);
    373 
    374     // class0
    375     for (j = 0; j < CLASS0_SIZE - 1; ++j) {
    376       diff += (int)nmv_count->class0[j] *
    377               (pre_nmv_prob->class0[j] - cur_nmv_prob->class0[j]);
    378     }
    379     pre_last_prob = MAX_PROB - pre_nmv_prob->class0[CLASS0_SIZE - 2];
    380     cur_last_prob = MAX_PROB - cur_nmv_prob->class0[CLASS0_SIZE - 2];
    381 
    382     diff += (int)nmv_count->class0[CLASS0_SIZE - 1] *
    383             (pre_last_prob - cur_last_prob);
    384 
    385     // bits
    386     for (j = 0; j < MV_OFFSET_BITS; ++j) {
    387       diff += (int)nmv_count->bits[j][0] *
    388               (pre_nmv_prob->bits[j] - cur_nmv_prob->bits[j]);
    389 
    390       pre_last_prob = MAX_PROB - pre_nmv_prob->bits[j];
    391       cur_last_prob = MAX_PROB - cur_nmv_prob->bits[j];
    392 
    393       diff += (int)nmv_count->bits[j][1] * (pre_last_prob - cur_last_prob);
    394     }
    395 
    396     // class0_fp
    397     for (j = 0; j < CLASS0_SIZE; ++j) {
    398       for (k = 0; k < MV_FP_SIZE - 1; ++k) {
    399         diff += (int)nmv_count->class0_fp[j][k] *
    400                 (pre_nmv_prob->class0_fp[j][k] - cur_nmv_prob->class0_fp[j][k]);
    401       }
    402       pre_last_prob = MAX_PROB - pre_nmv_prob->class0_fp[j][MV_FP_SIZE - 2];
    403       cur_last_prob = MAX_PROB - cur_nmv_prob->class0_fp[j][MV_FP_SIZE - 2];
    404 
    405       diff += (int)nmv_count->class0_fp[j][MV_FP_SIZE - 1] *
    406               (pre_last_prob - cur_last_prob);
    407     }
    408 
    409     // fp
    410     for (j = 0; j < MV_FP_SIZE - 1; ++j) {
    411       diff +=
    412           (int)nmv_count->fp[j] * (pre_nmv_prob->fp[j] - cur_nmv_prob->fp[j]);
    413     }
    414     pre_last_prob = MAX_PROB - pre_nmv_prob->fp[MV_FP_SIZE - 2];
    415     cur_last_prob = MAX_PROB - cur_nmv_prob->fp[MV_FP_SIZE - 2];
    416 
    417     diff +=
    418         (int)nmv_count->fp[MV_FP_SIZE - 1] * (pre_last_prob - cur_last_prob);
    419 
    420     // class0_hp
    421     diff += (int)nmv_count->class0_hp[0] *
    422             (pre_nmv_prob->class0_hp - cur_nmv_prob->class0_hp);
    423 
    424     pre_last_prob = MAX_PROB - pre_nmv_prob->class0_hp;
    425     cur_last_prob = MAX_PROB - cur_nmv_prob->class0_hp;
    426 
    427     diff += (int)nmv_count->class0_hp[1] * (pre_last_prob - cur_last_prob);
    428 
    429     // hp
    430     diff += (int)nmv_count->hp[0] * (pre_nmv_prob->hp - cur_nmv_prob->hp);
    431 
    432     pre_last_prob = MAX_PROB - pre_nmv_prob->hp;
    433     cur_last_prob = MAX_PROB - cur_nmv_prob->hp;
    434 
    435     diff += (int)nmv_count->hp[1] * (pre_last_prob - cur_last_prob);
    436   }
    437 
    438   return -diff;
    439 }
    440 
    441 // Test for whether to calculate metrics for the frame.
    442 static int is_psnr_calc_enabled(VP9_COMP *cpi) {
    443   VP9_COMMON *const cm = &cpi->common;
    444   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
    445 
    446   return cpi->b_calculate_psnr && (oxcf->pass != 1) && cm->show_frame;
    447 }
    448 
    449 /* clang-format off */
    450 const Vp9LevelSpec vp9_level_defs[VP9_LEVELS] = {
    451   //         sample rate    size   breadth  bitrate  cpb
    452   { LEVEL_1,   829440,      36864,    512,   200,    400,    2, 1,  4,  8 },
    453   { LEVEL_1_1, 2764800,     73728,    768,   800,    1000,   2, 1,  4,  8 },
    454   { LEVEL_2,   4608000,     122880,   960,   1800,   1500,   2, 1,  4,  8 },
    455   { LEVEL_2_1, 9216000,     245760,   1344,  3600,   2800,   2, 2,  4,  8 },
    456   { LEVEL_3,   20736000,    552960,   2048,  7200,   6000,   2, 4,  4,  8 },
    457   { LEVEL_3_1, 36864000,    983040,   2752,  12000,  10000,  2, 4,  4,  8 },
    458   { LEVEL_4,   83558400,    2228224,  4160,  18000,  16000,  4, 4,  4,  8 },
    459   { LEVEL_4_1, 160432128,   2228224,  4160,  30000,  18000,  4, 4,  5,  6 },
    460   { LEVEL_5,   311951360,   8912896,  8384,  60000,  36000,  6, 8,  6,  4 },
    461   { LEVEL_5_1, 588251136,   8912896,  8384,  120000, 46000,  8, 8,  10, 4 },
    462   // TODO(huisu): update max_cpb_size for level 5_2 ~ 6_2 when
    463   // they are finalized (currently tentative).
    464   { LEVEL_5_2, 1176502272,  8912896,  8384,  180000, 90000,  8, 8,  10, 4 },
    465   { LEVEL_6,   1176502272,  35651584, 16832, 180000, 90000,  8, 16, 10, 4 },
    466   { LEVEL_6_1, 2353004544u, 35651584, 16832, 240000, 180000, 8, 16, 10, 4 },
    467   { LEVEL_6_2, 4706009088u, 35651584, 16832, 480000, 360000, 8, 16, 10, 4 },
    468 };
    469 /* clang-format on */
    470 
    471 static const char *level_fail_messages[TARGET_LEVEL_FAIL_IDS] = {
    472   "The average bit-rate is too high.",
    473   "The picture size is too large.",
    474   "The picture width/height is too large.",
    475   "The luma sample rate is too large.",
    476   "The CPB size is too large.",
    477   "The compression ratio is too small",
    478   "Too many column tiles are used.",
    479   "The alt-ref distance is too small.",
    480   "Too many reference buffers are used."
    481 };
    482 
    483 static INLINE void Scale2Ratio(VPX_SCALING mode, int *hr, int *hs) {
    484   switch (mode) {
    485     case NORMAL:
    486       *hr = 1;
    487       *hs = 1;
    488       break;
    489     case FOURFIVE:
    490       *hr = 4;
    491       *hs = 5;
    492       break;
    493     case THREEFIVE:
    494       *hr = 3;
    495       *hs = 5;
    496       break;
    497     default:
    498       assert(mode == ONETWO);
    499       *hr = 1;
    500       *hs = 2;
    501       break;
    502   }
    503 }
    504 
    505 // Mark all inactive blocks as active. Other segmentation features may be set
    506 // so memset cannot be used, instead only inactive blocks should be reset.
    507 static void suppress_active_map(VP9_COMP *cpi) {
    508   unsigned char *const seg_map = cpi->segmentation_map;
    509 
    510   if (cpi->active_map.enabled || cpi->active_map.update) {
    511     const int rows = cpi->common.mi_rows;
    512     const int cols = cpi->common.mi_cols;
    513     int i;
    514 
    515     for (i = 0; i < rows * cols; ++i)
    516       if (seg_map[i] == AM_SEGMENT_ID_INACTIVE)
    517         seg_map[i] = AM_SEGMENT_ID_ACTIVE;
    518   }
    519 }
    520 
    521 static void apply_active_map(VP9_COMP *cpi) {
    522   struct segmentation *const seg = &cpi->common.seg;
    523   unsigned char *const seg_map = cpi->segmentation_map;
    524   const unsigned char *const active_map = cpi->active_map.map;
    525   int i;
    526 
    527   assert(AM_SEGMENT_ID_ACTIVE == CR_SEGMENT_ID_BASE);
    528 
    529   if (frame_is_intra_only(&cpi->common)) {
    530     cpi->active_map.enabled = 0;
    531     cpi->active_map.update = 1;
    532   }
    533 
    534   if (cpi->active_map.update) {
    535     if (cpi->active_map.enabled) {
    536       for (i = 0; i < cpi->common.mi_rows * cpi->common.mi_cols; ++i)
    537         if (seg_map[i] == AM_SEGMENT_ID_ACTIVE) seg_map[i] = active_map[i];
    538       vp9_enable_segmentation(seg);
    539       vp9_enable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
    540       vp9_enable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
    541       // Setting the data to -MAX_LOOP_FILTER will result in the computed loop
    542       // filter level being zero regardless of the value of seg->abs_delta.
    543       vp9_set_segdata(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF,
    544                       -MAX_LOOP_FILTER);
    545     } else {
    546       vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
    547       vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
    548       if (seg->enabled) {
    549         seg->update_data = 1;
    550         seg->update_map = 1;
    551       }
    552     }
    553     cpi->active_map.update = 0;
    554   }
    555 }
    556 
    557 static void apply_roi_map(VP9_COMP *cpi) {
    558   VP9_COMMON *cm = &cpi->common;
    559   struct segmentation *const seg = &cm->seg;
    560   vpx_roi_map_t *roi = &cpi->roi;
    561   const int *delta_q = roi->delta_q;
    562   const int *delta_lf = roi->delta_lf;
    563   const int *skip = roi->skip;
    564   int ref_frame[8];
    565   int internal_delta_q[MAX_SEGMENTS];
    566   int i;
    567   static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG,
    568                                     VP9_ALT_FLAG };
    569 
    570   // TODO(jianj): Investigate why ROI not working in speed < 5 or in non
    571   // realtime mode.
    572   if (cpi->oxcf.mode != REALTIME || cpi->oxcf.speed < 5) return;
    573   if (!roi->enabled) return;
    574 
    575   memcpy(&ref_frame, roi->ref_frame, sizeof(ref_frame));
    576 
    577   vp9_enable_segmentation(seg);
    578   vp9_clearall_segfeatures(seg);
    579   // Select delta coding method;
    580   seg->abs_delta = SEGMENT_DELTADATA;
    581 
    582   memcpy(cpi->segmentation_map, roi->roi_map, (cm->mi_rows * cm->mi_cols));
    583 
    584   for (i = 0; i < MAX_SEGMENTS; ++i) {
    585     // Translate the external delta q values to internal values.
    586     internal_delta_q[i] = vp9_quantizer_to_qindex(abs(delta_q[i]));
    587     if (delta_q[i] < 0) internal_delta_q[i] = -internal_delta_q[i];
    588     vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
    589     vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
    590     if (internal_delta_q[i] != 0) {
    591       vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
    592       vp9_set_segdata(seg, i, SEG_LVL_ALT_Q, internal_delta_q[i]);
    593     }
    594     if (delta_lf[i] != 0) {
    595       vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
    596       vp9_set_segdata(seg, i, SEG_LVL_ALT_LF, delta_lf[i]);
    597     }
    598     if (skip[i] != 0) {
    599       vp9_enable_segfeature(seg, i, SEG_LVL_SKIP);
    600       vp9_set_segdata(seg, i, SEG_LVL_SKIP, skip[i]);
    601     }
    602     if (ref_frame[i] >= 0) {
    603       int valid_ref = 1;
    604       // ALTREF is not used as reference for nonrd_pickmode with 0 lag.
    605       if (ref_frame[i] == ALTREF_FRAME && cpi->sf.use_nonrd_pick_mode)
    606         valid_ref = 0;
    607       // If GOLDEN is selected, make sure it's set as reference.
    608       if (ref_frame[i] == GOLDEN_FRAME &&
    609           !(cpi->ref_frame_flags & flag_list[ref_frame[i]])) {
    610         valid_ref = 0;
    611       }
    612       // GOLDEN was updated in previous encoded frame, so GOLDEN and LAST are
    613       // same reference.
    614       if (ref_frame[i] == GOLDEN_FRAME && cpi->rc.frames_since_golden == 0)
    615         ref_frame[i] = LAST_FRAME;
    616       if (valid_ref) {
    617         vp9_enable_segfeature(seg, i, SEG_LVL_REF_FRAME);
    618         vp9_set_segdata(seg, i, SEG_LVL_REF_FRAME, ref_frame[i]);
    619       }
    620     }
    621   }
    622   roi->enabled = 1;
    623 }
    624 
    625 static void init_level_info(Vp9LevelInfo *level_info) {
    626   Vp9LevelStats *const level_stats = &level_info->level_stats;
    627   Vp9LevelSpec *const level_spec = &level_info->level_spec;
    628 
    629   memset(level_stats, 0, sizeof(*level_stats));
    630   memset(level_spec, 0, sizeof(*level_spec));
    631   level_spec->level = LEVEL_UNKNOWN;
    632   level_spec->min_altref_distance = INT_MAX;
    633 }
    634 
    635 static int check_seg_range(int seg_data[8], int range) {
    636   return !(abs(seg_data[0]) > range || abs(seg_data[1]) > range ||
    637            abs(seg_data[2]) > range || abs(seg_data[3]) > range ||
    638            abs(seg_data[4]) > range || abs(seg_data[5]) > range ||
    639            abs(seg_data[6]) > range || abs(seg_data[7]) > range);
    640 }
    641 
    642 VP9_LEVEL vp9_get_level(const Vp9LevelSpec *const level_spec) {
    643   int i;
    644   const Vp9LevelSpec *this_level;
    645 
    646   vpx_clear_system_state();
    647 
    648   for (i = 0; i < VP9_LEVELS; ++i) {
    649     this_level = &vp9_level_defs[i];
    650     if ((double)level_spec->max_luma_sample_rate >
    651             (double)this_level->max_luma_sample_rate *
    652                 (1 + SAMPLE_RATE_GRACE_P) ||
    653         level_spec->max_luma_picture_size > this_level->max_luma_picture_size ||
    654         level_spec->max_luma_picture_breadth >
    655             this_level->max_luma_picture_breadth ||
    656         level_spec->average_bitrate > this_level->average_bitrate ||
    657         level_spec->max_cpb_size > this_level->max_cpb_size ||
    658         level_spec->compression_ratio < this_level->compression_ratio ||
    659         level_spec->max_col_tiles > this_level->max_col_tiles ||
    660         level_spec->min_altref_distance < this_level->min_altref_distance ||
    661         level_spec->max_ref_frame_buffers > this_level->max_ref_frame_buffers)
    662       continue;
    663     break;
    664   }
    665   return (i == VP9_LEVELS) ? LEVEL_UNKNOWN : vp9_level_defs[i].level;
    666 }
    667 
    668 int vp9_set_roi_map(VP9_COMP *cpi, unsigned char *map, unsigned int rows,
    669                     unsigned int cols, int delta_q[8], int delta_lf[8],
    670                     int skip[8], int ref_frame[8]) {
    671   VP9_COMMON *cm = &cpi->common;
    672   vpx_roi_map_t *roi = &cpi->roi;
    673   const int range = 63;
    674   const int ref_frame_range = 3;  // Alt-ref
    675   const int skip_range = 1;
    676   const int frame_rows = cpi->common.mi_rows;
    677   const int frame_cols = cpi->common.mi_cols;
    678 
    679   // Check number of rows and columns match
    680   if (frame_rows != (int)rows || frame_cols != (int)cols) {
    681     return -1;
    682   }
    683 
    684   if (!check_seg_range(delta_q, range) || !check_seg_range(delta_lf, range) ||
    685       !check_seg_range(ref_frame, ref_frame_range) ||
    686       !check_seg_range(skip, skip_range))
    687     return -1;
    688 
    689   // Also disable segmentation if no deltas are specified.
    690   if (!map ||
    691       (!(delta_q[0] | delta_q[1] | delta_q[2] | delta_q[3] | delta_q[4] |
    692          delta_q[5] | delta_q[6] | delta_q[7] | delta_lf[0] | delta_lf[1] |
    693          delta_lf[2] | delta_lf[3] | delta_lf[4] | delta_lf[5] | delta_lf[6] |
    694          delta_lf[7] | skip[0] | skip[1] | skip[2] | skip[3] | skip[4] |
    695          skip[5] | skip[6] | skip[7]) &&
    696        (ref_frame[0] == -1 && ref_frame[1] == -1 && ref_frame[2] == -1 &&
    697         ref_frame[3] == -1 && ref_frame[4] == -1 && ref_frame[5] == -1 &&
    698         ref_frame[6] == -1 && ref_frame[7] == -1))) {
    699     vp9_disable_segmentation(&cm->seg);
    700     cpi->roi.enabled = 0;
    701     return 0;
    702   }
    703 
    704   if (roi->roi_map) {
    705     vpx_free(roi->roi_map);
    706     roi->roi_map = NULL;
    707   }
    708   CHECK_MEM_ERROR(cm, roi->roi_map, vpx_malloc(rows * cols));
    709 
    710   // Copy to ROI sturcture in the compressor.
    711   memcpy(roi->roi_map, map, rows * cols);
    712   memcpy(&roi->delta_q, delta_q, MAX_SEGMENTS * sizeof(delta_q[0]));
    713   memcpy(&roi->delta_lf, delta_lf, MAX_SEGMENTS * sizeof(delta_lf[0]));
    714   memcpy(&roi->skip, skip, MAX_SEGMENTS * sizeof(skip[0]));
    715   memcpy(&roi->ref_frame, ref_frame, MAX_SEGMENTS * sizeof(ref_frame[0]));
    716   roi->enabled = 1;
    717   roi->rows = rows;
    718   roi->cols = cols;
    719 
    720   return 0;
    721 }
    722 
    723 int vp9_set_active_map(VP9_COMP *cpi, unsigned char *new_map_16x16, int rows,
    724                        int cols) {
    725   if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
    726     unsigned char *const active_map_8x8 = cpi->active_map.map;
    727     const int mi_rows = cpi->common.mi_rows;
    728     const int mi_cols = cpi->common.mi_cols;
    729     cpi->active_map.update = 1;
    730     if (new_map_16x16) {
    731       int r, c;
    732       for (r = 0; r < mi_rows; ++r) {
    733         for (c = 0; c < mi_cols; ++c) {
    734           active_map_8x8[r * mi_cols + c] =
    735               new_map_16x16[(r >> 1) * cols + (c >> 1)]
    736                   ? AM_SEGMENT_ID_ACTIVE
    737                   : AM_SEGMENT_ID_INACTIVE;
    738         }
    739       }
    740       cpi->active_map.enabled = 1;
    741     } else {
    742       cpi->active_map.enabled = 0;
    743     }
    744     return 0;
    745   } else {
    746     return -1;
    747   }
    748 }
    749 
    750 int vp9_get_active_map(VP9_COMP *cpi, unsigned char *new_map_16x16, int rows,
    751                        int cols) {
    752   if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols &&
    753       new_map_16x16) {
    754     unsigned char *const seg_map_8x8 = cpi->segmentation_map;
    755     const int mi_rows = cpi->common.mi_rows;
    756     const int mi_cols = cpi->common.mi_cols;
    757     memset(new_map_16x16, !cpi->active_map.enabled, rows * cols);
    758     if (cpi->active_map.enabled) {
    759       int r, c;
    760       for (r = 0; r < mi_rows; ++r) {
    761         for (c = 0; c < mi_cols; ++c) {
    762           // Cyclic refresh segments are considered active despite not having
    763           // AM_SEGMENT_ID_ACTIVE
    764           new_map_16x16[(r >> 1) * cols + (c >> 1)] |=
    765               seg_map_8x8[r * mi_cols + c] != AM_SEGMENT_ID_INACTIVE;
    766         }
    767       }
    768     }
    769     return 0;
    770   } else {
    771     return -1;
    772   }
    773 }
    774 
    775 void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
    776   MACROBLOCK *const mb = &cpi->td.mb;
    777   cpi->common.allow_high_precision_mv = allow_high_precision_mv;
    778   if (cpi->common.allow_high_precision_mv) {
    779     mb->mvcost = mb->nmvcost_hp;
    780     mb->mvsadcost = mb->nmvsadcost_hp;
    781   } else {
    782     mb->mvcost = mb->nmvcost;
    783     mb->mvsadcost = mb->nmvsadcost;
    784   }
    785 }
    786 
    787 static void setup_frame(VP9_COMP *cpi) {
    788   VP9_COMMON *const cm = &cpi->common;
    789   // Set up entropy context depending on frame type. The decoder mandates
    790   // the use of the default context, index 0, for keyframes and inter
    791   // frames where the error_resilient_mode or intra_only flag is set. For
    792   // other inter-frames the encoder currently uses only two contexts;
    793   // context 1 for ALTREF frames and context 0 for the others.
    794   if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
    795     vp9_setup_past_independence(cm);
    796   } else {
    797     if (!cpi->use_svc) cm->frame_context_idx = cpi->refresh_alt_ref_frame;
    798   }
    799 
    800   // TODO(jingning): Overwrite the frame_context_idx index in multi-layer ARF
    801   // case. Need some further investigation on if we could apply this to single
    802   // layer ARF case as well.
    803   if (cpi->multi_layer_arf && !cpi->use_svc) {
    804     GF_GROUP *const gf_group = &cpi->twopass.gf_group;
    805     cm->frame_context_idx = clamp(gf_group->layer_depth[gf_group->index] - 1, 0,
    806                                   FRAME_CONTEXTS - 1);
    807   }
    808 
    809   if (cm->frame_type == KEY_FRAME) {
    810     cpi->refresh_golden_frame = 1;
    811     cpi->refresh_alt_ref_frame = 1;
    812     vp9_zero(cpi->interp_filter_selected);
    813   } else {
    814     *cm->fc = cm->frame_contexts[cm->frame_context_idx];
    815     vp9_zero(cpi->interp_filter_selected[0]);
    816   }
    817 }
    818 
    819 static void vp9_enc_setup_mi(VP9_COMMON *cm) {
    820   int i;
    821   cm->mi = cm->mip + cm->mi_stride + 1;
    822   memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
    823   cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
    824   // Clear top border row
    825   memset(cm->prev_mip, 0, sizeof(*cm->prev_mip) * cm->mi_stride);
    826   // Clear left border column
    827   for (i = 1; i < cm->mi_rows + 1; ++i)
    828     memset(&cm->prev_mip[i * cm->mi_stride], 0, sizeof(*cm->prev_mip));
    829 
    830   cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
    831   cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
    832 
    833   memset(cm->mi_grid_base, 0,
    834          cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mi_grid_base));
    835 }
    836 
    837 static int vp9_enc_alloc_mi(VP9_COMMON *cm, int mi_size) {
    838   cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip));
    839   if (!cm->mip) return 1;
    840   cm->prev_mip = vpx_calloc(mi_size, sizeof(*cm->prev_mip));
    841   if (!cm->prev_mip) return 1;
    842   cm->mi_alloc_size = mi_size;
    843 
    844   cm->mi_grid_base = (MODE_INFO **)vpx_calloc(mi_size, sizeof(MODE_INFO *));
    845   if (!cm->mi_grid_base) return 1;
    846   cm->prev_mi_grid_base =
    847       (MODE_INFO **)vpx_calloc(mi_size, sizeof(MODE_INFO *));
    848   if (!cm->prev_mi_grid_base) return 1;
    849 
    850   return 0;
    851 }
    852 
    853 static void vp9_enc_free_mi(VP9_COMMON *cm) {
    854   vpx_free(cm->mip);
    855   cm->mip = NULL;
    856   vpx_free(cm->prev_mip);
    857   cm->prev_mip = NULL;
    858   vpx_free(cm->mi_grid_base);
    859   cm->mi_grid_base = NULL;
    860   vpx_free(cm->prev_mi_grid_base);
    861   cm->prev_mi_grid_base = NULL;
    862   cm->mi_alloc_size = 0;
    863 }
    864 
    865 static void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
    866   // Current mip will be the prev_mip for the next frame.
    867   MODE_INFO **temp_base = cm->prev_mi_grid_base;
    868   MODE_INFO *temp = cm->prev_mip;
    869 
    870   // Skip update prev_mi frame in show_existing_frame mode.
    871   if (cm->show_existing_frame) return;
    872 
    873   cm->prev_mip = cm->mip;
    874   cm->mip = temp;
    875 
    876   // Update the upper left visible macroblock ptrs.
    877   cm->mi = cm->mip + cm->mi_stride + 1;
    878   cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
    879 
    880   cm->prev_mi_grid_base = cm->mi_grid_base;
    881   cm->mi_grid_base = temp_base;
    882   cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
    883   cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
    884 }
    885 
    886 void vp9_initialize_enc(void) {
    887   static volatile int init_done = 0;
    888 
    889   if (!init_done) {
    890     vp9_rtcd();
    891     vpx_dsp_rtcd();
    892     vpx_scale_rtcd();
    893     vp9_init_intra_predictors();
    894     vp9_init_me_luts();
    895     vp9_rc_init_minq_luts();
    896     vp9_entropy_mv_init();
    897 #if !CONFIG_REALTIME_ONLY
    898     vp9_temporal_filter_init();
    899 #endif
    900     init_done = 1;
    901   }
    902 }
    903 
    904 static void dealloc_compressor_data(VP9_COMP *cpi) {
    905   VP9_COMMON *const cm = &cpi->common;
    906   int i;
    907 
    908   vpx_free(cpi->mbmi_ext_base);
    909   cpi->mbmi_ext_base = NULL;
    910 
    911   vpx_free(cpi->tile_data);
    912   cpi->tile_data = NULL;
    913 
    914   vpx_free(cpi->segmentation_map);
    915   cpi->segmentation_map = NULL;
    916   vpx_free(cpi->coding_context.last_frame_seg_map_copy);
    917   cpi->coding_context.last_frame_seg_map_copy = NULL;
    918 
    919   vpx_free(cpi->nmvcosts[0]);
    920   vpx_free(cpi->nmvcosts[1]);
    921   cpi->nmvcosts[0] = NULL;
    922   cpi->nmvcosts[1] = NULL;
    923 
    924   vpx_free(cpi->nmvcosts_hp[0]);
    925   vpx_free(cpi->nmvcosts_hp[1]);
    926   cpi->nmvcosts_hp[0] = NULL;
    927   cpi->nmvcosts_hp[1] = NULL;
    928 
    929   vpx_free(cpi->nmvsadcosts[0]);
    930   vpx_free(cpi->nmvsadcosts[1]);
    931   cpi->nmvsadcosts[0] = NULL;
    932   cpi->nmvsadcosts[1] = NULL;
    933 
    934   vpx_free(cpi->nmvsadcosts_hp[0]);
    935   vpx_free(cpi->nmvsadcosts_hp[1]);
    936   cpi->nmvsadcosts_hp[0] = NULL;
    937   cpi->nmvsadcosts_hp[1] = NULL;
    938 
    939   vpx_free(cpi->skin_map);
    940   cpi->skin_map = NULL;
    941 
    942   vpx_free(cpi->prev_partition);
    943   cpi->prev_partition = NULL;
    944 
    945   vpx_free(cpi->svc.prev_partition_svc);
    946   cpi->svc.prev_partition_svc = NULL;
    947 
    948   vpx_free(cpi->prev_segment_id);
    949   cpi->prev_segment_id = NULL;
    950 
    951   vpx_free(cpi->prev_variance_low);
    952   cpi->prev_variance_low = NULL;
    953 
    954   vpx_free(cpi->copied_frame_cnt);
    955   cpi->copied_frame_cnt = NULL;
    956 
    957   vpx_free(cpi->content_state_sb_fd);
    958   cpi->content_state_sb_fd = NULL;
    959 
    960   vpx_free(cpi->count_arf_frame_usage);
    961   cpi->count_arf_frame_usage = NULL;
    962   vpx_free(cpi->count_lastgolden_frame_usage);
    963   cpi->count_lastgolden_frame_usage = NULL;
    964 
    965   vp9_cyclic_refresh_free(cpi->cyclic_refresh);
    966   cpi->cyclic_refresh = NULL;
    967 
    968   vpx_free(cpi->active_map.map);
    969   cpi->active_map.map = NULL;
    970 
    971   vpx_free(cpi->roi.roi_map);
    972   cpi->roi.roi_map = NULL;
    973 
    974   vpx_free(cpi->consec_zero_mv);
    975   cpi->consec_zero_mv = NULL;
    976 
    977   vp9_free_ref_frame_buffers(cm->buffer_pool);
    978 #if CONFIG_VP9_POSTPROC
    979   vp9_free_postproc_buffers(cm);
    980 #endif
    981   vp9_free_context_buffers(cm);
    982 
    983   vpx_free_frame_buffer(&cpi->last_frame_uf);
    984   vpx_free_frame_buffer(&cpi->scaled_source);
    985   vpx_free_frame_buffer(&cpi->scaled_last_source);
    986   vpx_free_frame_buffer(&cpi->alt_ref_buffer);
    987 #ifdef ENABLE_KF_DENOISE
    988   vpx_free_frame_buffer(&cpi->raw_unscaled_source);
    989   vpx_free_frame_buffer(&cpi->raw_scaled_source);
    990 #endif
    991 
    992   vp9_lookahead_destroy(cpi->lookahead);
    993 
    994   vpx_free(cpi->tile_tok[0][0]);
    995   cpi->tile_tok[0][0] = 0;
    996 
    997   vpx_free(cpi->tplist[0][0]);
    998   cpi->tplist[0][0] = NULL;
    999 
   1000   vp9_free_pc_tree(&cpi->td);
   1001 
   1002   for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
   1003     LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
   1004     vpx_free(lc->rc_twopass_stats_in.buf);
   1005     lc->rc_twopass_stats_in.buf = NULL;
   1006     lc->rc_twopass_stats_in.sz = 0;
   1007   }
   1008 
   1009   if (cpi->source_diff_var != NULL) {
   1010     vpx_free(cpi->source_diff_var);
   1011     cpi->source_diff_var = NULL;
   1012   }
   1013 
   1014   for (i = 0; i < MAX_LAG_BUFFERS; ++i) {
   1015     vpx_free_frame_buffer(&cpi->svc.scaled_frames[i]);
   1016   }
   1017   memset(&cpi->svc.scaled_frames[0], 0,
   1018          MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0]));
   1019 
   1020   vpx_free_frame_buffer(&cpi->svc.scaled_temp);
   1021   memset(&cpi->svc.scaled_temp, 0, sizeof(cpi->svc.scaled_temp));
   1022 
   1023   vpx_free_frame_buffer(&cpi->svc.empty_frame.img);
   1024   memset(&cpi->svc.empty_frame, 0, sizeof(cpi->svc.empty_frame));
   1025 
   1026   vp9_free_svc_cyclic_refresh(cpi);
   1027 }
   1028 
   1029 static void save_coding_context(VP9_COMP *cpi) {
   1030   CODING_CONTEXT *const cc = &cpi->coding_context;
   1031   VP9_COMMON *cm = &cpi->common;
   1032 
   1033   // Stores a snapshot of key state variables which can subsequently be
   1034   // restored with a call to vp9_restore_coding_context. These functions are
   1035   // intended for use in a re-code loop in vp9_compress_frame where the
   1036   // quantizer value is adjusted between loop iterations.
   1037   vp9_copy(cc->nmvjointcost, cpi->td.mb.nmvjointcost);
   1038 
   1039   memcpy(cc->nmvcosts[0], cpi->nmvcosts[0],
   1040          MV_VALS * sizeof(*cpi->nmvcosts[0]));
   1041   memcpy(cc->nmvcosts[1], cpi->nmvcosts[1],
   1042          MV_VALS * sizeof(*cpi->nmvcosts[1]));
   1043   memcpy(cc->nmvcosts_hp[0], cpi->nmvcosts_hp[0],
   1044          MV_VALS * sizeof(*cpi->nmvcosts_hp[0]));
   1045   memcpy(cc->nmvcosts_hp[1], cpi->nmvcosts_hp[1],
   1046          MV_VALS * sizeof(*cpi->nmvcosts_hp[1]));
   1047 
   1048   vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
   1049 
   1050   memcpy(cpi->coding_context.last_frame_seg_map_copy, cm->last_frame_seg_map,
   1051          (cm->mi_rows * cm->mi_cols));
   1052 
   1053   vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
   1054   vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
   1055 
   1056   cc->fc = *cm->fc;
   1057 }
   1058 
   1059 static void restore_coding_context(VP9_COMP *cpi) {
   1060   CODING_CONTEXT *const cc = &cpi->coding_context;
   1061   VP9_COMMON *cm = &cpi->common;
   1062 
   1063   // Restore key state variables to the snapshot state stored in the
   1064   // previous call to vp9_save_coding_context.
   1065   vp9_copy(cpi->td.mb.nmvjointcost, cc->nmvjointcost);
   1066 
   1067   memcpy(cpi->nmvcosts[0], cc->nmvcosts[0], MV_VALS * sizeof(*cc->nmvcosts[0]));
   1068   memcpy(cpi->nmvcosts[1], cc->nmvcosts[1], MV_VALS * sizeof(*cc->nmvcosts[1]));
   1069   memcpy(cpi->nmvcosts_hp[0], cc->nmvcosts_hp[0],
   1070          MV_VALS * sizeof(*cc->nmvcosts_hp[0]));
   1071   memcpy(cpi->nmvcosts_hp[1], cc->nmvcosts_hp[1],
   1072          MV_VALS * sizeof(*cc->nmvcosts_hp[1]));
   1073 
   1074   vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
   1075 
   1076   memcpy(cm->last_frame_seg_map, cpi->coding_context.last_frame_seg_map_copy,
   1077          (cm->mi_rows * cm->mi_cols));
   1078 
   1079   vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
   1080   vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
   1081 
   1082   *cm->fc = cc->fc;
   1083 }
   1084 
   1085 #if !CONFIG_REALTIME_ONLY
   1086 static void configure_static_seg_features(VP9_COMP *cpi) {
   1087   VP9_COMMON *const cm = &cpi->common;
   1088   const RATE_CONTROL *const rc = &cpi->rc;
   1089   struct segmentation *const seg = &cm->seg;
   1090 
   1091   int high_q = (int)(rc->avg_q > 48.0);
   1092   int qi_delta;
   1093 
   1094   // Disable and clear down for KF
   1095   if (cm->frame_type == KEY_FRAME) {
   1096     // Clear down the global segmentation map
   1097     memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
   1098     seg->update_map = 0;
   1099     seg->update_data = 0;
   1100     cpi->static_mb_pct = 0;
   1101 
   1102     // Disable segmentation
   1103     vp9_disable_segmentation(seg);
   1104 
   1105     // Clear down the segment features.
   1106     vp9_clearall_segfeatures(seg);
   1107   } else if (cpi->refresh_alt_ref_frame) {
   1108     // If this is an alt ref frame
   1109     // Clear down the global segmentation map
   1110     memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
   1111     seg->update_map = 0;
   1112     seg->update_data = 0;
   1113     cpi->static_mb_pct = 0;
   1114 
   1115     // Disable segmentation and individual segment features by default
   1116     vp9_disable_segmentation(seg);
   1117     vp9_clearall_segfeatures(seg);
   1118 
   1119     // Scan frames from current to arf frame.
   1120     // This function re-enables segmentation if appropriate.
   1121     vp9_update_mbgraph_stats(cpi);
   1122 
   1123     // If segmentation was enabled set those features needed for the
   1124     // arf itself.
   1125     if (seg->enabled) {
   1126       seg->update_map = 1;
   1127       seg->update_data = 1;
   1128 
   1129       qi_delta =
   1130           vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875, cm->bit_depth);
   1131       vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
   1132       vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
   1133 
   1134       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
   1135       vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
   1136 
   1137       // Where relevant assume segment data is delta data
   1138       seg->abs_delta = SEGMENT_DELTADATA;
   1139     }
   1140   } else if (seg->enabled) {
   1141     // All other frames if segmentation has been enabled
   1142 
   1143     // First normal frame in a valid gf or alt ref group
   1144     if (rc->frames_since_golden == 0) {
   1145       // Set up segment features for normal frames in an arf group
   1146       if (rc->source_alt_ref_active) {
   1147         seg->update_map = 0;
   1148         seg->update_data = 1;
   1149         seg->abs_delta = SEGMENT_DELTADATA;
   1150 
   1151         qi_delta =
   1152             vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125, cm->bit_depth);
   1153         vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
   1154         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
   1155 
   1156         vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
   1157         vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
   1158 
   1159         // Segment coding disabled for compred testing
   1160         if (high_q || (cpi->static_mb_pct == 100)) {
   1161           vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
   1162           vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
   1163           vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
   1164         }
   1165       } else {
   1166         // Disable segmentation and clear down features if alt ref
   1167         // is not active for this group
   1168 
   1169         vp9_disable_segmentation(seg);
   1170 
   1171         memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
   1172 
   1173         seg->update_map = 0;
   1174         seg->update_data = 0;
   1175 
   1176         vp9_clearall_segfeatures(seg);
   1177       }
   1178     } else if (rc->is_src_frame_alt_ref) {
   1179       // Special case where we are coding over the top of a previous
   1180       // alt ref frame.
   1181       // Segment coding disabled for compred testing
   1182 
   1183       // Enable ref frame features for segment 0 as well
   1184       vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
   1185       vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
   1186 
   1187       // All mbs should use ALTREF_FRAME
   1188       vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
   1189       vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
   1190       vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
   1191       vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
   1192 
   1193       // Skip all MBs if high Q (0,0 mv and skip coeffs)
   1194       if (high_q) {
   1195         vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
   1196         vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
   1197       }
   1198       // Enable data update
   1199       seg->update_data = 1;
   1200     } else {
   1201       // All other frames.
   1202 
   1203       // No updates.. leave things as they are.
   1204       seg->update_map = 0;
   1205       seg->update_data = 0;
   1206     }
   1207   }
   1208 }
   1209 #endif  // !CONFIG_REALTIME_ONLY
   1210 
   1211 static void update_reference_segmentation_map(VP9_COMP *cpi) {
   1212   VP9_COMMON *const cm = &cpi->common;
   1213   MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
   1214   uint8_t *cache_ptr = cm->last_frame_seg_map;
   1215   int row, col;
   1216 
   1217   for (row = 0; row < cm->mi_rows; row++) {
   1218     MODE_INFO **mi_8x8 = mi_8x8_ptr;
   1219     uint8_t *cache = cache_ptr;
   1220     for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
   1221       cache[0] = mi_8x8[0]->segment_id;
   1222     mi_8x8_ptr += cm->mi_stride;
   1223     cache_ptr += cm->mi_cols;
   1224   }
   1225 }
   1226 
   1227 static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
   1228   VP9_COMMON *cm = &cpi->common;
   1229   const VP9EncoderConfig *oxcf = &cpi->oxcf;
   1230 
   1231   if (!cpi->lookahead)
   1232     cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
   1233                                         cm->subsampling_x, cm->subsampling_y,
   1234 #if CONFIG_VP9_HIGHBITDEPTH
   1235                                         cm->use_highbitdepth,
   1236 #endif
   1237                                         oxcf->lag_in_frames);
   1238   if (!cpi->lookahead)
   1239     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1240                        "Failed to allocate lag buffers");
   1241 
   1242   // TODO(agrange) Check if ARF is enabled and skip allocation if not.
   1243   if (vpx_realloc_frame_buffer(&cpi->alt_ref_buffer, oxcf->width, oxcf->height,
   1244                                cm->subsampling_x, cm->subsampling_y,
   1245 #if CONFIG_VP9_HIGHBITDEPTH
   1246                                cm->use_highbitdepth,
   1247 #endif
   1248                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1249                                NULL, NULL, NULL))
   1250     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1251                        "Failed to allocate altref buffer");
   1252 }
   1253 
   1254 static void alloc_util_frame_buffers(VP9_COMP *cpi) {
   1255   VP9_COMMON *const cm = &cpi->common;
   1256   if (vpx_realloc_frame_buffer(&cpi->last_frame_uf, cm->width, cm->height,
   1257                                cm->subsampling_x, cm->subsampling_y,
   1258 #if CONFIG_VP9_HIGHBITDEPTH
   1259                                cm->use_highbitdepth,
   1260 #endif
   1261                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1262                                NULL, NULL, NULL))
   1263     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1264                        "Failed to allocate last frame buffer");
   1265 
   1266   if (vpx_realloc_frame_buffer(&cpi->scaled_source, cm->width, cm->height,
   1267                                cm->subsampling_x, cm->subsampling_y,
   1268 #if CONFIG_VP9_HIGHBITDEPTH
   1269                                cm->use_highbitdepth,
   1270 #endif
   1271                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1272                                NULL, NULL, NULL))
   1273     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1274                        "Failed to allocate scaled source buffer");
   1275 
   1276   // For 1 pass cbr: allocate scaled_frame that may be used as an intermediate
   1277   // buffer for a 2 stage down-sampling: two stages of 1:2 down-sampling for a
   1278   // target of 1/4x1/4. number_spatial_layers must be greater than 2.
   1279   if (is_one_pass_cbr_svc(cpi) && !cpi->svc.scaled_temp_is_alloc &&
   1280       cpi->svc.number_spatial_layers > 2) {
   1281     cpi->svc.scaled_temp_is_alloc = 1;
   1282     if (vpx_realloc_frame_buffer(
   1283             &cpi->svc.scaled_temp, cm->width >> 1, cm->height >> 1,
   1284             cm->subsampling_x, cm->subsampling_y,
   1285 #if CONFIG_VP9_HIGHBITDEPTH
   1286             cm->use_highbitdepth,
   1287 #endif
   1288             VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, NULL, NULL, NULL))
   1289       vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1290                          "Failed to allocate scaled_frame for svc ");
   1291   }
   1292 
   1293   if (vpx_realloc_frame_buffer(&cpi->scaled_last_source, cm->width, cm->height,
   1294                                cm->subsampling_x, cm->subsampling_y,
   1295 #if CONFIG_VP9_HIGHBITDEPTH
   1296                                cm->use_highbitdepth,
   1297 #endif
   1298                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1299                                NULL, NULL, NULL))
   1300     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1301                        "Failed to allocate scaled last source buffer");
   1302 #ifdef ENABLE_KF_DENOISE
   1303   if (vpx_realloc_frame_buffer(&cpi->raw_unscaled_source, cm->width, cm->height,
   1304                                cm->subsampling_x, cm->subsampling_y,
   1305 #if CONFIG_VP9_HIGHBITDEPTH
   1306                                cm->use_highbitdepth,
   1307 #endif
   1308                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1309                                NULL, NULL, NULL))
   1310     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1311                        "Failed to allocate unscaled raw source frame buffer");
   1312 
   1313   if (vpx_realloc_frame_buffer(&cpi->raw_scaled_source, cm->width, cm->height,
   1314                                cm->subsampling_x, cm->subsampling_y,
   1315 #if CONFIG_VP9_HIGHBITDEPTH
   1316                                cm->use_highbitdepth,
   1317 #endif
   1318                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   1319                                NULL, NULL, NULL))
   1320     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   1321                        "Failed to allocate scaled raw source frame buffer");
   1322 #endif
   1323 }
   1324 
   1325 static int alloc_context_buffers_ext(VP9_COMP *cpi) {
   1326   VP9_COMMON *cm = &cpi->common;
   1327   int mi_size = cm->mi_cols * cm->mi_rows;
   1328 
   1329   cpi->mbmi_ext_base = vpx_calloc(mi_size, sizeof(*cpi->mbmi_ext_base));
   1330   if (!cpi->mbmi_ext_base) return 1;
   1331 
   1332   return 0;
   1333 }
   1334 
   1335 static void alloc_compressor_data(VP9_COMP *cpi) {
   1336   VP9_COMMON *cm = &cpi->common;
   1337   int sb_rows;
   1338 
   1339   vp9_alloc_context_buffers(cm, cm->width, cm->height);
   1340 
   1341   alloc_context_buffers_ext(cpi);
   1342 
   1343   vpx_free(cpi->tile_tok[0][0]);
   1344 
   1345   {
   1346     unsigned int tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
   1347     CHECK_MEM_ERROR(cm, cpi->tile_tok[0][0],
   1348                     vpx_calloc(tokens, sizeof(*cpi->tile_tok[0][0])));
   1349   }
   1350 
   1351   sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2;
   1352   vpx_free(cpi->tplist[0][0]);
   1353   CHECK_MEM_ERROR(
   1354       cm, cpi->tplist[0][0],
   1355       vpx_calloc(sb_rows * 4 * (1 << 6), sizeof(*cpi->tplist[0][0])));
   1356 
   1357   vp9_setup_pc_tree(&cpi->common, &cpi->td);
   1358 }
   1359 
   1360 void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
   1361   cpi->framerate = framerate < 0.1 ? 30 : framerate;
   1362   vp9_rc_update_framerate(cpi);
   1363 }
   1364 
   1365 static void set_tile_limits(VP9_COMP *cpi) {
   1366   VP9_COMMON *const cm = &cpi->common;
   1367 
   1368   int min_log2_tile_cols, max_log2_tile_cols;
   1369   vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
   1370 
   1371   cm->log2_tile_cols =
   1372       clamp(cpi->oxcf.tile_columns, min_log2_tile_cols, max_log2_tile_cols);
   1373   cm->log2_tile_rows = cpi->oxcf.tile_rows;
   1374 
   1375   if (cpi->oxcf.target_level == LEVEL_AUTO) {
   1376     const int level_tile_cols =
   1377         log_tile_cols_from_picsize_level(cpi->common.width, cpi->common.height);
   1378     if (cm->log2_tile_cols > level_tile_cols) {
   1379       cm->log2_tile_cols = VPXMAX(level_tile_cols, min_log2_tile_cols);
   1380     }
   1381   }
   1382 }
   1383 
   1384 static void update_frame_size(VP9_COMP *cpi) {
   1385   VP9_COMMON *const cm = &cpi->common;
   1386   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
   1387 
   1388   vp9_set_mb_mi(cm, cm->width, cm->height);
   1389   vp9_init_context_buffers(cm);
   1390   vp9_init_macroblockd(cm, xd, NULL);
   1391   cpi->td.mb.mbmi_ext_base = cpi->mbmi_ext_base;
   1392   memset(cpi->mbmi_ext_base, 0,
   1393          cm->mi_rows * cm->mi_cols * sizeof(*cpi->mbmi_ext_base));
   1394 
   1395   set_tile_limits(cpi);
   1396 }
   1397 
   1398 static void init_buffer_indices(VP9_COMP *cpi) {
   1399   int ref_frame;
   1400 
   1401   for (ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame)
   1402     cpi->ref_fb_idx[ref_frame] = ref_frame;
   1403 
   1404   cpi->lst_fb_idx = cpi->ref_fb_idx[LAST_FRAME - 1];
   1405   cpi->gld_fb_idx = cpi->ref_fb_idx[GOLDEN_FRAME - 1];
   1406   cpi->alt_fb_idx = cpi->ref_fb_idx[ALTREF_FRAME - 1];
   1407 }
   1408 
   1409 static void init_level_constraint(LevelConstraint *lc) {
   1410   lc->level_index = -1;
   1411   lc->max_cpb_size = INT_MAX;
   1412   lc->max_frame_size = INT_MAX;
   1413   lc->rc_config_updated = 0;
   1414   lc->fail_flag = 0;
   1415 }
   1416 
   1417 static void set_level_constraint(LevelConstraint *ls, int8_t level_index) {
   1418   vpx_clear_system_state();
   1419   ls->level_index = level_index;
   1420   if (level_index >= 0) {
   1421     ls->max_cpb_size = vp9_level_defs[level_index].max_cpb_size * (double)1000;
   1422   }
   1423 }
   1424 
   1425 static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) {
   1426   VP9_COMMON *const cm = &cpi->common;
   1427 
   1428   cpi->oxcf = *oxcf;
   1429   cpi->framerate = oxcf->init_framerate;
   1430   cm->profile = oxcf->profile;
   1431   cm->bit_depth = oxcf->bit_depth;
   1432 #if CONFIG_VP9_HIGHBITDEPTH
   1433   cm->use_highbitdepth = oxcf->use_highbitdepth;
   1434 #endif
   1435   cm->color_space = oxcf->color_space;
   1436   cm->color_range = oxcf->color_range;
   1437 
   1438   cpi->target_level = oxcf->target_level;
   1439   cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
   1440   set_level_constraint(&cpi->level_constraint,
   1441                        get_level_index(cpi->target_level));
   1442 
   1443   cm->width = oxcf->width;
   1444   cm->height = oxcf->height;
   1445   alloc_compressor_data(cpi);
   1446 
   1447   cpi->svc.temporal_layering_mode = oxcf->temporal_layering_mode;
   1448 
   1449   // Single thread case: use counts in common.
   1450   cpi->td.counts = &cm->counts;
   1451 
   1452   // Spatial scalability.
   1453   cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
   1454   // Temporal scalability.
   1455   cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
   1456 
   1457   if ((cpi->svc.number_temporal_layers > 1 && cpi->oxcf.rc_mode == VPX_CBR) ||
   1458       ((cpi->svc.number_temporal_layers > 1 ||
   1459         cpi->svc.number_spatial_layers > 1) &&
   1460        cpi->oxcf.pass != 1)) {
   1461     vp9_init_layer_context(cpi);
   1462   }
   1463 
   1464   // change includes all joint functionality
   1465   vp9_change_config(cpi, oxcf);
   1466 
   1467   cpi->static_mb_pct = 0;
   1468   cpi->ref_frame_flags = 0;
   1469 
   1470   init_buffer_indices(cpi);
   1471 
   1472   vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
   1473 }
   1474 
   1475 static void set_rc_buffer_sizes(RATE_CONTROL *rc,
   1476                                 const VP9EncoderConfig *oxcf) {
   1477   const int64_t bandwidth = oxcf->target_bandwidth;
   1478   const int64_t starting = oxcf->starting_buffer_level_ms;
   1479   const int64_t optimal = oxcf->optimal_buffer_level_ms;
   1480   const int64_t maximum = oxcf->maximum_buffer_size_ms;
   1481 
   1482   rc->starting_buffer_level = starting * bandwidth / 1000;
   1483   rc->optimal_buffer_level =
   1484       (optimal == 0) ? bandwidth / 8 : optimal * bandwidth / 1000;
   1485   rc->maximum_buffer_size =
   1486       (maximum == 0) ? bandwidth / 8 : maximum * bandwidth / 1000;
   1487 }
   1488 
   1489 #if CONFIG_VP9_HIGHBITDEPTH
   1490 #define HIGHBD_BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX4DF) \
   1491   cpi->fn_ptr[BT].sdf = SDF;                             \
   1492   cpi->fn_ptr[BT].sdaf = SDAF;                           \
   1493   cpi->fn_ptr[BT].vf = VF;                               \
   1494   cpi->fn_ptr[BT].svf = SVF;                             \
   1495   cpi->fn_ptr[BT].svaf = SVAF;                           \
   1496   cpi->fn_ptr[BT].sdx4df = SDX4DF;
   1497 
   1498 #define MAKE_BFP_SAD_WRAPPER(fnname)                                           \
   1499   static unsigned int fnname##_bits8(const uint8_t *src_ptr,                   \
   1500                                      int source_stride,                        \
   1501                                      const uint8_t *ref_ptr, int ref_stride) { \
   1502     return fnname(src_ptr, source_stride, ref_ptr, ref_stride);                \
   1503   }                                                                            \
   1504   static unsigned int fnname##_bits10(                                         \
   1505       const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
   1506       int ref_stride) {                                                        \
   1507     return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 2;           \
   1508   }                                                                            \
   1509   static unsigned int fnname##_bits12(                                         \
   1510       const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
   1511       int ref_stride) {                                                        \
   1512     return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 4;           \
   1513   }
   1514 
   1515 #define MAKE_BFP_SADAVG_WRAPPER(fnname)                                        \
   1516   static unsigned int fnname##_bits8(                                          \
   1517       const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
   1518       int ref_stride, const uint8_t *second_pred) {                            \
   1519     return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred);   \
   1520   }                                                                            \
   1521   static unsigned int fnname##_bits10(                                         \
   1522       const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
   1523       int ref_stride, const uint8_t *second_pred) {                            \
   1524     return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred) >> \
   1525            2;                                                                  \
   1526   }                                                                            \
   1527   static unsigned int fnname##_bits12(                                         \
   1528       const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
   1529       int ref_stride, const uint8_t *second_pred) {                            \
   1530     return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred) >> \
   1531            4;                                                                  \
   1532   }
   1533 
   1534 #define MAKE_BFP_SAD4D_WRAPPER(fnname)                                        \
   1535   static void fnname##_bits8(const uint8_t *src_ptr, int source_stride,       \
   1536                              const uint8_t *const ref_ptr[], int ref_stride,  \
   1537                              unsigned int *sad_array) {                       \
   1538     fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
   1539   }                                                                           \
   1540   static void fnname##_bits10(const uint8_t *src_ptr, int source_stride,      \
   1541                               const uint8_t *const ref_ptr[], int ref_stride, \
   1542                               unsigned int *sad_array) {                      \
   1543     int i;                                                                    \
   1544     fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
   1545     for (i = 0; i < 4; i++) sad_array[i] >>= 2;                               \
   1546   }                                                                           \
   1547   static void fnname##_bits12(const uint8_t *src_ptr, int source_stride,      \
   1548                               const uint8_t *const ref_ptr[], int ref_stride, \
   1549                               unsigned int *sad_array) {                      \
   1550     int i;                                                                    \
   1551     fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
   1552     for (i = 0; i < 4; i++) sad_array[i] >>= 4;                               \
   1553   }
   1554 
   1555 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x16)
   1556 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x16_avg)
   1557 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x16x4d)
   1558 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x32)
   1559 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x32_avg)
   1560 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x32x4d)
   1561 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad64x32)
   1562 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad64x32_avg)
   1563 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad64x32x4d)
   1564 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x64)
   1565 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x64_avg)
   1566 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x64x4d)
   1567 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x32)
   1568 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x32_avg)
   1569 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x32x4d)
   1570 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad64x64)
   1571 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad64x64_avg)
   1572 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad64x64x4d)
   1573 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x16)
   1574 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x16_avg)
   1575 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x16x4d)
   1576 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x8)
   1577 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x8_avg)
   1578 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x8x4d)
   1579 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x16)
   1580 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x16_avg)
   1581 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x16x4d)
   1582 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x8)
   1583 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x8_avg)
   1584 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x8x4d)
   1585 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x4)
   1586 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x4_avg)
   1587 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x4x4d)
   1588 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad4x8)
   1589 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad4x8_avg)
   1590 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad4x8x4d)
   1591 MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad4x4)
   1592 MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad4x4_avg)
   1593 MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad4x4x4d)
   1594 
   1595 static void highbd_set_var_fns(VP9_COMP *const cpi) {
   1596   VP9_COMMON *const cm = &cpi->common;
   1597   if (cm->use_highbitdepth) {
   1598     switch (cm->bit_depth) {
   1599       case VPX_BITS_8:
   1600         HIGHBD_BFP(BLOCK_32X16, vpx_highbd_sad32x16_bits8,
   1601                    vpx_highbd_sad32x16_avg_bits8, vpx_highbd_8_variance32x16,
   1602                    vpx_highbd_8_sub_pixel_variance32x16,
   1603                    vpx_highbd_8_sub_pixel_avg_variance32x16,
   1604                    vpx_highbd_sad32x16x4d_bits8)
   1605 
   1606         HIGHBD_BFP(BLOCK_16X32, vpx_highbd_sad16x32_bits8,
   1607                    vpx_highbd_sad16x32_avg_bits8, vpx_highbd_8_variance16x32,
   1608                    vpx_highbd_8_sub_pixel_variance16x32,
   1609                    vpx_highbd_8_sub_pixel_avg_variance16x32,
   1610                    vpx_highbd_sad16x32x4d_bits8)
   1611 
   1612         HIGHBD_BFP(BLOCK_64X32, vpx_highbd_sad64x32_bits8,
   1613                    vpx_highbd_sad64x32_avg_bits8, vpx_highbd_8_variance64x32,
   1614                    vpx_highbd_8_sub_pixel_variance64x32,
   1615                    vpx_highbd_8_sub_pixel_avg_variance64x32,
   1616                    vpx_highbd_sad64x32x4d_bits8)
   1617 
   1618         HIGHBD_BFP(BLOCK_32X64, vpx_highbd_sad32x64_bits8,
   1619                    vpx_highbd_sad32x64_avg_bits8, vpx_highbd_8_variance32x64,
   1620                    vpx_highbd_8_sub_pixel_variance32x64,
   1621                    vpx_highbd_8_sub_pixel_avg_variance32x64,
   1622                    vpx_highbd_sad32x64x4d_bits8)
   1623 
   1624         HIGHBD_BFP(BLOCK_32X32, vpx_highbd_sad32x32_bits8,
   1625                    vpx_highbd_sad32x32_avg_bits8, vpx_highbd_8_variance32x32,
   1626                    vpx_highbd_8_sub_pixel_variance32x32,
   1627                    vpx_highbd_8_sub_pixel_avg_variance32x32,
   1628                    vpx_highbd_sad32x32x4d_bits8)
   1629 
   1630         HIGHBD_BFP(BLOCK_64X64, vpx_highbd_sad64x64_bits8,
   1631                    vpx_highbd_sad64x64_avg_bits8, vpx_highbd_8_variance64x64,
   1632                    vpx_highbd_8_sub_pixel_variance64x64,
   1633                    vpx_highbd_8_sub_pixel_avg_variance64x64,
   1634                    vpx_highbd_sad64x64x4d_bits8)
   1635 
   1636         HIGHBD_BFP(BLOCK_16X16, vpx_highbd_sad16x16_bits8,
   1637                    vpx_highbd_sad16x16_avg_bits8, vpx_highbd_8_variance16x16,
   1638                    vpx_highbd_8_sub_pixel_variance16x16,
   1639                    vpx_highbd_8_sub_pixel_avg_variance16x16,
   1640                    vpx_highbd_sad16x16x4d_bits8)
   1641 
   1642         HIGHBD_BFP(BLOCK_16X8, vpx_highbd_sad16x8_bits8,
   1643                    vpx_highbd_sad16x8_avg_bits8, vpx_highbd_8_variance16x8,
   1644                    vpx_highbd_8_sub_pixel_variance16x8,
   1645                    vpx_highbd_8_sub_pixel_avg_variance16x8,
   1646                    vpx_highbd_sad16x8x4d_bits8)
   1647 
   1648         HIGHBD_BFP(BLOCK_8X16, vpx_highbd_sad8x16_bits8,
   1649                    vpx_highbd_sad8x16_avg_bits8, vpx_highbd_8_variance8x16,
   1650                    vpx_highbd_8_sub_pixel_variance8x16,
   1651                    vpx_highbd_8_sub_pixel_avg_variance8x16,
   1652                    vpx_highbd_sad8x16x4d_bits8)
   1653 
   1654         HIGHBD_BFP(
   1655             BLOCK_8X8, vpx_highbd_sad8x8_bits8, vpx_highbd_sad8x8_avg_bits8,
   1656             vpx_highbd_8_variance8x8, vpx_highbd_8_sub_pixel_variance8x8,
   1657             vpx_highbd_8_sub_pixel_avg_variance8x8, vpx_highbd_sad8x8x4d_bits8)
   1658 
   1659         HIGHBD_BFP(
   1660             BLOCK_8X4, vpx_highbd_sad8x4_bits8, vpx_highbd_sad8x4_avg_bits8,
   1661             vpx_highbd_8_variance8x4, vpx_highbd_8_sub_pixel_variance8x4,
   1662             vpx_highbd_8_sub_pixel_avg_variance8x4, vpx_highbd_sad8x4x4d_bits8)
   1663 
   1664         HIGHBD_BFP(
   1665             BLOCK_4X8, vpx_highbd_sad4x8_bits8, vpx_highbd_sad4x8_avg_bits8,
   1666             vpx_highbd_8_variance4x8, vpx_highbd_8_sub_pixel_variance4x8,
   1667             vpx_highbd_8_sub_pixel_avg_variance4x8, vpx_highbd_sad4x8x4d_bits8)
   1668 
   1669         HIGHBD_BFP(
   1670             BLOCK_4X4, vpx_highbd_sad4x4_bits8, vpx_highbd_sad4x4_avg_bits8,
   1671             vpx_highbd_8_variance4x4, vpx_highbd_8_sub_pixel_variance4x4,
   1672             vpx_highbd_8_sub_pixel_avg_variance4x4, vpx_highbd_sad4x4x4d_bits8)
   1673         break;
   1674 
   1675       case VPX_BITS_10:
   1676         HIGHBD_BFP(BLOCK_32X16, vpx_highbd_sad32x16_bits10,
   1677                    vpx_highbd_sad32x16_avg_bits10, vpx_highbd_10_variance32x16,
   1678                    vpx_highbd_10_sub_pixel_variance32x16,
   1679                    vpx_highbd_10_sub_pixel_avg_variance32x16,
   1680                    vpx_highbd_sad32x16x4d_bits10)
   1681 
   1682         HIGHBD_BFP(BLOCK_16X32, vpx_highbd_sad16x32_bits10,
   1683                    vpx_highbd_sad16x32_avg_bits10, vpx_highbd_10_variance16x32,
   1684                    vpx_highbd_10_sub_pixel_variance16x32,
   1685                    vpx_highbd_10_sub_pixel_avg_variance16x32,
   1686                    vpx_highbd_sad16x32x4d_bits10)
   1687 
   1688         HIGHBD_BFP(BLOCK_64X32, vpx_highbd_sad64x32_bits10,
   1689                    vpx_highbd_sad64x32_avg_bits10, vpx_highbd_10_variance64x32,
   1690                    vpx_highbd_10_sub_pixel_variance64x32,
   1691                    vpx_highbd_10_sub_pixel_avg_variance64x32,
   1692                    vpx_highbd_sad64x32x4d_bits10)
   1693 
   1694         HIGHBD_BFP(BLOCK_32X64, vpx_highbd_sad32x64_bits10,
   1695                    vpx_highbd_sad32x64_avg_bits10, vpx_highbd_10_variance32x64,
   1696                    vpx_highbd_10_sub_pixel_variance32x64,
   1697                    vpx_highbd_10_sub_pixel_avg_variance32x64,
   1698                    vpx_highbd_sad32x64x4d_bits10)
   1699 
   1700         HIGHBD_BFP(BLOCK_32X32, vpx_highbd_sad32x32_bits10,
   1701                    vpx_highbd_sad32x32_avg_bits10, vpx_highbd_10_variance32x32,
   1702                    vpx_highbd_10_sub_pixel_variance32x32,
   1703                    vpx_highbd_10_sub_pixel_avg_variance32x32,
   1704                    vpx_highbd_sad32x32x4d_bits10)
   1705 
   1706         HIGHBD_BFP(BLOCK_64X64, vpx_highbd_sad64x64_bits10,
   1707                    vpx_highbd_sad64x64_avg_bits10, vpx_highbd_10_variance64x64,
   1708                    vpx_highbd_10_sub_pixel_variance64x64,
   1709                    vpx_highbd_10_sub_pixel_avg_variance64x64,
   1710                    vpx_highbd_sad64x64x4d_bits10)
   1711 
   1712         HIGHBD_BFP(BLOCK_16X16, vpx_highbd_sad16x16_bits10,
   1713                    vpx_highbd_sad16x16_avg_bits10, vpx_highbd_10_variance16x16,
   1714                    vpx_highbd_10_sub_pixel_variance16x16,
   1715                    vpx_highbd_10_sub_pixel_avg_variance16x16,
   1716                    vpx_highbd_sad16x16x4d_bits10)
   1717 
   1718         HIGHBD_BFP(BLOCK_16X8, vpx_highbd_sad16x8_bits10,
   1719                    vpx_highbd_sad16x8_avg_bits10, vpx_highbd_10_variance16x8,
   1720                    vpx_highbd_10_sub_pixel_variance16x8,
   1721                    vpx_highbd_10_sub_pixel_avg_variance16x8,
   1722                    vpx_highbd_sad16x8x4d_bits10)
   1723 
   1724         HIGHBD_BFP(BLOCK_8X16, vpx_highbd_sad8x16_bits10,
   1725                    vpx_highbd_sad8x16_avg_bits10, vpx_highbd_10_variance8x16,
   1726                    vpx_highbd_10_sub_pixel_variance8x16,
   1727                    vpx_highbd_10_sub_pixel_avg_variance8x16,
   1728                    vpx_highbd_sad8x16x4d_bits10)
   1729 
   1730         HIGHBD_BFP(BLOCK_8X8, vpx_highbd_sad8x8_bits10,
   1731                    vpx_highbd_sad8x8_avg_bits10, vpx_highbd_10_variance8x8,
   1732                    vpx_highbd_10_sub_pixel_variance8x8,
   1733                    vpx_highbd_10_sub_pixel_avg_variance8x8,
   1734                    vpx_highbd_sad8x8x4d_bits10)
   1735 
   1736         HIGHBD_BFP(BLOCK_8X4, vpx_highbd_sad8x4_bits10,
   1737                    vpx_highbd_sad8x4_avg_bits10, vpx_highbd_10_variance8x4,
   1738                    vpx_highbd_10_sub_pixel_variance8x4,
   1739                    vpx_highbd_10_sub_pixel_avg_variance8x4,
   1740                    vpx_highbd_sad8x4x4d_bits10)
   1741 
   1742         HIGHBD_BFP(BLOCK_4X8, vpx_highbd_sad4x8_bits10,
   1743                    vpx_highbd_sad4x8_avg_bits10, vpx_highbd_10_variance4x8,
   1744                    vpx_highbd_10_sub_pixel_variance4x8,
   1745                    vpx_highbd_10_sub_pixel_avg_variance4x8,
   1746                    vpx_highbd_sad4x8x4d_bits10)
   1747 
   1748         HIGHBD_BFP(BLOCK_4X4, vpx_highbd_sad4x4_bits10,
   1749                    vpx_highbd_sad4x4_avg_bits10, vpx_highbd_10_variance4x4,
   1750                    vpx_highbd_10_sub_pixel_variance4x4,
   1751                    vpx_highbd_10_sub_pixel_avg_variance4x4,
   1752                    vpx_highbd_sad4x4x4d_bits10)
   1753         break;
   1754 
   1755       default:
   1756         assert(cm->bit_depth == VPX_BITS_12);
   1757         HIGHBD_BFP(BLOCK_32X16, vpx_highbd_sad32x16_bits12,
   1758                    vpx_highbd_sad32x16_avg_bits12, vpx_highbd_12_variance32x16,
   1759                    vpx_highbd_12_sub_pixel_variance32x16,
   1760                    vpx_highbd_12_sub_pixel_avg_variance32x16,
   1761                    vpx_highbd_sad32x16x4d_bits12)
   1762 
   1763         HIGHBD_BFP(BLOCK_16X32, vpx_highbd_sad16x32_bits12,
   1764                    vpx_highbd_sad16x32_avg_bits12, vpx_highbd_12_variance16x32,
   1765                    vpx_highbd_12_sub_pixel_variance16x32,
   1766                    vpx_highbd_12_sub_pixel_avg_variance16x32,
   1767                    vpx_highbd_sad16x32x4d_bits12)
   1768 
   1769         HIGHBD_BFP(BLOCK_64X32, vpx_highbd_sad64x32_bits12,
   1770                    vpx_highbd_sad64x32_avg_bits12, vpx_highbd_12_variance64x32,
   1771                    vpx_highbd_12_sub_pixel_variance64x32,
   1772                    vpx_highbd_12_sub_pixel_avg_variance64x32,
   1773                    vpx_highbd_sad64x32x4d_bits12)
   1774 
   1775         HIGHBD_BFP(BLOCK_32X64, vpx_highbd_sad32x64_bits12,
   1776                    vpx_highbd_sad32x64_avg_bits12, vpx_highbd_12_variance32x64,
   1777                    vpx_highbd_12_sub_pixel_variance32x64,
   1778                    vpx_highbd_12_sub_pixel_avg_variance32x64,
   1779                    vpx_highbd_sad32x64x4d_bits12)
   1780 
   1781         HIGHBD_BFP(BLOCK_32X32, vpx_highbd_sad32x32_bits12,
   1782                    vpx_highbd_sad32x32_avg_bits12, vpx_highbd_12_variance32x32,
   1783                    vpx_highbd_12_sub_pixel_variance32x32,
   1784                    vpx_highbd_12_sub_pixel_avg_variance32x32,
   1785                    vpx_highbd_sad32x32x4d_bits12)
   1786 
   1787         HIGHBD_BFP(BLOCK_64X64, vpx_highbd_sad64x64_bits12,
   1788                    vpx_highbd_sad64x64_avg_bits12, vpx_highbd_12_variance64x64,
   1789                    vpx_highbd_12_sub_pixel_variance64x64,
   1790                    vpx_highbd_12_sub_pixel_avg_variance64x64,
   1791                    vpx_highbd_sad64x64x4d_bits12)
   1792 
   1793         HIGHBD_BFP(BLOCK_16X16, vpx_highbd_sad16x16_bits12,
   1794                    vpx_highbd_sad16x16_avg_bits12, vpx_highbd_12_variance16x16,
   1795                    vpx_highbd_12_sub_pixel_variance16x16,
   1796                    vpx_highbd_12_sub_pixel_avg_variance16x16,
   1797                    vpx_highbd_sad16x16x4d_bits12)
   1798 
   1799         HIGHBD_BFP(BLOCK_16X8, vpx_highbd_sad16x8_bits12,
   1800                    vpx_highbd_sad16x8_avg_bits12, vpx_highbd_12_variance16x8,
   1801                    vpx_highbd_12_sub_pixel_variance16x8,
   1802                    vpx_highbd_12_sub_pixel_avg_variance16x8,
   1803                    vpx_highbd_sad16x8x4d_bits12)
   1804 
   1805         HIGHBD_BFP(BLOCK_8X16, vpx_highbd_sad8x16_bits12,
   1806                    vpx_highbd_sad8x16_avg_bits12, vpx_highbd_12_variance8x16,
   1807                    vpx_highbd_12_sub_pixel_variance8x16,
   1808                    vpx_highbd_12_sub_pixel_avg_variance8x16,
   1809                    vpx_highbd_sad8x16x4d_bits12)
   1810 
   1811         HIGHBD_BFP(BLOCK_8X8, vpx_highbd_sad8x8_bits12,
   1812                    vpx_highbd_sad8x8_avg_bits12, vpx_highbd_12_variance8x8,
   1813                    vpx_highbd_12_sub_pixel_variance8x8,
   1814                    vpx_highbd_12_sub_pixel_avg_variance8x8,
   1815                    vpx_highbd_sad8x8x4d_bits12)
   1816 
   1817         HIGHBD_BFP(BLOCK_8X4, vpx_highbd_sad8x4_bits12,
   1818                    vpx_highbd_sad8x4_avg_bits12, vpx_highbd_12_variance8x4,
   1819                    vpx_highbd_12_sub_pixel_variance8x4,
   1820                    vpx_highbd_12_sub_pixel_avg_variance8x4,
   1821                    vpx_highbd_sad8x4x4d_bits12)
   1822 
   1823         HIGHBD_BFP(BLOCK_4X8, vpx_highbd_sad4x8_bits12,
   1824                    vpx_highbd_sad4x8_avg_bits12, vpx_highbd_12_variance4x8,
   1825                    vpx_highbd_12_sub_pixel_variance4x8,
   1826                    vpx_highbd_12_sub_pixel_avg_variance4x8,
   1827                    vpx_highbd_sad4x8x4d_bits12)
   1828 
   1829         HIGHBD_BFP(BLOCK_4X4, vpx_highbd_sad4x4_bits12,
   1830                    vpx_highbd_sad4x4_avg_bits12, vpx_highbd_12_variance4x4,
   1831                    vpx_highbd_12_sub_pixel_variance4x4,
   1832                    vpx_highbd_12_sub_pixel_avg_variance4x4,
   1833                    vpx_highbd_sad4x4x4d_bits12)
   1834         break;
   1835     }
   1836   }
   1837 }
   1838 #endif  // CONFIG_VP9_HIGHBITDEPTH
   1839 
   1840 static void realloc_segmentation_maps(VP9_COMP *cpi) {
   1841   VP9_COMMON *const cm = &cpi->common;
   1842 
   1843   // Create the encoder segmentation map and set all entries to 0
   1844   vpx_free(cpi->segmentation_map);
   1845   CHECK_MEM_ERROR(cm, cpi->segmentation_map,
   1846                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
   1847 
   1848   // Create a map used for cyclic background refresh.
   1849   if (cpi->cyclic_refresh) vp9_cyclic_refresh_free(cpi->cyclic_refresh);
   1850   CHECK_MEM_ERROR(cm, cpi->cyclic_refresh,
   1851                   vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
   1852 
   1853   // Create a map used to mark inactive areas.
   1854   vpx_free(cpi->active_map.map);
   1855   CHECK_MEM_ERROR(cm, cpi->active_map.map,
   1856                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
   1857 
   1858   // And a place holder structure is the coding context
   1859   // for use if we want to save and restore it
   1860   vpx_free(cpi->coding_context.last_frame_seg_map_copy);
   1861   CHECK_MEM_ERROR(cm, cpi->coding_context.last_frame_seg_map_copy,
   1862                   vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
   1863 }
   1864 
   1865 static void alloc_copy_partition_data(VP9_COMP *cpi) {
   1866   VP9_COMMON *const cm = &cpi->common;
   1867   if (cpi->prev_partition == NULL) {
   1868     CHECK_MEM_ERROR(cm, cpi->prev_partition,
   1869                     (BLOCK_SIZE *)vpx_calloc(cm->mi_stride * cm->mi_rows,
   1870                                              sizeof(*cpi->prev_partition)));
   1871   }
   1872   if (cpi->prev_segment_id == NULL) {
   1873     CHECK_MEM_ERROR(
   1874         cm, cpi->prev_segment_id,
   1875         (int8_t *)vpx_calloc((cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1),
   1876                              sizeof(*cpi->prev_segment_id)));
   1877   }
   1878   if (cpi->prev_variance_low == NULL) {
   1879     CHECK_MEM_ERROR(cm, cpi->prev_variance_low,
   1880                     (uint8_t *)vpx_calloc(
   1881                         (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) * 25,
   1882                         sizeof(*cpi->prev_variance_low)));
   1883   }
   1884   if (cpi->copied_frame_cnt == NULL) {
   1885     CHECK_MEM_ERROR(
   1886         cm, cpi->copied_frame_cnt,
   1887         (uint8_t *)vpx_calloc((cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1),
   1888                               sizeof(*cpi->copied_frame_cnt)));
   1889   }
   1890 }
   1891 
   1892 void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
   1893   VP9_COMMON *const cm = &cpi->common;
   1894   RATE_CONTROL *const rc = &cpi->rc;
   1895   int last_w = cpi->oxcf.width;
   1896   int last_h = cpi->oxcf.height;
   1897 
   1898   vp9_init_quantizer(cpi);
   1899   if (cm->profile != oxcf->profile) cm->profile = oxcf->profile;
   1900   cm->bit_depth = oxcf->bit_depth;
   1901   cm->color_space = oxcf->color_space;
   1902   cm->color_range = oxcf->color_range;
   1903 
   1904   cpi->target_level = oxcf->target_level;
   1905   cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
   1906   set_level_constraint(&cpi->level_constraint,
   1907                        get_level_index(cpi->target_level));
   1908 
   1909   if (cm->profile <= PROFILE_1)
   1910     assert(cm->bit_depth == VPX_BITS_8);
   1911   else
   1912     assert(cm->bit_depth > VPX_BITS_8);
   1913 
   1914   cpi->oxcf = *oxcf;
   1915 #if CONFIG_VP9_HIGHBITDEPTH
   1916   cpi->td.mb.e_mbd.bd = (int)cm->bit_depth;
   1917 #endif  // CONFIG_VP9_HIGHBITDEPTH
   1918 
   1919   if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
   1920     rc->baseline_gf_interval = FIXED_GF_INTERVAL;
   1921   } else {
   1922     rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
   1923   }
   1924 
   1925   cpi->refresh_golden_frame = 0;
   1926   cpi->refresh_last_frame = 1;
   1927   cm->refresh_frame_context = 1;
   1928   cm->reset_frame_context = 0;
   1929 
   1930   vp9_reset_segment_features(&cm->seg);
   1931   vp9_set_high_precision_mv(cpi, 0);
   1932 
   1933   {
   1934     int i;
   1935 
   1936     for (i = 0; i < MAX_SEGMENTS; i++)
   1937       cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
   1938   }
   1939   cpi->encode_breakout = cpi->oxcf.encode_breakout;
   1940 
   1941   set_rc_buffer_sizes(rc, &cpi->oxcf);
   1942 
   1943   // Under a configuration change, where maximum_buffer_size may change,
   1944   // keep buffer level clipped to the maximum allowed buffer size.
   1945   rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
   1946   rc->buffer_level = VPXMIN(rc->buffer_level, rc->maximum_buffer_size);
   1947 
   1948   // Set up frame rate and related parameters rate control values.
   1949   vp9_new_framerate(cpi, cpi->framerate);
   1950 
   1951   // Set absolute upper and lower quality limits
   1952   rc->worst_quality = cpi->oxcf.worst_allowed_q;
   1953   rc->best_quality = cpi->oxcf.best_allowed_q;
   1954 
   1955   cm->interp_filter = cpi->sf.default_interp_filter;
   1956 
   1957   if (cpi->oxcf.render_width > 0 && cpi->oxcf.render_height > 0) {
   1958     cm->render_width = cpi->oxcf.render_width;
   1959     cm->render_height = cpi->oxcf.render_height;
   1960   } else {
   1961     cm->render_width = cpi->oxcf.width;
   1962     cm->render_height = cpi->oxcf.height;
   1963   }
   1964   if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
   1965     cm->width = cpi->oxcf.width;
   1966     cm->height = cpi->oxcf.height;
   1967     cpi->external_resize = 1;
   1968   }
   1969 
   1970   if (cpi->initial_width) {
   1971     int new_mi_size = 0;
   1972     vp9_set_mb_mi(cm, cm->width, cm->height);
   1973     new_mi_size = cm->mi_stride * calc_mi_size(cm->mi_rows);
   1974     if (cm->mi_alloc_size < new_mi_size) {
   1975       vp9_free_context_buffers(cm);
   1976       alloc_compressor_data(cpi);
   1977       realloc_segmentation_maps(cpi);
   1978       cpi->initial_width = cpi->initial_height = 0;
   1979       cpi->external_resize = 0;
   1980     } else if (cm->mi_alloc_size == new_mi_size &&
   1981                (cpi->oxcf.width > last_w || cpi->oxcf.height > last_h)) {
   1982       vp9_alloc_loop_filter(cm);
   1983     }
   1984   }
   1985 
   1986   if (cm->current_video_frame == 0 || last_w != cpi->oxcf.width ||
   1987       last_h != cpi->oxcf.height)
   1988     update_frame_size(cpi);
   1989 
   1990   if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
   1991     memset(cpi->consec_zero_mv, 0,
   1992            cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
   1993     if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
   1994       vp9_cyclic_refresh_reset_resize(cpi);
   1995     rc->rc_1_frame = 0;
   1996     rc->rc_2_frame = 0;
   1997   }
   1998 
   1999   if ((cpi->svc.number_temporal_layers > 1 && cpi->oxcf.rc_mode == VPX_CBR) ||
   2000       ((cpi->svc.number_temporal_layers > 1 ||
   2001         cpi->svc.number_spatial_layers > 1) &&
   2002        cpi->oxcf.pass != 1)) {
   2003     vp9_update_layer_context_change_config(cpi,
   2004                                            (int)cpi->oxcf.target_bandwidth);
   2005   }
   2006 
   2007   // Check for resetting the rc flags (rc_1_frame, rc_2_frame) if the
   2008   // configuration change has a large change in avg_frame_bandwidth.
   2009   // For SVC check for resetting based on spatial layer average bandwidth.
   2010   // Also reset buffer level to optimal level.
   2011   if (cm->current_video_frame > 0) {
   2012     if (cpi->use_svc) {
   2013       vp9_svc_check_reset_layer_rc_flag(cpi);
   2014     } else {
   2015       if (rc->avg_frame_bandwidth > (3 * rc->last_avg_frame_bandwidth >> 1) ||
   2016           rc->avg_frame_bandwidth < (rc->last_avg_frame_bandwidth >> 1)) {
   2017         rc->rc_1_frame = 0;
   2018         rc->rc_2_frame = 0;
   2019         rc->bits_off_target = rc->optimal_buffer_level;
   2020         rc->buffer_level = rc->optimal_buffer_level;
   2021       }
   2022     }
   2023   }
   2024 
   2025   cpi->alt_ref_source = NULL;
   2026   rc->is_src_frame_alt_ref = 0;
   2027 
   2028 #if 0
   2029   // Experimental RD Code
   2030   cpi->frame_distortion = 0;
   2031   cpi->last_frame_distortion = 0;
   2032 #endif
   2033 
   2034   set_tile_limits(cpi);
   2035 
   2036   cpi->ext_refresh_frame_flags_pending = 0;
   2037   cpi->ext_refresh_frame_context_pending = 0;
   2038 
   2039 #if CONFIG_VP9_HIGHBITDEPTH
   2040   highbd_set_var_fns(cpi);
   2041 #endif
   2042 
   2043   vp9_set_row_mt(cpi);
   2044 }
   2045 
   2046 #ifndef M_LOG2_E
   2047 #define M_LOG2_E 0.693147180559945309417
   2048 #endif
   2049 #define log2f(x) (log(x) / (float)M_LOG2_E)
   2050 
   2051 /***********************************************************************
   2052  * Read before modifying 'cal_nmvjointsadcost' or 'cal_nmvsadcosts'    *
   2053  ***********************************************************************
   2054  * The following 2 functions ('cal_nmvjointsadcost' and                *
   2055  * 'cal_nmvsadcosts') are used to calculate cost lookup tables         *
   2056  * used by 'vp9_diamond_search_sad'. The C implementation of the       *
   2057  * function is generic, but the AVX intrinsics optimised version       *
   2058  * relies on the following properties of the computed tables:          *
   2059  * For cal_nmvjointsadcost:                                            *
   2060  *   - mvjointsadcost[1] == mvjointsadcost[2] == mvjointsadcost[3]     *
   2061  * For cal_nmvsadcosts:                                                *
   2062  *   - For all i: mvsadcost[0][i] == mvsadcost[1][i]                   *
   2063  *         (Equal costs for both components)                           *
   2064  *   - For all i: mvsadcost[0][i] == mvsadcost[0][-i]                  *
   2065  *         (Cost function is even)                                     *
   2066  * If these do not hold, then the AVX optimised version of the         *
   2067  * 'vp9_diamond_search_sad' function cannot be used as it is, in which *
   2068  * case you can revert to using the C function instead.                *
   2069  ***********************************************************************/
   2070 
   2071 static void cal_nmvjointsadcost(int *mvjointsadcost) {
   2072   /*********************************************************************
   2073    * Warning: Read the comments above before modifying this function   *
   2074    *********************************************************************/
   2075   mvjointsadcost[0] = 600;
   2076   mvjointsadcost[1] = 300;
   2077   mvjointsadcost[2] = 300;
   2078   mvjointsadcost[3] = 300;
   2079 }
   2080 
   2081 static void cal_nmvsadcosts(int *mvsadcost[2]) {
   2082   /*********************************************************************
   2083    * Warning: Read the comments above before modifying this function   *
   2084    *********************************************************************/
   2085   int i = 1;
   2086 
   2087   mvsadcost[0][0] = 0;
   2088   mvsadcost[1][0] = 0;
   2089 
   2090   do {
   2091     double z = 256 * (2 * (log2f(8 * i) + .6));
   2092     mvsadcost[0][i] = (int)z;
   2093     mvsadcost[1][i] = (int)z;
   2094     mvsadcost[0][-i] = (int)z;
   2095     mvsadcost[1][-i] = (int)z;
   2096   } while (++i <= MV_MAX);
   2097 }
   2098 
   2099 static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
   2100   int i = 1;
   2101 
   2102   mvsadcost[0][0] = 0;
   2103   mvsadcost[1][0] = 0;
   2104 
   2105   do {
   2106     double z = 256 * (2 * (log2f(8 * i) + .6));
   2107     mvsadcost[0][i] = (int)z;
   2108     mvsadcost[1][i] = (int)z;
   2109     mvsadcost[0][-i] = (int)z;
   2110     mvsadcost[1][-i] = (int)z;
   2111   } while (++i <= MV_MAX);
   2112 }
   2113 
   2114 VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf,
   2115                                 BufferPool *const pool) {
   2116   unsigned int i;
   2117   VP9_COMP *volatile const cpi = vpx_memalign(32, sizeof(VP9_COMP));
   2118   VP9_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL;
   2119 
   2120   if (!cm) return NULL;
   2121 
   2122   vp9_zero(*cpi);
   2123 
   2124   if (setjmp(cm->error.jmp)) {
   2125     cm->error.setjmp = 0;
   2126     vp9_remove_compressor(cpi);
   2127     return 0;
   2128   }
   2129 
   2130   cm->error.setjmp = 1;
   2131   cm->alloc_mi = vp9_enc_alloc_mi;
   2132   cm->free_mi = vp9_enc_free_mi;
   2133   cm->setup_mi = vp9_enc_setup_mi;
   2134 
   2135   CHECK_MEM_ERROR(cm, cm->fc, (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc)));
   2136   CHECK_MEM_ERROR(
   2137       cm, cm->frame_contexts,
   2138       (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS, sizeof(*cm->frame_contexts)));
   2139 
   2140   cpi->use_svc = 0;
   2141   cpi->resize_state = ORIG;
   2142   cpi->external_resize = 0;
   2143   cpi->resize_avg_qp = 0;
   2144   cpi->resize_buffer_underflow = 0;
   2145   cpi->use_skin_detection = 0;
   2146   cpi->common.buffer_pool = pool;
   2147 
   2148   cpi->force_update_segmentation = 0;
   2149 
   2150   init_config(cpi, oxcf);
   2151   vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
   2152 
   2153   cm->current_video_frame = 0;
   2154   cpi->partition_search_skippable_frame = 0;
   2155   cpi->tile_data = NULL;
   2156 
   2157   realloc_segmentation_maps(cpi);
   2158 
   2159   CHECK_MEM_ERROR(
   2160       cm, cpi->skin_map,
   2161       vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(cpi->skin_map[0])));
   2162 
   2163   CHECK_MEM_ERROR(cm, cpi->alt_ref_aq, vp9_alt_ref_aq_create());
   2164 
   2165   CHECK_MEM_ERROR(
   2166       cm, cpi->consec_zero_mv,
   2167       vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv)));
   2168 
   2169   CHECK_MEM_ERROR(cm, cpi->nmvcosts[0],
   2170                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[0])));
   2171   CHECK_MEM_ERROR(cm, cpi->nmvcosts[1],
   2172                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[1])));
   2173   CHECK_MEM_ERROR(cm, cpi->nmvcosts_hp[0],
   2174                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[0])));
   2175   CHECK_MEM_ERROR(cm, cpi->nmvcosts_hp[1],
   2176                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1])));
   2177   CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[0],
   2178                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0])));
   2179   CHECK_MEM_ERROR(cm, cpi->nmvsadcosts[1],
   2180                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1])));
   2181   CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[0],
   2182                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0])));
   2183   CHECK_MEM_ERROR(cm, cpi->nmvsadcosts_hp[1],
   2184                   vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1])));
   2185 
   2186   for (i = 0; i < (sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]));
   2187        i++) {
   2188     CHECK_MEM_ERROR(
   2189         cm, cpi->mbgraph_stats[i].mb_stats,
   2190         vpx_calloc(cm->MBs * sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
   2191   }
   2192 
   2193 #if CONFIG_FP_MB_STATS
   2194   cpi->use_fp_mb_stats = 0;
   2195   if (cpi->use_fp_mb_stats) {
   2196     // a place holder used to store the first pass mb stats in the first pass
   2197     CHECK_MEM_ERROR(cm, cpi->twopass.frame_mb_stats_buf,
   2198                     vpx_calloc(cm->MBs * sizeof(uint8_t), 1));
   2199   } else {
   2200     cpi->twopass.frame_mb_stats_buf = NULL;
   2201   }
   2202 #endif
   2203 
   2204   cpi->refresh_alt_ref_frame = 0;
   2205   cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
   2206 
   2207   init_level_info(&cpi->level_info);
   2208   init_level_constraint(&cpi->level_constraint);
   2209 
   2210 #if CONFIG_INTERNAL_STATS
   2211   cpi->b_calculate_blockiness = 1;
   2212   cpi->b_calculate_consistency = 1;
   2213   cpi->total_inconsistency = 0;
   2214   cpi->psnr.worst = 100.0;
   2215   cpi->worst_ssim = 100.0;
   2216 
   2217   cpi->count = 0;
   2218   cpi->bytes = 0;
   2219 
   2220   if (cpi->b_calculate_psnr) {
   2221     cpi->total_sq_error = 0;
   2222     cpi->total_samples = 0;
   2223 
   2224     cpi->totalp_sq_error = 0;
   2225     cpi->totalp_samples = 0;
   2226 
   2227     cpi->tot_recode_hits = 0;
   2228     cpi->summed_quality = 0;
   2229     cpi->summed_weights = 0;
   2230     cpi->summedp_quality = 0;
   2231     cpi->summedp_weights = 0;
   2232   }
   2233 
   2234   cpi->fastssim.worst = 100.0;
   2235 
   2236   cpi->psnrhvs.worst = 100.0;
   2237 
   2238   if (cpi->b_calculate_blockiness) {
   2239     cpi->total_blockiness = 0;
   2240     cpi->worst_blockiness = 0.0;
   2241   }
   2242 
   2243   if (cpi->b_calculate_consistency) {
   2244     CHECK_MEM_ERROR(cm, cpi->ssim_vars,
   2245                     vpx_calloc(cpi->common.mi_rows * cpi->common.mi_cols,
   2246                                sizeof(*cpi->ssim_vars) * 4));
   2247     cpi->worst_consistency = 100.0;
   2248   } else {
   2249     cpi->ssim_vars = NULL;
   2250   }
   2251 
   2252 #endif
   2253 
   2254   cpi->first_time_stamp_ever = INT64_MAX;
   2255 
   2256   /*********************************************************************
   2257    * Warning: Read the comments around 'cal_nmvjointsadcost' and       *
   2258    * 'cal_nmvsadcosts' before modifying how these tables are computed. *
   2259    *********************************************************************/
   2260   cal_nmvjointsadcost(cpi->td.mb.nmvjointsadcost);
   2261   cpi->td.mb.nmvcost[0] = &cpi->nmvcosts[0][MV_MAX];
   2262   cpi->td.mb.nmvcost[1] = &cpi->nmvcosts[1][MV_MAX];
   2263   cpi->td.mb.nmvsadcost[0] = &cpi->nmvsadcosts[0][MV_MAX];
   2264   cpi->td.mb.nmvsadcost[1] = &cpi->nmvsadcosts[1][MV_MAX];
   2265   cal_nmvsadcosts(cpi->td.mb.nmvsadcost);
   2266 
   2267   cpi->td.mb.nmvcost_hp[0] = &cpi->nmvcosts_hp[0][MV_MAX];
   2268   cpi->td.mb.nmvcost_hp[1] = &cpi->nmvcosts_hp[1][MV_MAX];
   2269   cpi->td.mb.nmvsadcost_hp[0] = &cpi->nmvsadcosts_hp[0][MV_MAX];
   2270   cpi->td.mb.nmvsadcost_hp[1] = &cpi->nmvsadcosts_hp[1][MV_MAX];
   2271   cal_nmvsadcosts_hp(cpi->td.mb.nmvsadcost_hp);
   2272 
   2273 #if CONFIG_VP9_TEMPORAL_DENOISING
   2274 #ifdef OUTPUT_YUV_DENOISED
   2275   yuv_denoised_file = fopen("denoised.yuv", "ab");
   2276 #endif
   2277 #endif
   2278 #ifdef OUTPUT_YUV_SKINMAP
   2279   yuv_skinmap_file = fopen("skinmap.yuv", "wb");
   2280 #endif
   2281 #ifdef OUTPUT_YUV_REC
   2282   yuv_rec_file = fopen("rec.yuv", "wb");
   2283 #endif
   2284 #ifdef OUTPUT_YUV_SVC_SRC
   2285   yuv_svc_src[0] = fopen("svc_src_0.yuv", "wb");
   2286   yuv_svc_src[1] = fopen("svc_src_1.yuv", "wb");
   2287   yuv_svc_src[2] = fopen("svc_src_2.yuv", "wb");
   2288 #endif
   2289 
   2290 #if 0
   2291   framepsnr = fopen("framepsnr.stt", "a");
   2292   kf_list = fopen("kf_list.stt", "w");
   2293 #endif
   2294 
   2295   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
   2296 
   2297 #if !CONFIG_REALTIME_ONLY
   2298   if (oxcf->pass == 1) {
   2299     vp9_init_first_pass(cpi);
   2300   } else if (oxcf->pass == 2) {
   2301     const size_t packet_sz = sizeof(FIRSTPASS_STATS);
   2302     const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
   2303 
   2304     if (cpi->svc.number_spatial_layers > 1 ||
   2305         cpi->svc.number_temporal_layers > 1) {
   2306       FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
   2307       FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = { 0 };
   2308       int i;
   2309 
   2310       for (i = 0; i < oxcf->ss_number_layers; ++i) {
   2311         FIRSTPASS_STATS *const last_packet_for_layer =
   2312             &stats[packets - oxcf->ss_number_layers + i];
   2313         const int layer_id = (int)last_packet_for_layer->spatial_layer_id;
   2314         const int packets_in_layer = (int)last_packet_for_layer->count + 1;
   2315         if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) {
   2316           LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id];
   2317 
   2318           vpx_free(lc->rc_twopass_stats_in.buf);
   2319 
   2320           lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz;
   2321           CHECK_MEM_ERROR(cm, lc->rc_twopass_stats_in.buf,
   2322                           vpx_malloc(lc->rc_twopass_stats_in.sz));
   2323           lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf;
   2324           lc->twopass.stats_in = lc->twopass.stats_in_start;
   2325           lc->twopass.stats_in_end =
   2326               lc->twopass.stats_in_start + packets_in_layer - 1;
   2327           stats_copy[layer_id] = lc->rc_twopass_stats_in.buf;
   2328         }
   2329       }
   2330 
   2331       for (i = 0; i < packets; ++i) {
   2332         const int layer_id = (int)stats[i].spatial_layer_id;
   2333         if (layer_id >= 0 && layer_id < oxcf->ss_number_layers &&
   2334             stats_copy[layer_id] != NULL) {
   2335           *stats_copy[layer_id] = stats[i];
   2336           ++stats_copy[layer_id];
   2337         }
   2338       }
   2339 
   2340       vp9_init_second_pass_spatial_svc(cpi);
   2341     } else {
   2342 #if CONFIG_FP_MB_STATS
   2343       if (cpi->use_fp_mb_stats) {
   2344         const size_t psz = cpi->common.MBs * sizeof(uint8_t);
   2345         const int ps = (int)(oxcf->firstpass_mb_stats_in.sz / psz);
   2346 
   2347         cpi->twopass.firstpass_mb_stats.mb_stats_start =
   2348             oxcf->firstpass_mb_stats_in.buf;
   2349         cpi->twopass.firstpass_mb_stats.mb_stats_end =
   2350             cpi->twopass.firstpass_mb_stats.mb_stats_start +
   2351             (ps - 1) * cpi->common.MBs * sizeof(uint8_t);
   2352       }
   2353 #endif
   2354 
   2355       cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
   2356       cpi->twopass.stats_in = cpi->twopass.stats_in_start;
   2357       cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
   2358 
   2359       vp9_init_second_pass(cpi);
   2360     }
   2361   }
   2362 #endif  // !CONFIG_REALTIME_ONLY
   2363 
   2364   vp9_set_speed_features_framesize_independent(cpi);
   2365   vp9_set_speed_features_framesize_dependent(cpi);
   2366 
   2367 #if CONFIG_NON_GREEDY_MV
   2368   cpi->feature_score_loc_alloc = 0;
   2369 #endif  // CONFIG_NON_GREEDY_MV
   2370   for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) cpi->tpl_stats[i].tpl_stats_ptr = NULL;
   2371 
   2372   // Allocate memory to store variances for a frame.
   2373   CHECK_MEM_ERROR(cm, cpi->source_diff_var, vpx_calloc(cm->MBs, sizeof(diff)));
   2374   cpi->source_var_thresh = 0;
   2375   cpi->frames_till_next_var_check = 0;
   2376 
   2377 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX4DF) \
   2378   cpi->fn_ptr[BT].sdf = SDF;                      \
   2379   cpi->fn_ptr[BT].sdaf = SDAF;                    \
   2380   cpi->fn_ptr[BT].vf = VF;                        \
   2381   cpi->fn_ptr[BT].svf = SVF;                      \
   2382   cpi->fn_ptr[BT].svaf = SVAF;                    \
   2383   cpi->fn_ptr[BT].sdx4df = SDX4DF;
   2384 
   2385   BFP(BLOCK_32X16, vpx_sad32x16, vpx_sad32x16_avg, vpx_variance32x16,
   2386       vpx_sub_pixel_variance32x16, vpx_sub_pixel_avg_variance32x16,
   2387       vpx_sad32x16x4d)
   2388 
   2389   BFP(BLOCK_16X32, vpx_sad16x32, vpx_sad16x32_avg, vpx_variance16x32,
   2390       vpx_sub_pixel_variance16x32, vpx_sub_pixel_avg_variance16x32,
   2391       vpx_sad16x32x4d)
   2392 
   2393   BFP(BLOCK_64X32, vpx_sad64x32, vpx_sad64x32_avg, vpx_variance64x32,
   2394       vpx_sub_pixel_variance64x32, vpx_sub_pixel_avg_variance64x32,
   2395       vpx_sad64x32x4d)
   2396 
   2397   BFP(BLOCK_32X64, vpx_sad32x64, vpx_sad32x64_avg, vpx_variance32x64,
   2398       vpx_sub_pixel_variance32x64, vpx_sub_pixel_avg_variance32x64,
   2399       vpx_sad32x64x4d)
   2400 
   2401   BFP(BLOCK_32X32, vpx_sad32x32, vpx_sad32x32_avg, vpx_variance32x32,
   2402       vpx_sub_pixel_variance32x32, vpx_sub_pixel_avg_variance32x32,
   2403       vpx_sad32x32x4d)
   2404 
   2405   BFP(BLOCK_64X64, vpx_sad64x64, vpx_sad64x64_avg, vpx_variance64x64,
   2406       vpx_sub_pixel_variance64x64, vpx_sub_pixel_avg_variance64x64,
   2407       vpx_sad64x64x4d)
   2408 
   2409   BFP(BLOCK_16X16, vpx_sad16x16, vpx_sad16x16_avg, vpx_variance16x16,
   2410       vpx_sub_pixel_variance16x16, vpx_sub_pixel_avg_variance16x16,
   2411       vpx_sad16x16x4d)
   2412 
   2413   BFP(BLOCK_16X8, vpx_sad16x8, vpx_sad16x8_avg, vpx_variance16x8,
   2414       vpx_sub_pixel_variance16x8, vpx_sub_pixel_avg_variance16x8,
   2415       vpx_sad16x8x4d)
   2416 
   2417   BFP(BLOCK_8X16, vpx_sad8x16, vpx_sad8x16_avg, vpx_variance8x16,
   2418       vpx_sub_pixel_variance8x16, vpx_sub_pixel_avg_variance8x16,
   2419       vpx_sad8x16x4d)
   2420 
   2421   BFP(BLOCK_8X8, vpx_sad8x8, vpx_sad8x8_avg, vpx_variance8x8,
   2422       vpx_sub_pixel_variance8x8, vpx_sub_pixel_avg_variance8x8, vpx_sad8x8x4d)
   2423 
   2424   BFP(BLOCK_8X4, vpx_sad8x4, vpx_sad8x4_avg, vpx_variance8x4,
   2425       vpx_sub_pixel_variance8x4, vpx_sub_pixel_avg_variance8x4, vpx_sad8x4x4d)
   2426 
   2427   BFP(BLOCK_4X8, vpx_sad4x8, vpx_sad4x8_avg, vpx_variance4x8,
   2428       vpx_sub_pixel_variance4x8, vpx_sub_pixel_avg_variance4x8, vpx_sad4x8x4d)
   2429 
   2430   BFP(BLOCK_4X4, vpx_sad4x4, vpx_sad4x4_avg, vpx_variance4x4,
   2431       vpx_sub_pixel_variance4x4, vpx_sub_pixel_avg_variance4x4, vpx_sad4x4x4d)
   2432 
   2433 #if CONFIG_VP9_HIGHBITDEPTH
   2434   highbd_set_var_fns(cpi);
   2435 #endif
   2436 
   2437   /* vp9_init_quantizer() is first called here. Add check in
   2438    * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
   2439    * called later when needed. This will avoid unnecessary calls of
   2440    * vp9_init_quantizer() for every frame.
   2441    */
   2442   vp9_init_quantizer(cpi);
   2443 
   2444   vp9_loop_filter_init(cm);
   2445 
   2446   // Set up the unit scaling factor used during motion search.
   2447 #if CONFIG_VP9_HIGHBITDEPTH
   2448   vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
   2449                                     cm->width, cm->height,
   2450                                     cm->use_highbitdepth);
   2451 #else
   2452   vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
   2453                                     cm->width, cm->height);
   2454 #endif  // CONFIG_VP9_HIGHBITDEPTH
   2455   cpi->td.mb.me_sf = &cpi->me_sf;
   2456 
   2457   cm->error.setjmp = 0;
   2458 
   2459   return cpi;
   2460 }
   2461 
   2462 #if CONFIG_INTERNAL_STATS
   2463 #define SNPRINT(H, T) snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T))
   2464 
   2465 #define SNPRINT2(H, T, V) \
   2466   snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V))
   2467 #endif  // CONFIG_INTERNAL_STATS
   2468 
   2469 void vp9_remove_compressor(VP9_COMP *cpi) {
   2470   VP9_COMMON *cm;
   2471   unsigned int i, frame;
   2472   int t;
   2473 
   2474   if (!cpi) return;
   2475 
   2476 #if CONFIG_INTERNAL_STATS
   2477   vpx_free(cpi->ssim_vars);
   2478 #endif
   2479 
   2480   cm = &cpi->common;
   2481   if (cm->current_video_frame > 0) {
   2482 #if CONFIG_INTERNAL_STATS
   2483     vpx_clear_system_state();
   2484 
   2485     if (cpi->oxcf.pass != 1) {
   2486       char headings[512] = { 0 };
   2487       char results[512] = { 0 };
   2488       FILE *f = fopen("opsnr.stt", "a");
   2489       double time_encoded =
   2490           (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
   2491           10000000.000;
   2492       double total_encode_time =
   2493           (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
   2494       const double dr =
   2495           (double)cpi->bytes * (double)8 / (double)1000 / time_encoded;
   2496       const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1);
   2497       const double target_rate = (double)cpi->oxcf.target_bandwidth / 1000;
   2498       const double rate_err = ((100.0 * (dr - target_rate)) / target_rate);
   2499 
   2500       if (cpi->b_calculate_psnr) {
   2501         const double total_psnr = vpx_sse_to_psnr(
   2502             (double)cpi->total_samples, peak, (double)cpi->total_sq_error);
   2503         const double totalp_psnr = vpx_sse_to_psnr(
   2504             (double)cpi->totalp_samples, peak, (double)cpi->totalp_sq_error);
   2505         const double total_ssim =
   2506             100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
   2507         const double totalp_ssim =
   2508             100 * pow(cpi->summedp_quality / cpi->summedp_weights, 8.0);
   2509 
   2510         snprintf(headings, sizeof(headings),
   2511                  "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
   2512                  "VPXSSIM\tVPSSIMP\tFASTSIM\tPSNRHVS\t"
   2513                  "WstPsnr\tWstSsim\tWstFast\tWstHVS\t"
   2514                  "AVPsnrY\tAPsnrCb\tAPsnrCr");
   2515         snprintf(results, sizeof(results),
   2516                  "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
   2517                  "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
   2518                  "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
   2519                  "%7.3f\t%7.3f\t%7.3f",
   2520                  dr, cpi->psnr.stat[ALL] / cpi->count, total_psnr,
   2521                  cpi->psnrp.stat[ALL] / cpi->count, totalp_psnr, total_ssim,
   2522                  totalp_ssim, cpi->fastssim.stat[ALL] / cpi->count,
   2523                  cpi->psnrhvs.stat[ALL] / cpi->count, cpi->psnr.worst,
   2524                  cpi->worst_ssim, cpi->fastssim.worst, cpi->psnrhvs.worst,
   2525                  cpi->psnr.stat[Y] / cpi->count, cpi->psnr.stat[U] / cpi->count,
   2526                  cpi->psnr.stat[V] / cpi->count);
   2527 
   2528         if (cpi->b_calculate_blockiness) {
   2529           SNPRINT(headings, "\t  Block\tWstBlck");
   2530           SNPRINT2(results, "\t%7.3f", cpi->total_blockiness / cpi->count);
   2531           SNPRINT2(results, "\t%7.3f", cpi->worst_blockiness);
   2532         }
   2533 
   2534         if (cpi->b_calculate_consistency) {
   2535           double consistency =
   2536               vpx_sse_to_psnr((double)cpi->totalp_samples, peak,
   2537                               (double)cpi->total_inconsistency);
   2538 
   2539           SNPRINT(headings, "\tConsist\tWstCons");
   2540           SNPRINT2(results, "\t%7.3f", consistency);
   2541           SNPRINT2(results, "\t%7.3f", cpi->worst_consistency);
   2542         }
   2543 
   2544         fprintf(f, "%s\t    Time\tRcErr\tAbsErr\n", headings);
   2545         fprintf(f, "%s\t%8.0f\t%7.2f\t%7.2f\n", results, total_encode_time,
   2546                 rate_err, fabs(rate_err));
   2547       }
   2548 
   2549       fclose(f);
   2550     }
   2551 #endif
   2552 
   2553 #if 0
   2554     {
   2555       printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
   2556       printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
   2557       printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
   2558              cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
   2559              cpi->time_compress_data / 1000,
   2560              (cpi->time_receive_data + cpi->time_compress_data) / 1000);
   2561     }
   2562 #endif
   2563   }
   2564 
   2565 #if CONFIG_VP9_TEMPORAL_DENOISING
   2566   vp9_denoiser_free(&(cpi->denoiser));
   2567 #endif
   2568 
   2569 #if CONFIG_NON_GREEDY_MV
   2570   vpx_free(cpi->feature_score_loc_arr);
   2571   vpx_free(cpi->feature_score_loc_sort);
   2572   vpx_free(cpi->feature_score_loc_heap);
   2573 #endif
   2574   for (frame = 0; frame < MAX_ARF_GOP_SIZE; ++frame) {
   2575     vpx_free(cpi->tpl_stats[frame].tpl_stats_ptr);
   2576     cpi->tpl_stats[frame].is_valid = 0;
   2577   }
   2578 
   2579   for (t = 0; t < cpi->num_workers; ++t) {
   2580     VPxWorker *const worker = &cpi->workers[t];
   2581     EncWorkerData *const thread_data = &cpi->tile_thr_data[t];
   2582 
   2583     // Deallocate allocated threads.
   2584     vpx_get_worker_interface()->end(worker);
   2585 
   2586     // Deallocate allocated thread data.
   2587     if (t < cpi->num_workers - 1) {
   2588       vpx_free(thread_data->td->counts);
   2589       vp9_free_pc_tree(thread_data->td);
   2590       vpx_free(thread_data->td);
   2591     }
   2592   }
   2593   vpx_free(cpi->tile_thr_data);
   2594   vpx_free(cpi->workers);
   2595   vp9_row_mt_mem_dealloc(cpi);
   2596 
   2597   if (cpi->num_workers > 1) {
   2598     vp9_loop_filter_dealloc(&cpi->lf_row_sync);
   2599     vp9_bitstream_encode_tiles_buffer_dealloc(cpi);
   2600   }
   2601 
   2602   vp9_alt_ref_aq_destroy(cpi->alt_ref_aq);
   2603 
   2604   dealloc_compressor_data(cpi);
   2605 
   2606   for (i = 0; i < sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]);
   2607        ++i) {
   2608     vpx_free(cpi->mbgraph_stats[i].mb_stats);
   2609   }
   2610 
   2611 #if CONFIG_FP_MB_STATS
   2612   if (cpi->use_fp_mb_stats) {
   2613     vpx_free(cpi->twopass.frame_mb_stats_buf);
   2614     cpi->twopass.frame_mb_stats_buf = NULL;
   2615   }
   2616 #endif
   2617 
   2618   vp9_remove_common(cm);
   2619   vp9_free_ref_frame_buffers(cm->buffer_pool);
   2620 #if CONFIG_VP9_POSTPROC
   2621   vp9_free_postproc_buffers(cm);
   2622 #endif
   2623   vpx_free(cpi);
   2624 
   2625 #if CONFIG_VP9_TEMPORAL_DENOISING
   2626 #ifdef OUTPUT_YUV_DENOISED
   2627   fclose(yuv_denoised_file);
   2628 #endif
   2629 #endif
   2630 #ifdef OUTPUT_YUV_SKINMAP
   2631   fclose(yuv_skinmap_file);
   2632 #endif
   2633 #ifdef OUTPUT_YUV_REC
   2634   fclose(yuv_rec_file);
   2635 #endif
   2636 #ifdef OUTPUT_YUV_SVC_SRC
   2637   fclose(yuv_svc_src[0]);
   2638   fclose(yuv_svc_src[1]);
   2639   fclose(yuv_svc_src[2]);
   2640 #endif
   2641 
   2642 #if 0
   2643 
   2644   if (keyfile)
   2645     fclose(keyfile);
   2646 
   2647   if (framepsnr)
   2648     fclose(framepsnr);
   2649 
   2650   if (kf_list)
   2651     fclose(kf_list);
   2652 
   2653 #endif
   2654 }
   2655 
   2656 static void generate_psnr_packet(VP9_COMP *cpi) {
   2657   struct vpx_codec_cx_pkt pkt;
   2658   int i;
   2659   PSNR_STATS psnr;
   2660 #if CONFIG_VP9_HIGHBITDEPTH
   2661   vpx_calc_highbd_psnr(cpi->raw_source_frame, cpi->common.frame_to_show, &psnr,
   2662                        cpi->td.mb.e_mbd.bd, cpi->oxcf.input_bit_depth);
   2663 #else
   2664   vpx_calc_psnr(cpi->raw_source_frame, cpi->common.frame_to_show, &psnr);
   2665 #endif
   2666 
   2667   for (i = 0; i < 4; ++i) {
   2668     pkt.data.psnr.samples[i] = psnr.samples[i];
   2669     pkt.data.psnr.sse[i] = psnr.sse[i];
   2670     pkt.data.psnr.psnr[i] = psnr.psnr[i];
   2671   }
   2672   pkt.kind = VPX_CODEC_PSNR_PKT;
   2673   if (cpi->use_svc)
   2674     cpi->svc
   2675         .layer_context[cpi->svc.spatial_layer_id *
   2676                        cpi->svc.number_temporal_layers]
   2677         .psnr_pkt = pkt.data.psnr;
   2678   else
   2679     vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
   2680 }
   2681 
   2682 int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
   2683   if (ref_frame_flags > 7) return -1;
   2684 
   2685   cpi->ref_frame_flags = ref_frame_flags;
   2686   return 0;
   2687 }
   2688 
   2689 void vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) {
   2690   cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0;
   2691   cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0;
   2692   cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0;
   2693   cpi->ext_refresh_frame_flags_pending = 1;
   2694 }
   2695 
   2696 static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(
   2697     VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag) {
   2698   MV_REFERENCE_FRAME ref_frame = NONE;
   2699   if (ref_frame_flag == VP9_LAST_FLAG)
   2700     ref_frame = LAST_FRAME;
   2701   else if (ref_frame_flag == VP9_GOLD_FLAG)
   2702     ref_frame = GOLDEN_FRAME;
   2703   else if (ref_frame_flag == VP9_ALT_FLAG)
   2704     ref_frame = ALTREF_FRAME;
   2705 
   2706   return ref_frame == NONE ? NULL : get_ref_frame_buffer(cpi, ref_frame);
   2707 }
   2708 
   2709 int vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
   2710                            YV12_BUFFER_CONFIG *sd) {
   2711   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
   2712   if (cfg) {
   2713     vpx_yv12_copy_frame(cfg, sd);
   2714     return 0;
   2715   } else {
   2716     return -1;
   2717   }
   2718 }
   2719 
   2720 int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
   2721                           YV12_BUFFER_CONFIG *sd) {
   2722   YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
   2723   if (cfg) {
   2724     vpx_yv12_copy_frame(sd, cfg);
   2725     return 0;
   2726   } else {
   2727     return -1;
   2728   }
   2729 }
   2730 
   2731 int vp9_update_entropy(VP9_COMP *cpi, int update) {
   2732   cpi->ext_refresh_frame_context = update;
   2733   cpi->ext_refresh_frame_context_pending = 1;
   2734   return 0;
   2735 }
   2736 
   2737 #ifdef OUTPUT_YUV_REC
   2738 void vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
   2739   YV12_BUFFER_CONFIG *s = cm->frame_to_show;
   2740   uint8_t *src = s->y_buffer;
   2741   int h = cm->height;
   2742 
   2743 #if CONFIG_VP9_HIGHBITDEPTH
   2744   if (s->flags & YV12_FLAG_HIGHBITDEPTH) {
   2745     uint16_t *src16 = CONVERT_TO_SHORTPTR(s->y_buffer);
   2746 
   2747     do {
   2748       fwrite(src16, s->y_width, 2, yuv_rec_file);
   2749       src16 += s->y_stride;
   2750     } while (--h);
   2751 
   2752     src16 = CONVERT_TO_SHORTPTR(s->u_buffer);
   2753     h = s->uv_height;
   2754 
   2755     do {
   2756       fwrite(src16, s->uv_width, 2, yuv_rec_file);
   2757       src16 += s->uv_stride;
   2758     } while (--h);
   2759 
   2760     src16 = CONVERT_TO_SHORTPTR(s->v_buffer);
   2761     h = s->uv_height;
   2762 
   2763     do {
   2764       fwrite(src16, s->uv_width, 2, yuv_rec_file);
   2765       src16 += s->uv_stride;
   2766     } while (--h);
   2767 
   2768     fflush(yuv_rec_file);
   2769     return;
   2770   }
   2771 #endif  // CONFIG_VP9_HIGHBITDEPTH
   2772 
   2773   do {
   2774     fwrite(src, s->y_width, 1, yuv_rec_file);
   2775     src += s->y_stride;
   2776   } while (--h);
   2777 
   2778   src = s->u_buffer;
   2779   h = s->uv_height;
   2780 
   2781   do {
   2782     fwrite(src, s->uv_width, 1, yuv_rec_file);
   2783     src += s->uv_stride;
   2784   } while (--h);
   2785 
   2786   src = s->v_buffer;
   2787   h = s->uv_height;
   2788 
   2789   do {
   2790     fwrite(src, s->uv_width, 1, yuv_rec_file);
   2791     src += s->uv_stride;
   2792   } while (--h);
   2793 
   2794   fflush(yuv_rec_file);
   2795 }
   2796 #endif
   2797 
   2798 #if CONFIG_VP9_HIGHBITDEPTH
   2799 static void scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src,
   2800                                                 YV12_BUFFER_CONFIG *dst,
   2801                                                 int bd) {
   2802 #else
   2803 static void scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src,
   2804                                                 YV12_BUFFER_CONFIG *dst) {
   2805 #endif  // CONFIG_VP9_HIGHBITDEPTH
   2806   // TODO(dkovalev): replace YV12_BUFFER_CONFIG with vpx_image_t
   2807   int i;
   2808   const uint8_t *const srcs[3] = { src->y_buffer, src->u_buffer,
   2809                                    src->v_buffer };
   2810   const int src_strides[3] = { src->y_stride, src->uv_stride, src->uv_stride };
   2811   const int src_widths[3] = { src->y_crop_width, src->uv_crop_width,
   2812                               src->uv_crop_width };
   2813   const int src_heights[3] = { src->y_crop_height, src->uv_crop_height,
   2814                                src->uv_crop_height };
   2815   uint8_t *const dsts[3] = { dst->y_buffer, dst->u_buffer, dst->v_buffer };
   2816   const int dst_strides[3] = { dst->y_stride, dst->uv_stride, dst->uv_stride };
   2817   const int dst_widths[3] = { dst->y_crop_width, dst->uv_crop_width,
   2818                               dst->uv_crop_width };
   2819   const int dst_heights[3] = { dst->y_crop_height, dst->uv_crop_height,
   2820                                dst->uv_crop_height };
   2821 
   2822   for (i = 0; i < MAX_MB_PLANE; ++i) {
   2823 #if CONFIG_VP9_HIGHBITDEPTH
   2824     if (src->flags & YV12_FLAG_HIGHBITDEPTH) {
   2825       vp9_highbd_resize_plane(srcs[i], src_heights[i], src_widths[i],
   2826                               src_strides[i], dsts[i], dst_heights[i],
   2827                               dst_widths[i], dst_strides[i], bd);
   2828     } else {
   2829       vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i],
   2830                        dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]);
   2831     }
   2832 #else
   2833     vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i],
   2834                      dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]);
   2835 #endif  // CONFIG_VP9_HIGHBITDEPTH
   2836   }
   2837   vpx_extend_frame_borders(dst);
   2838 }
   2839 
   2840 #if CONFIG_VP9_HIGHBITDEPTH
   2841 static void scale_and_extend_frame(const YV12_BUFFER_CONFIG *src,
   2842                                    YV12_BUFFER_CONFIG *dst, int bd,
   2843                                    INTERP_FILTER filter_type,
   2844                                    int phase_scaler) {
   2845   const int src_w = src->y_crop_width;
   2846   const int src_h = src->y_crop_height;
   2847   const int dst_w = dst->y_crop_width;
   2848   const int dst_h = dst->y_crop_height;
   2849   const uint8_t *const srcs[3] = { src->y_buffer, src->u_buffer,
   2850                                    src->v_buffer };
   2851   const int src_strides[3] = { src->y_stride, src->uv_stride, src->uv_stride };
   2852   uint8_t *const dsts[3] = { dst->y_buffer, dst->u_buffer, dst->v_buffer };
   2853   const int dst_strides[3] = { dst->y_stride, dst->uv_stride, dst->uv_stride };
   2854   const InterpKernel *const kernel = vp9_filter_kernels[filter_type];
   2855   int x, y, i;
   2856 
   2857   for (i = 0; i < MAX_MB_PLANE; ++i) {
   2858     const int factor = (i == 0 || i == 3 ? 1 : 2);
   2859     const int src_stride = src_strides[i];
   2860     const int dst_stride = dst_strides[i];
   2861     for (y = 0; y < dst_h; y += 16) {
   2862       const int y_q4 = y * (16 / factor) * src_h / dst_h + phase_scaler;
   2863       for (x = 0; x < dst_w; x += 16) {
   2864         const int x_q4 = x * (16 / factor) * src_w / dst_w + phase_scaler;
   2865         const uint8_t *src_ptr = srcs[i] +
   2866                                  (y / factor) * src_h / dst_h * src_stride +
   2867                                  (x / factor) * src_w / dst_w;
   2868         uint8_t *dst_ptr = dsts[i] + (y / factor) * dst_stride + (x / factor);
   2869 
   2870         if (src->flags & YV12_FLAG_HIGHBITDEPTH) {
   2871           vpx_highbd_convolve8(CONVERT_TO_SHORTPTR(src_ptr), src_stride,
   2872                                CONVERT_TO_SHORTPTR(dst_ptr), dst_stride, kernel,
   2873                                x_q4 & 0xf, 16 * src_w / dst_w, y_q4 & 0xf,
   2874                                16 * src_h / dst_h, 16 / factor, 16 / factor,
   2875                                bd);
   2876         } else {
   2877           vpx_scaled_2d(src_ptr, src_stride, dst_ptr, dst_stride, kernel,
   2878                         x_q4 & 0xf, 16 * src_w / dst_w, y_q4 & 0xf,
   2879                         16 * src_h / dst_h, 16 / factor, 16 / factor);
   2880         }
   2881       }
   2882     }
   2883   }
   2884 
   2885   vpx_extend_frame_borders(dst);
   2886 }
   2887 #endif  // CONFIG_VP9_HIGHBITDEPTH
   2888 
   2889 static int scale_down(VP9_COMP *cpi, int q) {
   2890   RATE_CONTROL *const rc = &cpi->rc;
   2891   GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   2892   int scale = 0;
   2893   assert(frame_is_kf_gf_arf(cpi));
   2894 
   2895   if (rc->frame_size_selector == UNSCALED &&
   2896       q >= rc->rf_level_maxq[gf_group->rf_level[gf_group->index]]) {
   2897     const int max_size_thresh =
   2898         (int)(rate_thresh_mult[SCALE_STEP1] *
   2899               VPXMAX(rc->this_frame_target, rc->avg_frame_bandwidth));
   2900     scale = rc->projected_frame_size > max_size_thresh ? 1 : 0;
   2901   }
   2902   return scale;
   2903 }
   2904 
   2905 static int big_rate_miss_high_threshold(VP9_COMP *cpi) {
   2906   const RATE_CONTROL *const rc = &cpi->rc;
   2907   int big_miss_high;
   2908 
   2909   if (frame_is_kf_gf_arf(cpi))
   2910     big_miss_high = rc->this_frame_target * 3 / 2;
   2911   else
   2912     big_miss_high = rc->this_frame_target * 2;
   2913 
   2914   return big_miss_high;
   2915 }
   2916 
   2917 static int big_rate_miss(VP9_COMP *cpi) {
   2918   const RATE_CONTROL *const rc = &cpi->rc;
   2919   int big_miss_high;
   2920   int big_miss_low;
   2921 
   2922   // Ignore for overlay frames
   2923   if (rc->is_src_frame_alt_ref) {
   2924     return 0;
   2925   } else {
   2926     big_miss_low = (rc->this_frame_target / 2);
   2927     big_miss_high = big_rate_miss_high_threshold(cpi);
   2928 
   2929     return (rc->projected_frame_size > big_miss_high) ||
   2930            (rc->projected_frame_size < big_miss_low);
   2931   }
   2932 }
   2933 
   2934 // test in two pass for the first
   2935 static int two_pass_first_group_inter(VP9_COMP *cpi) {
   2936   if (cpi->oxcf.pass == 2) {
   2937     TWO_PASS *const twopass = &cpi->twopass;
   2938     GF_GROUP *const gf_group = &twopass->gf_group;
   2939     const int gfg_index = gf_group->index;
   2940 
   2941     if (gfg_index == 0) return gf_group->update_type[gfg_index] == LF_UPDATE;
   2942     return gf_group->update_type[gfg_index - 1] != LF_UPDATE &&
   2943            gf_group->update_type[gfg_index] == LF_UPDATE;
   2944   } else {
   2945     return 0;
   2946   }
   2947 }
   2948 
   2949 // Function to test for conditions that indicate we should loop
   2950 // back and recode a frame.
   2951 static int recode_loop_test(VP9_COMP *cpi, int high_limit, int low_limit, int q,
   2952                             int maxq, int minq) {
   2953   const RATE_CONTROL *const rc = &cpi->rc;
   2954   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
   2955   const int frame_is_kfgfarf = frame_is_kf_gf_arf(cpi);
   2956   int force_recode = 0;
   2957 
   2958   if ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
   2959       big_rate_miss(cpi) || (cpi->sf.recode_loop == ALLOW_RECODE) ||
   2960       (two_pass_first_group_inter(cpi) &&
   2961        (cpi->sf.recode_loop == ALLOW_RECODE_FIRST)) ||
   2962       (frame_is_kfgfarf && (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF))) {
   2963     if (frame_is_kfgfarf && (oxcf->resize_mode == RESIZE_DYNAMIC) &&
   2964         scale_down(cpi, q)) {
   2965       // Code this group at a lower resolution.
   2966       cpi->resize_pending = 1;
   2967       return 1;
   2968     }
   2969 
   2970     // Force recode for extreme overshoot.
   2971     if ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
   2972         (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF &&
   2973          rc->projected_frame_size >= big_rate_miss_high_threshold(cpi))) {
   2974       return 1;
   2975     }
   2976 
   2977     // TODO(agrange) high_limit could be greater than the scale-down threshold.
   2978     if ((rc->projected_frame_size > high_limit && q < maxq) ||
   2979         (rc->projected_frame_size < low_limit && q > minq)) {
   2980       force_recode = 1;
   2981     } else if (cpi->oxcf.rc_mode == VPX_CQ) {
   2982       // Deal with frame undershoot and whether or not we are
   2983       // below the automatically set cq level.
   2984       if (q > oxcf->cq_level &&
   2985           rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
   2986         force_recode = 1;
   2987       }
   2988     }
   2989   }
   2990   return force_recode;
   2991 }
   2992 
   2993 static void update_ref_frames(VP9_COMP *cpi) {
   2994   VP9_COMMON *const cm = &cpi->common;
   2995   BufferPool *const pool = cm->buffer_pool;
   2996   GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   2997 
   2998   // Pop ARF.
   2999   if (cm->show_existing_frame) {
   3000     cpi->lst_fb_idx = cpi->alt_fb_idx;
   3001     cpi->alt_fb_idx =
   3002         stack_pop(gf_group->arf_index_stack, gf_group->stack_size);
   3003     --gf_group->stack_size;
   3004   }
   3005 
   3006   // At this point the new frame has been encoded.
   3007   // If any buffer copy / swapping is signaled it should be done here.
   3008   if (cm->frame_type == KEY_FRAME) {
   3009     ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
   3010                cm->new_fb_idx);
   3011     ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
   3012                cm->new_fb_idx);
   3013   } else if (vp9_preserve_existing_gf(cpi)) {
   3014     // We have decided to preserve the previously existing golden frame as our
   3015     // new ARF frame. However, in the short term in function
   3016     // vp9_get_refresh_mask() we left it in the GF slot and, if
   3017     // we're updating the GF with the current decoded frame, we save it to the
   3018     // ARF slot instead.
   3019     // We now have to update the ARF with the current frame and swap gld_fb_idx
   3020     // and alt_fb_idx so that, overall, we've stored the old GF in the new ARF
   3021     // slot and, if we're updating the GF, the current frame becomes the new GF.
   3022     int tmp;
   3023 
   3024     ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
   3025                cm->new_fb_idx);
   3026 
   3027     tmp = cpi->alt_fb_idx;
   3028     cpi->alt_fb_idx = cpi->gld_fb_idx;
   3029     cpi->gld_fb_idx = tmp;
   3030   } else { /* For non key/golden frames */
   3031     if (cpi->refresh_alt_ref_frame) {
   3032       int arf_idx = gf_group->top_arf_idx;
   3033 
   3034       // Push new ARF into stack.
   3035       stack_push(gf_group->arf_index_stack, cpi->alt_fb_idx,
   3036                  gf_group->stack_size);
   3037       ++gf_group->stack_size;
   3038 
   3039       assert(arf_idx < REF_FRAMES);
   3040 
   3041       ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
   3042       memcpy(cpi->interp_filter_selected[ALTREF_FRAME],
   3043              cpi->interp_filter_selected[0],
   3044              sizeof(cpi->interp_filter_selected[0]));
   3045 
   3046       cpi->alt_fb_idx = arf_idx;
   3047     }
   3048 
   3049     if (cpi->refresh_golden_frame) {
   3050       ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
   3051                  cm->new_fb_idx);
   3052       if (!cpi->rc.is_src_frame_alt_ref)
   3053         memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
   3054                cpi->interp_filter_selected[0],
   3055                sizeof(cpi->interp_filter_selected[0]));
   3056       else
   3057         memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
   3058                cpi->interp_filter_selected[ALTREF_FRAME],
   3059                sizeof(cpi->interp_filter_selected[ALTREF_FRAME]));
   3060     }
   3061   }
   3062 
   3063   if (cpi->refresh_last_frame) {
   3064     ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx],
   3065                cm->new_fb_idx);
   3066     if (!cpi->rc.is_src_frame_alt_ref)
   3067       memcpy(cpi->interp_filter_selected[LAST_FRAME],
   3068              cpi->interp_filter_selected[0],
   3069              sizeof(cpi->interp_filter_selected[0]));
   3070   }
   3071 
   3072   if (gf_group->update_type[gf_group->index] == MID_OVERLAY_UPDATE) {
   3073     cpi->alt_fb_idx =
   3074         stack_pop(gf_group->arf_index_stack, gf_group->stack_size);
   3075     --gf_group->stack_size;
   3076   }
   3077 }
   3078 
   3079 void vp9_update_reference_frames(VP9_COMP *cpi) {
   3080   update_ref_frames(cpi);
   3081 
   3082 #if CONFIG_VP9_TEMPORAL_DENOISING
   3083   vp9_denoiser_update_ref_frame(cpi);
   3084 #endif
   3085 
   3086   if (is_one_pass_cbr_svc(cpi)) vp9_svc_update_ref_frame(cpi);
   3087 }
   3088 
   3089 static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
   3090   MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
   3091   struct loopfilter *lf = &cm->lf;
   3092   int is_reference_frame =
   3093       (cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
   3094        cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
   3095   if (cpi->use_svc &&
   3096       cpi->svc.temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS)
   3097     is_reference_frame = !cpi->svc.non_reference_frame;
   3098 
   3099   // Skip loop filter in show_existing_frame mode.
   3100   if (cm->show_existing_frame) {
   3101     lf->filter_level = 0;
   3102     return;
   3103   }
   3104 
   3105   if (xd->lossless) {
   3106     lf->filter_level = 0;
   3107     lf->last_filt_level = 0;
   3108   } else {
   3109     struct vpx_usec_timer timer;
   3110 
   3111     vpx_clear_system_state();
   3112 
   3113     vpx_usec_timer_start(&timer);
   3114 
   3115     if (!cpi->rc.is_src_frame_alt_ref) {
   3116       if ((cpi->common.frame_type == KEY_FRAME) &&
   3117           (!cpi->rc.this_key_frame_forced)) {
   3118         lf->last_filt_level = 0;
   3119       }
   3120       vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
   3121       lf->last_filt_level = lf->filter_level;
   3122     } else {
   3123       lf->filter_level = 0;
   3124     }
   3125 
   3126     vpx_usec_timer_mark(&timer);
   3127     cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
   3128   }
   3129 
   3130   if (lf->filter_level > 0 && is_reference_frame) {
   3131     vp9_build_mask_frame(cm, lf->filter_level, 0);
   3132 
   3133     if (cpi->num_workers > 1)
   3134       vp9_loop_filter_frame_mt(cm->frame_to_show, cm, xd->plane,
   3135                                lf->filter_level, 0, 0, cpi->workers,
   3136                                cpi->num_workers, &cpi->lf_row_sync);
   3137     else
   3138       vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
   3139   }
   3140 
   3141   vpx_extend_frame_inner_borders(cm->frame_to_show);
   3142 }
   3143 
   3144 static INLINE void alloc_frame_mvs(VP9_COMMON *const cm, int buffer_idx) {
   3145   RefCntBuffer *const new_fb_ptr = &cm->buffer_pool->frame_bufs[buffer_idx];
   3146   if (new_fb_ptr->mvs == NULL || new_fb_ptr->mi_rows < cm->mi_rows ||
   3147       new_fb_ptr->mi_cols < cm->mi_cols) {
   3148     vpx_free(new_fb_ptr->mvs);
   3149     CHECK_MEM_ERROR(cm, new_fb_ptr->mvs,
   3150                     (MV_REF *)vpx_calloc(cm->mi_rows * cm->mi_cols,
   3151                                          sizeof(*new_fb_ptr->mvs)));
   3152     new_fb_ptr->mi_rows = cm->mi_rows;
   3153     new_fb_ptr->mi_cols = cm->mi_cols;
   3154   }
   3155 }
   3156 
   3157 void vp9_scale_references(VP9_COMP *cpi) {
   3158   VP9_COMMON *cm = &cpi->common;
   3159   MV_REFERENCE_FRAME ref_frame;
   3160   const VP9_REFFRAME ref_mask[3] = { VP9_LAST_FLAG, VP9_GOLD_FLAG,
   3161                                      VP9_ALT_FLAG };
   3162 
   3163   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
   3164     // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1).
   3165     if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) {
   3166       BufferPool *const pool = cm->buffer_pool;
   3167       const YV12_BUFFER_CONFIG *const ref =
   3168           get_ref_frame_buffer(cpi, ref_frame);
   3169 
   3170       if (ref == NULL) {
   3171         cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
   3172         continue;
   3173       }
   3174 
   3175 #if CONFIG_VP9_HIGHBITDEPTH
   3176       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) {
   3177         RefCntBuffer *new_fb_ptr = NULL;
   3178         int force_scaling = 0;
   3179         int new_fb = cpi->scaled_ref_idx[ref_frame - 1];
   3180         if (new_fb == INVALID_IDX) {
   3181           new_fb = get_free_fb(cm);
   3182           force_scaling = 1;
   3183         }
   3184         if (new_fb == INVALID_IDX) return;
   3185         new_fb_ptr = &pool->frame_bufs[new_fb];
   3186         if (force_scaling || new_fb_ptr->buf.y_crop_width != cm->width ||
   3187             new_fb_ptr->buf.y_crop_height != cm->height) {
   3188           if (vpx_realloc_frame_buffer(&new_fb_ptr->buf, cm->width, cm->height,
   3189                                        cm->subsampling_x, cm->subsampling_y,
   3190                                        cm->use_highbitdepth,
   3191                                        VP9_ENC_BORDER_IN_PIXELS,
   3192                                        cm->byte_alignment, NULL, NULL, NULL))
   3193             vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   3194                                "Failed to allocate frame buffer");
   3195           scale_and_extend_frame(ref, &new_fb_ptr->buf, (int)cm->bit_depth,
   3196                                  EIGHTTAP, 0);
   3197           cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
   3198           alloc_frame_mvs(cm, new_fb);
   3199         }
   3200 #else
   3201       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) {
   3202         RefCntBuffer *new_fb_ptr = NULL;
   3203         int force_scaling = 0;
   3204         int new_fb = cpi->scaled_ref_idx[ref_frame - 1];
   3205         if (new_fb == INVALID_IDX) {
   3206           new_fb = get_free_fb(cm);
   3207           force_scaling = 1;
   3208         }
   3209         if (new_fb == INVALID_IDX) return;
   3210         new_fb_ptr = &pool->frame_bufs[new_fb];
   3211         if (force_scaling || new_fb_ptr->buf.y_crop_width != cm->width ||
   3212             new_fb_ptr->buf.y_crop_height != cm->height) {
   3213           if (vpx_realloc_frame_buffer(&new_fb_ptr->buf, cm->width, cm->height,
   3214                                        cm->subsampling_x, cm->subsampling_y,
   3215                                        VP9_ENC_BORDER_IN_PIXELS,
   3216                                        cm->byte_alignment, NULL, NULL, NULL))
   3217             vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   3218                                "Failed to allocate frame buffer");
   3219           vp9_scale_and_extend_frame(ref, &new_fb_ptr->buf, EIGHTTAP, 0);
   3220           cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
   3221           alloc_frame_mvs(cm, new_fb);
   3222         }
   3223 #endif  // CONFIG_VP9_HIGHBITDEPTH
   3224       } else {
   3225         int buf_idx;
   3226         RefCntBuffer *buf = NULL;
   3227         if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
   3228           // Check for release of scaled reference.
   3229           buf_idx = cpi->scaled_ref_idx[ref_frame - 1];
   3230           if (buf_idx != INVALID_IDX) {
   3231             buf = &pool->frame_bufs[buf_idx];
   3232             --buf->ref_count;
   3233             cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
   3234           }
   3235         }
   3236         buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
   3237         buf = &pool->frame_bufs[buf_idx];
   3238         buf->buf.y_crop_width = ref->y_crop_width;
   3239         buf->buf.y_crop_height = ref->y_crop_height;
   3240         cpi->scaled_ref_idx[ref_frame - 1] = buf_idx;
   3241         ++buf->ref_count;
   3242       }
   3243     } else {
   3244       if (cpi->oxcf.pass != 0 || cpi->use_svc)
   3245         cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
   3246     }
   3247   }
   3248 }
   3249 
   3250 static void release_scaled_references(VP9_COMP *cpi) {
   3251   VP9_COMMON *cm = &cpi->common;
   3252   int i;
   3253   if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
   3254     // Only release scaled references under certain conditions:
   3255     // if reference will be updated, or if scaled reference has same resolution.
   3256     int refresh[3];
   3257     refresh[0] = (cpi->refresh_last_frame) ? 1 : 0;
   3258     refresh[1] = (cpi->refresh_golden_frame) ? 1 : 0;
   3259     refresh[2] = (cpi->refresh_alt_ref_frame) ? 1 : 0;
   3260     for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
   3261       const int idx = cpi->scaled_ref_idx[i - 1];
   3262       if (idx != INVALID_IDX) {
   3263         RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
   3264         const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, i);
   3265         if (refresh[i - 1] || (buf->buf.y_crop_width == ref->y_crop_width &&
   3266                                buf->buf.y_crop_height == ref->y_crop_height)) {
   3267           --buf->ref_count;
   3268           cpi->scaled_ref_idx[i - 1] = INVALID_IDX;
   3269         }
   3270       }
   3271     }
   3272   } else {
   3273     for (i = 0; i < REFS_PER_FRAME; ++i) {
   3274       const int idx = cpi->scaled_ref_idx[i];
   3275       if (idx != INVALID_IDX) {
   3276         RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
   3277         --buf->ref_count;
   3278         cpi->scaled_ref_idx[i] = INVALID_IDX;
   3279       }
   3280     }
   3281   }
   3282 }
   3283 
   3284 static void full_to_model_count(unsigned int *model_count,
   3285                                 unsigned int *full_count) {
   3286   int n;
   3287   model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
   3288   model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
   3289   model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
   3290   for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
   3291     model_count[TWO_TOKEN] += full_count[n];
   3292   model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
   3293 }
   3294 
   3295 static void full_to_model_counts(vp9_coeff_count_model *model_count,
   3296                                  vp9_coeff_count *full_count) {
   3297   int i, j, k, l;
   3298 
   3299   for (i = 0; i < PLANE_TYPES; ++i)
   3300     for (j = 0; j < REF_TYPES; ++j)
   3301       for (k = 0; k < COEF_BANDS; ++k)
   3302         for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
   3303           full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
   3304 }
   3305 
   3306 #if 0 && CONFIG_INTERNAL_STATS
   3307 static void output_frame_level_debug_stats(VP9_COMP *cpi) {
   3308   VP9_COMMON *const cm = &cpi->common;
   3309   FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
   3310   int64_t recon_err;
   3311 
   3312   vpx_clear_system_state();
   3313 
   3314 #if CONFIG_VP9_HIGHBITDEPTH
   3315   if (cm->use_highbitdepth) {
   3316     recon_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   3317   } else {
   3318     recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   3319   }
   3320 #else
   3321   recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   3322 #endif  // CONFIG_VP9_HIGHBITDEPTH
   3323 
   3324 
   3325   if (cpi->twopass.total_left_stats.coded_error != 0.0) {
   3326     double dc_quant_devisor;
   3327 #if CONFIG_VP9_HIGHBITDEPTH
   3328     switch (cm->bit_depth) {
   3329       case VPX_BITS_8:
   3330         dc_quant_devisor = 4.0;
   3331         break;
   3332       case VPX_BITS_10:
   3333         dc_quant_devisor = 16.0;
   3334         break;
   3335       default:
   3336         assert(cm->bit_depth == VPX_BITS_12);
   3337         dc_quant_devisor = 64.0;
   3338         break;
   3339     }
   3340 #else
   3341     dc_quant_devisor = 4.0;
   3342 #endif
   3343 
   3344     if (!cm->current_video_frame) {
   3345       fprintf(f, "frame, width, height, last ts, last end ts, "
   3346           "source_alt_ref_pending, source_alt_ref_active, "
   3347           "this_frame_target, projected_frame_size, "
   3348           "projected_frame_size / MBs, "
   3349           "projected_frame_size - this_frame_target, "
   3350           "vbr_bits_off_target, vbr_bits_off_target_fast, "
   3351           "twopass.extend_minq, twopass.extend_minq_fast, "
   3352           "total_target_vs_actual, "
   3353           "starting_buffer_level - bits_off_target, "
   3354           "total_actual_bits, base_qindex, q for base_qindex, "
   3355           "dc quant, q for active_worst_quality, avg_q, q for oxcf.cq_level, "
   3356           "refresh_last_frame, refresh_golden_frame, refresh_alt_ref_frame, "
   3357           "frame_type, gfu_boost, "
   3358           "twopass.bits_left, "
   3359           "twopass.total_left_stats.coded_error, "
   3360           "twopass.bits_left / (1 + twopass.total_left_stats.coded_error), "
   3361           "tot_recode_hits, recon_err, kf_boost, "
   3362           "twopass.kf_zeromotion_pct, twopass.fr_content_type, "
   3363           "filter_level, seg.aq_av_offset\n");
   3364     }
   3365 
   3366     fprintf(f, "%10u, %d, %d, %10"PRId64", %10"PRId64", %d, %d, %10d, %10d, "
   3367         "%10d, %10d, %10"PRId64", %10"PRId64", %5d, %5d, %10"PRId64", "
   3368         "%10"PRId64", %10"PRId64", %10d, %7.2lf, %7.2lf, %7.2lf, %7.2lf, "
   3369         "%7.2lf, %6d, %6d, %5d, %5d, %5d, %10"PRId64", %10.3lf, %10lf, %8u, "
   3370         "%10"PRId64", %10d, %10d, %10d, %10d, %10d\n",
   3371         cpi->common.current_video_frame,
   3372         cm->width, cm->height,
   3373         cpi->last_time_stamp_seen,
   3374         cpi->last_end_time_stamp_seen,
   3375         cpi->rc.source_alt_ref_pending,
   3376         cpi->rc.source_alt_ref_active,
   3377         cpi->rc.this_frame_target,
   3378         cpi->rc.projected_frame_size,
   3379         cpi->rc.projected_frame_size / cpi->common.MBs,
   3380         (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
   3381         cpi->rc.vbr_bits_off_target,
   3382         cpi->rc.vbr_bits_off_target_fast,
   3383         cpi->twopass.extend_minq,
   3384         cpi->twopass.extend_minq_fast,
   3385         cpi->rc.total_target_vs_actual,
   3386         (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target),
   3387         cpi->rc.total_actual_bits, cm->base_qindex,
   3388         vp9_convert_qindex_to_q(cm->base_qindex, cm->bit_depth),
   3389         (double)vp9_dc_quant(cm->base_qindex, 0, cm->bit_depth) /
   3390             dc_quant_devisor,
   3391         vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality,
   3392                                 cm->bit_depth),
   3393         cpi->rc.avg_q,
   3394         vp9_convert_qindex_to_q(cpi->oxcf.cq_level, cm->bit_depth),
   3395         cpi->refresh_last_frame, cpi->refresh_golden_frame,
   3396         cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
   3397         cpi->twopass.bits_left,
   3398         cpi->twopass.total_left_stats.coded_error,
   3399         cpi->twopass.bits_left /
   3400             (1 + cpi->twopass.total_left_stats.coded_error),
   3401         cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
   3402         cpi->twopass.kf_zeromotion_pct,
   3403         cpi->twopass.fr_content_type,
   3404         cm->lf.filter_level,
   3405         cm->seg.aq_av_offset);
   3406   }
   3407   fclose(f);
   3408 
   3409   if (0) {
   3410     FILE *const fmodes = fopen("Modes.stt", "a");
   3411     int i;
   3412 
   3413     fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
   3414             cm->frame_type, cpi->refresh_golden_frame,
   3415             cpi->refresh_alt_ref_frame);
   3416 
   3417     for (i = 0; i < MAX_MODES; ++i)
   3418       fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
   3419 
   3420     fprintf(fmodes, "\n");
   3421 
   3422     fclose(fmodes);
   3423   }
   3424 }
   3425 #endif
   3426 
   3427 static void set_mv_search_params(VP9_COMP *cpi) {
   3428   const VP9_COMMON *const cm = &cpi->common;
   3429   const unsigned int max_mv_def = VPXMIN(cm->width, cm->height);
   3430 
   3431   // Default based on max resolution.
   3432   cpi->mv_step_param = vp9_init_search_range(max_mv_def);
   3433 
   3434   if (cpi->sf.mv.auto_mv_step_size) {
   3435     if (frame_is_intra_only(cm)) {
   3436       // Initialize max_mv_magnitude for use in the first INTER frame
   3437       // after a key/intra-only frame.
   3438       cpi->max_mv_magnitude = max_mv_def;
   3439     } else {
   3440       if (cm->show_frame) {
   3441         // Allow mv_steps to correspond to twice the max mv magnitude found
   3442         // in the previous frame, capped by the default max_mv_magnitude based
   3443         // on resolution.
   3444         cpi->mv_step_param = vp9_init_search_range(
   3445             VPXMIN(max_mv_def, 2 * cpi->max_mv_magnitude));
   3446       }
   3447       cpi->max_mv_magnitude = 0;
   3448     }
   3449   }
   3450 }
   3451 
   3452 static void set_size_independent_vars(VP9_COMP *cpi) {
   3453   vp9_set_speed_features_framesize_independent(cpi);
   3454   vp9_set_rd_speed_thresholds(cpi);
   3455   vp9_set_rd_speed_thresholds_sub8x8(cpi);
   3456   cpi->common.interp_filter = cpi->sf.default_interp_filter;
   3457 }
   3458 
   3459 static void set_size_dependent_vars(VP9_COMP *cpi, int *q, int *bottom_index,
   3460                                     int *top_index) {
   3461   VP9_COMMON *const cm = &cpi->common;
   3462 
   3463   // Setup variables that depend on the dimensions of the frame.
   3464   vp9_set_speed_features_framesize_dependent(cpi);
   3465 
   3466   // Decide q and q bounds.
   3467   *q = vp9_rc_pick_q_and_bounds(cpi, bottom_index, top_index);
   3468 
   3469   if (cpi->oxcf.rc_mode == VPX_CBR && cpi->rc.force_max_q) {
   3470     *q = cpi->rc.worst_quality;
   3471     cpi->rc.force_max_q = 0;
   3472   }
   3473 
   3474   if (!frame_is_intra_only(cm)) {
   3475     vp9_set_high_precision_mv(cpi, (*q) < HIGH_PRECISION_MV_QTHRESH);
   3476   }
   3477 
   3478 #if !CONFIG_REALTIME_ONLY
   3479   // Configure experimental use of segmentation for enhanced coding of
   3480   // static regions if indicated.
   3481   // Only allowed in the second pass of a two pass encode, as it requires
   3482   // lagged coding, and if the relevant speed feature flag is set.
   3483   if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
   3484     configure_static_seg_features(cpi);
   3485 #endif  // !CONFIG_REALTIME_ONLY
   3486 
   3487 #if CONFIG_VP9_POSTPROC && !(CONFIG_VP9_TEMPORAL_DENOISING)
   3488   if (cpi->oxcf.noise_sensitivity > 0) {
   3489     int l = 0;
   3490     switch (cpi->oxcf.noise_sensitivity) {
   3491       case 1: l = 20; break;
   3492       case 2: l = 40; break;
   3493       case 3: l = 60; break;
   3494       case 4:
   3495       case 5: l = 100; break;
   3496       case 6: l = 150; break;
   3497     }
   3498     if (!cpi->common.postproc_state.limits) {
   3499       cpi->common.postproc_state.limits =
   3500           vpx_calloc(cpi->un_scaled_source->y_width,
   3501                      sizeof(*cpi->common.postproc_state.limits));
   3502     }
   3503     vp9_denoise(cpi->Source, cpi->Source, l, cpi->common.postproc_state.limits);
   3504   }
   3505 #endif  // CONFIG_VP9_POSTPROC
   3506 }
   3507 
   3508 #if CONFIG_VP9_TEMPORAL_DENOISING
   3509 static void setup_denoiser_buffer(VP9_COMP *cpi) {
   3510   VP9_COMMON *const cm = &cpi->common;
   3511   if (cpi->oxcf.noise_sensitivity > 0 &&
   3512       !cpi->denoiser.frame_buffer_initialized) {
   3513     if (vp9_denoiser_alloc(cm, &cpi->svc, &cpi->denoiser, cpi->use_svc,
   3514                            cpi->oxcf.noise_sensitivity, cm->width, cm->height,
   3515                            cm->subsampling_x, cm->subsampling_y,
   3516 #if CONFIG_VP9_HIGHBITDEPTH
   3517                            cm->use_highbitdepth,
   3518 #endif
   3519                            VP9_ENC_BORDER_IN_PIXELS))
   3520       vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   3521                          "Failed to allocate denoiser");
   3522   }
   3523 }
   3524 #endif
   3525 
   3526 static void init_motion_estimation(VP9_COMP *cpi) {
   3527   int y_stride = cpi->scaled_source.y_stride;
   3528 
   3529   if (cpi->sf.mv.search_method == NSTEP) {
   3530     vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
   3531   } else if (cpi->sf.mv.search_method == DIAMOND) {
   3532     vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
   3533   }
   3534 }
   3535 
   3536 static void set_frame_size(VP9_COMP *cpi) {
   3537   int ref_frame;
   3538   VP9_COMMON *const cm = &cpi->common;
   3539   VP9EncoderConfig *const oxcf = &cpi->oxcf;
   3540   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
   3541 
   3542 #if !CONFIG_REALTIME_ONLY
   3543   if (oxcf->pass == 2 && oxcf->rc_mode == VPX_VBR &&
   3544       ((oxcf->resize_mode == RESIZE_FIXED && cm->current_video_frame == 0) ||
   3545        (oxcf->resize_mode == RESIZE_DYNAMIC && cpi->resize_pending))) {
   3546     calculate_coded_size(cpi, &oxcf->scaled_frame_width,
   3547                          &oxcf->scaled_frame_height);
   3548 
   3549     // There has been a change in frame size.
   3550     vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
   3551                          oxcf->scaled_frame_height);
   3552   }
   3553 #endif  // !CONFIG_REALTIME_ONLY
   3554 
   3555   if (oxcf->pass == 0 && oxcf->rc_mode == VPX_CBR && !cpi->use_svc &&
   3556       oxcf->resize_mode == RESIZE_DYNAMIC && cpi->resize_pending != 0) {
   3557     oxcf->scaled_frame_width =
   3558         (oxcf->width * cpi->resize_scale_num) / cpi->resize_scale_den;
   3559     oxcf->scaled_frame_height =
   3560         (oxcf->height * cpi->resize_scale_num) / cpi->resize_scale_den;
   3561     // There has been a change in frame size.
   3562     vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
   3563                          oxcf->scaled_frame_height);
   3564 
   3565     // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
   3566     set_mv_search_params(cpi);
   3567 
   3568     vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
   3569 #if CONFIG_VP9_TEMPORAL_DENOISING
   3570     // Reset the denoiser on the resized frame.
   3571     if (cpi->oxcf.noise_sensitivity > 0) {
   3572       vp9_denoiser_free(&(cpi->denoiser));
   3573       setup_denoiser_buffer(cpi);
   3574       // Dynamic resize is only triggered for non-SVC, so we can force
   3575       // golden frame update here as temporary fix to denoiser.
   3576       cpi->refresh_golden_frame = 1;
   3577     }
   3578 #endif
   3579   }
   3580 
   3581   if ((oxcf->pass == 2) && !cpi->use_svc) {
   3582     vp9_set_target_rate(cpi);
   3583   }
   3584 
   3585   alloc_frame_mvs(cm, cm->new_fb_idx);
   3586 
   3587   // Reset the frame pointers to the current frame size.
   3588   if (vpx_realloc_frame_buffer(get_frame_new_buffer(cm), cm->width, cm->height,
   3589                                cm->subsampling_x, cm->subsampling_y,
   3590 #if CONFIG_VP9_HIGHBITDEPTH
   3591                                cm->use_highbitdepth,
   3592 #endif
   3593                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   3594                                NULL, NULL, NULL))
   3595     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   3596                        "Failed to allocate frame buffer");
   3597 
   3598   alloc_util_frame_buffers(cpi);
   3599   init_motion_estimation(cpi);
   3600 
   3601   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
   3602     RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
   3603     const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
   3604 
   3605     ref_buf->idx = buf_idx;
   3606 
   3607     if (buf_idx != INVALID_IDX) {
   3608       YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[buf_idx].buf;
   3609       ref_buf->buf = buf;
   3610 #if CONFIG_VP9_HIGHBITDEPTH
   3611       vp9_setup_scale_factors_for_frame(
   3612           &ref_buf->sf, buf->y_crop_width, buf->y_crop_height, cm->width,
   3613           cm->height, (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? 1 : 0);
   3614 #else
   3615       vp9_setup_scale_factors_for_frame(&ref_buf->sf, buf->y_crop_width,
   3616                                         buf->y_crop_height, cm->width,
   3617                                         cm->height);
   3618 #endif  // CONFIG_VP9_HIGHBITDEPTH
   3619       if (vp9_is_scaled(&ref_buf->sf)) vpx_extend_frame_borders(buf);
   3620     } else {
   3621       ref_buf->buf = NULL;
   3622     }
   3623   }
   3624 
   3625   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
   3626 }
   3627 
   3628 #if CONFIG_CONSISTENT_RECODE
   3629 static void save_encode_params(VP9_COMP *cpi) {
   3630   VP9_COMMON *const cm = &cpi->common;
   3631   const int tile_cols = 1 << cm->log2_tile_cols;
   3632   const int tile_rows = 1 << cm->log2_tile_rows;
   3633   int tile_col, tile_row;
   3634   int i, j;
   3635   RD_OPT *rd_opt = &cpi->rd;
   3636   for (i = 0; i < MAX_REF_FRAMES; i++) {
   3637     for (j = 0; j < REFERENCE_MODES; j++)
   3638       rd_opt->prediction_type_threshes_prev[i][j] =
   3639           rd_opt->prediction_type_threshes[i][j];
   3640 
   3641     for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; j++)
   3642       rd_opt->filter_threshes_prev[i][j] = rd_opt->filter_threshes[i][j];
   3643   }
   3644 
   3645   if (cpi->tile_data != NULL) {
   3646     for (tile_row = 0; tile_row < tile_rows; ++tile_row)
   3647       for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
   3648         TileDataEnc *tile_data =
   3649             &cpi->tile_data[tile_row * tile_cols + tile_col];
   3650         for (i = 0; i < BLOCK_SIZES; ++i) {
   3651           for (j = 0; j < MAX_MODES; ++j) {
   3652             tile_data->thresh_freq_fact_prev[i][j] =
   3653                 tile_data->thresh_freq_fact[i][j];
   3654           }
   3655         }
   3656       }
   3657   }
   3658 }
   3659 #endif
   3660 
   3661 static INLINE void set_raw_source_frame(VP9_COMP *cpi) {
   3662 #ifdef ENABLE_KF_DENOISE
   3663   if (is_spatial_denoise_enabled(cpi)) {
   3664     cpi->raw_source_frame = vp9_scale_if_required(
   3665         cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
   3666         (oxcf->pass == 0), EIGHTTAP, 0);
   3667   } else {
   3668     cpi->raw_source_frame = cpi->Source;
   3669   }
   3670 #else
   3671   cpi->raw_source_frame = cpi->Source;
   3672 #endif
   3673 }
   3674 
   3675 static int encode_without_recode_loop(VP9_COMP *cpi, size_t *size,
   3676                                       uint8_t *dest) {
   3677   VP9_COMMON *const cm = &cpi->common;
   3678   SVC *const svc = &cpi->svc;
   3679   int q = 0, bottom_index = 0, top_index = 0;
   3680   int no_drop_scene_change = 0;
   3681   const INTERP_FILTER filter_scaler =
   3682       (is_one_pass_cbr_svc(cpi))
   3683           ? svc->downsample_filter_type[svc->spatial_layer_id]
   3684           : EIGHTTAP;
   3685   const int phase_scaler =
   3686       (is_one_pass_cbr_svc(cpi))
   3687           ? svc->downsample_filter_phase[svc->spatial_layer_id]
   3688           : 0;
   3689 
   3690   if (cm->show_existing_frame) {
   3691     if (is_psnr_calc_enabled(cpi)) set_raw_source_frame(cpi);
   3692     return 1;
   3693   }
   3694 
   3695   svc->time_stamp_prev[svc->spatial_layer_id] = svc->time_stamp_superframe;
   3696 
   3697   // Flag to check if its valid to compute the source sad (used for
   3698   // scene detection and for superblock content state in CBR mode).
   3699   // The flag may get reset below based on SVC or resizing state.
   3700   cpi->compute_source_sad_onepass = cpi->oxcf.mode == REALTIME;
   3701 
   3702   vpx_clear_system_state();
   3703 
   3704   set_frame_size(cpi);
   3705 
   3706   if (is_one_pass_cbr_svc(cpi) &&
   3707       cpi->un_scaled_source->y_width == cm->width << 2 &&
   3708       cpi->un_scaled_source->y_height == cm->height << 2 &&
   3709       svc->scaled_temp.y_width == cm->width << 1 &&
   3710       svc->scaled_temp.y_height == cm->height << 1) {
   3711     // For svc, if it is a 1/4x1/4 downscaling, do a two-stage scaling to take
   3712     // advantage of the 1:2 optimized scaler. In the process, the 1/2x1/2
   3713     // result will be saved in scaled_temp and might be used later.
   3714     const INTERP_FILTER filter_scaler2 = svc->downsample_filter_type[1];
   3715     const int phase_scaler2 = svc->downsample_filter_phase[1];
   3716     cpi->Source = vp9_svc_twostage_scale(
   3717         cm, cpi->un_scaled_source, &cpi->scaled_source, &svc->scaled_temp,
   3718         filter_scaler, phase_scaler, filter_scaler2, phase_scaler2);
   3719     svc->scaled_one_half = 1;
   3720   } else if (is_one_pass_cbr_svc(cpi) &&
   3721              cpi->un_scaled_source->y_width == cm->width << 1 &&
   3722              cpi->un_scaled_source->y_height == cm->height << 1 &&
   3723              svc->scaled_one_half) {
   3724     // If the spatial layer is 1/2x1/2 and the scaling is already done in the
   3725     // two-stage scaling, use the result directly.
   3726     cpi->Source = &svc->scaled_temp;
   3727     svc->scaled_one_half = 0;
   3728   } else {
   3729     cpi->Source = vp9_scale_if_required(
   3730         cm, cpi->un_scaled_source, &cpi->scaled_source, (cpi->oxcf.pass == 0),
   3731         filter_scaler, phase_scaler);
   3732   }
   3733 #ifdef OUTPUT_YUV_SVC_SRC
   3734   // Write out at most 3 spatial layers.
   3735   if (is_one_pass_cbr_svc(cpi) && svc->spatial_layer_id < 3) {
   3736     vpx_write_yuv_frame(yuv_svc_src[svc->spatial_layer_id], cpi->Source);
   3737   }
   3738 #endif
   3739   // Unfiltered raw source used in metrics calculation if the source
   3740   // has been filtered.
   3741   if (is_psnr_calc_enabled(cpi)) {
   3742 #ifdef ENABLE_KF_DENOISE
   3743     if (is_spatial_denoise_enabled(cpi)) {
   3744       cpi->raw_source_frame = vp9_scale_if_required(
   3745           cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
   3746           (cpi->oxcf.pass == 0), EIGHTTAP, phase_scaler);
   3747     } else {
   3748       cpi->raw_source_frame = cpi->Source;
   3749     }
   3750 #else
   3751     cpi->raw_source_frame = cpi->Source;
   3752 #endif
   3753   }
   3754 
   3755   if ((cpi->use_svc &&
   3756        (svc->spatial_layer_id < svc->number_spatial_layers - 1 ||
   3757         svc->temporal_layer_id < svc->number_temporal_layers - 1 ||
   3758         svc->current_superframe < 1)) ||
   3759       cpi->resize_pending || cpi->resize_state || cpi->external_resize ||
   3760       cpi->resize_state != ORIG) {
   3761     cpi->compute_source_sad_onepass = 0;
   3762     if (cpi->content_state_sb_fd != NULL)
   3763       memset(cpi->content_state_sb_fd, 0,
   3764              (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) *
   3765                  sizeof(*cpi->content_state_sb_fd));
   3766   }
   3767 
   3768   // Avoid scaling last_source unless its needed.
   3769   // Last source is needed if avg_source_sad() is used, or if
   3770   // partition_search_type == SOURCE_VAR_BASED_PARTITION, or if noise
   3771   // estimation is enabled.
   3772   if (cpi->unscaled_last_source != NULL &&
   3773       (cpi->oxcf.content == VP9E_CONTENT_SCREEN ||
   3774        (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_VBR &&
   3775         cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5) ||
   3776        cpi->sf.partition_search_type == SOURCE_VAR_BASED_PARTITION ||
   3777        (cpi->noise_estimate.enabled && !cpi->oxcf.noise_sensitivity) ||
   3778        cpi->compute_source_sad_onepass))
   3779     cpi->Last_Source = vp9_scale_if_required(
   3780         cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
   3781         (cpi->oxcf.pass == 0), EIGHTTAP, 0);
   3782 
   3783   if (cpi->Last_Source == NULL ||
   3784       cpi->Last_Source->y_width != cpi->Source->y_width ||
   3785       cpi->Last_Source->y_height != cpi->Source->y_height)
   3786     cpi->compute_source_sad_onepass = 0;
   3787 
   3788   if (frame_is_intra_only(cm) || cpi->resize_pending != 0) {
   3789     memset(cpi->consec_zero_mv, 0,
   3790            cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
   3791   }
   3792 
   3793 #if CONFIG_VP9_TEMPORAL_DENOISING
   3794   if (cpi->oxcf.noise_sensitivity > 0 && cpi->use_svc)
   3795     vp9_denoiser_reset_on_first_frame(cpi);
   3796 #endif
   3797   vp9_update_noise_estimate(cpi);
   3798 
   3799   // Scene detection is always used for VBR mode or screen-content case.
   3800   // For other cases (e.g., CBR mode) use it for 5 <= speed < 8 for now
   3801   // (need to check encoding time cost for doing this for speed 8).
   3802   cpi->rc.high_source_sad = 0;
   3803   cpi->rc.hybrid_intra_scene_change = 0;
   3804   cpi->rc.re_encode_maxq_scene_change = 0;
   3805   if (cm->show_frame && cpi->oxcf.mode == REALTIME &&
   3806       (cpi->oxcf.rc_mode == VPX_VBR ||
   3807        cpi->oxcf.content == VP9E_CONTENT_SCREEN ||
   3808        (cpi->oxcf.speed >= 5 && cpi->oxcf.speed < 8)))
   3809     vp9_scene_detection_onepass(cpi);
   3810 
   3811   if (svc->spatial_layer_id == svc->first_spatial_layer_to_encode) {
   3812     svc->high_source_sad_superframe = cpi->rc.high_source_sad;
   3813     svc->high_num_blocks_with_motion = cpi->rc.high_num_blocks_with_motion;
   3814     // On scene change reset temporal layer pattern to TL0.
   3815     // Note that if the base/lower spatial layers are skipped: instead of
   3816     // inserting base layer here, we force max-q for the next superframe
   3817     // with lower spatial layers: this is done in vp9_encodedframe_overshoot()
   3818     // when max-q is decided for the current layer.
   3819     // Only do this reset for bypass/flexible mode.
   3820     if (svc->high_source_sad_superframe && svc->temporal_layer_id > 0 &&
   3821         svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
   3822       // rc->high_source_sad will get reset so copy it to restore it.
   3823       int tmp_high_source_sad = cpi->rc.high_source_sad;
   3824       vp9_svc_reset_temporal_layers(cpi, cm->frame_type == KEY_FRAME);
   3825       cpi->rc.high_source_sad = tmp_high_source_sad;
   3826     }
   3827   }
   3828 
   3829   // For 1 pass CBR, check if we are dropping this frame.
   3830   // Never drop on key frame, if base layer is key for svc,
   3831   // on scene change, or if superframe has layer sync.
   3832   if ((cpi->rc.high_source_sad || svc->high_source_sad_superframe) &&
   3833       !(cpi->rc.use_post_encode_drop && svc->last_layer_dropped[0]))
   3834     no_drop_scene_change = 1;
   3835   if (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_CBR &&
   3836       !frame_is_intra_only(cm) && !no_drop_scene_change &&
   3837       !svc->superframe_has_layer_sync &&
   3838       (!cpi->use_svc ||
   3839        !svc->layer_context[svc->temporal_layer_id].is_key_frame)) {
   3840     if (vp9_rc_drop_frame(cpi)) return 0;
   3841   }
   3842 
   3843   // For 1 pass CBR SVC, only ZEROMV is allowed for spatial reference frame
   3844   // when svc->force_zero_mode_spatial_ref = 1. Under those conditions we can
   3845   // avoid this frame-level upsampling (for non intra_only frames).
   3846   if (frame_is_intra_only(cm) == 0 &&
   3847       !(is_one_pass_cbr_svc(cpi) && svc->force_zero_mode_spatial_ref)) {
   3848     vp9_scale_references(cpi);
   3849   }
   3850 
   3851   set_size_independent_vars(cpi);
   3852   set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
   3853 
   3854   // search method and step parameter might be changed in speed settings.
   3855   init_motion_estimation(cpi);
   3856 
   3857   if (cpi->sf.copy_partition_flag) alloc_copy_partition_data(cpi);
   3858 
   3859   if (cpi->sf.svc_use_lowres_part &&
   3860       svc->spatial_layer_id == svc->number_spatial_layers - 2) {
   3861     if (svc->prev_partition_svc == NULL) {
   3862       CHECK_MEM_ERROR(
   3863           cm, svc->prev_partition_svc,
   3864           (BLOCK_SIZE *)vpx_calloc(cm->mi_stride * cm->mi_rows,
   3865                                    sizeof(*svc->prev_partition_svc)));
   3866     }
   3867   }
   3868 
   3869   // TODO(jianj): Look into issue of skin detection with high bitdepth.
   3870   if (cm->bit_depth == 8 && cpi->oxcf.speed >= 5 && cpi->oxcf.pass == 0 &&
   3871       cpi->oxcf.rc_mode == VPX_CBR &&
   3872       cpi->oxcf.content != VP9E_CONTENT_SCREEN &&
   3873       cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
   3874     cpi->use_skin_detection = 1;
   3875   }
   3876 
   3877   // Enable post encode frame dropping for CBR on non key frame, when
   3878   // ext_use_post_encode_drop is specified by user.
   3879   cpi->rc.use_post_encode_drop = cpi->rc.ext_use_post_encode_drop &&
   3880                                  cpi->oxcf.rc_mode == VPX_CBR &&
   3881                                  cm->frame_type != KEY_FRAME;
   3882 
   3883   vp9_set_quantizer(cm, q);
   3884   vp9_set_variance_partition_thresholds(cpi, q, 0);
   3885 
   3886   setup_frame(cpi);
   3887 
   3888   suppress_active_map(cpi);
   3889 
   3890   if (cpi->use_svc) {
   3891     // On non-zero spatial layer, check for disabling inter-layer
   3892     // prediction.
   3893     if (svc->spatial_layer_id > 0) vp9_svc_constrain_inter_layer_pred(cpi);
   3894     vp9_svc_assert_constraints_pattern(cpi);
   3895   }
   3896 
   3897   if (cpi->rc.last_post_encode_dropped_scene_change) {
   3898     cpi->rc.high_source_sad = 1;
   3899     svc->high_source_sad_superframe = 1;
   3900     // For now disable use_source_sad since Last_Source will not be the previous
   3901     // encoded but the dropped one.
   3902     cpi->sf.use_source_sad = 0;
   3903     cpi->rc.last_post_encode_dropped_scene_change = 0;
   3904   }
   3905   // Check if this high_source_sad (scene/slide change) frame should be
   3906   // encoded at high/max QP, and if so, set the q and adjust some rate
   3907   // control parameters.
   3908   if (cpi->sf.overshoot_detection_cbr_rt == FAST_DETECTION_MAXQ &&
   3909       (cpi->rc.high_source_sad ||
   3910        (cpi->use_svc && svc->high_source_sad_superframe))) {
   3911     if (vp9_encodedframe_overshoot(cpi, -1, &q)) {
   3912       vp9_set_quantizer(cm, q);
   3913       vp9_set_variance_partition_thresholds(cpi, q, 0);
   3914     }
   3915   }
   3916 
   3917   // Variance adaptive and in frame q adjustment experiments are mutually
   3918   // exclusive.
   3919   if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
   3920     vp9_vaq_frame_setup(cpi);
   3921   } else if (cpi->oxcf.aq_mode == EQUATOR360_AQ) {
   3922     vp9_360aq_frame_setup(cpi);
   3923   } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
   3924     vp9_setup_in_frame_q_adj(cpi);
   3925   } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
   3926     vp9_cyclic_refresh_setup(cpi);
   3927   } else if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ) {
   3928     // it may be pretty bad for rate-control,
   3929     // and I should handle it somehow
   3930     vp9_alt_ref_aq_setup_map(cpi->alt_ref_aq, cpi);
   3931   } else if (cpi->roi.enabled && !frame_is_intra_only(cm)) {
   3932     apply_roi_map(cpi);
   3933   }
   3934 
   3935   apply_active_map(cpi);
   3936 
   3937   vp9_encode_frame(cpi);
   3938 
   3939   // Check if we should re-encode this frame at high Q because of high
   3940   // overshoot based on the encoded frame size. Only for frames where
   3941   // high temporal-source SAD is detected.
   3942   // For SVC: all spatial layers are checked for re-encoding.
   3943   if (cpi->sf.overshoot_detection_cbr_rt == RE_ENCODE_MAXQ &&
   3944       (cpi->rc.high_source_sad ||
   3945        (cpi->use_svc && svc->high_source_sad_superframe))) {
   3946     int frame_size = 0;
   3947     // Get an estimate of the encoded frame size.
   3948     save_coding_context(cpi);
   3949     vp9_pack_bitstream(cpi, dest, size);
   3950     restore_coding_context(cpi);
   3951     frame_size = (int)(*size) << 3;
   3952     // Check if encoded frame will overshoot too much, and if so, set the q and
   3953     // adjust some rate control parameters, and return to re-encode the frame.
   3954     if (vp9_encodedframe_overshoot(cpi, frame_size, &q)) {
   3955       vpx_clear_system_state();
   3956       vp9_set_quantizer(cm, q);
   3957       vp9_set_variance_partition_thresholds(cpi, q, 0);
   3958       suppress_active_map(cpi);
   3959       // Turn-off cyclic refresh for re-encoded frame.
   3960       if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
   3961         CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
   3962         unsigned char *const seg_map = cpi->segmentation_map;
   3963         memset(seg_map, 0, cm->mi_rows * cm->mi_cols);
   3964         memset(cr->last_coded_q_map, MAXQ,
   3965                cm->mi_rows * cm->mi_cols * sizeof(*cr->last_coded_q_map));
   3966         cr->sb_index = 0;
   3967         vp9_disable_segmentation(&cm->seg);
   3968       }
   3969       apply_active_map(cpi);
   3970       vp9_encode_frame(cpi);
   3971     }
   3972   }
   3973 
   3974   // Update some stats from cyclic refresh, and check for golden frame update.
   3975   if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled &&
   3976       !frame_is_intra_only(cm))
   3977     vp9_cyclic_refresh_postencode(cpi);
   3978 
   3979   // Update the skip mb flag probabilities based on the distribution
   3980   // seen in the last encoder iteration.
   3981   // update_base_skip_probs(cpi);
   3982   vpx_clear_system_state();
   3983   return 1;
   3984 }
   3985 
   3986 #define MAX_QSTEP_ADJ 4
   3987 static int get_qstep_adj(int rate_excess, int rate_limit) {
   3988   int qstep =
   3989       rate_limit ? ((rate_excess + rate_limit / 2) / rate_limit) : INT_MAX;
   3990   return VPXMIN(qstep, MAX_QSTEP_ADJ);
   3991 }
   3992 
   3993 static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size,
   3994                                     uint8_t *dest) {
   3995   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
   3996   VP9_COMMON *const cm = &cpi->common;
   3997   RATE_CONTROL *const rc = &cpi->rc;
   3998   int bottom_index, top_index;
   3999   int loop_count = 0;
   4000   int loop_at_this_size = 0;
   4001   int loop = 0;
   4002   int overshoot_seen = 0;
   4003   int undershoot_seen = 0;
   4004   int frame_over_shoot_limit;
   4005   int frame_under_shoot_limit;
   4006   int q = 0, q_low = 0, q_high = 0;
   4007   int enable_acl;
   4008 #ifdef AGGRESSIVE_VBR
   4009   int qrange_adj = 1;
   4010 #endif
   4011 
   4012   if (cm->show_existing_frame) {
   4013     if (is_psnr_calc_enabled(cpi)) set_raw_source_frame(cpi);
   4014     return;
   4015   }
   4016 
   4017   set_size_independent_vars(cpi);
   4018 
   4019   enable_acl = cpi->sf.allow_acl ? (cm->frame_type == KEY_FRAME) ||
   4020                                        (cpi->twopass.gf_group.index == 1)
   4021                                  : 0;
   4022 
   4023   do {
   4024     vpx_clear_system_state();
   4025 
   4026     set_frame_size(cpi);
   4027 
   4028     if (loop_count == 0 || cpi->resize_pending != 0) {
   4029       set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
   4030 
   4031 #ifdef AGGRESSIVE_VBR
   4032       if (two_pass_first_group_inter(cpi)) {
   4033         // Adjustment limits for min and max q
   4034         qrange_adj = VPXMAX(1, (top_index - bottom_index) / 2);
   4035 
   4036         bottom_index =
   4037             VPXMAX(bottom_index - qrange_adj / 2, oxcf->best_allowed_q);
   4038         top_index = VPXMIN(oxcf->worst_allowed_q, top_index + qrange_adj / 2);
   4039       }
   4040 #endif
   4041       // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
   4042       set_mv_search_params(cpi);
   4043 
   4044       // Reset the loop state for new frame size.
   4045       overshoot_seen = 0;
   4046       undershoot_seen = 0;
   4047 
   4048       // Reconfiguration for change in frame size has concluded.
   4049       cpi->resize_pending = 0;
   4050 
   4051       q_low = bottom_index;
   4052       q_high = top_index;
   4053 
   4054       loop_at_this_size = 0;
   4055     }
   4056 
   4057     // Decide frame size bounds first time through.
   4058     if (loop_count == 0) {
   4059       vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
   4060                                        &frame_under_shoot_limit,
   4061                                        &frame_over_shoot_limit);
   4062     }
   4063 
   4064     cpi->Source =
   4065         vp9_scale_if_required(cm, cpi->un_scaled_source, &cpi->scaled_source,
   4066                               (oxcf->pass == 0), EIGHTTAP, 0);
   4067 
   4068     // Unfiltered raw source used in metrics calculation if the source
   4069     // has been filtered.
   4070     if (is_psnr_calc_enabled(cpi)) {
   4071 #ifdef ENABLE_KF_DENOISE
   4072       if (is_spatial_denoise_enabled(cpi)) {
   4073         cpi->raw_source_frame = vp9_scale_if_required(
   4074             cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
   4075             (oxcf->pass == 0), EIGHTTAP, 0);
   4076       } else {
   4077         cpi->raw_source_frame = cpi->Source;
   4078       }
   4079 #else
   4080       cpi->raw_source_frame = cpi->Source;
   4081 #endif
   4082     }
   4083 
   4084     if (cpi->unscaled_last_source != NULL)
   4085       cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source,
   4086                                                &cpi->scaled_last_source,
   4087                                                (oxcf->pass == 0), EIGHTTAP, 0);
   4088 
   4089     if (frame_is_intra_only(cm) == 0) {
   4090       if (loop_count > 0) {
   4091         release_scaled_references(cpi);
   4092       }
   4093       vp9_scale_references(cpi);
   4094     }
   4095 
   4096     vp9_set_quantizer(cm, q);
   4097 
   4098     if (loop_count == 0) setup_frame(cpi);
   4099 
   4100     // Variance adaptive and in frame q adjustment experiments are mutually
   4101     // exclusive.
   4102     if (oxcf->aq_mode == VARIANCE_AQ) {
   4103       vp9_vaq_frame_setup(cpi);
   4104     } else if (oxcf->aq_mode == EQUATOR360_AQ) {
   4105       vp9_360aq_frame_setup(cpi);
   4106     } else if (oxcf->aq_mode == COMPLEXITY_AQ) {
   4107       vp9_setup_in_frame_q_adj(cpi);
   4108     } else if (oxcf->aq_mode == LOOKAHEAD_AQ) {
   4109       vp9_alt_ref_aq_setup_map(cpi->alt_ref_aq, cpi);
   4110     } else if (oxcf->aq_mode == PSNR_AQ) {
   4111       vp9_psnr_aq_mode_setup(&cm->seg);
   4112     }
   4113 
   4114     vp9_encode_frame(cpi);
   4115 
   4116     // Update the skip mb flag probabilities based on the distribution
   4117     // seen in the last encoder iteration.
   4118     // update_base_skip_probs(cpi);
   4119 
   4120     vpx_clear_system_state();
   4121 
   4122     // Dummy pack of the bitstream using up to date stats to get an
   4123     // accurate estimate of output frame size to determine if we need
   4124     // to recode.
   4125     if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
   4126       save_coding_context(cpi);
   4127       if (!cpi->sf.use_nonrd_pick_mode) vp9_pack_bitstream(cpi, dest, size);
   4128 
   4129       rc->projected_frame_size = (int)(*size) << 3;
   4130 
   4131       if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
   4132     }
   4133 
   4134     if (oxcf->rc_mode == VPX_Q) {
   4135       loop = 0;
   4136     } else {
   4137       if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced &&
   4138           (rc->projected_frame_size < rc->max_frame_bandwidth)) {
   4139         int last_q = q;
   4140         int64_t kf_err;
   4141 
   4142         int64_t high_err_target = cpi->ambient_err;
   4143         int64_t low_err_target = cpi->ambient_err >> 1;
   4144 
   4145 #if CONFIG_VP9_HIGHBITDEPTH
   4146         if (cm->use_highbitdepth) {
   4147           kf_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4148         } else {
   4149           kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4150         }
   4151 #else
   4152         kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4153 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4154 
   4155         // Prevent possible divide by zero error below for perfect KF
   4156         kf_err += !kf_err;
   4157 
   4158         // The key frame is not good enough or we can afford
   4159         // to make it better without undue risk of popping.
   4160         if ((kf_err > high_err_target &&
   4161              rc->projected_frame_size <= frame_over_shoot_limit) ||
   4162             (kf_err > low_err_target &&
   4163              rc->projected_frame_size <= frame_under_shoot_limit)) {
   4164           // Lower q_high
   4165           q_high = q > q_low ? q - 1 : q_low;
   4166 
   4167           // Adjust Q
   4168           q = (int)((q * high_err_target) / kf_err);
   4169           q = VPXMIN(q, (q_high + q_low) >> 1);
   4170         } else if (kf_err < low_err_target &&
   4171                    rc->projected_frame_size >= frame_under_shoot_limit) {
   4172           // The key frame is much better than the previous frame
   4173           // Raise q_low
   4174           q_low = q < q_high ? q + 1 : q_high;
   4175 
   4176           // Adjust Q
   4177           q = (int)((q * low_err_target) / kf_err);
   4178           q = VPXMIN(q, (q_high + q_low + 1) >> 1);
   4179         }
   4180 
   4181         // Clamp Q to upper and lower limits:
   4182         q = clamp(q, q_low, q_high);
   4183 
   4184         loop = q != last_q;
   4185       } else if (recode_loop_test(cpi, frame_over_shoot_limit,
   4186                                   frame_under_shoot_limit, q,
   4187                                   VPXMAX(q_high, top_index), bottom_index)) {
   4188         // Is the projected frame size out of range and are we allowed
   4189         // to attempt to recode.
   4190         int last_q = q;
   4191         int retries = 0;
   4192         int qstep;
   4193 
   4194         if (cpi->resize_pending == 1) {
   4195           // Change in frame size so go back around the recode loop.
   4196           cpi->rc.frame_size_selector =
   4197               SCALE_STEP1 - cpi->rc.frame_size_selector;
   4198           cpi->rc.next_frame_size_selector = cpi->rc.frame_size_selector;
   4199 
   4200 #if CONFIG_INTERNAL_STATS
   4201           ++cpi->tot_recode_hits;
   4202 #endif
   4203           ++loop_count;
   4204           loop = 1;
   4205           continue;
   4206         }
   4207 
   4208         // Frame size out of permitted range:
   4209         // Update correction factor & compute new Q to try...
   4210 
   4211         // Frame is too large
   4212         if (rc->projected_frame_size > rc->this_frame_target) {
   4213           // Special case if the projected size is > the max allowed.
   4214           if ((q == q_high) &&
   4215               ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
   4216                (!rc->is_src_frame_alt_ref &&
   4217                 (rc->projected_frame_size >=
   4218                  big_rate_miss_high_threshold(cpi))))) {
   4219             int max_rate = VPXMAX(1, VPXMIN(rc->max_frame_bandwidth,
   4220                                             big_rate_miss_high_threshold(cpi)));
   4221             double q_val_high;
   4222             q_val_high = vp9_convert_qindex_to_q(q_high, cm->bit_depth);
   4223             q_val_high =
   4224                 q_val_high * ((double)rc->projected_frame_size / max_rate);
   4225             q_high = vp9_convert_q_to_qindex(q_val_high, cm->bit_depth);
   4226             q_high = clamp(q_high, rc->best_quality, rc->worst_quality);
   4227           }
   4228 
   4229           // Raise Qlow as to at least the current value
   4230           qstep =
   4231               get_qstep_adj(rc->projected_frame_size, rc->this_frame_target);
   4232           q_low = VPXMIN(q + qstep, q_high);
   4233 
   4234           if (undershoot_seen || loop_at_this_size > 1) {
   4235             // Update rate_correction_factor unless
   4236             vp9_rc_update_rate_correction_factors(cpi);
   4237 
   4238             q = (q_high + q_low + 1) / 2;
   4239           } else {
   4240             // Update rate_correction_factor unless
   4241             vp9_rc_update_rate_correction_factors(cpi);
   4242 
   4243             q = vp9_rc_regulate_q(cpi, rc->this_frame_target, bottom_index,
   4244                                   VPXMAX(q_high, top_index));
   4245 
   4246             while (q < q_low && retries < 10) {
   4247               vp9_rc_update_rate_correction_factors(cpi);
   4248               q = vp9_rc_regulate_q(cpi, rc->this_frame_target, bottom_index,
   4249                                     VPXMAX(q_high, top_index));
   4250               retries++;
   4251             }
   4252           }
   4253 
   4254           overshoot_seen = 1;
   4255         } else {
   4256           // Frame is too small
   4257           qstep =
   4258               get_qstep_adj(rc->this_frame_target, rc->projected_frame_size);
   4259           q_high = VPXMAX(q - qstep, q_low);
   4260 
   4261           if (overshoot_seen || loop_at_this_size > 1) {
   4262             vp9_rc_update_rate_correction_factors(cpi);
   4263             q = (q_high + q_low) / 2;
   4264           } else {
   4265             vp9_rc_update_rate_correction_factors(cpi);
   4266             q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
   4267                                   VPXMIN(q_low, bottom_index), top_index);
   4268             // Special case reset for qlow for constrained quality.
   4269             // This should only trigger where there is very substantial
   4270             // undershoot on a frame and the auto cq level is above
   4271             // the user passsed in value.
   4272             if (oxcf->rc_mode == VPX_CQ && q < q_low) {
   4273               q_low = q;
   4274             }
   4275 
   4276             while (q > q_high && retries < 10) {
   4277               vp9_rc_update_rate_correction_factors(cpi);
   4278               q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
   4279                                     VPXMIN(q_low, bottom_index), top_index);
   4280               retries++;
   4281             }
   4282           }
   4283           undershoot_seen = 1;
   4284         }
   4285 
   4286         // Clamp Q to upper and lower limits:
   4287         q = clamp(q, q_low, q_high);
   4288 
   4289         loop = (q != last_q);
   4290       } else {
   4291         loop = 0;
   4292       }
   4293     }
   4294 
   4295     // Special case for overlay frame.
   4296     if (rc->is_src_frame_alt_ref &&
   4297         rc->projected_frame_size < rc->max_frame_bandwidth)
   4298       loop = 0;
   4299 
   4300     if (loop) {
   4301       ++loop_count;
   4302       ++loop_at_this_size;
   4303 
   4304 #if CONFIG_INTERNAL_STATS
   4305       ++cpi->tot_recode_hits;
   4306 #endif
   4307     }
   4308 
   4309     if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF)
   4310       if (loop || !enable_acl) restore_coding_context(cpi);
   4311   } while (loop);
   4312 
   4313 #ifdef AGGRESSIVE_VBR
   4314   if (two_pass_first_group_inter(cpi)) {
   4315     cpi->twopass.active_worst_quality =
   4316         VPXMIN(q + qrange_adj, oxcf->worst_allowed_q);
   4317   } else if (!frame_is_kf_gf_arf(cpi)) {
   4318 #else
   4319   if (!frame_is_kf_gf_arf(cpi)) {
   4320 #endif
   4321     // Have we been forced to adapt Q outside the expected range by an extreme
   4322     // rate miss. If so adjust the active maxQ for the subsequent frames.
   4323     if (!rc->is_src_frame_alt_ref && (q > cpi->twopass.active_worst_quality)) {
   4324       cpi->twopass.active_worst_quality = q;
   4325     } else if (oxcf->vbr_corpus_complexity && q == q_low &&
   4326                rc->projected_frame_size < rc->this_frame_target) {
   4327       cpi->twopass.active_worst_quality =
   4328           VPXMAX(q, cpi->twopass.active_worst_quality - 1);
   4329     }
   4330   }
   4331 
   4332   if (enable_acl) {
   4333     // Skip recoding, if model diff is below threshold
   4334     const int thresh = compute_context_model_thresh(cpi);
   4335     const int diff = compute_context_model_diff(cm);
   4336     if (diff < thresh) {
   4337       vpx_clear_system_state();
   4338       restore_coding_context(cpi);
   4339       return;
   4340     }
   4341 
   4342     vp9_encode_frame(cpi);
   4343     vpx_clear_system_state();
   4344     restore_coding_context(cpi);
   4345   }
   4346 }
   4347 
   4348 static int get_ref_frame_flags(const VP9_COMP *cpi) {
   4349   const int *const map = cpi->common.ref_frame_map;
   4350   const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
   4351   const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
   4352   const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
   4353   int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
   4354 
   4355   if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
   4356 
   4357   if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
   4358       (cpi->svc.number_temporal_layers == 1 &&
   4359        cpi->svc.number_spatial_layers == 1))
   4360     flags &= ~VP9_GOLD_FLAG;
   4361 
   4362   if (alt_is_last) flags &= ~VP9_ALT_FLAG;
   4363 
   4364   if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
   4365 
   4366   return flags;
   4367 }
   4368 
   4369 static void set_ext_overrides(VP9_COMP *cpi) {
   4370   // Overrides the defaults with the externally supplied values with
   4371   // vp9_update_reference() and vp9_update_entropy() calls
   4372   // Note: The overrides are valid only for the next frame passed
   4373   // to encode_frame_to_data_rate() function
   4374   if (cpi->ext_refresh_frame_context_pending) {
   4375     cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context;
   4376     cpi->ext_refresh_frame_context_pending = 0;
   4377   }
   4378   if (cpi->ext_refresh_frame_flags_pending) {
   4379     cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
   4380     cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
   4381     cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
   4382   }
   4383 }
   4384 
   4385 YV12_BUFFER_CONFIG *vp9_svc_twostage_scale(
   4386     VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
   4387     YV12_BUFFER_CONFIG *scaled_temp, INTERP_FILTER filter_type,
   4388     int phase_scaler, INTERP_FILTER filter_type2, int phase_scaler2) {
   4389   if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
   4390       cm->mi_rows * MI_SIZE != unscaled->y_height) {
   4391 #if CONFIG_VP9_HIGHBITDEPTH
   4392     if (cm->bit_depth == VPX_BITS_8) {
   4393       vp9_scale_and_extend_frame(unscaled, scaled_temp, filter_type2,
   4394                                  phase_scaler2);
   4395       vp9_scale_and_extend_frame(scaled_temp, scaled, filter_type,
   4396                                  phase_scaler);
   4397     } else {
   4398       scale_and_extend_frame(unscaled, scaled_temp, (int)cm->bit_depth,
   4399                              filter_type2, phase_scaler2);
   4400       scale_and_extend_frame(scaled_temp, scaled, (int)cm->bit_depth,
   4401                              filter_type, phase_scaler);
   4402     }
   4403 #else
   4404     vp9_scale_and_extend_frame(unscaled, scaled_temp, filter_type2,
   4405                                phase_scaler2);
   4406     vp9_scale_and_extend_frame(scaled_temp, scaled, filter_type, phase_scaler);
   4407 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4408     return scaled;
   4409   } else {
   4410     return unscaled;
   4411   }
   4412 }
   4413 
   4414 YV12_BUFFER_CONFIG *vp9_scale_if_required(
   4415     VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
   4416     int use_normative_scaler, INTERP_FILTER filter_type, int phase_scaler) {
   4417   if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
   4418       cm->mi_rows * MI_SIZE != unscaled->y_height) {
   4419 #if CONFIG_VP9_HIGHBITDEPTH
   4420     if (use_normative_scaler && unscaled->y_width <= (scaled->y_width << 1) &&
   4421         unscaled->y_height <= (scaled->y_height << 1))
   4422       if (cm->bit_depth == VPX_BITS_8)
   4423         vp9_scale_and_extend_frame(unscaled, scaled, filter_type, phase_scaler);
   4424       else
   4425         scale_and_extend_frame(unscaled, scaled, (int)cm->bit_depth,
   4426                                filter_type, phase_scaler);
   4427     else
   4428       scale_and_extend_frame_nonnormative(unscaled, scaled, (int)cm->bit_depth);
   4429 #else
   4430     if (use_normative_scaler && unscaled->y_width <= (scaled->y_width << 1) &&
   4431         unscaled->y_height <= (scaled->y_height << 1))
   4432       vp9_scale_and_extend_frame(unscaled, scaled, filter_type, phase_scaler);
   4433     else
   4434       scale_and_extend_frame_nonnormative(unscaled, scaled);
   4435 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4436     return scaled;
   4437   } else {
   4438     return unscaled;
   4439   }
   4440 }
   4441 
   4442 static void set_ref_sign_bias(VP9_COMP *cpi) {
   4443   VP9_COMMON *const cm = &cpi->common;
   4444   RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
   4445   const int cur_frame_index = ref_buffer->frame_index;
   4446   MV_REFERENCE_FRAME ref_frame;
   4447 
   4448   for (ref_frame = LAST_FRAME; ref_frame < MAX_REF_FRAMES; ++ref_frame) {
   4449     const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
   4450     const RefCntBuffer *const ref_cnt_buf =
   4451         get_ref_cnt_buffer(&cpi->common, buf_idx);
   4452     if (ref_cnt_buf) {
   4453       cm->ref_frame_sign_bias[ref_frame] =
   4454           cur_frame_index < ref_cnt_buf->frame_index;
   4455     }
   4456   }
   4457 }
   4458 
   4459 static int setup_interp_filter_search_mask(VP9_COMP *cpi) {
   4460   INTERP_FILTER ifilter;
   4461   int ref_total[MAX_REF_FRAMES] = { 0 };
   4462   MV_REFERENCE_FRAME ref;
   4463   int mask = 0;
   4464   if (cpi->common.last_frame_type == KEY_FRAME || cpi->refresh_alt_ref_frame)
   4465     return mask;
   4466   for (ref = LAST_FRAME; ref <= ALTREF_FRAME; ++ref)
   4467     for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter)
   4468       ref_total[ref] += cpi->interp_filter_selected[ref][ifilter];
   4469 
   4470   for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter) {
   4471     if ((ref_total[LAST_FRAME] &&
   4472          cpi->interp_filter_selected[LAST_FRAME][ifilter] == 0) &&
   4473         (ref_total[GOLDEN_FRAME] == 0 ||
   4474          cpi->interp_filter_selected[GOLDEN_FRAME][ifilter] * 50 <
   4475              ref_total[GOLDEN_FRAME]) &&
   4476         (ref_total[ALTREF_FRAME] == 0 ||
   4477          cpi->interp_filter_selected[ALTREF_FRAME][ifilter] * 50 <
   4478              ref_total[ALTREF_FRAME]))
   4479       mask |= 1 << ifilter;
   4480   }
   4481   return mask;
   4482 }
   4483 
   4484 #ifdef ENABLE_KF_DENOISE
   4485 // Baseline Kernal weights for denoise
   4486 static uint8_t dn_kernal_3[9] = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
   4487 static uint8_t dn_kernal_5[25] = { 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 4,
   4488                                    2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 };
   4489 
   4490 static INLINE void add_denoise_point(int centre_val, int data_val, int thresh,
   4491                                      uint8_t point_weight, int *sum_val,
   4492                                      int *sum_weight) {
   4493   if (abs(centre_val - data_val) <= thresh) {
   4494     *sum_weight += point_weight;
   4495     *sum_val += (int)data_val * (int)point_weight;
   4496   }
   4497 }
   4498 
   4499 static void spatial_denoise_point(uint8_t *src_ptr, const int stride,
   4500                                   const int strength) {
   4501   int sum_weight = 0;
   4502   int sum_val = 0;
   4503   int thresh = strength;
   4504   int kernal_size = 5;
   4505   int half_k_size = 2;
   4506   int i, j;
   4507   int max_diff = 0;
   4508   uint8_t *tmp_ptr;
   4509   uint8_t *kernal_ptr;
   4510 
   4511   // Find the maximum deviation from the source point in the locale.
   4512   tmp_ptr = src_ptr - (stride * (half_k_size + 1)) - (half_k_size + 1);
   4513   for (i = 0; i < kernal_size + 2; ++i) {
   4514     for (j = 0; j < kernal_size + 2; ++j) {
   4515       max_diff = VPXMAX(max_diff, abs((int)*src_ptr - (int)tmp_ptr[j]));
   4516     }
   4517     tmp_ptr += stride;
   4518   }
   4519 
   4520   // Select the kernal size.
   4521   if (max_diff > (strength + (strength >> 1))) {
   4522     kernal_size = 3;
   4523     half_k_size = 1;
   4524     thresh = thresh >> 1;
   4525   }
   4526   kernal_ptr = (kernal_size == 3) ? dn_kernal_3 : dn_kernal_5;
   4527 
   4528   // Apply the kernal
   4529   tmp_ptr = src_ptr - (stride * half_k_size) - half_k_size;
   4530   for (i = 0; i < kernal_size; ++i) {
   4531     for (j = 0; j < kernal_size; ++j) {
   4532       add_denoise_point((int)*src_ptr, (int)tmp_ptr[j], thresh, *kernal_ptr,
   4533                         &sum_val, &sum_weight);
   4534       ++kernal_ptr;
   4535     }
   4536     tmp_ptr += stride;
   4537   }
   4538 
   4539   // Update the source value with the new filtered value
   4540   *src_ptr = (uint8_t)((sum_val + (sum_weight >> 1)) / sum_weight);
   4541 }
   4542 
   4543 #if CONFIG_VP9_HIGHBITDEPTH
   4544 static void highbd_spatial_denoise_point(uint16_t *src_ptr, const int stride,
   4545                                          const int strength) {
   4546   int sum_weight = 0;
   4547   int sum_val = 0;
   4548   int thresh = strength;
   4549   int kernal_size = 5;
   4550   int half_k_size = 2;
   4551   int i, j;
   4552   int max_diff = 0;
   4553   uint16_t *tmp_ptr;
   4554   uint8_t *kernal_ptr;
   4555 
   4556   // Find the maximum deviation from the source point in the locale.
   4557   tmp_ptr = src_ptr - (stride * (half_k_size + 1)) - (half_k_size + 1);
   4558   for (i = 0; i < kernal_size + 2; ++i) {
   4559     for (j = 0; j < kernal_size + 2; ++j) {
   4560       max_diff = VPXMAX(max_diff, abs((int)src_ptr - (int)tmp_ptr[j]));
   4561     }
   4562     tmp_ptr += stride;
   4563   }
   4564 
   4565   // Select the kernal size.
   4566   if (max_diff > (strength + (strength >> 1))) {
   4567     kernal_size = 3;
   4568     half_k_size = 1;
   4569     thresh = thresh >> 1;
   4570   }
   4571   kernal_ptr = (kernal_size == 3) ? dn_kernal_3 : dn_kernal_5;
   4572 
   4573   // Apply the kernal
   4574   tmp_ptr = src_ptr - (stride * half_k_size) - half_k_size;
   4575   for (i = 0; i < kernal_size; ++i) {
   4576     for (j = 0; j < kernal_size; ++j) {
   4577       add_denoise_point((int)*src_ptr, (int)tmp_ptr[j], thresh, *kernal_ptr,
   4578                         &sum_val, &sum_weight);
   4579       ++kernal_ptr;
   4580     }
   4581     tmp_ptr += stride;
   4582   }
   4583 
   4584   // Update the source value with the new filtered value
   4585   *src_ptr = (uint16_t)((sum_val + (sum_weight >> 1)) / sum_weight);
   4586 }
   4587 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4588 
   4589 // Apply thresholded spatial noise supression to a given buffer.
   4590 static void spatial_denoise_buffer(VP9_COMP *cpi, uint8_t *buffer,
   4591                                    const int stride, const int width,
   4592                                    const int height, const int strength) {
   4593   VP9_COMMON *const cm = &cpi->common;
   4594   uint8_t *src_ptr = buffer;
   4595   int row;
   4596   int col;
   4597 
   4598   for (row = 0; row < height; ++row) {
   4599     for (col = 0; col < width; ++col) {
   4600 #if CONFIG_VP9_HIGHBITDEPTH
   4601       if (cm->use_highbitdepth)
   4602         highbd_spatial_denoise_point(CONVERT_TO_SHORTPTR(&src_ptr[col]), stride,
   4603                                      strength);
   4604       else
   4605         spatial_denoise_point(&src_ptr[col], stride, strength);
   4606 #else
   4607       spatial_denoise_point(&src_ptr[col], stride, strength);
   4608 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4609     }
   4610     src_ptr += stride;
   4611   }
   4612 }
   4613 
   4614 // Apply thresholded spatial noise supression to source.
   4615 static void spatial_denoise_frame(VP9_COMP *cpi) {
   4616   YV12_BUFFER_CONFIG *src = cpi->Source;
   4617   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
   4618   TWO_PASS *const twopass = &cpi->twopass;
   4619   VP9_COMMON *const cm = &cpi->common;
   4620 
   4621   // Base the filter strength on the current active max Q.
   4622   const int q = (int)(vp9_convert_qindex_to_q(twopass->active_worst_quality,
   4623                                               cm->bit_depth));
   4624   int strength =
   4625       VPXMAX(oxcf->arnr_strength >> 2, VPXMIN(oxcf->arnr_strength, (q >> 4)));
   4626 
   4627   // Denoise each of Y,U and V buffers.
   4628   spatial_denoise_buffer(cpi, src->y_buffer, src->y_stride, src->y_width,
   4629                          src->y_height, strength);
   4630 
   4631   strength += (strength >> 1);
   4632   spatial_denoise_buffer(cpi, src->u_buffer, src->uv_stride, src->uv_width,
   4633                          src->uv_height, strength << 1);
   4634 
   4635   spatial_denoise_buffer(cpi, src->v_buffer, src->uv_stride, src->uv_width,
   4636                          src->uv_height, strength << 1);
   4637 }
   4638 #endif  // ENABLE_KF_DENOISE
   4639 
   4640 static void vp9_try_disable_lookahead_aq(VP9_COMP *cpi, size_t *size,
   4641                                          uint8_t *dest) {
   4642   if (cpi->common.seg.enabled)
   4643     if (ALT_REF_AQ_PROTECT_GAIN) {
   4644       size_t nsize = *size;
   4645       int overhead;
   4646 
   4647       // TODO(yuryg): optimize this, as
   4648       // we don't really need to repack
   4649 
   4650       save_coding_context(cpi);
   4651       vp9_disable_segmentation(&cpi->common.seg);
   4652       vp9_pack_bitstream(cpi, dest, &nsize);
   4653       restore_coding_context(cpi);
   4654 
   4655       overhead = (int)*size - (int)nsize;
   4656 
   4657       if (vp9_alt_ref_aq_disable_if(cpi->alt_ref_aq, overhead, (int)*size))
   4658         vp9_encode_frame(cpi);
   4659       else
   4660         vp9_enable_segmentation(&cpi->common.seg);
   4661     }
   4662 }
   4663 
   4664 static void set_frame_index(VP9_COMP *cpi, VP9_COMMON *cm) {
   4665   RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
   4666 
   4667   if (ref_buffer) {
   4668     const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   4669     ref_buffer->frame_index =
   4670         cm->current_video_frame + gf_group->arf_src_offset[gf_group->index];
   4671   }
   4672 }
   4673 
   4674 static void encode_frame_to_data_rate(VP9_COMP *cpi, size_t *size,
   4675                                       uint8_t *dest,
   4676                                       unsigned int *frame_flags) {
   4677   VP9_COMMON *const cm = &cpi->common;
   4678   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
   4679   struct segmentation *const seg = &cm->seg;
   4680   TX_SIZE t;
   4681 
   4682   // SVC: skip encoding of enhancement layer if the layer target bandwidth = 0.
   4683   // If in constrained layer drop mode (svc.framedrop_mode != LAYER_DROP) and
   4684   // base spatial layer was dropped, no need to set svc.skip_enhancement_layer,
   4685   // as whole superframe will be dropped.
   4686   if (cpi->use_svc && cpi->svc.spatial_layer_id > 0 &&
   4687       cpi->oxcf.target_bandwidth == 0 &&
   4688       !(cpi->svc.framedrop_mode != LAYER_DROP &&
   4689         cpi->svc.drop_spatial_layer[0])) {
   4690     cpi->svc.skip_enhancement_layer = 1;
   4691     vp9_rc_postencode_update_drop_frame(cpi);
   4692     cpi->ext_refresh_frame_flags_pending = 0;
   4693     cpi->last_frame_dropped = 1;
   4694     cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = 1;
   4695     cpi->svc.drop_spatial_layer[cpi->svc.spatial_layer_id] = 1;
   4696     if (cpi->svc.framedrop_mode == LAYER_DROP ||
   4697         cpi->svc.drop_spatial_layer[0] == 0) {
   4698       // For the case of constrained drop mode where the base is dropped
   4699       // (drop_spatial_layer[0] == 1), which means full superframe dropped,
   4700       // we don't increment the svc frame counters. In particular temporal
   4701       // layer counter (which is incremented in vp9_inc_frame_in_layer())
   4702       // won't be incremented, so on a dropped frame we try the same
   4703       // temporal_layer_id on next incoming frame. This is to avoid an
   4704       // issue with temporal alignement with full superframe dropping.
   4705       vp9_inc_frame_in_layer(cpi);
   4706     }
   4707     return;
   4708   }
   4709 
   4710   set_ext_overrides(cpi);
   4711   vpx_clear_system_state();
   4712 
   4713 #ifdef ENABLE_KF_DENOISE
   4714   // Spatial denoise of key frame.
   4715   if (is_spatial_denoise_enabled(cpi)) spatial_denoise_frame(cpi);
   4716 #endif
   4717 
   4718   if (cm->show_existing_frame == 0) {
   4719     // Update frame index
   4720     set_frame_index(cpi, cm);
   4721 
   4722     // Set the arf sign bias for this frame.
   4723     set_ref_sign_bias(cpi);
   4724   }
   4725 
   4726   // Set default state for segment based loop filter update flags.
   4727   cm->lf.mode_ref_delta_update = 0;
   4728 
   4729   if (cpi->oxcf.pass == 2 && cpi->sf.adaptive_interp_filter_search)
   4730     cpi->sf.interp_filter_search_mask = setup_interp_filter_search_mask(cpi);
   4731 
   4732   // Set various flags etc to special state if it is a key frame.
   4733   if (frame_is_intra_only(cm)) {
   4734     // Reset the loop filter deltas and segmentation map.
   4735     vp9_reset_segment_features(&cm->seg);
   4736 
   4737     // If segmentation is enabled force a map update for key frames.
   4738     if (seg->enabled) {
   4739       seg->update_map = 1;
   4740       seg->update_data = 1;
   4741     }
   4742 
   4743     // The alternate reference frame cannot be active for a key frame.
   4744     cpi->rc.source_alt_ref_active = 0;
   4745 
   4746     cm->error_resilient_mode = oxcf->error_resilient_mode;
   4747     cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode;
   4748 
   4749     // By default, encoder assumes decoder can use prev_mi.
   4750     if (cm->error_resilient_mode) {
   4751       cm->frame_parallel_decoding_mode = 1;
   4752       cm->reset_frame_context = 0;
   4753       cm->refresh_frame_context = 0;
   4754     } else if (cm->intra_only) {
   4755       // Only reset the current context.
   4756       cm->reset_frame_context = 2;
   4757     }
   4758   }
   4759 
   4760   vpx_clear_system_state();
   4761 
   4762 #if CONFIG_INTERNAL_STATS
   4763   memset(cpi->mode_chosen_counts, 0,
   4764          MAX_MODES * sizeof(*cpi->mode_chosen_counts));
   4765 #endif
   4766 #if CONFIG_CONSISTENT_RECODE
   4767   // Backup to ensure consistency between recodes
   4768   save_encode_params(cpi);
   4769 #endif
   4770 
   4771   if (cpi->sf.recode_loop == DISALLOW_RECODE) {
   4772     if (!encode_without_recode_loop(cpi, size, dest)) return;
   4773   } else {
   4774     encode_with_recode_loop(cpi, size, dest);
   4775   }
   4776 
   4777   // TODO(jingning): When using show existing frame mode, we assume that the
   4778   // current ARF will be directly used as the final reconstructed frame. This is
   4779   // an encoder control scheme. One could in principle explore other
   4780   // possibilities to arrange the reference frame buffer and their coding order.
   4781   if (cm->show_existing_frame) {
   4782     ref_cnt_fb(cm->buffer_pool->frame_bufs, &cm->new_fb_idx,
   4783                cm->ref_frame_map[cpi->alt_fb_idx]);
   4784   }
   4785 
   4786   // Disable segmentation if it decrease rate/distortion ratio
   4787   if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
   4788     vp9_try_disable_lookahead_aq(cpi, size, dest);
   4789 
   4790 #if CONFIG_VP9_TEMPORAL_DENOISING
   4791 #ifdef OUTPUT_YUV_DENOISED
   4792   if (oxcf->noise_sensitivity > 0 && denoise_svc(cpi)) {
   4793     vpx_write_yuv_frame(yuv_denoised_file,
   4794                         &cpi->denoiser.running_avg_y[INTRA_FRAME]);
   4795   }
   4796 #endif
   4797 #endif
   4798 #ifdef OUTPUT_YUV_SKINMAP
   4799   if (cpi->common.current_video_frame > 1) {
   4800     vp9_output_skin_map(cpi, yuv_skinmap_file);
   4801   }
   4802 #endif
   4803 
   4804   // Special case code to reduce pulsing when key frames are forced at a
   4805   // fixed interval. Note the reconstruction error if it is the frame before
   4806   // the force key frame
   4807   if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
   4808 #if CONFIG_VP9_HIGHBITDEPTH
   4809     if (cm->use_highbitdepth) {
   4810       cpi->ambient_err =
   4811           vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4812     } else {
   4813       cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4814     }
   4815 #else
   4816     cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
   4817 #endif  // CONFIG_VP9_HIGHBITDEPTH
   4818   }
   4819 
   4820   // If the encoder forced a KEY_FRAME decision
   4821   if (cm->frame_type == KEY_FRAME) cpi->refresh_last_frame = 1;
   4822 
   4823   cm->frame_to_show = get_frame_new_buffer(cm);
   4824   cm->frame_to_show->color_space = cm->color_space;
   4825   cm->frame_to_show->color_range = cm->color_range;
   4826   cm->frame_to_show->render_width = cm->render_width;
   4827   cm->frame_to_show->render_height = cm->render_height;
   4828 
   4829   // Pick the loop filter level for the frame.
   4830   loopfilter_frame(cpi, cm);
   4831 
   4832   if (cpi->rc.use_post_encode_drop) save_coding_context(cpi);
   4833 
   4834   // build the bitstream
   4835   vp9_pack_bitstream(cpi, dest, size);
   4836 
   4837   if (cpi->rc.use_post_encode_drop && cm->base_qindex < cpi->rc.worst_quality &&
   4838       cpi->svc.spatial_layer_id == 0 && post_encode_drop_cbr(cpi, size)) {
   4839     restore_coding_context(cpi);
   4840     return;
   4841   }
   4842 
   4843   cpi->last_frame_dropped = 0;
   4844   cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = 0;
   4845   if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
   4846     cpi->svc.num_encoded_top_layer++;
   4847 
   4848   // Keep track of the frame buffer index updated/refreshed for the
   4849   // current encoded TL0 superframe.
   4850   if (cpi->svc.temporal_layer_id == 0) {
   4851     if (cpi->refresh_last_frame)
   4852       cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->lst_fb_idx;
   4853     else if (cpi->refresh_golden_frame)
   4854       cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->gld_fb_idx;
   4855     else if (cpi->refresh_alt_ref_frame)
   4856       cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->alt_fb_idx;
   4857   }
   4858 
   4859   if (cm->seg.update_map) update_reference_segmentation_map(cpi);
   4860 
   4861   if (frame_is_intra_only(cm) == 0) {
   4862     release_scaled_references(cpi);
   4863   }
   4864   vp9_update_reference_frames(cpi);
   4865 
   4866   if (!cm->show_existing_frame) {
   4867     for (t = TX_4X4; t <= TX_32X32; ++t) {
   4868       full_to_model_counts(cpi->td.counts->coef[t],
   4869                            cpi->td.rd_counts.coef_counts[t]);
   4870     }
   4871 
   4872     if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
   4873       if (!frame_is_intra_only(cm)) {
   4874         vp9_adapt_mode_probs(cm);
   4875         vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
   4876       }
   4877       vp9_adapt_coef_probs(cm);
   4878     }
   4879   }
   4880 
   4881   cpi->ext_refresh_frame_flags_pending = 0;
   4882 
   4883   if (cpi->refresh_golden_frame == 1)
   4884     cpi->frame_flags |= FRAMEFLAGS_GOLDEN;
   4885   else
   4886     cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN;
   4887 
   4888   if (cpi->refresh_alt_ref_frame == 1)
   4889     cpi->frame_flags |= FRAMEFLAGS_ALTREF;
   4890   else
   4891     cpi->frame_flags &= ~FRAMEFLAGS_ALTREF;
   4892 
   4893   cpi->ref_frame_flags = get_ref_frame_flags(cpi);
   4894 
   4895   cm->last_frame_type = cm->frame_type;
   4896 
   4897   vp9_rc_postencode_update(cpi, *size);
   4898 
   4899   *size = VPXMAX(1, *size);
   4900 
   4901 #if 0
   4902   output_frame_level_debug_stats(cpi);
   4903 #endif
   4904 
   4905   if (cm->frame_type == KEY_FRAME) {
   4906     // Tell the caller that the frame was coded as a key frame
   4907     *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY;
   4908   } else {
   4909     *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY;
   4910   }
   4911 
   4912   // Clear the one shot update flags for segmentation map and mode/ref loop
   4913   // filter deltas.
   4914   cm->seg.update_map = 0;
   4915   cm->seg.update_data = 0;
   4916   cm->lf.mode_ref_delta_update = 0;
   4917 
   4918   // keep track of the last coded dimensions
   4919   cm->last_width = cm->width;
   4920   cm->last_height = cm->height;
   4921 
   4922   // reset to normal state now that we are done.
   4923   if (!cm->show_existing_frame) {
   4924     cm->last_show_frame = cm->show_frame;
   4925     cm->prev_frame = cm->cur_frame;
   4926   }
   4927 
   4928   if (cm->show_frame) {
   4929     vp9_swap_mi_and_prev_mi(cm);
   4930     // Don't increment frame counters if this was an altref buffer
   4931     // update not a real frame
   4932     ++cm->current_video_frame;
   4933     if (cpi->use_svc) vp9_inc_frame_in_layer(cpi);
   4934   }
   4935 
   4936   if (cpi->use_svc) {
   4937     cpi->svc
   4938         .layer_context[cpi->svc.spatial_layer_id *
   4939                            cpi->svc.number_temporal_layers +
   4940                        cpi->svc.temporal_layer_id]
   4941         .last_frame_type = cm->frame_type;
   4942     // Reset layer_sync back to 0 for next frame.
   4943     cpi->svc.spatial_layer_sync[cpi->svc.spatial_layer_id] = 0;
   4944   }
   4945 
   4946   cpi->force_update_segmentation = 0;
   4947 
   4948   if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
   4949     vp9_alt_ref_aq_unset_all(cpi->alt_ref_aq, cpi);
   4950 
   4951   cpi->svc.previous_frame_is_intra_only = cm->intra_only;
   4952   cpi->svc.set_intra_only_frame = 0;
   4953 }
   4954 
   4955 static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
   4956                       unsigned int *frame_flags) {
   4957   vp9_rc_get_svc_params(cpi);
   4958   encode_frame_to_data_rate(cpi, size, dest, frame_flags);
   4959 }
   4960 
   4961 static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
   4962                         unsigned int *frame_flags) {
   4963   if (cpi->oxcf.rc_mode == VPX_CBR) {
   4964     vp9_rc_get_one_pass_cbr_params(cpi);
   4965   } else {
   4966     vp9_rc_get_one_pass_vbr_params(cpi);
   4967   }
   4968   encode_frame_to_data_rate(cpi, size, dest, frame_flags);
   4969 }
   4970 
   4971 #if !CONFIG_REALTIME_ONLY
   4972 static void Pass2Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
   4973                         unsigned int *frame_flags) {
   4974   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
   4975   encode_frame_to_data_rate(cpi, size, dest, frame_flags);
   4976 
   4977   vp9_twopass_postencode_update(cpi);
   4978 }
   4979 #endif  // !CONFIG_REALTIME_ONLY
   4980 
   4981 static void init_ref_frame_bufs(VP9_COMMON *cm) {
   4982   int i;
   4983   BufferPool *const pool = cm->buffer_pool;
   4984   cm->new_fb_idx = INVALID_IDX;
   4985   for (i = 0; i < REF_FRAMES; ++i) {
   4986     cm->ref_frame_map[i] = INVALID_IDX;
   4987   }
   4988   for (i = 0; i < FRAME_BUFFERS; ++i) {
   4989     pool->frame_bufs[i].ref_count = 0;
   4990   }
   4991 }
   4992 
   4993 static void check_initial_width(VP9_COMP *cpi,
   4994 #if CONFIG_VP9_HIGHBITDEPTH
   4995                                 int use_highbitdepth,
   4996 #endif
   4997                                 int subsampling_x, int subsampling_y) {
   4998   VP9_COMMON *const cm = &cpi->common;
   4999 
   5000   if (!cpi->initial_width ||
   5001 #if CONFIG_VP9_HIGHBITDEPTH
   5002       cm->use_highbitdepth != use_highbitdepth ||
   5003 #endif
   5004       cm->subsampling_x != subsampling_x ||
   5005       cm->subsampling_y != subsampling_y) {
   5006     cm->subsampling_x = subsampling_x;
   5007     cm->subsampling_y = subsampling_y;
   5008 #if CONFIG_VP9_HIGHBITDEPTH
   5009     cm->use_highbitdepth = use_highbitdepth;
   5010 #endif
   5011 
   5012     alloc_raw_frame_buffers(cpi);
   5013     init_ref_frame_bufs(cm);
   5014     alloc_util_frame_buffers(cpi);
   5015 
   5016     init_motion_estimation(cpi);  // TODO(agrange) This can be removed.
   5017 
   5018     cpi->initial_width = cm->width;
   5019     cpi->initial_height = cm->height;
   5020     cpi->initial_mbs = cm->MBs;
   5021   }
   5022 }
   5023 
   5024 int vp9_receive_raw_frame(VP9_COMP *cpi, vpx_enc_frame_flags_t frame_flags,
   5025                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
   5026                           int64_t end_time) {
   5027   VP9_COMMON *const cm = &cpi->common;
   5028   struct vpx_usec_timer timer;
   5029   int res = 0;
   5030   const int subsampling_x = sd->subsampling_x;
   5031   const int subsampling_y = sd->subsampling_y;
   5032 #if CONFIG_VP9_HIGHBITDEPTH
   5033   const int use_highbitdepth = (sd->flags & YV12_FLAG_HIGHBITDEPTH) != 0;
   5034 #endif
   5035 
   5036 #if CONFIG_VP9_HIGHBITDEPTH
   5037   check_initial_width(cpi, use_highbitdepth, subsampling_x, subsampling_y);
   5038 #else
   5039   check_initial_width(cpi, subsampling_x, subsampling_y);
   5040 #endif  // CONFIG_VP9_HIGHBITDEPTH
   5041 
   5042 #if CONFIG_VP9_HIGHBITDEPTH
   5043   // Disable denoiser for high bitdepth since vp9_denoiser_filter only works for
   5044   // 8 bits.
   5045   if (cm->bit_depth > 8) cpi->oxcf.noise_sensitivity = 0;
   5046 #endif
   5047 
   5048 #if CONFIG_VP9_TEMPORAL_DENOISING
   5049   setup_denoiser_buffer(cpi);
   5050 #endif
   5051   vpx_usec_timer_start(&timer);
   5052 
   5053   if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
   5054 #if CONFIG_VP9_HIGHBITDEPTH
   5055                          use_highbitdepth,
   5056 #endif  // CONFIG_VP9_HIGHBITDEPTH
   5057                          frame_flags))
   5058     res = -1;
   5059   vpx_usec_timer_mark(&timer);
   5060   cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
   5061 
   5062   if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
   5063       (subsampling_x != 1 || subsampling_y != 1)) {
   5064     vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
   5065                        "Non-4:2:0 color format requires profile 1 or 3");
   5066     res = -1;
   5067   }
   5068   if ((cm->profile == PROFILE_1 || cm->profile == PROFILE_3) &&
   5069       (subsampling_x == 1 && subsampling_y == 1)) {
   5070     vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
   5071                        "4:2:0 color format requires profile 0 or 2");
   5072     res = -1;
   5073   }
   5074 
   5075   return res;
   5076 }
   5077 
   5078 static int frame_is_reference(const VP9_COMP *cpi) {
   5079   const VP9_COMMON *cm = &cpi->common;
   5080 
   5081   return cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
   5082          cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame ||
   5083          cm->refresh_frame_context || cm->lf.mode_ref_delta_update ||
   5084          cm->seg.update_map || cm->seg.update_data;
   5085 }
   5086 
   5087 static void adjust_frame_rate(VP9_COMP *cpi,
   5088                               const struct lookahead_entry *source) {
   5089   int64_t this_duration;
   5090   int step = 0;
   5091 
   5092   if (source->ts_start == cpi->first_time_stamp_ever) {
   5093     this_duration = source->ts_end - source->ts_start;
   5094     step = 1;
   5095   } else {
   5096     int64_t last_duration =
   5097         cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
   5098 
   5099     this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
   5100 
   5101     // do a step update if the duration changes by 10%
   5102     if (last_duration)
   5103       step = (int)((this_duration - last_duration) * 10 / last_duration);
   5104   }
   5105 
   5106   if (this_duration) {
   5107     if (step) {
   5108       vp9_new_framerate(cpi, 10000000.0 / this_duration);
   5109     } else {
   5110       // Average this frame's rate into the last second's average
   5111       // frame rate. If we haven't seen 1 second yet, then average
   5112       // over the whole interval seen.
   5113       const double interval = VPXMIN(
   5114           (double)(source->ts_end - cpi->first_time_stamp_ever), 10000000.0);
   5115       double avg_duration = 10000000.0 / cpi->framerate;
   5116       avg_duration *= (interval - avg_duration + this_duration);
   5117       avg_duration /= interval;
   5118 
   5119       vp9_new_framerate(cpi, 10000000.0 / avg_duration);
   5120     }
   5121   }
   5122   cpi->last_time_stamp_seen = source->ts_start;
   5123   cpi->last_end_time_stamp_seen = source->ts_end;
   5124 }
   5125 
   5126 // Returns 0 if this is not an alt ref else the offset of the source frame
   5127 // used as the arf midpoint.
   5128 static int get_arf_src_index(VP9_COMP *cpi) {
   5129   RATE_CONTROL *const rc = &cpi->rc;
   5130   int arf_src_index = 0;
   5131   if (is_altref_enabled(cpi)) {
   5132     if (cpi->oxcf.pass == 2) {
   5133       const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   5134       if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
   5135         arf_src_index = gf_group->arf_src_offset[gf_group->index];
   5136       }
   5137     } else if (rc->source_alt_ref_pending) {
   5138       arf_src_index = rc->frames_till_gf_update_due;
   5139     }
   5140   }
   5141   return arf_src_index;
   5142 }
   5143 
   5144 static void check_src_altref(VP9_COMP *cpi,
   5145                              const struct lookahead_entry *source) {
   5146   RATE_CONTROL *const rc = &cpi->rc;
   5147 
   5148   if (cpi->oxcf.pass == 2) {
   5149     const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
   5150     rc->is_src_frame_alt_ref =
   5151         (gf_group->update_type[gf_group->index] == OVERLAY_UPDATE);
   5152   } else {
   5153     rc->is_src_frame_alt_ref =
   5154         cpi->alt_ref_source && (source == cpi->alt_ref_source);
   5155   }
   5156 
   5157   if (rc->is_src_frame_alt_ref) {
   5158     // Current frame is an ARF overlay frame.
   5159     cpi->alt_ref_source = NULL;
   5160 
   5161     // Don't refresh the last buffer for an ARF overlay frame. It will
   5162     // become the GF so preserve last as an alternative prediction option.
   5163     cpi->refresh_last_frame = 0;
   5164   }
   5165 }
   5166 
   5167 #if CONFIG_INTERNAL_STATS
   5168 static void adjust_image_stat(double y, double u, double v, double all,
   5169                               ImageStat *s) {
   5170   s->stat[Y] += y;
   5171   s->stat[U] += u;
   5172   s->stat[V] += v;
   5173   s->stat[ALL] += all;
   5174   s->worst = VPXMIN(s->worst, all);
   5175 }
   5176 #endif  // CONFIG_INTERNAL_STATS
   5177 
   5178 // Adjust the maximum allowable frame size for the target level.
   5179 static void level_rc_framerate(VP9_COMP *cpi, int arf_src_index) {
   5180   RATE_CONTROL *const rc = &cpi->rc;
   5181   LevelConstraint *const ls = &cpi->level_constraint;
   5182   VP9_COMMON *const cm = &cpi->common;
   5183   const double max_cpb_size = ls->max_cpb_size;
   5184   vpx_clear_system_state();
   5185   rc->max_frame_bandwidth = VPXMIN(rc->max_frame_bandwidth, ls->max_frame_size);
   5186   if (frame_is_intra_only(cm)) {
   5187     rc->max_frame_bandwidth =
   5188         VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.5));
   5189   } else if (arf_src_index > 0) {
   5190     rc->max_frame_bandwidth =
   5191         VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.4));
   5192   } else {
   5193     rc->max_frame_bandwidth =
   5194         VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.2));
   5195   }
   5196 }
   5197 
   5198 static void update_level_info(VP9_COMP *cpi, size_t *size, int arf_src_index) {
   5199   VP9_COMMON *const cm = &cpi->common;
   5200   Vp9LevelInfo *const level_info = &cpi->level_info;
   5201   Vp9LevelSpec *const level_spec = &level_info->level_spec;
   5202   Vp9LevelStats *const level_stats = &level_info->level_stats;
   5203   int i, idx;
   5204   uint64_t luma_samples, dur_end;
   5205   const uint32_t luma_pic_size = cm->width * cm->height;
   5206   const uint32_t luma_pic_breadth = VPXMAX(cm->width, cm->height);
   5207   LevelConstraint *const level_constraint = &cpi->level_constraint;
   5208   const int8_t level_index = level_constraint->level_index;
   5209   double cpb_data_size;
   5210 
   5211   vpx_clear_system_state();
   5212 
   5213   // update level_stats
   5214   level_stats->total_compressed_size += *size;
   5215   if (cm->show_frame) {
   5216     level_stats->total_uncompressed_size +=
   5217         luma_pic_size +
   5218         2 * (luma_pic_size >> (cm->subsampling_x + cm->subsampling_y));
   5219     level_stats->time_encoded =
   5220         (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
   5221         (double)TICKS_PER_SEC;
   5222   }
   5223 
   5224   if (arf_src_index > 0) {
   5225     if (!level_stats->seen_first_altref) {
   5226       level_stats->seen_first_altref = 1;
   5227     } else if (level_stats->frames_since_last_altref <
   5228                level_spec->min_altref_distance) {
   5229       level_spec->min_altref_distance = level_stats->frames_since_last_altref;
   5230     }
   5231     level_stats->frames_since_last_altref = 0;
   5232   } else {
   5233     ++level_stats->frames_since_last_altref;
   5234   }
   5235 
   5236   if (level_stats->frame_window_buffer.len < FRAME_WINDOW_SIZE - 1) {
   5237     idx = (level_stats->frame_window_buffer.start +
   5238            level_stats->frame_window_buffer.len++) %
   5239           FRAME_WINDOW_SIZE;
   5240   } else {
   5241     idx = level_stats->frame_window_buffer.start;
   5242     level_stats->frame_window_buffer.start = (idx + 1) % FRAME_WINDOW_SIZE;
   5243   }
   5244   level_stats->frame_window_buffer.buf[idx].ts = cpi->last_time_stamp_seen;
   5245   level_stats->frame_window_buffer.buf[idx].size = (uint32_t)(*size);
   5246   level_stats->frame_window_buffer.buf[idx].luma_samples = luma_pic_size;
   5247 
   5248   if (cm->frame_type == KEY_FRAME) {
   5249     level_stats->ref_refresh_map = 0;
   5250   } else {
   5251     int count = 0;
   5252     level_stats->ref_refresh_map |= vp9_get_refresh_mask(cpi);
   5253     // Also need to consider the case where the encoder refers to a buffer
   5254     // that has been implicitly refreshed after encoding a keyframe.
   5255     if (!cm->intra_only) {
   5256       level_stats->ref_refresh_map |= (1 << cpi->lst_fb_idx);
   5257       level_stats->ref_refresh_map |= (1 << cpi->gld_fb_idx);
   5258       level_stats->ref_refresh_map |= (1 << cpi->alt_fb_idx);
   5259     }
   5260     for (i = 0; i < REF_FRAMES; ++i) {
   5261       count += (level_stats->ref_refresh_map >> i) & 1;
   5262     }
   5263     if (count > level_spec->max_ref_frame_buffers) {
   5264       level_spec->max_ref_frame_buffers = count;
   5265     }
   5266   }
   5267 
   5268   // update average_bitrate
   5269   level_spec->average_bitrate = (double)level_stats->total_compressed_size /
   5270                                 125.0 / level_stats->time_encoded;
   5271 
   5272   // update max_luma_sample_rate
   5273   luma_samples = 0;
   5274   for (i = 0; i < level_stats->frame_window_buffer.len; ++i) {
   5275     idx = (level_stats->frame_window_buffer.start +
   5276            level_stats->frame_window_buffer.len - 1 - i) %
   5277           FRAME_WINDOW_SIZE;
   5278     if (i == 0) {
   5279       dur_end = level_stats->frame_window_buffer.buf[idx].ts;
   5280     }
   5281     if (dur_end - level_stats->frame_window_buffer.buf[idx].ts >=
   5282         TICKS_PER_SEC) {
   5283       break;
   5284     }
   5285     luma_samples += level_stats->frame_window_buffer.buf[idx].luma_samples;
   5286   }
   5287   if (luma_samples > level_spec->max_luma_sample_rate) {
   5288     level_spec->max_luma_sample_rate = luma_samples;
   5289   }
   5290 
   5291   // update max_cpb_size
   5292   cpb_data_size = 0;
   5293   for (i = 0; i < CPB_WINDOW_SIZE; ++i) {
   5294     if (i >= level_stats->frame_window_buffer.len) break;
   5295     idx = (level_stats->frame_window_buffer.start +
   5296            level_stats->frame_window_buffer.len - 1 - i) %
   5297           FRAME_WINDOW_SIZE;
   5298     cpb_data_size += level_stats->frame_window_buffer.buf[idx].size;
   5299   }
   5300   cpb_data_size = cpb_data_size / 125.0;
   5301   if (cpb_data_size > level_spec->max_cpb_size) {
   5302     level_spec->max_cpb_size = cpb_data_size;
   5303   }
   5304 
   5305   // update max_luma_picture_size
   5306   if (luma_pic_size > level_spec->max_luma_picture_size) {
   5307     level_spec->max_luma_picture_size = luma_pic_size;
   5308   }
   5309 
   5310   // update max_luma_picture_breadth
   5311   if (luma_pic_breadth > level_spec->max_luma_picture_breadth) {
   5312     level_spec->max_luma_picture_breadth = luma_pic_breadth;
   5313   }
   5314 
   5315   // update compression_ratio
   5316   level_spec->compression_ratio = (double)level_stats->total_uncompressed_size *
   5317                                   cm->bit_depth /
   5318                                   level_stats->total_compressed_size / 8.0;
   5319 
   5320   // update max_col_tiles
   5321   if (level_spec->max_col_tiles < (1 << cm->log2_tile_cols)) {
   5322     level_spec->max_col_tiles = (1 << cm->log2_tile_cols);
   5323   }
   5324 
   5325   if (level_index >= 0 && level_constraint->fail_flag == 0) {
   5326     if (level_spec->max_luma_picture_size >
   5327         vp9_level_defs[level_index].max_luma_picture_size) {
   5328       level_constraint->fail_flag |= (1 << LUMA_PIC_SIZE_TOO_LARGE);
   5329       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5330                          "Failed to encode to the target level %d. %s",
   5331                          vp9_level_defs[level_index].level,
   5332                          level_fail_messages[LUMA_PIC_SIZE_TOO_LARGE]);
   5333     }
   5334 
   5335     if (level_spec->max_luma_picture_breadth >
   5336         vp9_level_defs[level_index].max_luma_picture_breadth) {
   5337       level_constraint->fail_flag |= (1 << LUMA_PIC_BREADTH_TOO_LARGE);
   5338       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5339                          "Failed to encode to the target level %d. %s",
   5340                          vp9_level_defs[level_index].level,
   5341                          level_fail_messages[LUMA_PIC_BREADTH_TOO_LARGE]);
   5342     }
   5343 
   5344     if ((double)level_spec->max_luma_sample_rate >
   5345         (double)vp9_level_defs[level_index].max_luma_sample_rate *
   5346             (1 + SAMPLE_RATE_GRACE_P)) {
   5347       level_constraint->fail_flag |= (1 << LUMA_SAMPLE_RATE_TOO_LARGE);
   5348       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5349                          "Failed to encode to the target level %d. %s",
   5350                          vp9_level_defs[level_index].level,
   5351                          level_fail_messages[LUMA_SAMPLE_RATE_TOO_LARGE]);
   5352     }
   5353 
   5354     if (level_spec->max_col_tiles > vp9_level_defs[level_index].max_col_tiles) {
   5355       level_constraint->fail_flag |= (1 << TOO_MANY_COLUMN_TILE);
   5356       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5357                          "Failed to encode to the target level %d. %s",
   5358                          vp9_level_defs[level_index].level,
   5359                          level_fail_messages[TOO_MANY_COLUMN_TILE]);
   5360     }
   5361 
   5362     if (level_spec->min_altref_distance <
   5363         vp9_level_defs[level_index].min_altref_distance) {
   5364       level_constraint->fail_flag |= (1 << ALTREF_DIST_TOO_SMALL);
   5365       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5366                          "Failed to encode to the target level %d. %s",
   5367                          vp9_level_defs[level_index].level,
   5368                          level_fail_messages[ALTREF_DIST_TOO_SMALL]);
   5369     }
   5370 
   5371     if (level_spec->max_ref_frame_buffers >
   5372         vp9_level_defs[level_index].max_ref_frame_buffers) {
   5373       level_constraint->fail_flag |= (1 << TOO_MANY_REF_BUFFER);
   5374       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5375                          "Failed to encode to the target level %d. %s",
   5376                          vp9_level_defs[level_index].level,
   5377                          level_fail_messages[TOO_MANY_REF_BUFFER]);
   5378     }
   5379 
   5380     if (level_spec->max_cpb_size > vp9_level_defs[level_index].max_cpb_size) {
   5381       level_constraint->fail_flag |= (1 << CPB_TOO_LARGE);
   5382       vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
   5383                          "Failed to encode to the target level %d. %s",
   5384                          vp9_level_defs[level_index].level,
   5385                          level_fail_messages[CPB_TOO_LARGE]);
   5386     }
   5387 
   5388     // Set an upper bound for the next frame size. It will be used in
   5389     // level_rc_framerate() before encoding the next frame.
   5390     cpb_data_size = 0;
   5391     for (i = 0; i < CPB_WINDOW_SIZE - 1; ++i) {
   5392       if (i >= level_stats->frame_window_buffer.len) break;
   5393       idx = (level_stats->frame_window_buffer.start +
   5394              level_stats->frame_window_buffer.len - 1 - i) %
   5395             FRAME_WINDOW_SIZE;
   5396       cpb_data_size += level_stats->frame_window_buffer.buf[idx].size;
   5397     }
   5398     cpb_data_size = cpb_data_size / 125.0;
   5399     level_constraint->max_frame_size =
   5400         (int)((vp9_level_defs[level_index].max_cpb_size - cpb_data_size) *
   5401               1000.0);
   5402     if (level_stats->frame_window_buffer.len < CPB_WINDOW_SIZE - 1)
   5403       level_constraint->max_frame_size >>= 1;
   5404   }
   5405 }
   5406 
   5407 typedef struct GF_PICTURE {
   5408   YV12_BUFFER_CONFIG *frame;
   5409   int ref_frame[3];
   5410   FRAME_UPDATE_TYPE update_type;
   5411 } GF_PICTURE;
   5412 
   5413 static void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
   5414                             const GF_GROUP *gf_group, int *tpl_group_frames) {
   5415   VP9_COMMON *cm = &cpi->common;
   5416   int frame_idx = 0;
   5417   int i;
   5418   int gld_index = -1;
   5419   int alt_index = -1;
   5420   int lst_index = -1;
   5421   int arf_index_stack[MAX_ARF_LAYERS];
   5422   int arf_stack_size = 0;
   5423   int extend_frame_count = 0;
   5424   int pframe_qindex = cpi->tpl_stats[2].base_qindex;
   5425   int frame_gop_offset = 0;
   5426 
   5427   RefCntBuffer *frame_bufs = cm->buffer_pool->frame_bufs;
   5428   int8_t recon_frame_index[REFS_PER_FRAME + MAX_ARF_LAYERS];
   5429 
   5430   memset(recon_frame_index, -1, sizeof(recon_frame_index));
   5431   stack_init(arf_index_stack, MAX_ARF_LAYERS);
   5432 
   5433   // TODO(jingning): To be used later for gf frame type parsing.
   5434   (void)gf_group;
   5435 
   5436   for (i = 0; i < FRAME_BUFFERS; ++i) {
   5437     if (frame_bufs[i].ref_count == 0) {
   5438       alloc_frame_mvs(cm, i);
   5439       if (vpx_realloc_frame_buffer(&frame_bufs[i].buf, cm->width, cm->height,
   5440                                    cm->subsampling_x, cm->subsampling_y,
   5441 #if CONFIG_VP9_HIGHBITDEPTH
   5442                                    cm->use_highbitdepth,
   5443 #endif
   5444                                    VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
   5445                                    NULL, NULL, NULL))
   5446         vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   5447                            "Failed to allocate frame buffer");
   5448 
   5449       recon_frame_index[frame_idx] = i;
   5450       ++frame_idx;
   5451 
   5452       if (frame_idx >= REFS_PER_FRAME + cpi->oxcf.enable_auto_arf) break;
   5453     }
   5454   }
   5455 
   5456   for (i = 0; i < REFS_PER_FRAME + 1; ++i) {
   5457     assert(recon_frame_index[i] >= 0);
   5458     cpi->tpl_recon_frames[i] = &frame_bufs[recon_frame_index[i]].buf;
   5459   }
   5460 
   5461   *tpl_group_frames = 0;
   5462 
   5463   // Initialize Golden reference frame.
   5464   gf_picture[0].frame = get_ref_frame_buffer(cpi, GOLDEN_FRAME);
   5465   for (i = 0; i < 3; ++i) gf_picture[0].ref_frame[i] = -1;
   5466   gf_picture[0].update_type = gf_group->update_type[0];
   5467   gld_index = 0;
   5468   ++*tpl_group_frames;
   5469 
   5470   // Initialize base layer ARF frame
   5471   gf_picture[1].frame = cpi->Source;
   5472   gf_picture[1].ref_frame[0] = gld_index;
   5473   gf_picture[1].ref_frame[1] = lst_index;
   5474   gf_picture[1].ref_frame[2] = alt_index;
   5475   gf_picture[1].update_type = gf_group->update_type[1];
   5476   alt_index = 1;
   5477   ++*tpl_group_frames;
   5478 
   5479   // Initialize P frames
   5480   for (frame_idx = 2; frame_idx < MAX_ARF_GOP_SIZE; ++frame_idx) {
   5481     struct lookahead_entry *buf;
   5482     frame_gop_offset = gf_group->frame_gop_index[frame_idx];
   5483     buf = vp9_lookahead_peek(cpi->lookahead, frame_gop_offset - 1);
   5484 
   5485     if (buf == NULL) break;
   5486 
   5487     gf_picture[frame_idx].frame = &buf->img;
   5488     gf_picture[frame_idx].ref_frame[0] = gld_index;
   5489     gf_picture[frame_idx].ref_frame[1] = lst_index;
   5490     gf_picture[frame_idx].ref_frame[2] = alt_index;
   5491     gf_picture[frame_idx].update_type = gf_group->update_type[frame_idx];
   5492 
   5493     switch (gf_group->update_type[frame_idx]) {
   5494       case ARF_UPDATE:
   5495         stack_push(arf_index_stack, alt_index, arf_stack_size);
   5496         ++arf_stack_size;
   5497         alt_index = frame_idx;
   5498         break;
   5499       case LF_UPDATE: lst_index = frame_idx; break;
   5500       case OVERLAY_UPDATE:
   5501         gld_index = frame_idx;
   5502         alt_index = stack_pop(arf_index_stack, arf_stack_size);
   5503         --arf_stack_size;
   5504         break;
   5505       case USE_BUF_FRAME:
   5506         lst_index = alt_index;
   5507         alt_index = stack_pop(arf_index_stack, arf_stack_size);
   5508         --arf_stack_size;
   5509         break;
   5510       default: break;
   5511     }
   5512 
   5513     ++*tpl_group_frames;
   5514 
   5515     // The length of group of pictures is baseline_gf_interval, plus the
   5516     // beginning golden frame from last GOP, plus the last overlay frame in
   5517     // the same GOP.
   5518     if (frame_idx == gf_group->gf_group_size) break;
   5519   }
   5520 
   5521   alt_index = -1;
   5522   ++frame_idx;
   5523   ++frame_gop_offset;
   5524 
   5525   // Extend two frames outside the current gf group.
   5526   for (; frame_idx < MAX_LAG_BUFFERS && extend_frame_count < 2; ++frame_idx) {
   5527     struct lookahead_entry *buf =
   5528         vp9_lookahead_peek(cpi->lookahead, frame_gop_offset - 1);
   5529 
   5530     if (buf == NULL) break;
   5531 
   5532     cpi->tpl_stats[frame_idx].base_qindex = pframe_qindex;
   5533 
   5534     gf_picture[frame_idx].frame = &buf->img;
   5535     gf_picture[frame_idx].ref_frame[0] = gld_index;
   5536     gf_picture[frame_idx].ref_frame[1] = lst_index;
   5537     gf_picture[frame_idx].ref_frame[2] = alt_index;
   5538     gf_picture[frame_idx].update_type = LF_UPDATE;
   5539     lst_index = frame_idx;
   5540     ++*tpl_group_frames;
   5541     ++extend_frame_count;
   5542     ++frame_gop_offset;
   5543   }
   5544 }
   5545 
   5546 static void init_tpl_stats(VP9_COMP *cpi) {
   5547   int frame_idx;
   5548   for (frame_idx = 0; frame_idx < MAX_ARF_GOP_SIZE; ++frame_idx) {
   5549     TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
   5550 #if CONFIG_NON_GREEDY_MV
   5551     int rf_idx;
   5552     for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   5553       tpl_frame->mv_dist_sum[rf_idx] = 0;
   5554       tpl_frame->mv_cost_sum[rf_idx] = 0;
   5555     }
   5556 #endif
   5557     memset(tpl_frame->tpl_stats_ptr, 0,
   5558            tpl_frame->height * tpl_frame->width *
   5559                sizeof(*tpl_frame->tpl_stats_ptr));
   5560     tpl_frame->is_valid = 0;
   5561   }
   5562 }
   5563 
   5564 #if CONFIG_NON_GREEDY_MV
   5565 static uint32_t motion_compensated_prediction(
   5566     VP9_COMP *cpi, ThreadData *td, int frame_idx, uint8_t *cur_frame_buf,
   5567     uint8_t *ref_frame_buf, int stride, BLOCK_SIZE bsize, int mi_row,
   5568     int mi_col, MV *mv, int rf_idx, double *mv_dist, double *mv_cost) {
   5569 #else   // CONFIG_NON_GREEDY_MV
   5570 static uint32_t motion_compensated_prediction(VP9_COMP *cpi, ThreadData *td,
   5571                                               int frame_idx,
   5572                                               uint8_t *cur_frame_buf,
   5573                                               uint8_t *ref_frame_buf,
   5574                                               int stride, BLOCK_SIZE bsize,
   5575                                               int mi_row, int mi_col, MV *mv) {
   5576 #endif  // CONFIG_NON_GREEDY_MV
   5577   MACROBLOCK *const x = &td->mb;
   5578   MACROBLOCKD *const xd = &x->e_mbd;
   5579   MV_SPEED_FEATURES *const mv_sf = &cpi->sf.mv;
   5580   const SEARCH_METHODS search_method = NSTEP;
   5581   int step_param;
   5582   int sadpb = x->sadperbit16;
   5583   uint32_t bestsme = UINT_MAX;
   5584   uint32_t distortion;
   5585   uint32_t sse;
   5586   int cost_list[5];
   5587   const MvLimits tmp_mv_limits = x->mv_limits;
   5588 #if CONFIG_NON_GREEDY_MV
   5589   // lambda is used to adjust the importance of motion vector consitency.
   5590   // TODO(angiebird): Figure out lambda's proper value.
   5591   double lambda = cpi->tpl_stats[frame_idx].lambda;
   5592   int_mv nb_full_mvs[NB_MVS_NUM];
   5593 #endif
   5594 
   5595   MV best_ref_mv1 = { 0, 0 };
   5596   MV best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
   5597 
   5598   best_ref_mv1_full.col = best_ref_mv1.col >> 3;
   5599   best_ref_mv1_full.row = best_ref_mv1.row >> 3;
   5600 
   5601   // Setup frame pointers
   5602   x->plane[0].src.buf = cur_frame_buf;
   5603   x->plane[0].src.stride = stride;
   5604   xd->plane[0].pre[0].buf = ref_frame_buf;
   5605   xd->plane[0].pre[0].stride = stride;
   5606 
   5607   step_param = mv_sf->reduce_first_step_size;
   5608   step_param = VPXMIN(step_param, MAX_MVSEARCH_STEPS - 2);
   5609 
   5610   vp9_set_mv_search_range(&x->mv_limits, &best_ref_mv1);
   5611 
   5612 #if CONFIG_NON_GREEDY_MV
   5613   (void)search_method;
   5614   (void)sadpb;
   5615   vp9_prepare_nb_full_mvs(&cpi->tpl_stats[frame_idx], mi_row, mi_col, rf_idx,
   5616                           bsize, nb_full_mvs);
   5617   vp9_full_pixel_diamond_new(cpi, x, &best_ref_mv1_full, step_param, lambda, 1,
   5618                              &cpi->fn_ptr[bsize], nb_full_mvs, NB_MVS_NUM, mv,
   5619                              mv_dist, mv_cost);
   5620 #else
   5621   (void)frame_idx;
   5622   (void)mi_row;
   5623   (void)mi_col;
   5624   vp9_full_pixel_search(cpi, x, bsize, &best_ref_mv1_full, step_param,
   5625                         search_method, sadpb, cond_cost_list(cpi, cost_list),
   5626                         &best_ref_mv1, mv, 0, 0);
   5627 #endif
   5628 
   5629   /* restore UMV window */
   5630   x->mv_limits = tmp_mv_limits;
   5631 
   5632   // TODO(yunqing): may use higher tap interp filter than 2 taps.
   5633   // Ignore mv costing by sending NULL pointer instead of cost array
   5634   bestsme = cpi->find_fractional_mv_step(
   5635       x, mv, &best_ref_mv1, cpi->common.allow_high_precision_mv, x->errorperbit,
   5636       &cpi->fn_ptr[bsize], 0, mv_sf->subpel_search_level,
   5637       cond_cost_list(cpi, cost_list), NULL, NULL, &distortion, &sse, NULL, 0, 0,
   5638       USE_2_TAPS);
   5639 
   5640   return bestsme;
   5641 }
   5642 
   5643 static int get_overlap_area(int grid_pos_row, int grid_pos_col, int ref_pos_row,
   5644                             int ref_pos_col, int block, BLOCK_SIZE bsize) {
   5645   int width = 0, height = 0;
   5646   int bw = 4 << b_width_log2_lookup[bsize];
   5647   int bh = 4 << b_height_log2_lookup[bsize];
   5648 
   5649   switch (block) {
   5650     case 0:
   5651       width = grid_pos_col + bw - ref_pos_col;
   5652       height = grid_pos_row + bh - ref_pos_row;
   5653       break;
   5654     case 1:
   5655       width = ref_pos_col + bw - grid_pos_col;
   5656       height = grid_pos_row + bh - ref_pos_row;
   5657       break;
   5658     case 2:
   5659       width = grid_pos_col + bw - ref_pos_col;
   5660       height = ref_pos_row + bh - grid_pos_row;
   5661       break;
   5662     case 3:
   5663       width = ref_pos_col + bw - grid_pos_col;
   5664       height = ref_pos_row + bh - grid_pos_row;
   5665       break;
   5666     default: assert(0);
   5667   }
   5668 
   5669   return width * height;
   5670 }
   5671 
   5672 static int round_floor(int ref_pos, int bsize_pix) {
   5673   int round;
   5674   if (ref_pos < 0)
   5675     round = -(1 + (-ref_pos - 1) / bsize_pix);
   5676   else
   5677     round = ref_pos / bsize_pix;
   5678 
   5679   return round;
   5680 }
   5681 
   5682 static void tpl_model_store(TplDepStats *tpl_stats, int mi_row, int mi_col,
   5683                             BLOCK_SIZE bsize, int stride) {
   5684   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   5685   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   5686   const TplDepStats *src_stats = &tpl_stats[mi_row * stride + mi_col];
   5687   int idx, idy;
   5688 
   5689   for (idy = 0; idy < mi_height; ++idy) {
   5690     for (idx = 0; idx < mi_width; ++idx) {
   5691       TplDepStats *tpl_ptr = &tpl_stats[(mi_row + idy) * stride + mi_col + idx];
   5692       const int64_t mc_flow = tpl_ptr->mc_flow;
   5693       const int64_t mc_ref_cost = tpl_ptr->mc_ref_cost;
   5694       *tpl_ptr = *src_stats;
   5695       tpl_ptr->mc_flow = mc_flow;
   5696       tpl_ptr->mc_ref_cost = mc_ref_cost;
   5697       tpl_ptr->mc_dep_cost = tpl_ptr->intra_cost + tpl_ptr->mc_flow;
   5698     }
   5699   }
   5700 }
   5701 
   5702 static void tpl_model_update_b(TplDepFrame *tpl_frame, TplDepStats *tpl_stats,
   5703                                int mi_row, int mi_col, const BLOCK_SIZE bsize) {
   5704   TplDepFrame *ref_tpl_frame = &tpl_frame[tpl_stats->ref_frame_index];
   5705   TplDepStats *ref_stats = ref_tpl_frame->tpl_stats_ptr;
   5706   MV mv = tpl_stats->mv.as_mv;
   5707   int mv_row = mv.row >> 3;
   5708   int mv_col = mv.col >> 3;
   5709 
   5710   int ref_pos_row = mi_row * MI_SIZE + mv_row;
   5711   int ref_pos_col = mi_col * MI_SIZE + mv_col;
   5712 
   5713   const int bw = 4 << b_width_log2_lookup[bsize];
   5714   const int bh = 4 << b_height_log2_lookup[bsize];
   5715   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   5716   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   5717   const int pix_num = bw * bh;
   5718 
   5719   // top-left on grid block location in pixel
   5720   int grid_pos_row_base = round_floor(ref_pos_row, bh) * bh;
   5721   int grid_pos_col_base = round_floor(ref_pos_col, bw) * bw;
   5722   int block;
   5723 
   5724   for (block = 0; block < 4; ++block) {
   5725     int grid_pos_row = grid_pos_row_base + bh * (block >> 1);
   5726     int grid_pos_col = grid_pos_col_base + bw * (block & 0x01);
   5727 
   5728     if (grid_pos_row >= 0 && grid_pos_row < ref_tpl_frame->mi_rows * MI_SIZE &&
   5729         grid_pos_col >= 0 && grid_pos_col < ref_tpl_frame->mi_cols * MI_SIZE) {
   5730       int overlap_area = get_overlap_area(
   5731           grid_pos_row, grid_pos_col, ref_pos_row, ref_pos_col, block, bsize);
   5732       int ref_mi_row = round_floor(grid_pos_row, bh) * mi_height;
   5733       int ref_mi_col = round_floor(grid_pos_col, bw) * mi_width;
   5734 
   5735       int64_t mc_flow = tpl_stats->mc_dep_cost -
   5736                         (tpl_stats->mc_dep_cost * tpl_stats->inter_cost) /
   5737                             tpl_stats->intra_cost;
   5738 
   5739       int idx, idy;
   5740 
   5741       for (idy = 0; idy < mi_height; ++idy) {
   5742         for (idx = 0; idx < mi_width; ++idx) {
   5743           TplDepStats *des_stats =
   5744               &ref_stats[(ref_mi_row + idy) * ref_tpl_frame->stride +
   5745                          (ref_mi_col + idx)];
   5746 
   5747           des_stats->mc_flow += (mc_flow * overlap_area) / pix_num;
   5748           des_stats->mc_ref_cost +=
   5749               ((tpl_stats->intra_cost - tpl_stats->inter_cost) * overlap_area) /
   5750               pix_num;
   5751           assert(overlap_area >= 0);
   5752         }
   5753       }
   5754     }
   5755   }
   5756 }
   5757 
   5758 static void tpl_model_update(TplDepFrame *tpl_frame, TplDepStats *tpl_stats,
   5759                              int mi_row, int mi_col, const BLOCK_SIZE bsize) {
   5760   int idx, idy;
   5761   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   5762   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   5763 
   5764   for (idy = 0; idy < mi_height; ++idy) {
   5765     for (idx = 0; idx < mi_width; ++idx) {
   5766       TplDepStats *tpl_ptr =
   5767           &tpl_stats[(mi_row + idy) * tpl_frame->stride + (mi_col + idx)];
   5768       tpl_model_update_b(tpl_frame, tpl_ptr, mi_row + idy, mi_col + idx,
   5769                          BLOCK_8X8);
   5770     }
   5771   }
   5772 }
   5773 
   5774 static void get_quantize_error(MACROBLOCK *x, int plane, tran_low_t *coeff,
   5775                                tran_low_t *qcoeff, tran_low_t *dqcoeff,
   5776                                TX_SIZE tx_size, int64_t *recon_error,
   5777                                int64_t *sse) {
   5778   MACROBLOCKD *const xd = &x->e_mbd;
   5779   const struct macroblock_plane *const p = &x->plane[plane];
   5780   const struct macroblockd_plane *const pd = &xd->plane[plane];
   5781   const scan_order *const scan_order = &vp9_default_scan_orders[tx_size];
   5782   uint16_t eob;
   5783   int pix_num = 1 << num_pels_log2_lookup[txsize_to_bsize[tx_size]];
   5784   const int shift = tx_size == TX_32X32 ? 0 : 2;
   5785 
   5786 #if CONFIG_VP9_HIGHBITDEPTH
   5787   if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
   5788     vp9_highbd_quantize_fp_32x32(coeff, pix_num, x->skip_block, p->round_fp,
   5789                                  p->quant_fp, qcoeff, dqcoeff, pd->dequant,
   5790                                  &eob, scan_order->scan, scan_order->iscan);
   5791   } else {
   5792     vp9_quantize_fp_32x32(coeff, pix_num, x->skip_block, p->round_fp,
   5793                           p->quant_fp, qcoeff, dqcoeff, pd->dequant, &eob,
   5794                           scan_order->scan, scan_order->iscan);
   5795   }
   5796 #else
   5797   vp9_quantize_fp_32x32(coeff, pix_num, x->skip_block, p->round_fp, p->quant_fp,
   5798                         qcoeff, dqcoeff, pd->dequant, &eob, scan_order->scan,
   5799                         scan_order->iscan);
   5800 #endif  // CONFIG_VP9_HIGHBITDEPTH
   5801 
   5802   *recon_error = vp9_block_error(coeff, dqcoeff, pix_num, sse) >> shift;
   5803   *recon_error = VPXMAX(*recon_error, 1);
   5804 
   5805   *sse = (*sse) >> shift;
   5806   *sse = VPXMAX(*sse, 1);
   5807 }
   5808 
   5809 #if CONFIG_VP9_HIGHBITDEPTH
   5810 static void highbd_wht_fwd_txfm(int16_t *src_diff, int bw, tran_low_t *coeff,
   5811                                 TX_SIZE tx_size) {
   5812   // TODO(sdeng): Implement SIMD based high bit-depth Hadamard transforms.
   5813   switch (tx_size) {
   5814     case TX_8X8: vpx_highbd_hadamard_8x8(src_diff, bw, coeff); break;
   5815     case TX_16X16: vpx_highbd_hadamard_16x16(src_diff, bw, coeff); break;
   5816     case TX_32X32: vpx_highbd_hadamard_32x32(src_diff, bw, coeff); break;
   5817     default: assert(0);
   5818   }
   5819 }
   5820 #endif  // CONFIG_VP9_HIGHBITDEPTH
   5821 
   5822 static void wht_fwd_txfm(int16_t *src_diff, int bw, tran_low_t *coeff,
   5823                          TX_SIZE tx_size) {
   5824   switch (tx_size) {
   5825     case TX_8X8: vpx_hadamard_8x8(src_diff, bw, coeff); break;
   5826     case TX_16X16: vpx_hadamard_16x16(src_diff, bw, coeff); break;
   5827     case TX_32X32: vpx_hadamard_32x32(src_diff, bw, coeff); break;
   5828     default: assert(0);
   5829   }
   5830 }
   5831 
   5832 #if CONFIG_NON_GREEDY_MV
   5833 double get_feature_score(uint8_t *buf, ptrdiff_t stride, int rows, int cols) {
   5834   double IxIx = 0;
   5835   double IxIy = 0;
   5836   double IyIy = 0;
   5837   double score;
   5838   int r, c;
   5839   vpx_clear_system_state();
   5840   for (r = 0; r + 1 < rows; ++r) {
   5841     for (c = 0; c + 1 < cols; ++c) {
   5842       int diff_x = buf[r * stride + c] - buf[r * stride + c + 1];
   5843       int diff_y = buf[r * stride + c] - buf[(r + 1) * stride + c];
   5844       IxIx += diff_x * diff_x;
   5845       IxIy += diff_x * diff_y;
   5846       IyIy += diff_y * diff_y;
   5847     }
   5848   }
   5849   IxIx /= (rows - 1) * (cols - 1);
   5850   IxIy /= (rows - 1) * (cols - 1);
   5851   IyIy /= (rows - 1) * (cols - 1);
   5852   score = (IxIx * IyIy - IxIy * IxIy + 0.0001) / (IxIx + IyIy + 0.0001);
   5853   return score;
   5854 }
   5855 #endif
   5856 
   5857 static void set_mv_limits(const VP9_COMMON *cm, MACROBLOCK *x, int mi_row,
   5858                           int mi_col) {
   5859   x->mv_limits.row_min = -((mi_row * MI_SIZE) + (17 - 2 * VP9_INTERP_EXTEND));
   5860   x->mv_limits.row_max =
   5861       (cm->mi_rows - 1 - mi_row) * MI_SIZE + (17 - 2 * VP9_INTERP_EXTEND);
   5862   x->mv_limits.col_min = -((mi_col * MI_SIZE) + (17 - 2 * VP9_INTERP_EXTEND));
   5863   x->mv_limits.col_max =
   5864       ((cm->mi_cols - 1 - mi_col) * MI_SIZE) + (17 - 2 * VP9_INTERP_EXTEND);
   5865 }
   5866 
   5867 static void mode_estimation(VP9_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd,
   5868                             struct scale_factors *sf, GF_PICTURE *gf_picture,
   5869                             int frame_idx, TplDepFrame *tpl_frame,
   5870                             int16_t *src_diff, tran_low_t *coeff,
   5871                             tran_low_t *qcoeff, tran_low_t *dqcoeff, int mi_row,
   5872                             int mi_col, BLOCK_SIZE bsize, TX_SIZE tx_size,
   5873                             YV12_BUFFER_CONFIG *ref_frame[], uint8_t *predictor,
   5874                             int64_t *recon_error, int64_t *sse) {
   5875   VP9_COMMON *cm = &cpi->common;
   5876   ThreadData *td = &cpi->td;
   5877 
   5878   const int bw = 4 << b_width_log2_lookup[bsize];
   5879   const int bh = 4 << b_height_log2_lookup[bsize];
   5880   const int pix_num = bw * bh;
   5881   int best_rf_idx = -1;
   5882   int_mv best_mv;
   5883   int64_t best_inter_cost = INT64_MAX;
   5884   int64_t inter_cost;
   5885   int rf_idx;
   5886   const InterpKernel *const kernel = vp9_filter_kernels[EIGHTTAP];
   5887 
   5888   int64_t best_intra_cost = INT64_MAX;
   5889   int64_t intra_cost;
   5890   PREDICTION_MODE mode;
   5891   int mb_y_offset = mi_row * MI_SIZE * xd->cur_buf->y_stride + mi_col * MI_SIZE;
   5892   MODE_INFO mi_above, mi_left;
   5893   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   5894   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   5895   TplDepStats *tpl_stats =
   5896       &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   5897 
   5898   xd->mb_to_top_edge = -((mi_row * MI_SIZE) * 8);
   5899   xd->mb_to_bottom_edge = ((cm->mi_rows - 1 - mi_row) * MI_SIZE) * 8;
   5900   xd->mb_to_left_edge = -((mi_col * MI_SIZE) * 8);
   5901   xd->mb_to_right_edge = ((cm->mi_cols - 1 - mi_col) * MI_SIZE) * 8;
   5902   xd->above_mi = (mi_row > 0) ? &mi_above : NULL;
   5903   xd->left_mi = (mi_col > 0) ? &mi_left : NULL;
   5904 
   5905   // Intra prediction search
   5906   for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
   5907     uint8_t *src, *dst;
   5908     int src_stride, dst_stride;
   5909 
   5910     src = xd->cur_buf->y_buffer + mb_y_offset;
   5911     src_stride = xd->cur_buf->y_stride;
   5912 
   5913     dst = &predictor[0];
   5914     dst_stride = bw;
   5915 
   5916     xd->mi[0]->sb_type = bsize;
   5917     xd->mi[0]->ref_frame[0] = INTRA_FRAME;
   5918 
   5919     vp9_predict_intra_block(xd, b_width_log2_lookup[bsize], tx_size, mode, src,
   5920                             src_stride, dst, dst_stride, 0, 0, 0);
   5921 
   5922 #if CONFIG_VP9_HIGHBITDEPTH
   5923     if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
   5924       vpx_highbd_subtract_block(bh, bw, src_diff, bw, src, src_stride, dst,
   5925                                 dst_stride, xd->bd);
   5926       highbd_wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5927       intra_cost = vpx_highbd_satd(coeff, pix_num);
   5928     } else {
   5929       vpx_subtract_block(bh, bw, src_diff, bw, src, src_stride, dst,
   5930                          dst_stride);
   5931       wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5932       intra_cost = vpx_satd(coeff, pix_num);
   5933     }
   5934 #else
   5935     vpx_subtract_block(bh, bw, src_diff, bw, src, src_stride, dst, dst_stride);
   5936     wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5937     intra_cost = vpx_satd(coeff, pix_num);
   5938 #endif  // CONFIG_VP9_HIGHBITDEPTH
   5939 
   5940     if (intra_cost < best_intra_cost) best_intra_cost = intra_cost;
   5941   }
   5942 
   5943   // Motion compensated prediction
   5944   best_mv.as_int = 0;
   5945 
   5946   set_mv_limits(cm, x, mi_row, mi_col);
   5947 
   5948   for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   5949     int_mv mv;
   5950     if (ref_frame[rf_idx] == NULL) continue;
   5951 
   5952 #if CONFIG_NON_GREEDY_MV
   5953     (void)td;
   5954     mv.as_int =
   5955         get_pyramid_mv(tpl_frame, rf_idx, bsize, mi_row, mi_col)->as_int;
   5956 #else
   5957     motion_compensated_prediction(
   5958         cpi, td, frame_idx, xd->cur_buf->y_buffer + mb_y_offset,
   5959         ref_frame[rf_idx]->y_buffer + mb_y_offset, xd->cur_buf->y_stride, bsize,
   5960         mi_row, mi_col, &mv.as_mv);
   5961 #endif
   5962 
   5963 #if CONFIG_VP9_HIGHBITDEPTH
   5964     if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
   5965       vp9_highbd_build_inter_predictor(
   5966           CONVERT_TO_SHORTPTR(ref_frame[rf_idx]->y_buffer + mb_y_offset),
   5967           ref_frame[rf_idx]->y_stride, CONVERT_TO_SHORTPTR(&predictor[0]), bw,
   5968           &mv.as_mv, sf, bw, bh, 0, kernel, MV_PRECISION_Q3, mi_col * MI_SIZE,
   5969           mi_row * MI_SIZE, xd->bd);
   5970       vpx_highbd_subtract_block(
   5971           bh, bw, src_diff, bw, xd->cur_buf->y_buffer + mb_y_offset,
   5972           xd->cur_buf->y_stride, &predictor[0], bw, xd->bd);
   5973       highbd_wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5974       inter_cost = vpx_highbd_satd(coeff, pix_num);
   5975     } else {
   5976       vp9_build_inter_predictor(
   5977           ref_frame[rf_idx]->y_buffer + mb_y_offset,
   5978           ref_frame[rf_idx]->y_stride, &predictor[0], bw, &mv.as_mv, sf, bw, bh,
   5979           0, kernel, MV_PRECISION_Q3, mi_col * MI_SIZE, mi_row * MI_SIZE);
   5980       vpx_subtract_block(bh, bw, src_diff, bw,
   5981                          xd->cur_buf->y_buffer + mb_y_offset,
   5982                          xd->cur_buf->y_stride, &predictor[0], bw);
   5983       wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5984       inter_cost = vpx_satd(coeff, pix_num);
   5985     }
   5986 #else
   5987     vp9_build_inter_predictor(ref_frame[rf_idx]->y_buffer + mb_y_offset,
   5988                               ref_frame[rf_idx]->y_stride, &predictor[0], bw,
   5989                               &mv.as_mv, sf, bw, bh, 0, kernel, MV_PRECISION_Q3,
   5990                               mi_col * MI_SIZE, mi_row * MI_SIZE);
   5991     vpx_subtract_block(bh, bw, src_diff, bw,
   5992                        xd->cur_buf->y_buffer + mb_y_offset,
   5993                        xd->cur_buf->y_stride, &predictor[0], bw);
   5994     wht_fwd_txfm(src_diff, bw, coeff, tx_size);
   5995     inter_cost = vpx_satd(coeff, pix_num);
   5996 #endif
   5997 
   5998 #if CONFIG_NON_GREEDY_MV
   5999     tpl_stats->inter_cost_arr[rf_idx] = inter_cost;
   6000     get_quantize_error(x, 0, coeff, qcoeff, dqcoeff, tx_size,
   6001                        &tpl_stats->recon_error_arr[rf_idx],
   6002                        &tpl_stats->sse_arr[rf_idx]);
   6003 #endif
   6004 
   6005     if (inter_cost < best_inter_cost) {
   6006       best_rf_idx = rf_idx;
   6007       best_inter_cost = inter_cost;
   6008       best_mv.as_int = mv.as_int;
   6009 #if CONFIG_NON_GREEDY_MV
   6010       *recon_error = tpl_stats->recon_error_arr[rf_idx];
   6011       *sse = tpl_stats->sse_arr[rf_idx];
   6012 #else
   6013       get_quantize_error(x, 0, coeff, qcoeff, dqcoeff, tx_size, recon_error,
   6014                          sse);
   6015 #endif
   6016     }
   6017   }
   6018   best_intra_cost = VPXMAX(best_intra_cost, 1);
   6019   best_inter_cost = VPXMIN(best_intra_cost, best_inter_cost);
   6020   tpl_stats->inter_cost = VPXMAX(
   6021       1, (best_inter_cost << TPL_DEP_COST_SCALE_LOG2) / (mi_height * mi_width));
   6022   tpl_stats->intra_cost = VPXMAX(
   6023       1, (best_intra_cost << TPL_DEP_COST_SCALE_LOG2) / (mi_height * mi_width));
   6024   tpl_stats->ref_frame_index = gf_picture[frame_idx].ref_frame[best_rf_idx];
   6025   tpl_stats->mv.as_int = best_mv.as_int;
   6026 }
   6027 
   6028 #if CONFIG_NON_GREEDY_MV
   6029 static int compare_feature_score(const void *a, const void *b) {
   6030   const FEATURE_SCORE_LOC *aa = *(FEATURE_SCORE_LOC *const *)a;
   6031   const FEATURE_SCORE_LOC *bb = *(FEATURE_SCORE_LOC *const *)b;
   6032   if (aa->feature_score < bb->feature_score) {
   6033     return 1;
   6034   } else if (aa->feature_score > bb->feature_score) {
   6035     return -1;
   6036   } else {
   6037     return 0;
   6038   }
   6039 }
   6040 
   6041 static void do_motion_search(VP9_COMP *cpi, ThreadData *td, int frame_idx,
   6042                              YV12_BUFFER_CONFIG **ref_frame, BLOCK_SIZE bsize,
   6043                              int mi_row, int mi_col) {
   6044   VP9_COMMON *cm = &cpi->common;
   6045   MACROBLOCK *x = &td->mb;
   6046   MACROBLOCKD *xd = &x->e_mbd;
   6047   TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
   6048   TplDepStats *tpl_stats =
   6049       &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6050   const int mb_y_offset =
   6051       mi_row * MI_SIZE * xd->cur_buf->y_stride + mi_col * MI_SIZE;
   6052   int rf_idx;
   6053 
   6054   set_mv_limits(cm, x, mi_row, mi_col);
   6055 
   6056   for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   6057     int_mv *mv = get_pyramid_mv(tpl_frame, rf_idx, bsize, mi_row, mi_col);
   6058     if (ref_frame[rf_idx] == NULL) {
   6059       tpl_stats->ready[rf_idx] = 0;
   6060       continue;
   6061     } else {
   6062       tpl_stats->ready[rf_idx] = 1;
   6063     }
   6064     motion_compensated_prediction(
   6065         cpi, td, frame_idx, xd->cur_buf->y_buffer + mb_y_offset,
   6066         ref_frame[rf_idx]->y_buffer + mb_y_offset, xd->cur_buf->y_stride, bsize,
   6067         mi_row, mi_col, &mv->as_mv, rf_idx, &tpl_stats->mv_dist[rf_idx],
   6068         &tpl_stats->mv_cost[rf_idx]);
   6069   }
   6070 }
   6071 
   6072 #define CHANGE_MV_SEARCH_ORDER 1
   6073 #define USE_PQSORT 1
   6074 #define RE_COMPUTE_MV_INCONSISTENCY 1
   6075 
   6076 #if CHANGE_MV_SEARCH_ORDER
   6077 #if USE_PQSORT
   6078 static void max_heap_pop(FEATURE_SCORE_LOC **heap, int *size,
   6079                          FEATURE_SCORE_LOC **output) {
   6080   if (*size > 0) {
   6081     *output = heap[0];
   6082     --*size;
   6083     if (*size > 0) {
   6084       int p, l, r;
   6085       heap[0] = heap[*size];
   6086       p = 0;
   6087       l = 2 * p + 1;
   6088       r = 2 * p + 2;
   6089       while (l < *size) {
   6090         FEATURE_SCORE_LOC *tmp;
   6091         int c = l;
   6092         if (r < *size && heap[r]->feature_score > heap[l]->feature_score) {
   6093           c = r;
   6094         }
   6095         if (heap[p]->feature_score >= heap[c]->feature_score) {
   6096           break;
   6097         }
   6098         tmp = heap[p];
   6099         heap[p] = heap[c];
   6100         heap[c] = tmp;
   6101         p = c;
   6102         l = 2 * p + 1;
   6103         r = 2 * p + 2;
   6104       }
   6105     }
   6106   } else {
   6107     assert(0);
   6108   }
   6109 }
   6110 
   6111 static void max_heap_push(FEATURE_SCORE_LOC **heap, int *size,
   6112                           FEATURE_SCORE_LOC *input) {
   6113   int c, p;
   6114   FEATURE_SCORE_LOC *tmp;
   6115   heap[*size] = input;
   6116   ++*size;
   6117   c = *size - 1;
   6118   p = c >> 1;
   6119   while (c > 0 && heap[c]->feature_score > heap[p]->feature_score) {
   6120     tmp = heap[p];
   6121     heap[p] = heap[c];
   6122     heap[c] = tmp;
   6123     c = p;
   6124     p >>= 1;
   6125   }
   6126 }
   6127 
   6128 static void add_nb_blocks_to_heap(VP9_COMP *cpi, const TplDepFrame *tpl_frame,
   6129                                   BLOCK_SIZE bsize, int mi_row, int mi_col,
   6130                                   int *heap_size) {
   6131   const int mi_unit = num_8x8_blocks_wide_lookup[bsize];
   6132   const int dirs[NB_MVS_NUM][2] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } };
   6133   int i;
   6134   for (i = 0; i < NB_MVS_NUM; ++i) {
   6135     int r = dirs[i][0] * mi_unit;
   6136     int c = dirs[i][1] * mi_unit;
   6137     if (mi_row + r >= 0 && mi_row + r < tpl_frame->mi_rows && mi_col + c >= 0 &&
   6138         mi_col + c < tpl_frame->mi_cols) {
   6139       FEATURE_SCORE_LOC *fs_loc =
   6140           &cpi->feature_score_loc_arr[(mi_row + r) * tpl_frame->stride +
   6141                                       (mi_col + c)];
   6142       if (fs_loc->visited == 0) {
   6143         max_heap_push(cpi->feature_score_loc_heap, heap_size, fs_loc);
   6144       }
   6145     }
   6146   }
   6147 }
   6148 #endif  // USE_PQSORT
   6149 #endif  // CHANGE_MV_SEARCH_ORDER
   6150 
   6151 static void build_motion_field(VP9_COMP *cpi, MACROBLOCKD *xd, int frame_idx,
   6152                                YV12_BUFFER_CONFIG *ref_frame[3],
   6153                                BLOCK_SIZE bsize) {
   6154   VP9_COMMON *cm = &cpi->common;
   6155   ThreadData *td = &cpi->td;
   6156   TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
   6157   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   6158   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   6159   int fs_loc_sort_size;
   6160   int fs_loc_heap_size;
   6161   int mi_row, mi_col;
   6162 
   6163   tpl_frame->lambda = 250;
   6164 
   6165   fs_loc_sort_size = 0;
   6166   for (mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) {
   6167     for (mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) {
   6168       const int mb_y_offset =
   6169           mi_row * MI_SIZE * xd->cur_buf->y_stride + mi_col * MI_SIZE;
   6170       const int bw = 4 << b_width_log2_lookup[bsize];
   6171       const int bh = 4 << b_height_log2_lookup[bsize];
   6172       TplDepStats *tpl_stats =
   6173           &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6174       FEATURE_SCORE_LOC *fs_loc =
   6175           &cpi->feature_score_loc_arr[mi_row * tpl_frame->stride + mi_col];
   6176       tpl_stats->feature_score = get_feature_score(
   6177           xd->cur_buf->y_buffer + mb_y_offset, xd->cur_buf->y_stride, bw, bh);
   6178       fs_loc->visited = 0;
   6179       fs_loc->feature_score = tpl_stats->feature_score;
   6180       fs_loc->mi_row = mi_row;
   6181       fs_loc->mi_col = mi_col;
   6182       cpi->feature_score_loc_sort[fs_loc_sort_size] = fs_loc;
   6183       ++fs_loc_sort_size;
   6184     }
   6185   }
   6186 
   6187   qsort(cpi->feature_score_loc_sort, fs_loc_sort_size,
   6188         sizeof(*cpi->feature_score_loc_sort), compare_feature_score);
   6189 
   6190   for (mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) {
   6191     for (mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) {
   6192       int rf_idx;
   6193       for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   6194         TplDepStats *tpl_stats =
   6195             &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6196         tpl_stats->ready[rf_idx] = 0;
   6197       }
   6198     }
   6199   }
   6200 
   6201 #if CHANGE_MV_SEARCH_ORDER
   6202 #if !USE_PQSORT
   6203   for (i = 0; i < fs_loc_sort_size; ++i) {
   6204     FEATURE_SCORE_LOC *fs_loc = cpi->feature_score_loc_sort[i];
   6205     do_motion_search(cpi, td, frame_idx, ref_frame, bsize, fs_loc->mi_row,
   6206                      fs_loc->mi_col);
   6207   }
   6208 #else   // !USE_PQSORT
   6209   fs_loc_heap_size = 0;
   6210   max_heap_push(cpi->feature_score_loc_heap, &fs_loc_heap_size,
   6211                 cpi->feature_score_loc_sort[0]);
   6212 
   6213   while (fs_loc_heap_size > 0) {
   6214     FEATURE_SCORE_LOC *fs_loc;
   6215     max_heap_pop(cpi->feature_score_loc_heap, &fs_loc_heap_size, &fs_loc);
   6216 
   6217     fs_loc->visited = 1;
   6218 
   6219     do_motion_search(cpi, td, frame_idx, ref_frame, bsize, fs_loc->mi_row,
   6220                      fs_loc->mi_col);
   6221 
   6222     add_nb_blocks_to_heap(cpi, tpl_frame, bsize, fs_loc->mi_row, fs_loc->mi_col,
   6223                           &fs_loc_heap_size);
   6224   }
   6225 #endif  // !USE_PQSORT
   6226 #else   // CHANGE_MV_SEARCH_ORDER
   6227   for (mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) {
   6228     for (mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) {
   6229       do_motion_search(cpi, td, frame_idx, ref_frame, bsize, mi_row, mi_col);
   6230     }
   6231   }
   6232 #endif  // CHANGE_MV_SEARCH_ORDER
   6233 }
   6234 #endif  // CONFIG_NON_GREEDY_MV
   6235 
   6236 static void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture,
   6237                               int frame_idx, BLOCK_SIZE bsize) {
   6238   TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
   6239   YV12_BUFFER_CONFIG *this_frame = gf_picture[frame_idx].frame;
   6240   YV12_BUFFER_CONFIG *ref_frame[3] = { NULL, NULL, NULL };
   6241 
   6242   VP9_COMMON *cm = &cpi->common;
   6243   struct scale_factors sf;
   6244   int rdmult, idx;
   6245   ThreadData *td = &cpi->td;
   6246   MACROBLOCK *x = &td->mb;
   6247   MACROBLOCKD *xd = &x->e_mbd;
   6248   int mi_row, mi_col;
   6249 
   6250 #if CONFIG_VP9_HIGHBITDEPTH
   6251   DECLARE_ALIGNED(16, uint16_t, predictor16[32 * 32 * 3]);
   6252   DECLARE_ALIGNED(16, uint8_t, predictor8[32 * 32 * 3]);
   6253   uint8_t *predictor;
   6254 #else
   6255   DECLARE_ALIGNED(16, uint8_t, predictor[32 * 32 * 3]);
   6256 #endif
   6257   DECLARE_ALIGNED(16, int16_t, src_diff[32 * 32]);
   6258   DECLARE_ALIGNED(16, tran_low_t, coeff[32 * 32]);
   6259   DECLARE_ALIGNED(16, tran_low_t, qcoeff[32 * 32]);
   6260   DECLARE_ALIGNED(16, tran_low_t, dqcoeff[32 * 32]);
   6261 
   6262   const TX_SIZE tx_size = max_txsize_lookup[bsize];
   6263   const int mi_height = num_8x8_blocks_high_lookup[bsize];
   6264   const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   6265   int64_t recon_error, sse;
   6266 #if CONFIG_NON_GREEDY_MV
   6267   int square_block_idx;
   6268 #endif
   6269 
   6270   // Setup scaling factor
   6271 #if CONFIG_VP9_HIGHBITDEPTH
   6272   vp9_setup_scale_factors_for_frame(
   6273       &sf, this_frame->y_crop_width, this_frame->y_crop_height,
   6274       this_frame->y_crop_width, this_frame->y_crop_height,
   6275       cpi->common.use_highbitdepth);
   6276 
   6277   if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH)
   6278     predictor = CONVERT_TO_BYTEPTR(predictor16);
   6279   else
   6280     predictor = predictor8;
   6281 #else
   6282   vp9_setup_scale_factors_for_frame(
   6283       &sf, this_frame->y_crop_width, this_frame->y_crop_height,
   6284       this_frame->y_crop_width, this_frame->y_crop_height);
   6285 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6286 
   6287   // Prepare reference frame pointers. If any reference frame slot is
   6288   // unavailable, the pointer will be set to Null.
   6289   for (idx = 0; idx < 3; ++idx) {
   6290     int rf_idx = gf_picture[frame_idx].ref_frame[idx];
   6291     if (rf_idx != -1) ref_frame[idx] = gf_picture[rf_idx].frame;
   6292   }
   6293 
   6294   xd->mi = cm->mi_grid_visible;
   6295   xd->mi[0] = cm->mi;
   6296   xd->cur_buf = this_frame;
   6297 
   6298   // Get rd multiplier set up.
   6299   rdmult = vp9_compute_rd_mult_based_on_qindex(cpi, tpl_frame->base_qindex);
   6300   set_error_per_bit(&cpi->td.mb, rdmult);
   6301   vp9_initialize_me_consts(cpi, &cpi->td.mb, tpl_frame->base_qindex);
   6302 
   6303   tpl_frame->is_valid = 1;
   6304 
   6305   cm->base_qindex = tpl_frame->base_qindex;
   6306   vp9_frame_init_quantizer(cpi);
   6307 
   6308 #if CONFIG_NON_GREEDY_MV
   6309   for (square_block_idx = 0; square_block_idx < SQUARE_BLOCK_SIZES;
   6310        ++square_block_idx) {
   6311     BLOCK_SIZE square_bsize = square_block_idx_to_bsize(square_block_idx);
   6312     build_motion_field(cpi, xd, frame_idx, ref_frame, square_bsize);
   6313   }
   6314 #endif
   6315 
   6316   for (mi_row = 0; mi_row < cm->mi_rows; mi_row += mi_height) {
   6317     for (mi_col = 0; mi_col < cm->mi_cols; mi_col += mi_width) {
   6318       mode_estimation(cpi, x, xd, &sf, gf_picture, frame_idx, tpl_frame,
   6319                       src_diff, coeff, qcoeff, dqcoeff, mi_row, mi_col, bsize,
   6320                       tx_size, ref_frame, predictor, &recon_error, &sse);
   6321       // Motion flow dependency dispenser.
   6322       tpl_model_store(tpl_frame->tpl_stats_ptr, mi_row, mi_col, bsize,
   6323                       tpl_frame->stride);
   6324 
   6325       tpl_model_update(cpi->tpl_stats, tpl_frame->tpl_stats_ptr, mi_row, mi_col,
   6326                        bsize);
   6327 #if CONFIG_NON_GREEDY_MV
   6328       {
   6329         int rf_idx;
   6330         TplDepStats *this_tpl_stats =
   6331             &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6332         for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   6333 #if RE_COMPUTE_MV_INCONSISTENCY
   6334           MV this_mv =
   6335               get_pyramid_mv(tpl_frame, rf_idx, bsize, mi_row, mi_col)->as_mv;
   6336           MV full_mv;
   6337           int_mv nb_full_mvs[NB_MVS_NUM];
   6338           vp9_prepare_nb_full_mvs(tpl_frame, mi_row, mi_col, rf_idx, bsize,
   6339                                   nb_full_mvs);
   6340           full_mv.row = this_mv.row >> 3;
   6341           full_mv.col = this_mv.col >> 3;
   6342           this_tpl_stats->mv_cost[rf_idx] =
   6343               vp9_nb_mvs_inconsistency(&full_mv, nb_full_mvs, NB_MVS_NUM);
   6344 #endif  // RE_COMPUTE_MV_INCONSISTENCY
   6345           tpl_frame->mv_dist_sum[rf_idx] += this_tpl_stats->mv_dist[rf_idx];
   6346           tpl_frame->mv_cost_sum[rf_idx] += this_tpl_stats->mv_cost[rf_idx];
   6347         }
   6348       }
   6349 #endif  // CONFIG_NON_GREEDY_MV
   6350     }
   6351   }
   6352 }
   6353 
   6354 #if CONFIG_NON_GREEDY_MV
   6355 #define DUMP_TPL_STATS 0
   6356 #if DUMP_TPL_STATS
   6357 static void dump_buf(uint8_t *buf, int stride, int row, int col, int h, int w) {
   6358   printf("%d %d\n", h, w);
   6359   for (int i = 0; i < h; ++i) {
   6360     for (int j = 0; j < w; ++j) {
   6361       printf("%d ", buf[(row + i) * stride + col + j]);
   6362     }
   6363   }
   6364   printf("\n");
   6365 }
   6366 
   6367 static void dump_frame_buf(const YV12_BUFFER_CONFIG *frame_buf) {
   6368   dump_buf(frame_buf->y_buffer, frame_buf->y_stride, 0, 0, frame_buf->y_height,
   6369            frame_buf->y_width);
   6370   dump_buf(frame_buf->u_buffer, frame_buf->uv_stride, 0, 0,
   6371            frame_buf->uv_height, frame_buf->uv_width);
   6372   dump_buf(frame_buf->v_buffer, frame_buf->uv_stride, 0, 0,
   6373            frame_buf->uv_height, frame_buf->uv_width);
   6374 }
   6375 
   6376 static void dump_tpl_stats(const VP9_COMP *cpi, int tpl_group_frames,
   6377                            const GF_PICTURE *gf_picture, BLOCK_SIZE bsize) {
   6378   int frame_idx;
   6379   const VP9_COMMON *cm = &cpi->common;
   6380   for (frame_idx = 1; frame_idx < tpl_group_frames; ++frame_idx) {
   6381     const TplDepFrame *tpl_frame = &cpi->tpl_stats[frame_idx];
   6382     int idx = 0;
   6383     int mi_row, mi_col;
   6384     int rf_idx;
   6385     const int mi_height = num_8x8_blocks_high_lookup[bsize];
   6386     const int mi_width = num_8x8_blocks_wide_lookup[bsize];
   6387     printf("=\n");
   6388     printf("frame_idx %d mi_rows %d mi_cols %d bsize %d\n", frame_idx,
   6389            cm->mi_rows, cm->mi_cols, mi_width * MI_SIZE);
   6390     for (mi_row = 0; mi_row < cm->mi_rows; ++mi_row) {
   6391       for (mi_col = 0; mi_col < cm->mi_cols; ++mi_col) {
   6392         if ((mi_row % mi_height) == 0 && (mi_col % mi_width) == 0) {
   6393           const TplDepStats *tpl_ptr =
   6394               &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6395           int_mv mv = *get_pyramid_mv(tpl_frame, idx, bsize, mi_row, mi_col);
   6396           printf("%d %d %d %d\n", mi_row, mi_col, mv.as_mv.row, mv.as_mv.col);
   6397         }
   6398       }
   6399     }
   6400 
   6401     dump_frame_buf(gf_picture[frame_idx].frame);
   6402 
   6403     for (mi_row = 0; mi_row < cm->mi_rows; ++mi_row) {
   6404       for (mi_col = 0; mi_col < cm->mi_cols; ++mi_col) {
   6405         if ((mi_row % mi_height) == 0 && (mi_col % mi_width) == 0) {
   6406           const TplDepStats *tpl_ptr =
   6407               &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
   6408           printf("%f ", tpl_ptr->feature_score);
   6409         }
   6410       }
   6411     }
   6412     printf("\n");
   6413 
   6414     rf_idx = gf_picture[frame_idx].ref_frame[idx];
   6415     printf("has_ref %d\n", rf_idx != -1);
   6416     if (rf_idx != -1) {
   6417       YV12_BUFFER_CONFIG *ref_frame_buf = gf_picture[rf_idx].frame;
   6418       dump_frame_buf(ref_frame_buf);
   6419     }
   6420   }
   6421 }
   6422 #endif  // DUMP_TPL_STATS
   6423 #endif  // CONFIG_NON_GREEDY_MV
   6424 
   6425 static void init_tpl_buffer(VP9_COMP *cpi) {
   6426   VP9_COMMON *cm = &cpi->common;
   6427   int frame;
   6428 
   6429   const int mi_cols = mi_cols_aligned_to_sb(cm->mi_cols);
   6430   const int mi_rows = mi_cols_aligned_to_sb(cm->mi_rows);
   6431 #if CONFIG_NON_GREEDY_MV
   6432   int sqr_bsize;
   6433   int rf_idx;
   6434 
   6435   // TODO(angiebird): This probably needs further modifications to support
   6436   // frame scaling later on.
   6437   if (cpi->feature_score_loc_alloc == 0) {
   6438     // The smallest block size of motion field is 4x4, but the mi_unit is 8x8,
   6439     // therefore the number of units is "mi_rows * mi_cols * 4" here.
   6440     CHECK_MEM_ERROR(
   6441         cm, cpi->feature_score_loc_arr,
   6442         vpx_calloc(mi_rows * mi_cols * 4, sizeof(*cpi->feature_score_loc_arr)));
   6443     CHECK_MEM_ERROR(cm, cpi->feature_score_loc_sort,
   6444                     vpx_calloc(mi_rows * mi_cols * 4,
   6445                                sizeof(*cpi->feature_score_loc_sort)));
   6446     CHECK_MEM_ERROR(cm, cpi->feature_score_loc_heap,
   6447                     vpx_calloc(mi_rows * mi_cols * 4,
   6448                                sizeof(*cpi->feature_score_loc_heap)));
   6449 
   6450     cpi->feature_score_loc_alloc = 1;
   6451   }
   6452 #endif
   6453 
   6454   // TODO(jingning): Reduce the actual memory use for tpl model build up.
   6455   for (frame = 0; frame < MAX_ARF_GOP_SIZE; ++frame) {
   6456     if (cpi->tpl_stats[frame].width >= mi_cols &&
   6457         cpi->tpl_stats[frame].height >= mi_rows &&
   6458         cpi->tpl_stats[frame].tpl_stats_ptr)
   6459       continue;
   6460 
   6461 #if CONFIG_NON_GREEDY_MV
   6462     vpx_free(cpi->tpl_stats[frame].pyramid_mv_arr);
   6463     for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
   6464       for (sqr_bsize = 0; sqr_bsize < SQUARE_BLOCK_SIZES; ++sqr_bsize) {
   6465         CHECK_MEM_ERROR(
   6466             cm, cpi->tpl_stats[frame].pyramid_mv_arr[rf_idx][sqr_bsize],
   6467             vpx_calloc(
   6468                 mi_rows * mi_cols,
   6469                 sizeof(
   6470                     *cpi->tpl_stats[frame].pyramid_mv_arr[rf_idx][sqr_bsize])));
   6471       }
   6472     }
   6473 #endif
   6474     vpx_free(cpi->tpl_stats[frame].tpl_stats_ptr);
   6475     CHECK_MEM_ERROR(cm, cpi->tpl_stats[frame].tpl_stats_ptr,
   6476                     vpx_calloc(mi_rows * mi_cols,
   6477                                sizeof(*cpi->tpl_stats[frame].tpl_stats_ptr)));
   6478     cpi->tpl_stats[frame].is_valid = 0;
   6479     cpi->tpl_stats[frame].width = mi_cols;
   6480     cpi->tpl_stats[frame].height = mi_rows;
   6481     cpi->tpl_stats[frame].stride = mi_cols;
   6482     cpi->tpl_stats[frame].mi_rows = cm->mi_rows;
   6483     cpi->tpl_stats[frame].mi_cols = cm->mi_cols;
   6484   }
   6485 
   6486   for (frame = 0; frame < REF_FRAMES; ++frame) {
   6487     cpi->enc_frame_buf[frame].mem_valid = 0;
   6488     cpi->enc_frame_buf[frame].released = 1;
   6489   }
   6490 }
   6491 
   6492 static void setup_tpl_stats(VP9_COMP *cpi) {
   6493   GF_PICTURE gf_picture[MAX_ARF_GOP_SIZE];
   6494   const GF_GROUP *gf_group = &cpi->twopass.gf_group;
   6495   int tpl_group_frames = 0;
   6496   int frame_idx;
   6497   const BLOCK_SIZE bsize = BLOCK_32X32;
   6498 
   6499   init_gop_frames(cpi, gf_picture, gf_group, &tpl_group_frames);
   6500 
   6501   init_tpl_stats(cpi);
   6502 
   6503   // Backward propagation from tpl_group_frames to 1.
   6504   for (frame_idx = tpl_group_frames - 1; frame_idx > 0; --frame_idx) {
   6505     if (gf_picture[frame_idx].update_type == USE_BUF_FRAME) continue;
   6506     mc_flow_dispenser(cpi, gf_picture, frame_idx, bsize);
   6507   }
   6508 #if CONFIG_NON_GREEDY_MV
   6509 #if DUMP_TPL_STATS
   6510   dump_tpl_stats(cpi, tpl_group_frames, gf_picture, bsize);
   6511 #endif  // DUMP_TPL_STATS
   6512 #endif  // CONFIG_NON_GREEDY_MV
   6513 }
   6514 
   6515 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
   6516                             size_t *size, uint8_t *dest, int64_t *time_stamp,
   6517                             int64_t *time_end, int flush) {
   6518   const VP9EncoderConfig *const oxcf = &cpi->oxcf;
   6519   VP9_COMMON *const cm = &cpi->common;
   6520   BufferPool *const pool = cm->buffer_pool;
   6521   RATE_CONTROL *const rc = &cpi->rc;
   6522   struct vpx_usec_timer cmptimer;
   6523   YV12_BUFFER_CONFIG *force_src_buffer = NULL;
   6524   struct lookahead_entry *last_source = NULL;
   6525   struct lookahead_entry *source = NULL;
   6526   int arf_src_index;
   6527   const int gf_group_index = cpi->twopass.gf_group.index;
   6528   int i;
   6529 
   6530   if (is_one_pass_cbr_svc(cpi)) {
   6531     vp9_one_pass_cbr_svc_start_layer(cpi);
   6532   }
   6533 
   6534   vpx_usec_timer_start(&cmptimer);
   6535 
   6536   vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
   6537 
   6538   // Is multi-arf enabled.
   6539   // Note that at the moment multi_arf is only configured for 2 pass VBR and
   6540   // will not work properly with svc.
   6541   // Enable the Jingning's new "multi_layer_arf" code if "enable_auto_arf"
   6542   // is greater than or equal to 2.
   6543   if ((oxcf->pass == 2) && !cpi->use_svc && (cpi->oxcf.enable_auto_arf >= 2))
   6544     cpi->multi_layer_arf = 1;
   6545   else
   6546     cpi->multi_layer_arf = 0;
   6547 
   6548   // Normal defaults
   6549   cm->reset_frame_context = 0;
   6550   cm->refresh_frame_context = 1;
   6551   if (!is_one_pass_cbr_svc(cpi)) {
   6552     cpi->refresh_last_frame = 1;
   6553     cpi->refresh_golden_frame = 0;
   6554     cpi->refresh_alt_ref_frame = 0;
   6555   }
   6556 
   6557   // Should we encode an arf frame.
   6558   arf_src_index = get_arf_src_index(cpi);
   6559 
   6560   if (arf_src_index) {
   6561     for (i = 0; i <= arf_src_index; ++i) {
   6562       struct lookahead_entry *e = vp9_lookahead_peek(cpi->lookahead, i);
   6563       // Avoid creating an alt-ref if there's a forced keyframe pending.
   6564       if (e == NULL) {
   6565         break;
   6566       } else if (e->flags == VPX_EFLAG_FORCE_KF) {
   6567         arf_src_index = 0;
   6568         flush = 1;
   6569         break;
   6570       }
   6571     }
   6572   }
   6573 
   6574   // Clear arf index stack before group of pictures processing starts.
   6575   if (gf_group_index == 1) {
   6576     stack_init(cpi->twopass.gf_group.arf_index_stack, MAX_LAG_BUFFERS * 2);
   6577     cpi->twopass.gf_group.stack_size = 0;
   6578   }
   6579 
   6580   if (arf_src_index) {
   6581     assert(arf_src_index <= rc->frames_to_key);
   6582     if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) {
   6583       cpi->alt_ref_source = source;
   6584 
   6585 #if !CONFIG_REALTIME_ONLY
   6586       if ((oxcf->mode != REALTIME) && (oxcf->arnr_max_frames > 0) &&
   6587           (oxcf->arnr_strength > 0)) {
   6588         int bitrate = cpi->rc.avg_frame_bandwidth / 40;
   6589         int not_low_bitrate = bitrate > ALT_REF_AQ_LOW_BITRATE_BOUNDARY;
   6590 
   6591         int not_last_frame = (cpi->lookahead->sz - arf_src_index > 1);
   6592         not_last_frame |= ALT_REF_AQ_APPLY_TO_LAST_FRAME;
   6593 
   6594         // Produce the filtered ARF frame.
   6595         vp9_temporal_filter(cpi, arf_src_index);
   6596         vpx_extend_frame_borders(&cpi->alt_ref_buffer);
   6597 
   6598         // for small bitrates segmentation overhead usually
   6599         // eats all bitrate gain from enabling delta quantizers
   6600         if (cpi->oxcf.alt_ref_aq != 0 && not_low_bitrate && not_last_frame)
   6601           vp9_alt_ref_aq_setup_mode(cpi->alt_ref_aq, cpi);
   6602 
   6603         force_src_buffer = &cpi->alt_ref_buffer;
   6604       }
   6605 #endif
   6606       cm->show_frame = 0;
   6607       cm->intra_only = 0;
   6608       cpi->refresh_alt_ref_frame = 1;
   6609       cpi->refresh_golden_frame = 0;
   6610       cpi->refresh_last_frame = 0;
   6611       rc->is_src_frame_alt_ref = 0;
   6612       rc->source_alt_ref_pending = 0;
   6613     } else {
   6614       rc->source_alt_ref_pending = 0;
   6615     }
   6616   }
   6617 
   6618   if (!source) {
   6619     // Get last frame source.
   6620     if (cm->current_video_frame > 0) {
   6621       if ((last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
   6622         return -1;
   6623     }
   6624 
   6625     // Read in the source frame.
   6626     if (cpi->use_svc || cpi->svc.set_intra_only_frame)
   6627       source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
   6628     else
   6629       source = vp9_lookahead_pop(cpi->lookahead, flush);
   6630 
   6631     if (source != NULL) {
   6632       cm->show_frame = 1;
   6633       cm->intra_only = 0;
   6634       // if the flags indicate intra frame, but if the current picture is for
   6635       // non-zero spatial layer, it should not be an intra picture.
   6636       if ((source->flags & VPX_EFLAG_FORCE_KF) && cpi->use_svc &&
   6637           cpi->svc.spatial_layer_id > 0) {
   6638         source->flags &= ~(unsigned int)(VPX_EFLAG_FORCE_KF);
   6639       }
   6640 
   6641       // Check to see if the frame should be encoded as an arf overlay.
   6642       check_src_altref(cpi, source);
   6643     }
   6644   }
   6645 
   6646   if (source) {
   6647     cpi->un_scaled_source = cpi->Source =
   6648         force_src_buffer ? force_src_buffer : &source->img;
   6649 
   6650 #ifdef ENABLE_KF_DENOISE
   6651     // Copy of raw source for metrics calculation.
   6652     if (is_psnr_calc_enabled(cpi))
   6653       vp9_copy_and_extend_frame(cpi->Source, &cpi->raw_unscaled_source);
   6654 #endif
   6655 
   6656     cpi->unscaled_last_source = last_source != NULL ? &last_source->img : NULL;
   6657 
   6658     *time_stamp = source->ts_start;
   6659     *time_end = source->ts_end;
   6660     *frame_flags = (source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
   6661   } else {
   6662     *size = 0;
   6663 #if !CONFIG_REALTIME_ONLY
   6664     if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) {
   6665       vp9_end_first_pass(cpi); /* get last stats packet */
   6666       cpi->twopass.first_pass_done = 1;
   6667     }
   6668 #endif  // !CONFIG_REALTIME_ONLY
   6669     return -1;
   6670   }
   6671 
   6672   if (source->ts_start < cpi->first_time_stamp_ever) {
   6673     cpi->first_time_stamp_ever = source->ts_start;
   6674     cpi->last_end_time_stamp_seen = source->ts_start;
   6675   }
   6676 
   6677   // Clear down mmx registers
   6678   vpx_clear_system_state();
   6679 
   6680   // adjust frame rates based on timestamps given
   6681   if (cm->show_frame) {
   6682     if (cpi->use_svc && cpi->svc.use_set_ref_frame_config &&
   6683         cpi->svc.duration[cpi->svc.spatial_layer_id] > 0)
   6684       vp9_svc_adjust_frame_rate(cpi);
   6685     else
   6686       adjust_frame_rate(cpi, source);
   6687   }
   6688 
   6689   if (is_one_pass_cbr_svc(cpi)) {
   6690     vp9_update_temporal_layer_framerate(cpi);
   6691     vp9_restore_layer_context(cpi);
   6692   }
   6693 
   6694   // Find a free buffer for the new frame, releasing the reference previously
   6695   // held.
   6696   if (cm->new_fb_idx != INVALID_IDX) {
   6697     --pool->frame_bufs[cm->new_fb_idx].ref_count;
   6698   }
   6699   cm->new_fb_idx = get_free_fb(cm);
   6700 
   6701   if (cm->new_fb_idx == INVALID_IDX) return -1;
   6702 
   6703   cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx];
   6704 
   6705   // Start with a 0 size frame.
   6706   *size = 0;
   6707 
   6708   cpi->frame_flags = *frame_flags;
   6709 
   6710 #if !CONFIG_REALTIME_ONLY
   6711   if ((oxcf->pass == 2) && !cpi->use_svc) {
   6712     vp9_rc_get_second_pass_params(cpi);
   6713   } else if (oxcf->pass == 1) {
   6714     set_frame_size(cpi);
   6715   }
   6716 #endif  // !CONFIG_REALTIME_ONLY
   6717 
   6718   if (oxcf->pass != 1 && cpi->level_constraint.level_index >= 0 &&
   6719       cpi->level_constraint.fail_flag == 0)
   6720     level_rc_framerate(cpi, arf_src_index);
   6721 
   6722   if (cpi->oxcf.pass != 0 || cpi->use_svc || frame_is_intra_only(cm) == 1) {
   6723     for (i = 0; i < REFS_PER_FRAME; ++i) cpi->scaled_ref_idx[i] = INVALID_IDX;
   6724   }
   6725 
   6726   if (gf_group_index == 1 &&
   6727       cpi->twopass.gf_group.update_type[gf_group_index] == ARF_UPDATE &&
   6728       cpi->sf.enable_tpl_model) {
   6729     init_tpl_buffer(cpi);
   6730     vp9_estimate_qp_gop(cpi);
   6731     setup_tpl_stats(cpi);
   6732   }
   6733 
   6734   cpi->td.mb.fp_src_pred = 0;
   6735 #if CONFIG_REALTIME_ONLY
   6736   if (cpi->use_svc) {
   6737     SvcEncode(cpi, size, dest, frame_flags);
   6738   } else {
   6739     // One pass encode
   6740     Pass0Encode(cpi, size, dest, frame_flags);
   6741   }
   6742 #else  // !CONFIG_REALTIME_ONLY
   6743   if (oxcf->pass == 1 && !cpi->use_svc) {
   6744     const int lossless = is_lossless_requested(oxcf);
   6745 #if CONFIG_VP9_HIGHBITDEPTH
   6746     if (cpi->oxcf.use_highbitdepth)
   6747       cpi->td.mb.fwd_txfm4x4 =
   6748           lossless ? vp9_highbd_fwht4x4 : vpx_highbd_fdct4x4;
   6749     else
   6750       cpi->td.mb.fwd_txfm4x4 = lossless ? vp9_fwht4x4 : vpx_fdct4x4;
   6751     cpi->td.mb.highbd_inv_txfm_add =
   6752         lossless ? vp9_highbd_iwht4x4_add : vp9_highbd_idct4x4_add;
   6753 #else
   6754     cpi->td.mb.fwd_txfm4x4 = lossless ? vp9_fwht4x4 : vpx_fdct4x4;
   6755 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6756     cpi->td.mb.inv_txfm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
   6757     vp9_first_pass(cpi, source);
   6758   } else if (oxcf->pass == 2 && !cpi->use_svc) {
   6759     Pass2Encode(cpi, size, dest, frame_flags);
   6760   } else if (cpi->use_svc) {
   6761     SvcEncode(cpi, size, dest, frame_flags);
   6762   } else {
   6763     // One pass encode
   6764     Pass0Encode(cpi, size, dest, frame_flags);
   6765   }
   6766 #endif  // CONFIG_REALTIME_ONLY
   6767 
   6768   if (cm->show_frame) cm->cur_show_frame_fb_idx = cm->new_fb_idx;
   6769 
   6770   if (cm->refresh_frame_context)
   6771     cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
   6772 
   6773   // No frame encoded, or frame was dropped, release scaled references.
   6774   if ((*size == 0) && (frame_is_intra_only(cm) == 0)) {
   6775     release_scaled_references(cpi);
   6776   }
   6777 
   6778   if (*size > 0) {
   6779     cpi->droppable = !frame_is_reference(cpi);
   6780   }
   6781 
   6782   // Save layer specific state.
   6783   if (is_one_pass_cbr_svc(cpi) || ((cpi->svc.number_temporal_layers > 1 ||
   6784                                     cpi->svc.number_spatial_layers > 1) &&
   6785                                    oxcf->pass == 2)) {
   6786     vp9_save_layer_context(cpi);
   6787   }
   6788 
   6789   vpx_usec_timer_mark(&cmptimer);
   6790   cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
   6791 
   6792   // Should we calculate metrics for the frame.
   6793   if (is_psnr_calc_enabled(cpi)) generate_psnr_packet(cpi);
   6794 
   6795   if (cpi->keep_level_stats && oxcf->pass != 1)
   6796     update_level_info(cpi, size, arf_src_index);
   6797 
   6798 #if CONFIG_INTERNAL_STATS
   6799 
   6800   if (oxcf->pass != 1) {
   6801     double samples = 0.0;
   6802     cpi->bytes += (int)(*size);
   6803 
   6804     if (cm->show_frame) {
   6805       uint32_t bit_depth = 8;
   6806       uint32_t in_bit_depth = 8;
   6807       cpi->count++;
   6808 #if CONFIG_VP9_HIGHBITDEPTH
   6809       if (cm->use_highbitdepth) {
   6810         in_bit_depth = cpi->oxcf.input_bit_depth;
   6811         bit_depth = cm->bit_depth;
   6812       }
   6813 #endif
   6814 
   6815       if (cpi->b_calculate_psnr) {
   6816         YV12_BUFFER_CONFIG *orig = cpi->raw_source_frame;
   6817         YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
   6818         YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
   6819         PSNR_STATS psnr;
   6820 #if CONFIG_VP9_HIGHBITDEPTH
   6821         vpx_calc_highbd_psnr(orig, recon, &psnr, cpi->td.mb.e_mbd.bd,
   6822                              in_bit_depth);
   6823 #else
   6824         vpx_calc_psnr(orig, recon, &psnr);
   6825 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6826 
   6827         adjust_image_stat(psnr.psnr[1], psnr.psnr[2], psnr.psnr[3],
   6828                           psnr.psnr[0], &cpi->psnr);
   6829         cpi->total_sq_error += psnr.sse[0];
   6830         cpi->total_samples += psnr.samples[0];
   6831         samples = psnr.samples[0];
   6832 
   6833         {
   6834           PSNR_STATS psnr2;
   6835           double frame_ssim2 = 0, weight = 0;
   6836 #if CONFIG_VP9_POSTPROC
   6837           if (vpx_alloc_frame_buffer(
   6838                   pp, recon->y_crop_width, recon->y_crop_height,
   6839                   cm->subsampling_x, cm->subsampling_y,
   6840 #if CONFIG_VP9_HIGHBITDEPTH
   6841                   cm->use_highbitdepth,
   6842 #endif
   6843                   VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment) < 0) {
   6844             vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
   6845                                "Failed to allocate post processing buffer");
   6846           }
   6847           {
   6848             vp9_ppflags_t ppflags;
   6849             ppflags.post_proc_flag = VP9D_DEBLOCK;
   6850             ppflags.deblocking_level = 0;  // not used in vp9_post_proc_frame()
   6851             ppflags.noise_level = 0;       // not used in vp9_post_proc_frame()
   6852             vp9_post_proc_frame(cm, pp, &ppflags,
   6853                                 cpi->un_scaled_source->y_width);
   6854           }
   6855 #endif
   6856           vpx_clear_system_state();
   6857 
   6858 #if CONFIG_VP9_HIGHBITDEPTH
   6859           vpx_calc_highbd_psnr(orig, pp, &psnr2, cpi->td.mb.e_mbd.bd,
   6860                                cpi->oxcf.input_bit_depth);
   6861 #else
   6862           vpx_calc_psnr(orig, pp, &psnr2);
   6863 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6864 
   6865           cpi->totalp_sq_error += psnr2.sse[0];
   6866           cpi->totalp_samples += psnr2.samples[0];
   6867           adjust_image_stat(psnr2.psnr[1], psnr2.psnr[2], psnr2.psnr[3],
   6868                             psnr2.psnr[0], &cpi->psnrp);
   6869 
   6870 #if CONFIG_VP9_HIGHBITDEPTH
   6871           if (cm->use_highbitdepth) {
   6872             frame_ssim2 = vpx_highbd_calc_ssim(orig, recon, &weight, bit_depth,
   6873                                                in_bit_depth);
   6874           } else {
   6875             frame_ssim2 = vpx_calc_ssim(orig, recon, &weight);
   6876           }
   6877 #else
   6878           frame_ssim2 = vpx_calc_ssim(orig, recon, &weight);
   6879 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6880 
   6881           cpi->worst_ssim = VPXMIN(cpi->worst_ssim, frame_ssim2);
   6882           cpi->summed_quality += frame_ssim2 * weight;
   6883           cpi->summed_weights += weight;
   6884 
   6885 #if CONFIG_VP9_HIGHBITDEPTH
   6886           if (cm->use_highbitdepth) {
   6887             frame_ssim2 = vpx_highbd_calc_ssim(orig, pp, &weight, bit_depth,
   6888                                                in_bit_depth);
   6889           } else {
   6890             frame_ssim2 = vpx_calc_ssim(orig, pp, &weight);
   6891           }
   6892 #else
   6893           frame_ssim2 = vpx_calc_ssim(orig, pp, &weight);
   6894 #endif  // CONFIG_VP9_HIGHBITDEPTH
   6895 
   6896           cpi->summedp_quality += frame_ssim2 * weight;
   6897           cpi->summedp_weights += weight;
   6898 #if 0
   6899           if (cm->show_frame) {
   6900             FILE *f = fopen("q_used.stt", "a");
   6901             fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
   6902                     cpi->common.current_video_frame, psnr2.psnr[1],
   6903                     psnr2.psnr[2], psnr2.psnr[3], psnr2.psnr[0], frame_ssim2);
   6904             fclose(f);
   6905           }
   6906 #endif
   6907         }
   6908       }
   6909       if (cpi->b_calculate_blockiness) {
   6910 #if CONFIG_VP9_HIGHBITDEPTH
   6911         if (!cm->use_highbitdepth)
   6912 #endif
   6913         {
   6914           double frame_blockiness = vp9_get_blockiness(
   6915               cpi->Source->y_buffer, cpi->Source->y_stride,
   6916               cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride,
   6917               cpi->Source->y_width, cpi->Source->y_height);
   6918           cpi->worst_blockiness =
   6919               VPXMAX(cpi->worst_blockiness, frame_blockiness);
   6920           cpi->total_blockiness += frame_blockiness;
   6921         }
   6922       }
   6923 
   6924       if (cpi->b_calculate_consistency) {
   6925 #if CONFIG_VP9_HIGHBITDEPTH
   6926         if (!cm->use_highbitdepth)
   6927 #endif
   6928         {
   6929           double this_inconsistency = vpx_get_ssim_metrics(
   6930               cpi->Source->y_buffer, cpi->Source->y_stride,
   6931               cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride,
   6932               cpi->Source->y_width, cpi->Source->y_height, cpi->ssim_vars,
   6933               &cpi->metrics, 1);
   6934 
   6935           const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1);
   6936           double consistency =
   6937               vpx_sse_to_psnr(samples, peak, (double)cpi->total_inconsistency);
   6938           if (consistency > 0.0)
   6939             cpi->worst_consistency =
   6940                 VPXMIN(cpi->worst_consistency, consistency);
   6941           cpi->total_inconsistency += this_inconsistency;
   6942         }
   6943       }
   6944 
   6945       {
   6946         double y, u, v, frame_all;
   6947         frame_all = vpx_calc_fastssim(cpi->Source, cm->frame_to_show, &y, &u,
   6948                                       &v, bit_depth, in_bit_depth);
   6949         adjust_image_stat(y, u, v, frame_all, &cpi->fastssim);
   6950       }
   6951       {
   6952         double y, u, v, frame_all;
   6953         frame_all = vpx_psnrhvs(cpi->Source, cm->frame_to_show, &y, &u, &v,
   6954                                 bit_depth, in_bit_depth);
   6955         adjust_image_stat(y, u, v, frame_all, &cpi->psnrhvs);
   6956       }
   6957     }
   6958   }
   6959 
   6960 #endif
   6961 
   6962   if (is_one_pass_cbr_svc(cpi)) {
   6963     if (cm->show_frame) {
   6964       ++cpi->svc.spatial_layer_to_encode;
   6965       if (cpi->svc.spatial_layer_to_encode >= cpi->svc.number_spatial_layers)
   6966         cpi->svc.spatial_layer_to_encode = 0;
   6967     }
   6968   }
   6969 
   6970   vpx_clear_system_state();
   6971   return 0;
   6972 }
   6973 
   6974 int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
   6975                               vp9_ppflags_t *flags) {
   6976   VP9_COMMON *cm = &cpi->common;
   6977 #if !CONFIG_VP9_POSTPROC
   6978   (void)flags;
   6979 #endif
   6980 
   6981   if (!cm->show_frame) {
   6982     return -1;
   6983   } else {
   6984     int ret;
   6985 #if CONFIG_VP9_POSTPROC
   6986     ret = vp9_post_proc_frame(cm, dest, flags, cpi->un_scaled_source->y_width);
   6987 #else
   6988     if (cm->frame_to_show) {
   6989       *dest = *cm->frame_to_show;
   6990       dest->y_width = cm->width;
   6991       dest->y_height = cm->height;
   6992       dest->uv_width = cm->width >> cm->subsampling_x;
   6993       dest->uv_height = cm->height >> cm->subsampling_y;
   6994       ret = 0;
   6995     } else {
   6996       ret = -1;
   6997     }
   6998 #endif  // !CONFIG_VP9_POSTPROC
   6999     vpx_clear_system_state();
   7000     return ret;
   7001   }
   7002 }
   7003 
   7004 int vp9_set_internal_size(VP9_COMP *cpi, VPX_SCALING horiz_mode,
   7005                           VPX_SCALING vert_mode) {
   7006   VP9_COMMON *cm = &cpi->common;
   7007   int hr = 0, hs = 0, vr = 0, vs = 0;
   7008 
   7009   if (horiz_mode > ONETWO || vert_mode > ONETWO) return -1;
   7010 
   7011   Scale2Ratio(horiz_mode, &hr, &hs);
   7012   Scale2Ratio(vert_mode, &vr, &vs);
   7013 
   7014   // always go to the next whole number
   7015   cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
   7016   cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
   7017   if (cm->current_video_frame) {
   7018     assert(cm->width <= cpi->initial_width);
   7019     assert(cm->height <= cpi->initial_height);
   7020   }
   7021 
   7022   update_frame_size(cpi);
   7023 
   7024   return 0;
   7025 }
   7026 
   7027 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
   7028                          unsigned int height) {
   7029   VP9_COMMON *cm = &cpi->common;
   7030 #if CONFIG_VP9_HIGHBITDEPTH
   7031   check_initial_width(cpi, cm->use_highbitdepth, 1, 1);
   7032 #else
   7033   check_initial_width(cpi, 1, 1);
   7034 #endif  // CONFIG_VP9_HIGHBITDEPTH
   7035 
   7036 #if CONFIG_VP9_TEMPORAL_DENOISING
   7037   setup_denoiser_buffer(cpi);
   7038 #endif
   7039 
   7040   if (width) {
   7041     cm->width = width;
   7042     if (cm->width > cpi->initial_width) {
   7043       cm->width = cpi->initial_width;
   7044       printf("Warning: Desired width too large, changed to %d\n", cm->width);
   7045     }
   7046   }
   7047 
   7048   if (height) {
   7049     cm->height = height;
   7050     if (cm->height > cpi->initial_height) {
   7051       cm->height = cpi->initial_height;
   7052       printf("Warning: Desired height too large, changed to %d\n", cm->height);
   7053     }
   7054   }
   7055   assert(cm->width <= cpi->initial_width);
   7056   assert(cm->height <= cpi->initial_height);
   7057 
   7058   update_frame_size(cpi);
   7059 
   7060   return 0;
   7061 }
   7062 
   7063 void vp9_set_svc(VP9_COMP *cpi, int use_svc) {
   7064   cpi->use_svc = use_svc;
   7065   return;
   7066 }
   7067 
   7068 int vp9_get_quantizer(VP9_COMP *cpi) { return cpi->common.base_qindex; }
   7069 
   7070 void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) {
   7071   if (flags &
   7072       (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF)) {
   7073     int ref = 7;
   7074 
   7075     if (flags & VP8_EFLAG_NO_REF_LAST) ref ^= VP9_LAST_FLAG;
   7076 
   7077     if (flags & VP8_EFLAG_NO_REF_GF) ref ^= VP9_GOLD_FLAG;
   7078 
   7079     if (flags & VP8_EFLAG_NO_REF_ARF) ref ^= VP9_ALT_FLAG;
   7080 
   7081     vp9_use_as_reference(cpi, ref);
   7082   }
   7083 
   7084   if (flags &
   7085       (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
   7086        VP8_EFLAG_FORCE_GF | VP8_EFLAG_FORCE_ARF)) {
   7087     int upd = 7;
   7088 
   7089     if (flags & VP8_EFLAG_NO_UPD_LAST) upd ^= VP9_LAST_FLAG;
   7090 
   7091     if (flags & VP8_EFLAG_NO_UPD_GF) upd ^= VP9_GOLD_FLAG;
   7092 
   7093     if (flags & VP8_EFLAG_NO_UPD_ARF) upd ^= VP9_ALT_FLAG;
   7094 
   7095     vp9_update_reference(cpi, upd);
   7096   }
   7097 
   7098   if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
   7099     vp9_update_entropy(cpi, 0);
   7100   }
   7101 }
   7102 
   7103 void vp9_set_row_mt(VP9_COMP *cpi) {
   7104   // Enable row based multi-threading for supported modes of encoding
   7105   cpi->row_mt = 0;
   7106   if (((cpi->oxcf.mode == GOOD || cpi->oxcf.mode == BEST) &&
   7107        cpi->oxcf.speed < 5 && cpi->oxcf.pass == 1) &&
   7108       cpi->oxcf.row_mt && !cpi->use_svc)
   7109     cpi->row_mt = 1;
   7110 
   7111   if (cpi->oxcf.mode == GOOD && cpi->oxcf.speed < 5 &&
   7112       (cpi->oxcf.pass == 0 || cpi->oxcf.pass == 2) && cpi->oxcf.row_mt &&
   7113       !cpi->use_svc)
   7114     cpi->row_mt = 1;
   7115 
   7116   // In realtime mode, enable row based multi-threading for all the speed levels
   7117   // where non-rd path is used.
   7118   if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt) {
   7119     cpi->row_mt = 1;
   7120   }
   7121 
   7122   if (cpi->row_mt)
   7123     cpi->row_mt_bit_exact = 1;
   7124   else
   7125     cpi->row_mt_bit_exact = 0;
   7126 }
   7127