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