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 "vpx_config.h"
     12 #include "./vpx_scale_rtcd.h"
     13 #include "./vpx_dsp_rtcd.h"
     14 #include "./vp8_rtcd.h"
     15 #include "vp8/common/onyxc_int.h"
     16 #include "vp8/common/blockd.h"
     17 #include "onyx_int.h"
     18 #include "vp8/common/systemdependent.h"
     19 #include "vp8/encoder/quantize.h"
     20 #include "vp8/common/alloccommon.h"
     21 #include "mcomp.h"
     22 #include "firstpass.h"
     23 #include "vpx_dsp/psnr.h"
     24 #include "vpx_scale/vpx_scale.h"
     25 #include "vp8/common/extend.h"
     26 #include "ratectrl.h"
     27 #include "vp8/common/quant_common.h"
     28 #include "segmentation.h"
     29 #if CONFIG_POSTPROC
     30 #include "vp8/common/postproc.h"
     31 #endif
     32 #include "vpx_mem/vpx_mem.h"
     33 #include "vp8/common/reconintra.h"
     34 #include "vp8/common/swapyv12buffer.h"
     35 #include "vp8/common/threading.h"
     36 #include "vpx_ports/system_state.h"
     37 #include "vpx_ports/vpx_timer.h"
     38 #if ARCH_ARM
     39 #include "vpx_ports/arm.h"
     40 #endif
     41 #if CONFIG_MULTI_RES_ENCODING
     42 #include "mr_dissim.h"
     43 #endif
     44 #include "encodeframe.h"
     45 
     46 #include <assert.h>
     47 #include <math.h>
     48 #include <stdio.h>
     49 #include <limits.h>
     50 
     51 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
     52 extern int vp8_update_coef_context(VP8_COMP *cpi);
     53 extern void vp8_update_coef_probs(VP8_COMP *cpi);
     54 #endif
     55 
     56 extern void vp8cx_pick_filter_level_fast(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
     57 extern void vp8cx_set_alt_lf_level(VP8_COMP *cpi, int filt_val);
     58 extern void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi);
     59 
     60 extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source,
     61                               YV12_BUFFER_CONFIG *post, int filt_lvl,
     62                               int low_var_thresh, int flag);
     63 extern void print_parms(VP8_CONFIG *ocf, char *filenam);
     64 extern unsigned int vp8_get_processor_freq();
     65 extern void print_tree_update_probs();
     66 extern int vp8cx_create_encoder_threads(VP8_COMP *cpi);
     67 extern void vp8cx_remove_encoder_threads(VP8_COMP *cpi);
     68 
     69 int vp8_estimate_entropy_savings(VP8_COMP *cpi);
     70 
     71 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest);
     72 
     73 extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi, int distance);
     74 
     75 static void set_default_lf_deltas(VP8_COMP *cpi);
     76 
     77 extern const int vp8_gf_interval_table[101];
     78 
     79 #if CONFIG_INTERNAL_STATS
     80 #include "math.h"
     81 #include "vpx_dsp/ssim.h"
     82 #endif
     83 
     84 #ifdef OUTPUT_YUV_SRC
     85 FILE *yuv_file;
     86 #endif
     87 #ifdef OUTPUT_YUV_DENOISED
     88 FILE *yuv_denoised_file;
     89 #endif
     90 
     91 #if 0
     92 FILE *framepsnr;
     93 FILE *kf_list;
     94 FILE *keyfile;
     95 #endif
     96 
     97 #if 0
     98 extern int skip_true_count;
     99 extern int skip_false_count;
    100 #endif
    101 
    102 #ifdef VP8_ENTROPY_STATS
    103 extern int intra_mode_stats[10][10][10];
    104 #endif
    105 
    106 #ifdef SPEEDSTATS
    107 unsigned int frames_at_speed[16] = { 0, 0, 0, 0, 0, 0, 0, 0,
    108                                      0, 0, 0, 0, 0, 0, 0, 0 };
    109 unsigned int tot_pm = 0;
    110 unsigned int cnt_pm = 0;
    111 unsigned int tot_ef = 0;
    112 unsigned int cnt_ef = 0;
    113 #endif
    114 
    115 #ifdef MODE_STATS
    116 extern unsigned __int64 Sectionbits[50];
    117 extern int y_modes[5];
    118 extern int uv_modes[4];
    119 extern int b_modes[10];
    120 
    121 extern int inter_y_modes[10];
    122 extern int inter_uv_modes[4];
    123 extern unsigned int inter_b_modes[15];
    124 #endif
    125 
    126 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
    127 
    128 extern const int qrounding_factors[129];
    129 extern const int qzbin_factors[129];
    130 extern void vp8cx_init_quantizer(VP8_COMP *cpi);
    131 extern const int vp8cx_base_skip_false_prob[128];
    132 
    133 /* Tables relating active max Q to active min Q */
    134 static const unsigned char kf_low_motion_minq[QINDEX_RANGE] = {
    135   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    136   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    137   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
    138   1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  4,  4,  4,  5,  5,  5,
    139   5,  5,  6,  6,  6,  6,  7,  7,  8,  8,  8,  8,  9,  9,  10, 10, 10, 10, 11,
    140   11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
    141   17, 17, 18, 18, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23
    142 };
    143 static const unsigned char kf_high_motion_minq[QINDEX_RANGE] = {
    144   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    145   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,
    146   1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  5,
    147   5,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  8,  8,  8,  8,  9,  9,  10, 10,
    148   10, 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 15, 16,
    149   16, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
    150   22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30
    151 };
    152 static const unsigned char gf_low_motion_minq[QINDEX_RANGE] = {
    153   0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,
    154   3,  4,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,
    155   8,  8,  9,  9,  9,  9,  10, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15,
    156   15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
    157   25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34,
    158   34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44,
    159   45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58
    160 };
    161 static const unsigned char gf_mid_motion_minq[QINDEX_RANGE] = {
    162   0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  2,  2,  3,  3,  3,  4,  4,  4,  5,
    163   5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  10, 10, 10, 10, 11,
    164   11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18,
    165   18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
    166   28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37,
    167   37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50,
    168   51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
    169 };
    170 static const unsigned char gf_high_motion_minq[QINDEX_RANGE] = {
    171   0,  0,  0,  0,  1,  1,  1,  1,  1,  2,  2,  2,  3,  3,  3,  4,  4,  4,  5,
    172   5,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,  9,  10, 10, 10, 11, 11,
    173   12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21,
    174   21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30,
    175   31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40,
    176   40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
    177   57, 58, 59, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80
    178 };
    179 static const unsigned char inter_minq[QINDEX_RANGE] = {
    180   0,  0,  1,  1,  2,  3,  3,  4,  4,  5,  6,  6,  7,  8,  8,  9,  9,  10, 11,
    181   11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24,
    182   24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38,
    183   39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53,
    184   54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69,
    185   70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86,
    186   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
    187 };
    188 
    189 #ifdef PACKET_TESTING
    190 extern FILE *vpxlogc;
    191 #endif
    192 
    193 static void save_layer_context(VP8_COMP *cpi) {
    194   LAYER_CONTEXT *lc = &cpi->layer_context[cpi->current_layer];
    195 
    196   /* Save layer dependent coding state */
    197   lc->target_bandwidth = cpi->target_bandwidth;
    198   lc->starting_buffer_level = cpi->oxcf.starting_buffer_level;
    199   lc->optimal_buffer_level = cpi->oxcf.optimal_buffer_level;
    200   lc->maximum_buffer_size = cpi->oxcf.maximum_buffer_size;
    201   lc->starting_buffer_level_in_ms = cpi->oxcf.starting_buffer_level_in_ms;
    202   lc->optimal_buffer_level_in_ms = cpi->oxcf.optimal_buffer_level_in_ms;
    203   lc->maximum_buffer_size_in_ms = cpi->oxcf.maximum_buffer_size_in_ms;
    204   lc->buffer_level = cpi->buffer_level;
    205   lc->bits_off_target = cpi->bits_off_target;
    206   lc->total_actual_bits = cpi->total_actual_bits;
    207   lc->worst_quality = cpi->worst_quality;
    208   lc->active_worst_quality = cpi->active_worst_quality;
    209   lc->best_quality = cpi->best_quality;
    210   lc->active_best_quality = cpi->active_best_quality;
    211   lc->ni_av_qi = cpi->ni_av_qi;
    212   lc->ni_tot_qi = cpi->ni_tot_qi;
    213   lc->ni_frames = cpi->ni_frames;
    214   lc->avg_frame_qindex = cpi->avg_frame_qindex;
    215   lc->rate_correction_factor = cpi->rate_correction_factor;
    216   lc->key_frame_rate_correction_factor = cpi->key_frame_rate_correction_factor;
    217   lc->gf_rate_correction_factor = cpi->gf_rate_correction_factor;
    218   lc->zbin_over_quant = cpi->mb.zbin_over_quant;
    219   lc->inter_frame_target = cpi->inter_frame_target;
    220   lc->total_byte_count = cpi->total_byte_count;
    221   lc->filter_level = cpi->common.filter_level;
    222 
    223   lc->last_frame_percent_intra = cpi->last_frame_percent_intra;
    224 
    225   memcpy(lc->count_mb_ref_frame_usage, cpi->mb.count_mb_ref_frame_usage,
    226          sizeof(cpi->mb.count_mb_ref_frame_usage));
    227 }
    228 
    229 static void restore_layer_context(VP8_COMP *cpi, const int layer) {
    230   LAYER_CONTEXT *lc = &cpi->layer_context[layer];
    231 
    232   /* Restore layer dependent coding state */
    233   cpi->current_layer = layer;
    234   cpi->target_bandwidth = lc->target_bandwidth;
    235   cpi->oxcf.target_bandwidth = lc->target_bandwidth;
    236   cpi->oxcf.starting_buffer_level = lc->starting_buffer_level;
    237   cpi->oxcf.optimal_buffer_level = lc->optimal_buffer_level;
    238   cpi->oxcf.maximum_buffer_size = lc->maximum_buffer_size;
    239   cpi->oxcf.starting_buffer_level_in_ms = lc->starting_buffer_level_in_ms;
    240   cpi->oxcf.optimal_buffer_level_in_ms = lc->optimal_buffer_level_in_ms;
    241   cpi->oxcf.maximum_buffer_size_in_ms = lc->maximum_buffer_size_in_ms;
    242   cpi->buffer_level = lc->buffer_level;
    243   cpi->bits_off_target = lc->bits_off_target;
    244   cpi->total_actual_bits = lc->total_actual_bits;
    245   cpi->active_worst_quality = lc->active_worst_quality;
    246   cpi->active_best_quality = lc->active_best_quality;
    247   cpi->ni_av_qi = lc->ni_av_qi;
    248   cpi->ni_tot_qi = lc->ni_tot_qi;
    249   cpi->ni_frames = lc->ni_frames;
    250   cpi->avg_frame_qindex = lc->avg_frame_qindex;
    251   cpi->rate_correction_factor = lc->rate_correction_factor;
    252   cpi->key_frame_rate_correction_factor = lc->key_frame_rate_correction_factor;
    253   cpi->gf_rate_correction_factor = lc->gf_rate_correction_factor;
    254   cpi->mb.zbin_over_quant = lc->zbin_over_quant;
    255   cpi->inter_frame_target = lc->inter_frame_target;
    256   cpi->total_byte_count = lc->total_byte_count;
    257   cpi->common.filter_level = lc->filter_level;
    258 
    259   cpi->last_frame_percent_intra = lc->last_frame_percent_intra;
    260 
    261   memcpy(cpi->mb.count_mb_ref_frame_usage, lc->count_mb_ref_frame_usage,
    262          sizeof(cpi->mb.count_mb_ref_frame_usage));
    263 }
    264 
    265 static int rescale(int val, int num, int denom) {
    266   int64_t llnum = num;
    267   int64_t llden = denom;
    268   int64_t llval = val;
    269 
    270   return (int)(llval * llnum / llden);
    271 }
    272 
    273 static void init_temporal_layer_context(VP8_COMP *cpi, VP8_CONFIG *oxcf,
    274                                         const int layer,
    275                                         double prev_layer_framerate) {
    276   LAYER_CONTEXT *lc = &cpi->layer_context[layer];
    277 
    278   lc->framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[layer];
    279   lc->target_bandwidth = cpi->oxcf.target_bitrate[layer] * 1000;
    280 
    281   lc->starting_buffer_level_in_ms = oxcf->starting_buffer_level;
    282   lc->optimal_buffer_level_in_ms = oxcf->optimal_buffer_level;
    283   lc->maximum_buffer_size_in_ms = oxcf->maximum_buffer_size;
    284 
    285   lc->starting_buffer_level =
    286       rescale((int)(oxcf->starting_buffer_level), lc->target_bandwidth, 1000);
    287 
    288   if (oxcf->optimal_buffer_level == 0) {
    289     lc->optimal_buffer_level = lc->target_bandwidth / 8;
    290   } else {
    291     lc->optimal_buffer_level =
    292         rescale((int)(oxcf->optimal_buffer_level), lc->target_bandwidth, 1000);
    293   }
    294 
    295   if (oxcf->maximum_buffer_size == 0) {
    296     lc->maximum_buffer_size = lc->target_bandwidth / 8;
    297   } else {
    298     lc->maximum_buffer_size =
    299         rescale((int)(oxcf->maximum_buffer_size), lc->target_bandwidth, 1000);
    300   }
    301 
    302   /* Work out the average size of a frame within this layer */
    303   if (layer > 0) {
    304     lc->avg_frame_size_for_layer =
    305         (int)((cpi->oxcf.target_bitrate[layer] -
    306                cpi->oxcf.target_bitrate[layer - 1]) *
    307               1000 / (lc->framerate - prev_layer_framerate));
    308   }
    309 
    310   lc->active_worst_quality = cpi->oxcf.worst_allowed_q;
    311   lc->active_best_quality = cpi->oxcf.best_allowed_q;
    312   lc->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
    313 
    314   lc->buffer_level = lc->starting_buffer_level;
    315   lc->bits_off_target = lc->starting_buffer_level;
    316 
    317   lc->total_actual_bits = 0;
    318   lc->ni_av_qi = 0;
    319   lc->ni_tot_qi = 0;
    320   lc->ni_frames = 0;
    321   lc->rate_correction_factor = 1.0;
    322   lc->key_frame_rate_correction_factor = 1.0;
    323   lc->gf_rate_correction_factor = 1.0;
    324   lc->inter_frame_target = 0;
    325 }
    326 
    327 // Upon a run-time change in temporal layers, reset the layer context parameters
    328 // for any "new" layers. For "existing" layers, let them inherit the parameters
    329 // from the previous layer state (at the same layer #). In future we may want
    330 // to better map the previous layer state(s) to the "new" ones.
    331 static void reset_temporal_layer_change(VP8_COMP *cpi, VP8_CONFIG *oxcf,
    332                                         const int prev_num_layers) {
    333   int i;
    334   double prev_layer_framerate = 0;
    335   const int curr_num_layers = cpi->oxcf.number_of_layers;
    336   // If the previous state was 1 layer, get current layer context from cpi.
    337   // We need this to set the layer context for the new layers below.
    338   if (prev_num_layers == 1) {
    339     cpi->current_layer = 0;
    340     save_layer_context(cpi);
    341   }
    342   for (i = 0; i < curr_num_layers; ++i) {
    343     LAYER_CONTEXT *lc = &cpi->layer_context[i];
    344     if (i >= prev_num_layers) {
    345       init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
    346     }
    347     // The initial buffer levels are set based on their starting levels.
    348     // We could set the buffer levels based on the previous state (normalized
    349     // properly by the layer bandwidths) but we would need to keep track of
    350     // the previous set of layer bandwidths (i.e., target_bitrate[i])
    351     // before the layer change. For now, reset to the starting levels.
    352     lc->buffer_level =
    353         cpi->oxcf.starting_buffer_level_in_ms * cpi->oxcf.target_bitrate[i];
    354     lc->bits_off_target = lc->buffer_level;
    355     // TDOD(marpan): Should we set the rate_correction_factor and
    356     // active_worst/best_quality to values derived from the previous layer
    357     // state (to smooth-out quality dips/rate fluctuation at transition)?
    358 
    359     // We need to treat the 1 layer case separately: oxcf.target_bitrate[i]
    360     // is not set for 1 layer, and the restore_layer_context/save_context()
    361     // are not called in the encoding loop, so we need to call it here to
    362     // pass the layer context state to |cpi|.
    363     if (curr_num_layers == 1) {
    364       lc->target_bandwidth = cpi->oxcf.target_bandwidth;
    365       lc->buffer_level =
    366           cpi->oxcf.starting_buffer_level_in_ms * lc->target_bandwidth / 1000;
    367       lc->bits_off_target = lc->buffer_level;
    368       restore_layer_context(cpi, 0);
    369     }
    370     prev_layer_framerate = cpi->output_framerate / cpi->oxcf.rate_decimator[i];
    371   }
    372 }
    373 
    374 static void setup_features(VP8_COMP *cpi) {
    375   // If segmentation enabled set the update flags
    376   if (cpi->mb.e_mbd.segmentation_enabled) {
    377     cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    378     cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    379   } else {
    380     cpi->mb.e_mbd.update_mb_segmentation_map = 0;
    381     cpi->mb.e_mbd.update_mb_segmentation_data = 0;
    382   }
    383 
    384   cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 0;
    385   cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
    386   memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    387   memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
    388   memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0,
    389          sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    390   memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0,
    391          sizeof(cpi->mb.e_mbd.mode_lf_deltas));
    392 
    393   set_default_lf_deltas(cpi);
    394 }
    395 
    396 static void dealloc_raw_frame_buffers(VP8_COMP *cpi);
    397 
    398 void vp8_initialize_enc(void) {
    399   static volatile int init_done = 0;
    400 
    401   if (!init_done) {
    402     vpx_dsp_rtcd();
    403     vp8_init_intra_predictors();
    404     init_done = 1;
    405   }
    406 }
    407 
    408 static void dealloc_compressor_data(VP8_COMP *cpi) {
    409   vpx_free(cpi->tplist);
    410   cpi->tplist = NULL;
    411 
    412   /* Delete last frame MV storage buffers */
    413   vpx_free(cpi->lfmv);
    414   cpi->lfmv = 0;
    415 
    416   vpx_free(cpi->lf_ref_frame_sign_bias);
    417   cpi->lf_ref_frame_sign_bias = 0;
    418 
    419   vpx_free(cpi->lf_ref_frame);
    420   cpi->lf_ref_frame = 0;
    421 
    422   /* Delete sementation map */
    423   vpx_free(cpi->segmentation_map);
    424   cpi->segmentation_map = 0;
    425 
    426   vpx_free(cpi->active_map);
    427   cpi->active_map = 0;
    428 
    429   vp8_de_alloc_frame_buffers(&cpi->common);
    430 
    431   vp8_yv12_de_alloc_frame_buffer(&cpi->pick_lf_lvl_frame);
    432   vp8_yv12_de_alloc_frame_buffer(&cpi->scaled_source);
    433   dealloc_raw_frame_buffers(cpi);
    434 
    435   vpx_free(cpi->tok);
    436   cpi->tok = 0;
    437 
    438   /* Structure used to monitor GF usage */
    439   vpx_free(cpi->gf_active_flags);
    440   cpi->gf_active_flags = 0;
    441 
    442   /* Activity mask based per mb zbin adjustments */
    443   vpx_free(cpi->mb_activity_map);
    444   cpi->mb_activity_map = 0;
    445 
    446   vpx_free(cpi->mb.pip);
    447   cpi->mb.pip = 0;
    448 
    449 #if CONFIG_MULTITHREAD
    450   /* De-allocate mutex */
    451   if (cpi->pmutex != NULL) {
    452     VP8_COMMON *const pc = &cpi->common;
    453     int i;
    454 
    455     for (i = 0; i < pc->mb_rows; ++i) {
    456       pthread_mutex_destroy(&cpi->pmutex[i]);
    457     }
    458     vpx_free(cpi->pmutex);
    459     cpi->pmutex = NULL;
    460   }
    461 
    462   vpx_free(cpi->mt_current_mb_col);
    463   cpi->mt_current_mb_col = NULL;
    464 #endif
    465 }
    466 
    467 static void enable_segmentation(VP8_COMP *cpi) {
    468   /* Set the appropriate feature bit */
    469   cpi->mb.e_mbd.segmentation_enabled = 1;
    470   cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    471   cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    472 }
    473 static void disable_segmentation(VP8_COMP *cpi) {
    474   /* Clear the appropriate feature bit */
    475   cpi->mb.e_mbd.segmentation_enabled = 0;
    476 }
    477 
    478 /* Valid values for a segment are 0 to 3
    479  * Segmentation map is arrange as [Rows][Columns]
    480  */
    481 static void set_segmentation_map(VP8_COMP *cpi,
    482                                  unsigned char *segmentation_map) {
    483   /* Copy in the new segmentation map */
    484   memcpy(cpi->segmentation_map, segmentation_map,
    485          (cpi->common.mb_rows * cpi->common.mb_cols));
    486 
    487   /* Signal that the map should be updated. */
    488   cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    489   cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    490 }
    491 
    492 /* The values given for each segment can be either deltas (from the default
    493  * value chosen for the frame) or absolute values.
    494  *
    495  * Valid range for abs values is:
    496  *    (0-127 for MB_LVL_ALT_Q), (0-63 for SEGMENT_ALT_LF)
    497  * Valid range for delta values are:
    498  *    (+/-127 for MB_LVL_ALT_Q), (+/-63 for SEGMENT_ALT_LF)
    499  *
    500  * abs_delta = SEGMENT_DELTADATA (deltas)
    501  * abs_delta = SEGMENT_ABSDATA (use the absolute values given).
    502  *
    503  */
    504 static void set_segment_data(VP8_COMP *cpi, signed char *feature_data,
    505                              unsigned char abs_delta) {
    506   cpi->mb.e_mbd.mb_segement_abs_delta = abs_delta;
    507   memcpy(cpi->segment_feature_data, feature_data,
    508          sizeof(cpi->segment_feature_data));
    509 }
    510 
    511 /* A simple function to cyclically refresh the background at a lower Q */
    512 static void cyclic_background_refresh(VP8_COMP *cpi, int Q, int lf_adjustment) {
    513   unsigned char *seg_map = cpi->segmentation_map;
    514   signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
    515   int i;
    516   int block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
    517   int mbs_in_frame = cpi->common.mb_rows * cpi->common.mb_cols;
    518 
    519   cpi->cyclic_refresh_q = Q / 2;
    520 
    521   if (cpi->oxcf.screen_content_mode) {
    522     // Modify quality ramp-up based on Q. Above some Q level, increase the
    523     // number of blocks to be refreshed, and reduce it below the thredhold.
    524     // Turn-off under certain conditions (i.e., away from key frame, and if
    525     // we are at good quality (low Q) and most of the blocks were
    526     // skipped-encoded
    527     // in previous frame.
    528     int qp_thresh = (cpi->oxcf.screen_content_mode == 2) ? 80 : 100;
    529     if (Q >= qp_thresh) {
    530       cpi->cyclic_refresh_mode_max_mbs_perframe =
    531           (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
    532     } else if (cpi->frames_since_key > 250 && Q < 20 &&
    533                cpi->mb.skip_true_count > (int)(0.95 * mbs_in_frame)) {
    534       cpi->cyclic_refresh_mode_max_mbs_perframe = 0;
    535     } else {
    536       cpi->cyclic_refresh_mode_max_mbs_perframe =
    537           (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
    538     }
    539     block_count = cpi->cyclic_refresh_mode_max_mbs_perframe;
    540   }
    541 
    542   // Set every macroblock to be eligible for update.
    543   // For key frame this will reset seg map to 0.
    544   memset(cpi->segmentation_map, 0, mbs_in_frame);
    545 
    546   if (cpi->common.frame_type != KEY_FRAME && block_count > 0) {
    547     /* Cycle through the macro_block rows */
    548     /* MB loop to set local segmentation map */
    549     i = cpi->cyclic_refresh_mode_index;
    550     assert(i < mbs_in_frame);
    551     do {
    552       /* If the MB is as a candidate for clean up then mark it for
    553        * possible boost/refresh (segment 1) The segment id may get
    554        * reset to 0 later if the MB gets coded anything other than
    555        * last frame 0,0 as only (last frame 0,0) MBs are eligable for
    556        * refresh : that is to say Mbs likely to be background blocks.
    557        */
    558       if (cpi->cyclic_refresh_map[i] == 0) {
    559         seg_map[i] = 1;
    560         block_count--;
    561       } else if (cpi->cyclic_refresh_map[i] < 0) {
    562         cpi->cyclic_refresh_map[i]++;
    563       }
    564 
    565       i++;
    566       if (i == mbs_in_frame) i = 0;
    567 
    568     } while (block_count && i != cpi->cyclic_refresh_mode_index);
    569 
    570     cpi->cyclic_refresh_mode_index = i;
    571 
    572 #if CONFIG_TEMPORAL_DENOISING
    573     if (cpi->oxcf.noise_sensitivity > 0) {
    574       if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive &&
    575           Q < (int)cpi->denoiser.denoise_pars.qp_thresh &&
    576           (cpi->frames_since_key >
    577            2 * cpi->denoiser.denoise_pars.consec_zerolast)) {
    578         // Under aggressive denoising, use segmentation to turn off loop
    579         // filter below some qp thresh. The filter is reduced for all
    580         // blocks that have been encoded as ZEROMV LAST x frames in a row,
    581         // where x is set by cpi->denoiser.denoise_pars.consec_zerolast.
    582         // This is to avoid "dot" artifacts that can occur from repeated
    583         // loop filtering on noisy input source.
    584         cpi->cyclic_refresh_q = Q;
    585         // lf_adjustment = -MAX_LOOP_FILTER;
    586         lf_adjustment = -40;
    587         for (i = 0; i < mbs_in_frame; ++i) {
    588           seg_map[i] = (cpi->consec_zero_last[i] >
    589                         cpi->denoiser.denoise_pars.consec_zerolast)
    590                            ? 1
    591                            : 0;
    592         }
    593       }
    594     }
    595 #endif
    596   }
    597 
    598   /* Activate segmentation. */
    599   cpi->mb.e_mbd.update_mb_segmentation_map = 1;
    600   cpi->mb.e_mbd.update_mb_segmentation_data = 1;
    601   enable_segmentation(cpi);
    602 
    603   /* Set up the quant segment data */
    604   feature_data[MB_LVL_ALT_Q][0] = 0;
    605   feature_data[MB_LVL_ALT_Q][1] = (cpi->cyclic_refresh_q - Q);
    606   feature_data[MB_LVL_ALT_Q][2] = 0;
    607   feature_data[MB_LVL_ALT_Q][3] = 0;
    608 
    609   /* Set up the loop segment data */
    610   feature_data[MB_LVL_ALT_LF][0] = 0;
    611   feature_data[MB_LVL_ALT_LF][1] = lf_adjustment;
    612   feature_data[MB_LVL_ALT_LF][2] = 0;
    613   feature_data[MB_LVL_ALT_LF][3] = 0;
    614 
    615   /* Initialise the feature data structure */
    616   set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
    617 }
    618 
    619 static void set_default_lf_deltas(VP8_COMP *cpi) {
    620   cpi->mb.e_mbd.mode_ref_lf_delta_enabled = 1;
    621   cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
    622 
    623   memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
    624   memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
    625 
    626   /* Test of ref frame deltas */
    627   cpi->mb.e_mbd.ref_lf_deltas[INTRA_FRAME] = 2;
    628   cpi->mb.e_mbd.ref_lf_deltas[LAST_FRAME] = 0;
    629   cpi->mb.e_mbd.ref_lf_deltas[GOLDEN_FRAME] = -2;
    630   cpi->mb.e_mbd.ref_lf_deltas[ALTREF_FRAME] = -2;
    631 
    632   cpi->mb.e_mbd.mode_lf_deltas[0] = 4; /* BPRED */
    633 
    634   if (cpi->oxcf.Mode == MODE_REALTIME) {
    635     cpi->mb.e_mbd.mode_lf_deltas[1] = -12; /* Zero */
    636   } else {
    637     cpi->mb.e_mbd.mode_lf_deltas[1] = -2; /* Zero */
    638   }
    639 
    640   cpi->mb.e_mbd.mode_lf_deltas[2] = 2; /* New mv */
    641   cpi->mb.e_mbd.mode_lf_deltas[3] = 4; /* Split mv */
    642 }
    643 
    644 /* Convenience macros for mapping speed and mode into a continuous
    645  * range
    646  */
    647 #define GOOD(x) (x + 1)
    648 #define RT(x) (x + 7)
    649 
    650 static int speed_map(int speed, const int *map) {
    651   int res;
    652 
    653   do {
    654     res = *map++;
    655   } while (speed >= *map++);
    656   return res;
    657 }
    658 
    659 static const int thresh_mult_map_znn[] = {
    660   /* map common to zero, nearest, and near */
    661   0, GOOD(2), 1500, GOOD(3), 2000, RT(0), 1000, RT(2), 2000, INT_MAX
    662 };
    663 
    664 static const int thresh_mult_map_vhpred[] = { 1000, GOOD(2), 1500,    GOOD(3),
    665                                               2000, RT(0),   1000,    RT(1),
    666                                               2000, RT(7),   INT_MAX, INT_MAX };
    667 
    668 static const int thresh_mult_map_bpred[] = { 2000,    GOOD(0), 2500, GOOD(2),
    669                                              5000,    GOOD(3), 7500, RT(0),
    670                                              2500,    RT(1),   5000, RT(6),
    671                                              INT_MAX, INT_MAX };
    672 
    673 static const int thresh_mult_map_tm[] = { 1000,    GOOD(2), 1500, GOOD(3),
    674                                           2000,    RT(0),   0,    RT(1),
    675                                           1000,    RT(2),   2000, RT(7),
    676                                           INT_MAX, INT_MAX };
    677 
    678 static const int thresh_mult_map_new1[] = { 1000,  GOOD(2), 2000,
    679                                             RT(0), 2000,    INT_MAX };
    680 
    681 static const int thresh_mult_map_new2[] = { 1000, GOOD(2), 2000, GOOD(3),
    682                                             2500, GOOD(5), 4000, RT(0),
    683                                             2000, RT(2),   2500, RT(5),
    684                                             4000, INT_MAX };
    685 
    686 static const int thresh_mult_map_split1[] = {
    687   2500,  GOOD(0), 1700,  GOOD(2), 10000, GOOD(3), 25000, GOOD(4), INT_MAX,
    688   RT(0), 5000,    RT(1), 10000,   RT(2), 25000,   RT(3), INT_MAX, INT_MAX
    689 };
    690 
    691 static const int thresh_mult_map_split2[] = {
    692   5000,  GOOD(0), 4500,  GOOD(2), 20000, GOOD(3), 50000, GOOD(4), INT_MAX,
    693   RT(0), 10000,   RT(1), 20000,   RT(2), 50000,   RT(3), INT_MAX, INT_MAX
    694 };
    695 
    696 static const int mode_check_freq_map_zn2[] = {
    697   /* {zero,nearest}{2,3} */
    698   0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
    699 };
    700 
    701 static const int mode_check_freq_map_vhbpred[] = {
    702   0, GOOD(5), 2, RT(0), 0, RT(3), 2, RT(5), 4, INT_MAX
    703 };
    704 
    705 static const int mode_check_freq_map_near2[] = {
    706   0,      GOOD(5), 2,      RT(0),  0,      RT(3),  2,
    707   RT(10), 1 << 2,  RT(11), 1 << 3, RT(12), 1 << 4, INT_MAX
    708 };
    709 
    710 static const int mode_check_freq_map_new1[] = {
    711   0, RT(10), 1 << 1, RT(11), 1 << 2, RT(12), 1 << 3, INT_MAX
    712 };
    713 
    714 static const int mode_check_freq_map_new2[] = { 0,      GOOD(5), 4,      RT(0),
    715                                                 0,      RT(3),   4,      RT(10),
    716                                                 1 << 3, RT(11),  1 << 4, RT(12),
    717                                                 1 << 5, INT_MAX };
    718 
    719 static const int mode_check_freq_map_split1[] = {
    720   0, GOOD(2), 2, GOOD(3), 7, RT(1), 2, RT(2), 7, INT_MAX
    721 };
    722 
    723 static const int mode_check_freq_map_split2[] = {
    724   0, GOOD(1), 2, GOOD(2), 4, GOOD(3), 15, RT(1), 4, RT(2), 15, INT_MAX
    725 };
    726 
    727 void vp8_set_speed_features(VP8_COMP *cpi) {
    728   SPEED_FEATURES *sf = &cpi->sf;
    729   int Mode = cpi->compressor_speed;
    730   int Speed = cpi->Speed;
    731   int Speed2;
    732   int i;
    733   VP8_COMMON *cm = &cpi->common;
    734   int last_improved_quant = sf->improved_quant;
    735   int ref_frames;
    736 
    737   /* Initialise default mode frequency sampling variables */
    738   for (i = 0; i < MAX_MODES; ++i) {
    739     cpi->mode_check_freq[i] = 0;
    740   }
    741 
    742   cpi->mb.mbs_tested_so_far = 0;
    743   cpi->mb.mbs_zero_last_dot_suppress = 0;
    744 
    745   /* best quality defaults */
    746   sf->RD = 1;
    747   sf->search_method = NSTEP;
    748   sf->improved_quant = 1;
    749   sf->improved_dct = 1;
    750   sf->auto_filter = 1;
    751   sf->recode_loop = 1;
    752   sf->quarter_pixel_search = 1;
    753   sf->half_pixel_search = 1;
    754   sf->iterative_sub_pixel = 1;
    755   sf->optimize_coefficients = 1;
    756   sf->use_fastquant_for_pick = 0;
    757   sf->no_skip_block4x4_search = 1;
    758 
    759   sf->first_step = 0;
    760   sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
    761   sf->improved_mv_pred = 1;
    762 
    763   /* default thresholds to 0 */
    764   for (i = 0; i < MAX_MODES; ++i) sf->thresh_mult[i] = 0;
    765 
    766   /* Count enabled references */
    767   ref_frames = 1;
    768   if (cpi->ref_frame_flags & VP8_LAST_FRAME) ref_frames++;
    769   if (cpi->ref_frame_flags & VP8_GOLD_FRAME) ref_frames++;
    770   if (cpi->ref_frame_flags & VP8_ALTR_FRAME) ref_frames++;
    771 
    772   /* Convert speed to continuous range, with clamping */
    773   if (Mode == 0) {
    774     Speed = 0;
    775   } else if (Mode == 2) {
    776     Speed = RT(Speed);
    777   } else {
    778     if (Speed > 5) Speed = 5;
    779     Speed = GOOD(Speed);
    780   }
    781 
    782   sf->thresh_mult[THR_ZERO1] = sf->thresh_mult[THR_NEAREST1] =
    783       sf->thresh_mult[THR_NEAR1] = sf->thresh_mult[THR_DC] = 0; /* always */
    784 
    785   sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO3] =
    786       sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST3] =
    787           sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR3] =
    788               speed_map(Speed, thresh_mult_map_znn);
    789 
    790   sf->thresh_mult[THR_V_PRED] = sf->thresh_mult[THR_H_PRED] =
    791       speed_map(Speed, thresh_mult_map_vhpred);
    792   sf->thresh_mult[THR_B_PRED] = speed_map(Speed, thresh_mult_map_bpred);
    793   sf->thresh_mult[THR_TM] = speed_map(Speed, thresh_mult_map_tm);
    794   sf->thresh_mult[THR_NEW1] = speed_map(Speed, thresh_mult_map_new1);
    795   sf->thresh_mult[THR_NEW2] = sf->thresh_mult[THR_NEW3] =
    796       speed_map(Speed, thresh_mult_map_new2);
    797   sf->thresh_mult[THR_SPLIT1] = speed_map(Speed, thresh_mult_map_split1);
    798   sf->thresh_mult[THR_SPLIT2] = sf->thresh_mult[THR_SPLIT3] =
    799       speed_map(Speed, thresh_mult_map_split2);
    800 
    801   // Special case for temporal layers.
    802   // Reduce the thresholds for zero/nearest/near for GOLDEN, if GOLDEN is
    803   // used as second reference. We don't modify thresholds for ALTREF case
    804   // since ALTREF is usually used as long-term reference in temporal layers.
    805   if ((cpi->Speed <= 6) && (cpi->oxcf.number_of_layers > 1) &&
    806       (cpi->ref_frame_flags & VP8_LAST_FRAME) &&
    807       (cpi->ref_frame_flags & VP8_GOLD_FRAME)) {
    808     if (cpi->closest_reference_frame == GOLDEN_FRAME) {
    809       sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 3;
    810       sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 3;
    811       sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 3;
    812     } else {
    813       sf->thresh_mult[THR_ZERO2] = sf->thresh_mult[THR_ZERO2] >> 1;
    814       sf->thresh_mult[THR_NEAREST2] = sf->thresh_mult[THR_NEAREST2] >> 1;
    815       sf->thresh_mult[THR_NEAR2] = sf->thresh_mult[THR_NEAR2] >> 1;
    816     }
    817   }
    818 
    819   cpi->mode_check_freq[THR_ZERO1] = cpi->mode_check_freq[THR_NEAREST1] =
    820       cpi->mode_check_freq[THR_NEAR1] = cpi->mode_check_freq[THR_TM] =
    821           cpi->mode_check_freq[THR_DC] = 0; /* always */
    822 
    823   cpi->mode_check_freq[THR_ZERO2] = cpi->mode_check_freq[THR_ZERO3] =
    824       cpi->mode_check_freq[THR_NEAREST2] = cpi->mode_check_freq[THR_NEAREST3] =
    825           speed_map(Speed, mode_check_freq_map_zn2);
    826 
    827   cpi->mode_check_freq[THR_NEAR2] = cpi->mode_check_freq[THR_NEAR3] =
    828       speed_map(Speed, mode_check_freq_map_near2);
    829 
    830   cpi->mode_check_freq[THR_V_PRED] = cpi->mode_check_freq[THR_H_PRED] =
    831       cpi->mode_check_freq[THR_B_PRED] =
    832           speed_map(Speed, mode_check_freq_map_vhbpred);
    833 
    834   // For real-time mode at speed 10 keep the mode_check_freq threshold
    835   // for NEW1 similar to that of speed 9.
    836   Speed2 = Speed;
    837   if (cpi->Speed == 10 && Mode == 2) Speed2 = RT(9);
    838   cpi->mode_check_freq[THR_NEW1] = speed_map(Speed2, mode_check_freq_map_new1);
    839 
    840   cpi->mode_check_freq[THR_NEW2] = cpi->mode_check_freq[THR_NEW3] =
    841       speed_map(Speed, mode_check_freq_map_new2);
    842 
    843   cpi->mode_check_freq[THR_SPLIT1] =
    844       speed_map(Speed, mode_check_freq_map_split1);
    845   cpi->mode_check_freq[THR_SPLIT2] = cpi->mode_check_freq[THR_SPLIT3] =
    846       speed_map(Speed, mode_check_freq_map_split2);
    847   Speed = cpi->Speed;
    848   switch (Mode) {
    849 #if !CONFIG_REALTIME_ONLY
    850     case 0: /* best quality mode */
    851       sf->first_step = 0;
    852       sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
    853       break;
    854     case 1:
    855     case 3:
    856       if (Speed > 0) {
    857         /* Disable coefficient optimization above speed 0 */
    858         sf->optimize_coefficients = 0;
    859         sf->use_fastquant_for_pick = 1;
    860         sf->no_skip_block4x4_search = 0;
    861 
    862         sf->first_step = 1;
    863       }
    864 
    865       if (Speed > 2) {
    866         sf->improved_quant = 0;
    867         sf->improved_dct = 0;
    868 
    869         /* Only do recode loop on key frames, golden frames and
    870          * alt ref frames
    871          */
    872         sf->recode_loop = 2;
    873       }
    874 
    875       if (Speed > 3) {
    876         sf->auto_filter = 1;
    877         sf->recode_loop = 0; /* recode loop off */
    878         sf->RD = 0;          /* Turn rd off */
    879       }
    880 
    881       if (Speed > 4) {
    882         sf->auto_filter = 0; /* Faster selection of loop filter */
    883       }
    884 
    885       break;
    886 #endif
    887     case 2:
    888       sf->optimize_coefficients = 0;
    889       sf->recode_loop = 0;
    890       sf->auto_filter = 1;
    891       sf->iterative_sub_pixel = 1;
    892       sf->search_method = NSTEP;
    893 
    894       if (Speed > 0) {
    895         sf->improved_quant = 0;
    896         sf->improved_dct = 0;
    897 
    898         sf->use_fastquant_for_pick = 1;
    899         sf->no_skip_block4x4_search = 0;
    900         sf->first_step = 1;
    901       }
    902 
    903       if (Speed > 2) sf->auto_filter = 0; /* Faster selection of loop filter */
    904 
    905       if (Speed > 3) {
    906         sf->RD = 0;
    907         sf->auto_filter = 1;
    908       }
    909 
    910       if (Speed > 4) {
    911         sf->auto_filter = 0; /* Faster selection of loop filter */
    912         sf->search_method = HEX;
    913         sf->iterative_sub_pixel = 0;
    914       }
    915 
    916       if (Speed > 6) {
    917         unsigned int sum = 0;
    918         unsigned int total_mbs = cm->MBs;
    919         int thresh;
    920         unsigned int total_skip;
    921 
    922         int min = 2000;
    923 
    924         if (cpi->oxcf.encode_breakout > 2000) min = cpi->oxcf.encode_breakout;
    925 
    926         min >>= 7;
    927 
    928         for (i = 0; i < min; ++i) {
    929           sum += cpi->mb.error_bins[i];
    930         }
    931 
    932         total_skip = sum;
    933         sum = 0;
    934 
    935         /* i starts from 2 to make sure thresh started from 2048 */
    936         for (; i < 1024; ++i) {
    937           sum += cpi->mb.error_bins[i];
    938 
    939           if (10 * sum >=
    940               (unsigned int)(cpi->Speed - 6) * (total_mbs - total_skip)) {
    941             break;
    942           }
    943         }
    944 
    945         i--;
    946         thresh = (i << 7);
    947 
    948         if (thresh < 2000) thresh = 2000;
    949 
    950         if (ref_frames > 1) {
    951           sf->thresh_mult[THR_NEW1] = thresh;
    952           sf->thresh_mult[THR_NEAREST1] = thresh >> 1;
    953           sf->thresh_mult[THR_NEAR1] = thresh >> 1;
    954         }
    955 
    956         if (ref_frames > 2) {
    957           sf->thresh_mult[THR_NEW2] = thresh << 1;
    958           sf->thresh_mult[THR_NEAREST2] = thresh;
    959           sf->thresh_mult[THR_NEAR2] = thresh;
    960         }
    961 
    962         if (ref_frames > 3) {
    963           sf->thresh_mult[THR_NEW3] = thresh << 1;
    964           sf->thresh_mult[THR_NEAREST3] = thresh;
    965           sf->thresh_mult[THR_NEAR3] = thresh;
    966         }
    967 
    968         sf->improved_mv_pred = 0;
    969       }
    970 
    971       if (Speed > 8) sf->quarter_pixel_search = 0;
    972 
    973       if (cm->version == 0) {
    974         cm->filter_type = NORMAL_LOOPFILTER;
    975 
    976         if (Speed >= 14) cm->filter_type = SIMPLE_LOOPFILTER;
    977       } else {
    978         cm->filter_type = SIMPLE_LOOPFILTER;
    979       }
    980 
    981       /* This has a big hit on quality. Last resort */
    982       if (Speed >= 15) sf->half_pixel_search = 0;
    983 
    984       memset(cpi->mb.error_bins, 0, sizeof(cpi->mb.error_bins));
    985 
    986   }; /* switch */
    987 
    988   /* Slow quant, dct and trellis not worthwhile for first pass
    989    * so make sure they are always turned off.
    990    */
    991   if (cpi->pass == 1) {
    992     sf->improved_quant = 0;
    993     sf->optimize_coefficients = 0;
    994     sf->improved_dct = 0;
    995   }
    996 
    997   if (cpi->sf.search_method == NSTEP) {
    998     vp8_init3smotion_compensation(&cpi->mb,
    999                                   cm->yv12_fb[cm->lst_fb_idx].y_stride);
   1000   } else if (cpi->sf.search_method == DIAMOND) {
   1001     vp8_init_dsmotion_compensation(&cpi->mb,
   1002                                    cm->yv12_fb[cm->lst_fb_idx].y_stride);
   1003   }
   1004 
   1005   if (cpi->sf.improved_dct) {
   1006     cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
   1007     cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
   1008   } else {
   1009     /* No fast FDCT defined for any platform at this time. */
   1010     cpi->mb.short_fdct8x4 = vp8_short_fdct8x4;
   1011     cpi->mb.short_fdct4x4 = vp8_short_fdct4x4;
   1012   }
   1013 
   1014   cpi->mb.short_walsh4x4 = vp8_short_walsh4x4;
   1015 
   1016   if (cpi->sf.improved_quant) {
   1017     cpi->mb.quantize_b = vp8_regular_quantize_b;
   1018   } else {
   1019     cpi->mb.quantize_b = vp8_fast_quantize_b;
   1020   }
   1021   if (cpi->sf.improved_quant != last_improved_quant) vp8cx_init_quantizer(cpi);
   1022 
   1023   if (cpi->sf.iterative_sub_pixel == 1) {
   1024     cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step_iteratively;
   1025   } else if (cpi->sf.quarter_pixel_search) {
   1026     cpi->find_fractional_mv_step = vp8_find_best_sub_pixel_step;
   1027   } else if (cpi->sf.half_pixel_search) {
   1028     cpi->find_fractional_mv_step = vp8_find_best_half_pixel_step;
   1029   } else {
   1030     cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
   1031   }
   1032 
   1033   if (cpi->sf.optimize_coefficients == 1 && cpi->pass != 1) {
   1034     cpi->mb.optimize = 1;
   1035   } else {
   1036     cpi->mb.optimize = 0;
   1037   }
   1038 
   1039   if (cpi->common.full_pixel) {
   1040     cpi->find_fractional_mv_step = vp8_skip_fractional_mv_step;
   1041   }
   1042 
   1043 #ifdef SPEEDSTATS
   1044   frames_at_speed[cpi->Speed]++;
   1045 #endif
   1046 }
   1047 #undef GOOD
   1048 #undef RT
   1049 
   1050 static void alloc_raw_frame_buffers(VP8_COMP *cpi) {
   1051 #if VP8_TEMPORAL_ALT_REF
   1052   int width = (cpi->oxcf.Width + 15) & ~15;
   1053   int height = (cpi->oxcf.Height + 15) & ~15;
   1054 #endif
   1055 
   1056   cpi->lookahead = vp8_lookahead_init(cpi->oxcf.Width, cpi->oxcf.Height,
   1057                                       cpi->oxcf.lag_in_frames);
   1058   if (!cpi->lookahead) {
   1059     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1060                        "Failed to allocate lag buffers");
   1061   }
   1062 
   1063 #if VP8_TEMPORAL_ALT_REF
   1064 
   1065   if (vp8_yv12_alloc_frame_buffer(&cpi->alt_ref_buffer, width, height,
   1066                                   VP8BORDERINPIXELS)) {
   1067     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1068                        "Failed to allocate altref buffer");
   1069   }
   1070 
   1071 #endif
   1072 }
   1073 
   1074 static void dealloc_raw_frame_buffers(VP8_COMP *cpi) {
   1075 #if VP8_TEMPORAL_ALT_REF
   1076   vp8_yv12_de_alloc_frame_buffer(&cpi->alt_ref_buffer);
   1077 #endif
   1078   vp8_lookahead_destroy(cpi->lookahead);
   1079 }
   1080 
   1081 static int vp8_alloc_partition_data(VP8_COMP *cpi) {
   1082   vpx_free(cpi->mb.pip);
   1083 
   1084   cpi->mb.pip =
   1085       vpx_calloc((cpi->common.mb_cols + 1) * (cpi->common.mb_rows + 1),
   1086                  sizeof(PARTITION_INFO));
   1087   if (!cpi->mb.pip) return 1;
   1088 
   1089   cpi->mb.pi = cpi->mb.pip + cpi->common.mode_info_stride + 1;
   1090 
   1091   return 0;
   1092 }
   1093 
   1094 void vp8_alloc_compressor_data(VP8_COMP *cpi) {
   1095   VP8_COMMON *cm = &cpi->common;
   1096 
   1097   int width = cm->Width;
   1098   int height = cm->Height;
   1099 #if CONFIG_MULTITHREAD
   1100   int prev_mb_rows = cm->mb_rows;
   1101 #endif
   1102 
   1103   if (vp8_alloc_frame_buffers(cm, width, height)) {
   1104     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1105                        "Failed to allocate frame buffers");
   1106   }
   1107 
   1108   if (vp8_alloc_partition_data(cpi)) {
   1109     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1110                        "Failed to allocate partition data");
   1111   }
   1112 
   1113   if ((width & 0xf) != 0) width += 16 - (width & 0xf);
   1114 
   1115   if ((height & 0xf) != 0) height += 16 - (height & 0xf);
   1116 
   1117   if (vp8_yv12_alloc_frame_buffer(&cpi->pick_lf_lvl_frame, width, height,
   1118                                   VP8BORDERINPIXELS)) {
   1119     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1120                        "Failed to allocate last frame buffer");
   1121   }
   1122 
   1123   if (vp8_yv12_alloc_frame_buffer(&cpi->scaled_source, width, height,
   1124                                   VP8BORDERINPIXELS)) {
   1125     vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1126                        "Failed to allocate scaled source buffer");
   1127   }
   1128 
   1129   vpx_free(cpi->tok);
   1130 
   1131   {
   1132 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
   1133     unsigned int tokens = 8 * 24 * 16; /* one MB for each thread */
   1134 #else
   1135     unsigned int tokens = cm->mb_rows * cm->mb_cols * 24 * 16;
   1136 #endif
   1137     CHECK_MEM_ERROR(cpi->tok, vpx_calloc(tokens, sizeof(*cpi->tok)));
   1138   }
   1139 
   1140   /* Data used for real time vc mode to see if gf needs refreshing */
   1141   cpi->zeromv_count = 0;
   1142 
   1143   /* Structures used to monitor GF usage */
   1144   vpx_free(cpi->gf_active_flags);
   1145   CHECK_MEM_ERROR(
   1146       cpi->gf_active_flags,
   1147       vpx_calloc(sizeof(*cpi->gf_active_flags), cm->mb_rows * cm->mb_cols));
   1148   cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
   1149 
   1150   vpx_free(cpi->mb_activity_map);
   1151   CHECK_MEM_ERROR(
   1152       cpi->mb_activity_map,
   1153       vpx_calloc(sizeof(*cpi->mb_activity_map), cm->mb_rows * cm->mb_cols));
   1154 
   1155   /* allocate memory for storing last frame's MVs for MV prediction. */
   1156   vpx_free(cpi->lfmv);
   1157   CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
   1158                                         sizeof(*cpi->lfmv)));
   1159   vpx_free(cpi->lf_ref_frame_sign_bias);
   1160   CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias,
   1161                   vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
   1162                              sizeof(*cpi->lf_ref_frame_sign_bias)));
   1163   vpx_free(cpi->lf_ref_frame);
   1164   CHECK_MEM_ERROR(cpi->lf_ref_frame,
   1165                   vpx_calloc((cm->mb_rows + 2) * (cm->mb_cols + 2),
   1166                              sizeof(*cpi->lf_ref_frame)));
   1167 
   1168   /* Create the encoder segmentation map and set all entries to 0 */
   1169   vpx_free(cpi->segmentation_map);
   1170   CHECK_MEM_ERROR(
   1171       cpi->segmentation_map,
   1172       vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->segmentation_map)));
   1173   cpi->cyclic_refresh_mode_index = 0;
   1174   vpx_free(cpi->active_map);
   1175   CHECK_MEM_ERROR(cpi->active_map, vpx_calloc(cm->mb_rows * cm->mb_cols,
   1176                                               sizeof(*cpi->active_map)));
   1177   memset(cpi->active_map, 1, (cm->mb_rows * cm->mb_cols));
   1178 
   1179 #if CONFIG_MULTITHREAD
   1180   if (width < 640) {
   1181     cpi->mt_sync_range = 1;
   1182   } else if (width <= 1280) {
   1183     cpi->mt_sync_range = 4;
   1184   } else if (width <= 2560) {
   1185     cpi->mt_sync_range = 8;
   1186   } else {
   1187     cpi->mt_sync_range = 16;
   1188   }
   1189 
   1190   if (cpi->oxcf.multi_threaded > 1) {
   1191     int i;
   1192 
   1193     /* De-allocate and re-allocate mutex */
   1194     if (cpi->pmutex != NULL) {
   1195       for (i = 0; i < prev_mb_rows; ++i) {
   1196         pthread_mutex_destroy(&cpi->pmutex[i]);
   1197       }
   1198       vpx_free(cpi->pmutex);
   1199       cpi->pmutex = NULL;
   1200     }
   1201 
   1202     CHECK_MEM_ERROR(cpi->pmutex,
   1203                     vpx_malloc(sizeof(*cpi->pmutex) * cm->mb_rows));
   1204     if (cpi->pmutex) {
   1205       for (i = 0; i < cm->mb_rows; ++i) {
   1206         pthread_mutex_init(&cpi->pmutex[i], NULL);
   1207       }
   1208     }
   1209 
   1210     vpx_free(cpi->mt_current_mb_col);
   1211     CHECK_MEM_ERROR(cpi->mt_current_mb_col,
   1212                     vpx_malloc(sizeof(*cpi->mt_current_mb_col) * cm->mb_rows));
   1213   }
   1214 
   1215 #endif
   1216 
   1217   vpx_free(cpi->tplist);
   1218   CHECK_MEM_ERROR(cpi->tplist, vpx_malloc(sizeof(TOKENLIST) * cm->mb_rows));
   1219 
   1220 #if CONFIG_TEMPORAL_DENOISING
   1221   if (cpi->oxcf.noise_sensitivity > 0) {
   1222     vp8_denoiser_free(&cpi->denoiser);
   1223     if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
   1224                               cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
   1225       vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1226                          "Failed to allocate denoiser");
   1227     }
   1228   }
   1229 #endif
   1230 }
   1231 
   1232 /* Quant MOD */
   1233 static const int q_trans[] = {
   1234   0,  1,  2,  3,  4,  5,  7,   8,   9,   10,  12,  13,  15,  17,  18,  19,
   1235   20, 21, 23, 24, 25, 26, 27,  28,  29,  30,  31,  33,  35,  37,  39,  41,
   1236   43, 45, 47, 49, 51, 53, 55,  57,  59,  61,  64,  67,  70,  73,  76,  79,
   1237   82, 85, 88, 91, 94, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, 127,
   1238 };
   1239 
   1240 int vp8_reverse_trans(int x) {
   1241   int i;
   1242 
   1243   for (i = 0; i < 64; ++i) {
   1244     if (q_trans[i] >= x) return i;
   1245   }
   1246 
   1247   return 63;
   1248 }
   1249 void vp8_new_framerate(VP8_COMP *cpi, double framerate) {
   1250   if (framerate < .1) framerate = 30;
   1251 
   1252   cpi->framerate = framerate;
   1253   cpi->output_framerate = framerate;
   1254   cpi->per_frame_bandwidth =
   1255       (int)(cpi->oxcf.target_bandwidth / cpi->output_framerate);
   1256   cpi->av_per_frame_bandwidth = cpi->per_frame_bandwidth;
   1257   cpi->min_frame_bandwidth = (int)(cpi->av_per_frame_bandwidth *
   1258                                    cpi->oxcf.two_pass_vbrmin_section / 100);
   1259 
   1260   /* Set Maximum gf/arf interval */
   1261   cpi->max_gf_interval = ((int)(cpi->output_framerate / 2.0) + 2);
   1262 
   1263   if (cpi->max_gf_interval < 12) cpi->max_gf_interval = 12;
   1264 
   1265   /* Extended interval for genuinely static scenes */
   1266   cpi->twopass.static_scene_max_gf_interval = cpi->key_frame_frequency >> 1;
   1267 
   1268   /* Special conditions when altr ref frame enabled in lagged compress mode */
   1269   if (cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames) {
   1270     if (cpi->max_gf_interval > cpi->oxcf.lag_in_frames - 1) {
   1271       cpi->max_gf_interval = cpi->oxcf.lag_in_frames - 1;
   1272     }
   1273 
   1274     if (cpi->twopass.static_scene_max_gf_interval >
   1275         cpi->oxcf.lag_in_frames - 1) {
   1276       cpi->twopass.static_scene_max_gf_interval = cpi->oxcf.lag_in_frames - 1;
   1277     }
   1278   }
   1279 
   1280   if (cpi->max_gf_interval > cpi->twopass.static_scene_max_gf_interval) {
   1281     cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
   1282   }
   1283 }
   1284 
   1285 static void init_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
   1286   VP8_COMMON *cm = &cpi->common;
   1287 
   1288   cpi->oxcf = *oxcf;
   1289 
   1290   cpi->auto_gold = 1;
   1291   cpi->auto_adjust_gold_quantizer = 1;
   1292 
   1293   cm->version = oxcf->Version;
   1294   vp8_setup_version(cm);
   1295 
   1296   /* Frame rate is not available on the first frame, as it's derived from
   1297    * the observed timestamps. The actual value used here doesn't matter
   1298    * too much, as it will adapt quickly.
   1299    */
   1300   if (oxcf->timebase.num > 0) {
   1301     cpi->framerate =
   1302         (double)(oxcf->timebase.den) / (double)(oxcf->timebase.num);
   1303   } else {
   1304     cpi->framerate = 30;
   1305   }
   1306 
   1307   /* If the reciprocal of the timebase seems like a reasonable framerate,
   1308    * then use that as a guess, otherwise use 30.
   1309    */
   1310   if (cpi->framerate > 180) cpi->framerate = 30;
   1311 
   1312   cpi->ref_framerate = cpi->framerate;
   1313 
   1314   cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
   1315 
   1316   cm->refresh_golden_frame = 0;
   1317   cm->refresh_last_frame = 1;
   1318   cm->refresh_entropy_probs = 1;
   1319 
   1320   /* change includes all joint functionality */
   1321   vp8_change_config(cpi, oxcf);
   1322 
   1323   /* Initialize active best and worst q and average q values. */
   1324   cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
   1325   cpi->active_best_quality = cpi->oxcf.best_allowed_q;
   1326   cpi->avg_frame_qindex = cpi->oxcf.worst_allowed_q;
   1327 
   1328   /* Initialise the starting buffer levels */
   1329   cpi->buffer_level = cpi->oxcf.starting_buffer_level;
   1330   cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
   1331 
   1332   cpi->rolling_target_bits = cpi->av_per_frame_bandwidth;
   1333   cpi->rolling_actual_bits = cpi->av_per_frame_bandwidth;
   1334   cpi->long_rolling_target_bits = cpi->av_per_frame_bandwidth;
   1335   cpi->long_rolling_actual_bits = cpi->av_per_frame_bandwidth;
   1336 
   1337   cpi->total_actual_bits = 0;
   1338   cpi->total_target_vs_actual = 0;
   1339 
   1340   /* Temporal scalabilty */
   1341   if (cpi->oxcf.number_of_layers > 1) {
   1342     unsigned int i;
   1343     double prev_layer_framerate = 0;
   1344 
   1345     for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
   1346       init_temporal_layer_context(cpi, oxcf, i, prev_layer_framerate);
   1347       prev_layer_framerate =
   1348           cpi->output_framerate / cpi->oxcf.rate_decimator[i];
   1349     }
   1350   }
   1351 
   1352 #if VP8_TEMPORAL_ALT_REF
   1353   {
   1354     int i;
   1355 
   1356     cpi->fixed_divide[0] = 0;
   1357 
   1358     for (i = 1; i < 512; ++i) cpi->fixed_divide[i] = 0x80000 / i;
   1359   }
   1360 #endif
   1361 }
   1362 
   1363 static void update_layer_contexts(VP8_COMP *cpi) {
   1364   VP8_CONFIG *oxcf = &cpi->oxcf;
   1365 
   1366   /* Update snapshots of the layer contexts to reflect new parameters */
   1367   if (oxcf->number_of_layers > 1) {
   1368     unsigned int i;
   1369     double prev_layer_framerate = 0;
   1370 
   1371     assert(oxcf->number_of_layers <= VPX_TS_MAX_LAYERS);
   1372     for (i = 0; i < oxcf->number_of_layers && i < VPX_TS_MAX_LAYERS; ++i) {
   1373       LAYER_CONTEXT *lc = &cpi->layer_context[i];
   1374 
   1375       lc->framerate = cpi->ref_framerate / oxcf->rate_decimator[i];
   1376       lc->target_bandwidth = oxcf->target_bitrate[i] * 1000;
   1377 
   1378       lc->starting_buffer_level = rescale(
   1379           (int)oxcf->starting_buffer_level_in_ms, lc->target_bandwidth, 1000);
   1380 
   1381       if (oxcf->optimal_buffer_level == 0) {
   1382         lc->optimal_buffer_level = lc->target_bandwidth / 8;
   1383       } else {
   1384         lc->optimal_buffer_level = rescale(
   1385             (int)oxcf->optimal_buffer_level_in_ms, lc->target_bandwidth, 1000);
   1386       }
   1387 
   1388       if (oxcf->maximum_buffer_size == 0) {
   1389         lc->maximum_buffer_size = lc->target_bandwidth / 8;
   1390       } else {
   1391         lc->maximum_buffer_size = rescale((int)oxcf->maximum_buffer_size_in_ms,
   1392                                           lc->target_bandwidth, 1000);
   1393       }
   1394 
   1395       /* Work out the average size of a frame within this layer */
   1396       if (i > 0) {
   1397         lc->avg_frame_size_for_layer =
   1398             (int)((oxcf->target_bitrate[i] - oxcf->target_bitrate[i - 1]) *
   1399                   1000 / (lc->framerate - prev_layer_framerate));
   1400       }
   1401 
   1402       prev_layer_framerate = lc->framerate;
   1403     }
   1404   }
   1405 }
   1406 
   1407 void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) {
   1408   VP8_COMMON *cm = &cpi->common;
   1409   int last_w, last_h;
   1410   unsigned int prev_number_of_layers;
   1411 
   1412   if (!cpi) return;
   1413 
   1414   if (!oxcf) return;
   1415 
   1416   if (cm->version != oxcf->Version) {
   1417     cm->version = oxcf->Version;
   1418     vp8_setup_version(cm);
   1419   }
   1420 
   1421   last_w = cpi->oxcf.Width;
   1422   last_h = cpi->oxcf.Height;
   1423   prev_number_of_layers = cpi->oxcf.number_of_layers;
   1424 
   1425   cpi->oxcf = *oxcf;
   1426 
   1427   switch (cpi->oxcf.Mode) {
   1428     case MODE_REALTIME:
   1429       cpi->pass = 0;
   1430       cpi->compressor_speed = 2;
   1431 
   1432       if (cpi->oxcf.cpu_used < -16) {
   1433         cpi->oxcf.cpu_used = -16;
   1434       }
   1435 
   1436       if (cpi->oxcf.cpu_used > 16) cpi->oxcf.cpu_used = 16;
   1437 
   1438       break;
   1439 
   1440     case MODE_GOODQUALITY:
   1441       cpi->pass = 0;
   1442       cpi->compressor_speed = 1;
   1443 
   1444       if (cpi->oxcf.cpu_used < -5) {
   1445         cpi->oxcf.cpu_used = -5;
   1446       }
   1447 
   1448       if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
   1449 
   1450       break;
   1451 
   1452     case MODE_BESTQUALITY:
   1453       cpi->pass = 0;
   1454       cpi->compressor_speed = 0;
   1455       break;
   1456 
   1457     case MODE_FIRSTPASS:
   1458       cpi->pass = 1;
   1459       cpi->compressor_speed = 1;
   1460       break;
   1461     case MODE_SECONDPASS:
   1462       cpi->pass = 2;
   1463       cpi->compressor_speed = 1;
   1464 
   1465       if (cpi->oxcf.cpu_used < -5) {
   1466         cpi->oxcf.cpu_used = -5;
   1467       }
   1468 
   1469       if (cpi->oxcf.cpu_used > 5) cpi->oxcf.cpu_used = 5;
   1470 
   1471       break;
   1472     case MODE_SECONDPASS_BEST:
   1473       cpi->pass = 2;
   1474       cpi->compressor_speed = 0;
   1475       break;
   1476   }
   1477 
   1478   if (cpi->pass == 0) cpi->auto_worst_q = 1;
   1479 
   1480   cpi->oxcf.worst_allowed_q = q_trans[oxcf->worst_allowed_q];
   1481   cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q];
   1482   cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level];
   1483 
   1484   if (oxcf->fixed_q >= 0) {
   1485     if (oxcf->worst_allowed_q < 0) {
   1486       cpi->oxcf.fixed_q = q_trans[0];
   1487     } else {
   1488       cpi->oxcf.fixed_q = q_trans[oxcf->worst_allowed_q];
   1489     }
   1490 
   1491     if (oxcf->alt_q < 0) {
   1492       cpi->oxcf.alt_q = q_trans[0];
   1493     } else {
   1494       cpi->oxcf.alt_q = q_trans[oxcf->alt_q];
   1495     }
   1496 
   1497     if (oxcf->key_q < 0) {
   1498       cpi->oxcf.key_q = q_trans[0];
   1499     } else {
   1500       cpi->oxcf.key_q = q_trans[oxcf->key_q];
   1501     }
   1502 
   1503     if (oxcf->gold_q < 0) {
   1504       cpi->oxcf.gold_q = q_trans[0];
   1505     } else {
   1506       cpi->oxcf.gold_q = q_trans[oxcf->gold_q];
   1507     }
   1508   }
   1509 
   1510   cpi->baseline_gf_interval =
   1511       cpi->oxcf.alt_freq ? cpi->oxcf.alt_freq : DEFAULT_GF_INTERVAL;
   1512 
   1513   // GF behavior for 1 pass CBR, used when error_resilience is off.
   1514   if (!cpi->oxcf.error_resilient_mode &&
   1515       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
   1516       cpi->oxcf.Mode == MODE_REALTIME)
   1517     cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
   1518 
   1519 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
   1520   cpi->oxcf.token_partitions = 3;
   1521 #endif
   1522 
   1523   if (cpi->oxcf.token_partitions >= 0 && cpi->oxcf.token_partitions <= 3) {
   1524     cm->multi_token_partition = (TOKEN_PARTITION)cpi->oxcf.token_partitions;
   1525   }
   1526 
   1527   setup_features(cpi);
   1528 
   1529   {
   1530     int i;
   1531 
   1532     for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
   1533       cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
   1534     }
   1535   }
   1536 
   1537   /* At the moment the first order values may not be > MAXQ */
   1538   if (cpi->oxcf.fixed_q > MAXQ) cpi->oxcf.fixed_q = MAXQ;
   1539 
   1540   /* local file playback mode == really big buffer */
   1541   if (cpi->oxcf.end_usage == USAGE_LOCAL_FILE_PLAYBACK) {
   1542     cpi->oxcf.starting_buffer_level = 60000;
   1543     cpi->oxcf.optimal_buffer_level = 60000;
   1544     cpi->oxcf.maximum_buffer_size = 240000;
   1545     cpi->oxcf.starting_buffer_level_in_ms = 60000;
   1546     cpi->oxcf.optimal_buffer_level_in_ms = 60000;
   1547     cpi->oxcf.maximum_buffer_size_in_ms = 240000;
   1548   }
   1549 
   1550   /* Convert target bandwidth from Kbit/s to Bit/s */
   1551   cpi->oxcf.target_bandwidth *= 1000;
   1552 
   1553   cpi->oxcf.starting_buffer_level = rescale(
   1554       (int)cpi->oxcf.starting_buffer_level, cpi->oxcf.target_bandwidth, 1000);
   1555 
   1556   /* Set or reset optimal and maximum buffer levels. */
   1557   if (cpi->oxcf.optimal_buffer_level == 0) {
   1558     cpi->oxcf.optimal_buffer_level = cpi->oxcf.target_bandwidth / 8;
   1559   } else {
   1560     cpi->oxcf.optimal_buffer_level = rescale(
   1561         (int)cpi->oxcf.optimal_buffer_level, cpi->oxcf.target_bandwidth, 1000);
   1562   }
   1563 
   1564   if (cpi->oxcf.maximum_buffer_size == 0) {
   1565     cpi->oxcf.maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
   1566   } else {
   1567     cpi->oxcf.maximum_buffer_size = rescale((int)cpi->oxcf.maximum_buffer_size,
   1568                                             cpi->oxcf.target_bandwidth, 1000);
   1569   }
   1570   // Under a configuration change, where maximum_buffer_size may change,
   1571   // keep buffer level clipped to the maximum allowed buffer size.
   1572   if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
   1573     cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
   1574     cpi->buffer_level = cpi->bits_off_target;
   1575   }
   1576 
   1577   /* Set up frame rate and related parameters rate control values. */
   1578   vp8_new_framerate(cpi, cpi->framerate);
   1579 
   1580   /* Set absolute upper and lower quality limits */
   1581   cpi->worst_quality = cpi->oxcf.worst_allowed_q;
   1582   cpi->best_quality = cpi->oxcf.best_allowed_q;
   1583 
   1584   /* active values should only be modified if out of new range */
   1585   if (cpi->active_worst_quality > cpi->oxcf.worst_allowed_q) {
   1586     cpi->active_worst_quality = cpi->oxcf.worst_allowed_q;
   1587   }
   1588   /* less likely */
   1589   else if (cpi->active_worst_quality < cpi->oxcf.best_allowed_q) {
   1590     cpi->active_worst_quality = cpi->oxcf.best_allowed_q;
   1591   }
   1592   if (cpi->active_best_quality < cpi->oxcf.best_allowed_q) {
   1593     cpi->active_best_quality = cpi->oxcf.best_allowed_q;
   1594   }
   1595   /* less likely */
   1596   else if (cpi->active_best_quality > cpi->oxcf.worst_allowed_q) {
   1597     cpi->active_best_quality = cpi->oxcf.worst_allowed_q;
   1598   }
   1599 
   1600   cpi->buffered_mode = cpi->oxcf.optimal_buffer_level > 0;
   1601 
   1602   cpi->cq_target_quality = cpi->oxcf.cq_level;
   1603 
   1604   /* Only allow dropped frames in buffered mode */
   1605   cpi->drop_frames_allowed = cpi->oxcf.allow_df && cpi->buffered_mode;
   1606 
   1607   cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
   1608 
   1609   // Check if the number of temporal layers has changed, and if so reset the
   1610   // pattern counter and set/initialize the temporal layer context for the
   1611   // new layer configuration.
   1612   if (cpi->oxcf.number_of_layers != prev_number_of_layers) {
   1613     // If the number of temporal layers are changed we must start at the
   1614     // base of the pattern cycle, so set the layer id to 0 and reset
   1615     // the temporal pattern counter.
   1616     if (cpi->temporal_layer_id > 0) {
   1617       cpi->temporal_layer_id = 0;
   1618     }
   1619     cpi->temporal_pattern_counter = 0;
   1620     reset_temporal_layer_change(cpi, oxcf, prev_number_of_layers);
   1621   }
   1622 
   1623   if (!cpi->initial_width) {
   1624     cpi->initial_width = cpi->oxcf.Width;
   1625     cpi->initial_height = cpi->oxcf.Height;
   1626   }
   1627 
   1628   cm->Width = cpi->oxcf.Width;
   1629   cm->Height = cpi->oxcf.Height;
   1630   assert(cm->Width <= cpi->initial_width);
   1631   assert(cm->Height <= cpi->initial_height);
   1632 
   1633   /* TODO(jkoleszar): if an internal spatial resampling is active,
   1634    * and we downsize the input image, maybe we should clear the
   1635    * internal scale immediately rather than waiting for it to
   1636    * correct.
   1637    */
   1638 
   1639   /* VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs) */
   1640   if (cpi->oxcf.Sharpness > 7) cpi->oxcf.Sharpness = 7;
   1641 
   1642   cm->sharpness_level = cpi->oxcf.Sharpness;
   1643 
   1644   if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL) {
   1645     int hr, hs, vr, vs;
   1646 
   1647     Scale2Ratio(cm->horiz_scale, &hr, &hs);
   1648     Scale2Ratio(cm->vert_scale, &vr, &vs);
   1649 
   1650     /* always go to the next whole number */
   1651     cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
   1652     cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
   1653   }
   1654 
   1655   if (last_w != cpi->oxcf.Width || last_h != cpi->oxcf.Height) {
   1656     cpi->force_next_frame_intra = 1;
   1657   }
   1658 
   1659   if (((cm->Width + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_width ||
   1660       ((cm->Height + 15) & ~15) != cm->yv12_fb[cm->lst_fb_idx].y_height ||
   1661       cm->yv12_fb[cm->lst_fb_idx].y_width == 0) {
   1662     dealloc_raw_frame_buffers(cpi);
   1663     alloc_raw_frame_buffers(cpi);
   1664     vp8_alloc_compressor_data(cpi);
   1665   }
   1666 
   1667   if (cpi->oxcf.fixed_q >= 0) {
   1668     cpi->last_q[0] = cpi->oxcf.fixed_q;
   1669     cpi->last_q[1] = cpi->oxcf.fixed_q;
   1670   }
   1671 
   1672   cpi->Speed = cpi->oxcf.cpu_used;
   1673 
   1674   /* force to allowlag to 0 if lag_in_frames is 0; */
   1675   if (cpi->oxcf.lag_in_frames == 0) {
   1676     cpi->oxcf.allow_lag = 0;
   1677   }
   1678   /* Limit on lag buffers as these are not currently dynamically allocated */
   1679   else if (cpi->oxcf.lag_in_frames > MAX_LAG_BUFFERS) {
   1680     cpi->oxcf.lag_in_frames = MAX_LAG_BUFFERS;
   1681   }
   1682 
   1683   /* YX Temp */
   1684   cpi->alt_ref_source = NULL;
   1685   cpi->is_src_frame_alt_ref = 0;
   1686 
   1687 #if CONFIG_TEMPORAL_DENOISING
   1688   if (cpi->oxcf.noise_sensitivity) {
   1689     if (!cpi->denoiser.yv12_mc_running_avg.buffer_alloc) {
   1690       int width = (cpi->oxcf.Width + 15) & ~15;
   1691       int height = (cpi->oxcf.Height + 15) & ~15;
   1692       if (vp8_denoiser_allocate(&cpi->denoiser, width, height, cm->mb_rows,
   1693                                 cm->mb_cols, cpi->oxcf.noise_sensitivity)) {
   1694         vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
   1695                            "Failed to allocate denoiser");
   1696       }
   1697     }
   1698   }
   1699 #endif
   1700 
   1701 #if 0
   1702     /* Experimental RD Code */
   1703     cpi->frame_distortion = 0;
   1704     cpi->last_frame_distortion = 0;
   1705 #endif
   1706 }
   1707 
   1708 #ifndef M_LOG2_E
   1709 #define M_LOG2_E 0.693147180559945309417
   1710 #endif
   1711 #define log2f(x) (log(x) / (float)M_LOG2_E)
   1712 
   1713 static void cal_mvsadcosts(int *mvsadcost[2]) {
   1714   int i = 1;
   1715 
   1716   mvsadcost[0][0] = 300;
   1717   mvsadcost[1][0] = 300;
   1718 
   1719   do {
   1720     double z = 256 * (2 * (log2f(8 * i) + .6));
   1721     mvsadcost[0][i] = (int)z;
   1722     mvsadcost[1][i] = (int)z;
   1723     mvsadcost[0][-i] = (int)z;
   1724     mvsadcost[1][-i] = (int)z;
   1725   } while (++i <= mvfp_max);
   1726 }
   1727 
   1728 struct VP8_COMP *vp8_create_compressor(VP8_CONFIG *oxcf) {
   1729   int i;
   1730 
   1731   VP8_COMP *cpi;
   1732   VP8_COMMON *cm;
   1733 
   1734   cpi = vpx_memalign(32, sizeof(VP8_COMP));
   1735   /* Check that the CPI instance is valid */
   1736   if (!cpi) return 0;
   1737 
   1738   cm = &cpi->common;
   1739 
   1740   memset(cpi, 0, sizeof(VP8_COMP));
   1741 
   1742   if (setjmp(cm->error.jmp)) {
   1743     cpi->common.error.setjmp = 0;
   1744     vp8_remove_compressor(&cpi);
   1745     return 0;
   1746   }
   1747 
   1748   cpi->common.error.setjmp = 1;
   1749 
   1750   CHECK_MEM_ERROR(cpi->mb.ss, vpx_calloc(sizeof(search_site),
   1751                                          (MAX_MVSEARCH_STEPS * 8) + 1));
   1752 
   1753   vp8_create_common(&cpi->common);
   1754 
   1755   init_config(cpi, oxcf);
   1756 
   1757   memcpy(cpi->base_skip_false_prob, vp8cx_base_skip_false_prob,
   1758          sizeof(vp8cx_base_skip_false_prob));
   1759   cpi->common.current_video_frame = 0;
   1760   cpi->temporal_pattern_counter = 0;
   1761   cpi->temporal_layer_id = -1;
   1762   cpi->kf_overspend_bits = 0;
   1763   cpi->kf_bitrate_adjustment = 0;
   1764   cpi->frames_till_gf_update_due = 0;
   1765   cpi->gf_overspend_bits = 0;
   1766   cpi->non_gf_bitrate_adjustment = 0;
   1767   cpi->prob_last_coded = 128;
   1768   cpi->prob_gf_coded = 128;
   1769   cpi->prob_intra_coded = 63;
   1770 
   1771   /* Prime the recent reference frame usage counters.
   1772    * Hereafter they will be maintained as a sort of moving average
   1773    */
   1774   cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
   1775   cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
   1776   cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
   1777   cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
   1778 
   1779   /* Set reference frame sign bias for ALTREF frame to 1 (for now) */
   1780   cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
   1781 
   1782   cpi->twopass.gf_decay_rate = 0;
   1783   cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
   1784 
   1785   cpi->gold_is_last = 0;
   1786   cpi->alt_is_last = 0;
   1787   cpi->gold_is_alt = 0;
   1788 
   1789   cpi->active_map_enabled = 0;
   1790 
   1791 #if 0
   1792     /* Experimental code for lagged and one pass */
   1793     /* Initialise one_pass GF frames stats */
   1794     /* Update stats used for GF selection */
   1795     if (cpi->pass == 0)
   1796     {
   1797         cpi->one_pass_frame_index = 0;
   1798 
   1799         for (i = 0; i < MAX_LAG_BUFFERS; ++i)
   1800         {
   1801             cpi->one_pass_frame_stats[i].frames_so_far = 0;
   1802             cpi->one_pass_frame_stats[i].frame_intra_error = 0.0;
   1803             cpi->one_pass_frame_stats[i].frame_coded_error = 0.0;
   1804             cpi->one_pass_frame_stats[i].frame_pcnt_inter = 0.0;
   1805             cpi->one_pass_frame_stats[i].frame_pcnt_motion = 0.0;
   1806             cpi->one_pass_frame_stats[i].frame_mvr = 0.0;
   1807             cpi->one_pass_frame_stats[i].frame_mvr_abs = 0.0;
   1808             cpi->one_pass_frame_stats[i].frame_mvc = 0.0;
   1809             cpi->one_pass_frame_stats[i].frame_mvc_abs = 0.0;
   1810         }
   1811     }
   1812 #endif
   1813 
   1814   cpi->mse_source_denoised = 0;
   1815 
   1816   /* Should we use the cyclic refresh method.
   1817    * Currently there is no external control for this.
   1818    * Enable it for error_resilient_mode, or for 1 pass CBR mode.
   1819    */
   1820   cpi->cyclic_refresh_mode_enabled =
   1821       (cpi->oxcf.error_resilient_mode ||
   1822        (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
   1823         cpi->oxcf.Mode <= 2));
   1824   cpi->cyclic_refresh_mode_max_mbs_perframe =
   1825       (cpi->common.mb_rows * cpi->common.mb_cols) / 7;
   1826   if (cpi->oxcf.number_of_layers == 1) {
   1827     cpi->cyclic_refresh_mode_max_mbs_perframe =
   1828         (cpi->common.mb_rows * cpi->common.mb_cols) / 20;
   1829   } else if (cpi->oxcf.number_of_layers == 2) {
   1830     cpi->cyclic_refresh_mode_max_mbs_perframe =
   1831         (cpi->common.mb_rows * cpi->common.mb_cols) / 10;
   1832   }
   1833   cpi->cyclic_refresh_mode_index = 0;
   1834   cpi->cyclic_refresh_q = 32;
   1835 
   1836   // GF behavior for 1 pass CBR, used when error_resilience is off.
   1837   cpi->gf_update_onepass_cbr = 0;
   1838   cpi->gf_noboost_onepass_cbr = 0;
   1839   if (!cpi->oxcf.error_resilient_mode &&
   1840       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER && cpi->oxcf.Mode <= 2) {
   1841     cpi->gf_update_onepass_cbr = 1;
   1842     cpi->gf_noboost_onepass_cbr = 1;
   1843     cpi->gf_interval_onepass_cbr =
   1844         cpi->cyclic_refresh_mode_max_mbs_perframe > 0
   1845             ? (2 * (cpi->common.mb_rows * cpi->common.mb_cols) /
   1846                cpi->cyclic_refresh_mode_max_mbs_perframe)
   1847             : 10;
   1848     cpi->gf_interval_onepass_cbr =
   1849         VPXMIN(40, VPXMAX(6, cpi->gf_interval_onepass_cbr));
   1850     cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
   1851   }
   1852 
   1853   if (cpi->cyclic_refresh_mode_enabled) {
   1854     CHECK_MEM_ERROR(cpi->cyclic_refresh_map,
   1855                     vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
   1856   } else {
   1857     cpi->cyclic_refresh_map = (signed char *)NULL;
   1858   }
   1859 
   1860   CHECK_MEM_ERROR(cpi->consec_zero_last,
   1861                   vpx_calloc(cm->mb_rows * cm->mb_cols, 1));
   1862   CHECK_MEM_ERROR(cpi->consec_zero_last_mvbias,
   1863                   vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
   1864 
   1865 #ifdef VP8_ENTROPY_STATS
   1866   init_context_counters();
   1867 #endif
   1868 
   1869   /*Initialize the feed-forward activity masking.*/
   1870   cpi->activity_avg = 90 << 12;
   1871 
   1872   /* Give a sensible default for the first frame. */
   1873   cpi->frames_since_key = 8;
   1874   cpi->key_frame_frequency = cpi->oxcf.key_freq;
   1875   cpi->this_key_frame_forced = 0;
   1876   cpi->next_key_frame_forced = 0;
   1877 
   1878   cpi->source_alt_ref_pending = 0;
   1879   cpi->source_alt_ref_active = 0;
   1880   cpi->common.refresh_alt_ref_frame = 0;
   1881 
   1882   cpi->force_maxqp = 0;
   1883 
   1884   cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
   1885 #if CONFIG_INTERNAL_STATS
   1886   cpi->b_calculate_ssimg = 0;
   1887 
   1888   cpi->count = 0;
   1889   cpi->bytes = 0;
   1890 
   1891   if (cpi->b_calculate_psnr) {
   1892     cpi->total_sq_error = 0.0;
   1893     cpi->total_sq_error2 = 0.0;
   1894     cpi->total_y = 0.0;
   1895     cpi->total_u = 0.0;
   1896     cpi->total_v = 0.0;
   1897     cpi->total = 0.0;
   1898     cpi->totalp_y = 0.0;
   1899     cpi->totalp_u = 0.0;
   1900     cpi->totalp_v = 0.0;
   1901     cpi->totalp = 0.0;
   1902     cpi->tot_recode_hits = 0;
   1903     cpi->summed_quality = 0;
   1904     cpi->summed_weights = 0;
   1905   }
   1906 
   1907 #endif
   1908 
   1909   cpi->first_time_stamp_ever = 0x7FFFFFFF;
   1910 
   1911   cpi->frames_till_gf_update_due = 0;
   1912   cpi->key_frame_count = 1;
   1913 
   1914   cpi->ni_av_qi = cpi->oxcf.worst_allowed_q;
   1915   cpi->ni_tot_qi = 0;
   1916   cpi->ni_frames = 0;
   1917   cpi->total_byte_count = 0;
   1918 
   1919   cpi->drop_frame = 0;
   1920 
   1921   cpi->rate_correction_factor = 1.0;
   1922   cpi->key_frame_rate_correction_factor = 1.0;
   1923   cpi->gf_rate_correction_factor = 1.0;
   1924   cpi->twopass.est_max_qcorrection_factor = 1.0;
   1925 
   1926   for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
   1927     cpi->prior_key_frame_distance[i] = (int)cpi->output_framerate;
   1928   }
   1929 
   1930 #ifdef OUTPUT_YUV_SRC
   1931   yuv_file = fopen("bd.yuv", "ab");
   1932 #endif
   1933 #ifdef OUTPUT_YUV_DENOISED
   1934   yuv_denoised_file = fopen("denoised.yuv", "ab");
   1935 #endif
   1936 
   1937 #if 0
   1938     framepsnr = fopen("framepsnr.stt", "a");
   1939     kf_list = fopen("kf_list.stt", "w");
   1940 #endif
   1941 
   1942   cpi->output_pkt_list = oxcf->output_pkt_list;
   1943 
   1944 #if !CONFIG_REALTIME_ONLY
   1945 
   1946   if (cpi->pass == 1) {
   1947     vp8_init_first_pass(cpi);
   1948   } else if (cpi->pass == 2) {
   1949     size_t packet_sz = sizeof(FIRSTPASS_STATS);
   1950     int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
   1951 
   1952     cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
   1953     cpi->twopass.stats_in = cpi->twopass.stats_in_start;
   1954     cpi->twopass.stats_in_end =
   1955         (void *)((char *)cpi->twopass.stats_in + (packets - 1) * packet_sz);
   1956     vp8_init_second_pass(cpi);
   1957   }
   1958 
   1959 #endif
   1960 
   1961   if (cpi->compressor_speed == 2) {
   1962     cpi->avg_encode_time = 0;
   1963     cpi->avg_pick_mode_time = 0;
   1964   }
   1965 
   1966   vp8_set_speed_features(cpi);
   1967 
   1968   /* Set starting values of RD threshold multipliers (128 = *1) */
   1969   for (i = 0; i < MAX_MODES; ++i) {
   1970     cpi->mb.rd_thresh_mult[i] = 128;
   1971   }
   1972 
   1973 #ifdef VP8_ENTROPY_STATS
   1974   init_mv_ref_counts();
   1975 #endif
   1976 
   1977 #if CONFIG_MULTITHREAD
   1978   if (vp8cx_create_encoder_threads(cpi)) {
   1979     vp8_remove_compressor(&cpi);
   1980     return 0;
   1981   }
   1982 #endif
   1983 
   1984   cpi->fn_ptr[BLOCK_16X16].sdf = vpx_sad16x16;
   1985   cpi->fn_ptr[BLOCK_16X16].vf = vpx_variance16x16;
   1986   cpi->fn_ptr[BLOCK_16X16].svf = vpx_sub_pixel_variance16x16;
   1987   cpi->fn_ptr[BLOCK_16X16].sdx3f = vpx_sad16x16x3;
   1988   cpi->fn_ptr[BLOCK_16X16].sdx8f = vpx_sad16x16x8;
   1989   cpi->fn_ptr[BLOCK_16X16].sdx4df = vpx_sad16x16x4d;
   1990 
   1991   cpi->fn_ptr[BLOCK_16X8].sdf = vpx_sad16x8;
   1992   cpi->fn_ptr[BLOCK_16X8].vf = vpx_variance16x8;
   1993   cpi->fn_ptr[BLOCK_16X8].svf = vpx_sub_pixel_variance16x8;
   1994   cpi->fn_ptr[BLOCK_16X8].sdx3f = vpx_sad16x8x3;
   1995   cpi->fn_ptr[BLOCK_16X8].sdx8f = vpx_sad16x8x8;
   1996   cpi->fn_ptr[BLOCK_16X8].sdx4df = vpx_sad16x8x4d;
   1997 
   1998   cpi->fn_ptr[BLOCK_8X16].sdf = vpx_sad8x16;
   1999   cpi->fn_ptr[BLOCK_8X16].vf = vpx_variance8x16;
   2000   cpi->fn_ptr[BLOCK_8X16].svf = vpx_sub_pixel_variance8x16;
   2001   cpi->fn_ptr[BLOCK_8X16].sdx3f = vpx_sad8x16x3;
   2002   cpi->fn_ptr[BLOCK_8X16].sdx8f = vpx_sad8x16x8;
   2003   cpi->fn_ptr[BLOCK_8X16].sdx4df = vpx_sad8x16x4d;
   2004 
   2005   cpi->fn_ptr[BLOCK_8X8].sdf = vpx_sad8x8;
   2006   cpi->fn_ptr[BLOCK_8X8].vf = vpx_variance8x8;
   2007   cpi->fn_ptr[BLOCK_8X8].svf = vpx_sub_pixel_variance8x8;
   2008   cpi->fn_ptr[BLOCK_8X8].sdx3f = vpx_sad8x8x3;
   2009   cpi->fn_ptr[BLOCK_8X8].sdx8f = vpx_sad8x8x8;
   2010   cpi->fn_ptr[BLOCK_8X8].sdx4df = vpx_sad8x8x4d;
   2011 
   2012   cpi->fn_ptr[BLOCK_4X4].sdf = vpx_sad4x4;
   2013   cpi->fn_ptr[BLOCK_4X4].vf = vpx_variance4x4;
   2014   cpi->fn_ptr[BLOCK_4X4].svf = vpx_sub_pixel_variance4x4;
   2015   cpi->fn_ptr[BLOCK_4X4].sdx3f = vpx_sad4x4x3;
   2016   cpi->fn_ptr[BLOCK_4X4].sdx8f = vpx_sad4x4x8;
   2017   cpi->fn_ptr[BLOCK_4X4].sdx4df = vpx_sad4x4x4d;
   2018 
   2019 #if ARCH_X86 || ARCH_X86_64
   2020   cpi->fn_ptr[BLOCK_16X16].copymem = vp8_copy32xn;
   2021   cpi->fn_ptr[BLOCK_16X8].copymem = vp8_copy32xn;
   2022   cpi->fn_ptr[BLOCK_8X16].copymem = vp8_copy32xn;
   2023   cpi->fn_ptr[BLOCK_8X8].copymem = vp8_copy32xn;
   2024   cpi->fn_ptr[BLOCK_4X4].copymem = vp8_copy32xn;
   2025 #endif
   2026 
   2027   cpi->full_search_sad = vp8_full_search_sad;
   2028   cpi->diamond_search_sad = vp8_diamond_search_sad;
   2029   cpi->refining_search_sad = vp8_refining_search_sad;
   2030 
   2031   /* make sure frame 1 is okay */
   2032   cpi->mb.error_bins[0] = cpi->common.MBs;
   2033 
   2034   /* vp8cx_init_quantizer() is first called here. Add check in
   2035    * vp8cx_frame_init_quantizer() so that vp8cx_init_quantizer is only
   2036    * called later when needed. This will avoid unnecessary calls of
   2037    * vp8cx_init_quantizer() for every frame.
   2038    */
   2039   vp8cx_init_quantizer(cpi);
   2040 
   2041   vp8_loop_filter_init(cm);
   2042 
   2043   cpi->common.error.setjmp = 0;
   2044 
   2045 #if CONFIG_MULTI_RES_ENCODING
   2046 
   2047   /* Calculate # of MBs in a row in lower-resolution level image. */
   2048   if (cpi->oxcf.mr_encoder_id > 0) vp8_cal_low_res_mb_cols(cpi);
   2049 
   2050 #endif
   2051 
   2052   /* setup RD costs to MACROBLOCK struct */
   2053 
   2054   cpi->mb.mvcost[0] = &cpi->rd_costs.mvcosts[0][mv_max + 1];
   2055   cpi->mb.mvcost[1] = &cpi->rd_costs.mvcosts[1][mv_max + 1];
   2056   cpi->mb.mvsadcost[0] = &cpi->rd_costs.mvsadcosts[0][mvfp_max + 1];
   2057   cpi->mb.mvsadcost[1] = &cpi->rd_costs.mvsadcosts[1][mvfp_max + 1];
   2058 
   2059   cal_mvsadcosts(cpi->mb.mvsadcost);
   2060 
   2061   cpi->mb.mbmode_cost = cpi->rd_costs.mbmode_cost;
   2062   cpi->mb.intra_uv_mode_cost = cpi->rd_costs.intra_uv_mode_cost;
   2063   cpi->mb.bmode_costs = cpi->rd_costs.bmode_costs;
   2064   cpi->mb.inter_bmode_costs = cpi->rd_costs.inter_bmode_costs;
   2065   cpi->mb.token_costs = cpi->rd_costs.token_costs;
   2066 
   2067   /* setup block ptrs & offsets */
   2068   vp8_setup_block_ptrs(&cpi->mb);
   2069   vp8_setup_block_dptrs(&cpi->mb.e_mbd);
   2070 
   2071   return cpi;
   2072 }
   2073 
   2074 void vp8_remove_compressor(VP8_COMP **ptr) {
   2075   VP8_COMP *cpi = *ptr;
   2076 
   2077   if (!cpi) return;
   2078 
   2079   if (cpi && (cpi->common.current_video_frame > 0)) {
   2080 #if !CONFIG_REALTIME_ONLY
   2081 
   2082     if (cpi->pass == 2) {
   2083       vp8_end_second_pass(cpi);
   2084     }
   2085 
   2086 #endif
   2087 
   2088 #ifdef VP8_ENTROPY_STATS
   2089     print_context_counters();
   2090     print_tree_update_probs();
   2091     print_mode_context();
   2092 #endif
   2093 
   2094 #if CONFIG_INTERNAL_STATS
   2095 
   2096     if (cpi->pass != 1) {
   2097       FILE *f = fopen("opsnr.stt", "a");
   2098       double time_encoded =
   2099           (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
   2100           10000000.000;
   2101       double dr = (double)cpi->bytes * 8.0 / 1000.0 / time_encoded;
   2102 
   2103       if (cpi->b_calculate_psnr) {
   2104         if (cpi->oxcf.number_of_layers > 1) {
   2105           int i;
   2106 
   2107           fprintf(f,
   2108                   "Layer\tBitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
   2109                   "GLPsnrP\tVPXSSIM\n");
   2110           for (i = 0; i < (int)cpi->oxcf.number_of_layers; ++i) {
   2111             double dr =
   2112                 (double)cpi->bytes_in_layer[i] * 8.0 / 1000.0 / time_encoded;
   2113             double samples = 3.0 / 2 * cpi->frames_in_layer[i] *
   2114                              cpi->common.Width * cpi->common.Height;
   2115             double total_psnr =
   2116                 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2[i]);
   2117             double total_psnr2 =
   2118                 vpx_sse_to_psnr(samples, 255.0, cpi->total_error2_p[i]);
   2119             double total_ssim =
   2120                 100 * pow(cpi->sum_ssim[i] / cpi->sum_weights[i], 8.0);
   2121 
   2122             fprintf(f,
   2123                     "%5d\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
   2124                     "%7.3f\t%7.3f\n",
   2125                     i, dr, cpi->sum_psnr[i] / cpi->frames_in_layer[i],
   2126                     total_psnr, cpi->sum_psnr_p[i] / cpi->frames_in_layer[i],
   2127                     total_psnr2, total_ssim);
   2128           }
   2129         } else {
   2130           double samples =
   2131               3.0 / 2 * cpi->count * cpi->common.Width * cpi->common.Height;
   2132           double total_psnr =
   2133               vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error);
   2134           double total_psnr2 =
   2135               vpx_sse_to_psnr(samples, 255.0, cpi->total_sq_error2);
   2136           double total_ssim =
   2137               100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
   2138 
   2139           fprintf(f,
   2140                   "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\t"
   2141                   "GLPsnrP\tVPXSSIM\n");
   2142           fprintf(f,
   2143                   "%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
   2144                   "%7.3f\n",
   2145                   dr, cpi->total / cpi->count, total_psnr,
   2146                   cpi->totalp / cpi->count, total_psnr2, total_ssim);
   2147         }
   2148       }
   2149       fclose(f);
   2150 #if 0
   2151             f = fopen("qskip.stt", "a");
   2152             fprintf(f, "minq:%d -maxq:%d skiptrue:skipfalse = %d:%d\n", cpi->oxcf.best_allowed_q, cpi->oxcf.worst_allowed_q, skiptruecount, skipfalsecount);
   2153             fclose(f);
   2154 #endif
   2155     }
   2156 
   2157 #endif
   2158 
   2159 #ifdef SPEEDSTATS
   2160 
   2161     if (cpi->compressor_speed == 2) {
   2162       int i;
   2163       FILE *f = fopen("cxspeed.stt", "a");
   2164       cnt_pm /= cpi->common.MBs;
   2165 
   2166       for (i = 0; i < 16; ++i) fprintf(f, "%5d", frames_at_speed[i]);
   2167 
   2168       fprintf(f, "\n");
   2169       fclose(f);
   2170     }
   2171 
   2172 #endif
   2173 
   2174 #ifdef MODE_STATS
   2175     {
   2176       extern int count_mb_seg[4];
   2177       FILE *f = fopen("modes.stt", "a");
   2178       double dr = (double)cpi->framerate * (double)bytes * (double)8 /
   2179                   (double)count / (double)1000;
   2180       fprintf(f, "intra_mode in Intra Frames:\n");
   2181       fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d\n", y_modes[0], y_modes[1],
   2182               y_modes[2], y_modes[3], y_modes[4]);
   2183       fprintf(f, "UV:%8d, %8d, %8d, %8d\n", uv_modes[0], uv_modes[1],
   2184               uv_modes[2], uv_modes[3]);
   2185       fprintf(f, "B: ");
   2186       {
   2187         int i;
   2188 
   2189         for (i = 0; i < 10; ++i) fprintf(f, "%8d, ", b_modes[i]);
   2190 
   2191         fprintf(f, "\n");
   2192       }
   2193 
   2194       fprintf(f, "Modes in Inter Frames:\n");
   2195       fprintf(f, "Y: %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d, %8d\n",
   2196               inter_y_modes[0], inter_y_modes[1], inter_y_modes[2],
   2197               inter_y_modes[3], inter_y_modes[4], inter_y_modes[5],
   2198               inter_y_modes[6], inter_y_modes[7], inter_y_modes[8],
   2199               inter_y_modes[9]);
   2200       fprintf(f, "UV:%8d, %8d, %8d, %8d\n", inter_uv_modes[0],
   2201               inter_uv_modes[1], inter_uv_modes[2], inter_uv_modes[3]);
   2202       fprintf(f, "B: ");
   2203       {
   2204         int i;
   2205 
   2206         for (i = 0; i < 15; ++i) fprintf(f, "%8d, ", inter_b_modes[i]);
   2207 
   2208         fprintf(f, "\n");
   2209       }
   2210       fprintf(f, "P:%8d, %8d, %8d, %8d\n", count_mb_seg[0], count_mb_seg[1],
   2211               count_mb_seg[2], count_mb_seg[3]);
   2212       fprintf(f, "PB:%8d, %8d, %8d, %8d\n", inter_b_modes[LEFT4X4],
   2213               inter_b_modes[ABOVE4X4], inter_b_modes[ZERO4X4],
   2214               inter_b_modes[NEW4X4]);
   2215 
   2216       fclose(f);
   2217     }
   2218 #endif
   2219 
   2220 #ifdef VP8_ENTROPY_STATS
   2221     {
   2222       int i, j, k;
   2223       FILE *fmode = fopen("modecontext.c", "w");
   2224 
   2225       fprintf(fmode, "\n#include \"entropymode.h\"\n\n");
   2226       fprintf(fmode, "const unsigned int vp8_kf_default_bmode_counts ");
   2227       fprintf(fmode,
   2228               "[VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES] =\n{\n");
   2229 
   2230       for (i = 0; i < 10; ++i) {
   2231         fprintf(fmode, "    { /* Above Mode :  %d */\n", i);
   2232 
   2233         for (j = 0; j < 10; ++j) {
   2234           fprintf(fmode, "        {");
   2235 
   2236           for (k = 0; k < 10; ++k) {
   2237             if (!intra_mode_stats[i][j][k])
   2238               fprintf(fmode, " %5d, ", 1);
   2239             else
   2240               fprintf(fmode, " %5d, ", intra_mode_stats[i][j][k]);
   2241           }
   2242 
   2243           fprintf(fmode, "}, /* left_mode %d */\n", j);
   2244         }
   2245 
   2246         fprintf(fmode, "    },\n");
   2247       }
   2248 
   2249       fprintf(fmode, "};\n");
   2250       fclose(fmode);
   2251     }
   2252 #endif
   2253 
   2254 #if defined(SECTIONBITS_OUTPUT)
   2255 
   2256     if (0) {
   2257       int i;
   2258       FILE *f = fopen("tokenbits.stt", "a");
   2259 
   2260       for (i = 0; i < 28; ++i) fprintf(f, "%8d", (int)(Sectionbits[i] / 256));
   2261 
   2262       fprintf(f, "\n");
   2263       fclose(f);
   2264     }
   2265 
   2266 #endif
   2267 
   2268 #if 0
   2269         {
   2270             printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
   2271             printf("\n_frames recive_data encod_mb_row compress_frame  Total\n");
   2272             printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, cpi->time_receive_data / 1000, cpi->time_encode_mb_row / 1000, cpi->time_compress_data / 1000, (cpi->time_receive_data + cpi->time_compress_data) / 1000);
   2273         }
   2274 #endif
   2275   }
   2276 
   2277 #if CONFIG_MULTITHREAD
   2278   vp8cx_remove_encoder_threads(cpi);
   2279 #endif
   2280 
   2281 #if CONFIG_TEMPORAL_DENOISING
   2282   vp8_denoiser_free(&cpi->denoiser);
   2283 #endif
   2284   dealloc_compressor_data(cpi);
   2285   vpx_free(cpi->mb.ss);
   2286   vpx_free(cpi->tok);
   2287   vpx_free(cpi->cyclic_refresh_map);
   2288   vpx_free(cpi->consec_zero_last);
   2289   vpx_free(cpi->consec_zero_last_mvbias);
   2290 
   2291   vp8_remove_common(&cpi->common);
   2292   vpx_free(cpi);
   2293   *ptr = 0;
   2294 
   2295 #ifdef OUTPUT_YUV_SRC
   2296   fclose(yuv_file);
   2297 #endif
   2298 #ifdef OUTPUT_YUV_DENOISED
   2299   fclose(yuv_denoised_file);
   2300 #endif
   2301 
   2302 #if 0
   2303 
   2304     if (keyfile)
   2305         fclose(keyfile);
   2306 
   2307     if (framepsnr)
   2308         fclose(framepsnr);
   2309 
   2310     if (kf_list)
   2311         fclose(kf_list);
   2312 
   2313 #endif
   2314 }
   2315 
   2316 static uint64_t calc_plane_error(unsigned char *orig, int orig_stride,
   2317                                  unsigned char *recon, int recon_stride,
   2318                                  unsigned int cols, unsigned int rows) {
   2319   unsigned int row, col;
   2320   uint64_t total_sse = 0;
   2321   int diff;
   2322 
   2323   for (row = 0; row + 16 <= rows; row += 16) {
   2324     for (col = 0; col + 16 <= cols; col += 16) {
   2325       unsigned int sse;
   2326 
   2327       vpx_mse16x16(orig + col, orig_stride, recon + col, recon_stride, &sse);
   2328       total_sse += sse;
   2329     }
   2330 
   2331     /* Handle odd-sized width */
   2332     if (col < cols) {
   2333       unsigned int border_row, border_col;
   2334       unsigned char *border_orig = orig;
   2335       unsigned char *border_recon = recon;
   2336 
   2337       for (border_row = 0; border_row < 16; ++border_row) {
   2338         for (border_col = col; border_col < cols; ++border_col) {
   2339           diff = border_orig[border_col] - border_recon[border_col];
   2340           total_sse += diff * diff;
   2341         }
   2342 
   2343         border_orig += orig_stride;
   2344         border_recon += recon_stride;
   2345       }
   2346     }
   2347 
   2348     orig += orig_stride * 16;
   2349     recon += recon_stride * 16;
   2350   }
   2351 
   2352   /* Handle odd-sized height */
   2353   for (; row < rows; ++row) {
   2354     for (col = 0; col < cols; ++col) {
   2355       diff = orig[col] - recon[col];
   2356       total_sse += diff * diff;
   2357     }
   2358 
   2359     orig += orig_stride;
   2360     recon += recon_stride;
   2361   }
   2362 
   2363   vpx_clear_system_state();
   2364   return total_sse;
   2365 }
   2366 
   2367 static void generate_psnr_packet(VP8_COMP *cpi) {
   2368   YV12_BUFFER_CONFIG *orig = cpi->Source;
   2369   YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
   2370   struct vpx_codec_cx_pkt pkt;
   2371   uint64_t sse;
   2372   int i;
   2373   unsigned int width = cpi->common.Width;
   2374   unsigned int height = cpi->common.Height;
   2375 
   2376   pkt.kind = VPX_CODEC_PSNR_PKT;
   2377   sse = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
   2378                          recon->y_stride, width, height);
   2379   pkt.data.psnr.sse[0] = sse;
   2380   pkt.data.psnr.sse[1] = sse;
   2381   pkt.data.psnr.samples[0] = width * height;
   2382   pkt.data.psnr.samples[1] = width * height;
   2383 
   2384   width = (width + 1) / 2;
   2385   height = (height + 1) / 2;
   2386 
   2387   sse = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
   2388                          recon->uv_stride, width, height);
   2389   pkt.data.psnr.sse[0] += sse;
   2390   pkt.data.psnr.sse[2] = sse;
   2391   pkt.data.psnr.samples[0] += width * height;
   2392   pkt.data.psnr.samples[2] = width * height;
   2393 
   2394   sse = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
   2395                          recon->uv_stride, width, height);
   2396   pkt.data.psnr.sse[0] += sse;
   2397   pkt.data.psnr.sse[3] = sse;
   2398   pkt.data.psnr.samples[0] += width * height;
   2399   pkt.data.psnr.samples[3] = width * height;
   2400 
   2401   for (i = 0; i < 4; ++i) {
   2402     pkt.data.psnr.psnr[i] = vpx_sse_to_psnr(pkt.data.psnr.samples[i], 255.0,
   2403                                             (double)(pkt.data.psnr.sse[i]));
   2404   }
   2405 
   2406   vpx_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
   2407 }
   2408 
   2409 int vp8_use_as_reference(VP8_COMP *cpi, int ref_frame_flags) {
   2410   if (ref_frame_flags > 7) return -1;
   2411 
   2412   cpi->ref_frame_flags = ref_frame_flags;
   2413   return 0;
   2414 }
   2415 int vp8_update_reference(VP8_COMP *cpi, int ref_frame_flags) {
   2416   if (ref_frame_flags > 7) return -1;
   2417 
   2418   cpi->common.refresh_golden_frame = 0;
   2419   cpi->common.refresh_alt_ref_frame = 0;
   2420   cpi->common.refresh_last_frame = 0;
   2421 
   2422   if (ref_frame_flags & VP8_LAST_FRAME) cpi->common.refresh_last_frame = 1;
   2423 
   2424   if (ref_frame_flags & VP8_GOLD_FRAME) cpi->common.refresh_golden_frame = 1;
   2425 
   2426   if (ref_frame_flags & VP8_ALTR_FRAME) cpi->common.refresh_alt_ref_frame = 1;
   2427 
   2428   return 0;
   2429 }
   2430 
   2431 int vp8_get_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
   2432                       YV12_BUFFER_CONFIG *sd) {
   2433   VP8_COMMON *cm = &cpi->common;
   2434   int ref_fb_idx;
   2435 
   2436   if (ref_frame_flag == VP8_LAST_FRAME) {
   2437     ref_fb_idx = cm->lst_fb_idx;
   2438   } else if (ref_frame_flag == VP8_GOLD_FRAME) {
   2439     ref_fb_idx = cm->gld_fb_idx;
   2440   } else if (ref_frame_flag == VP8_ALTR_FRAME) {
   2441     ref_fb_idx = cm->alt_fb_idx;
   2442   } else {
   2443     return -1;
   2444   }
   2445 
   2446   vp8_yv12_copy_frame(&cm->yv12_fb[ref_fb_idx], sd);
   2447 
   2448   return 0;
   2449 }
   2450 int vp8_set_reference(VP8_COMP *cpi, enum vpx_ref_frame_type ref_frame_flag,
   2451                       YV12_BUFFER_CONFIG *sd) {
   2452   VP8_COMMON *cm = &cpi->common;
   2453 
   2454   int ref_fb_idx;
   2455 
   2456   if (ref_frame_flag == VP8_LAST_FRAME) {
   2457     ref_fb_idx = cm->lst_fb_idx;
   2458   } else if (ref_frame_flag == VP8_GOLD_FRAME) {
   2459     ref_fb_idx = cm->gld_fb_idx;
   2460   } else if (ref_frame_flag == VP8_ALTR_FRAME) {
   2461     ref_fb_idx = cm->alt_fb_idx;
   2462   } else {
   2463     return -1;
   2464   }
   2465 
   2466   vp8_yv12_copy_frame(sd, &cm->yv12_fb[ref_fb_idx]);
   2467 
   2468   return 0;
   2469 }
   2470 int vp8_update_entropy(VP8_COMP *cpi, int update) {
   2471   VP8_COMMON *cm = &cpi->common;
   2472   cm->refresh_entropy_probs = update;
   2473 
   2474   return 0;
   2475 }
   2476 
   2477 #if defined(OUTPUT_YUV_SRC) || defined(OUTPUT_YUV_DENOISED)
   2478 void vp8_write_yuv_frame(FILE *yuv_file, YV12_BUFFER_CONFIG *s) {
   2479   unsigned char *src = s->y_buffer;
   2480   int h = s->y_height;
   2481 
   2482   do {
   2483     fwrite(src, s->y_width, 1, yuv_file);
   2484     src += s->y_stride;
   2485   } while (--h);
   2486 
   2487   src = s->u_buffer;
   2488   h = s->uv_height;
   2489 
   2490   do {
   2491     fwrite(src, s->uv_width, 1, yuv_file);
   2492     src += s->uv_stride;
   2493   } while (--h);
   2494 
   2495   src = s->v_buffer;
   2496   h = s->uv_height;
   2497 
   2498   do {
   2499     fwrite(src, s->uv_width, 1, yuv_file);
   2500     src += s->uv_stride;
   2501   } while (--h);
   2502 }
   2503 #endif
   2504 
   2505 static void scale_and_extend_source(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi) {
   2506   VP8_COMMON *cm = &cpi->common;
   2507 
   2508   /* are we resizing the image */
   2509   if (cm->horiz_scale != 0 || cm->vert_scale != 0) {
   2510 #if CONFIG_SPATIAL_RESAMPLING
   2511     int hr, hs, vr, vs;
   2512     int tmp_height;
   2513 
   2514     if (cm->vert_scale == 3) {
   2515       tmp_height = 9;
   2516     } else {
   2517       tmp_height = 11;
   2518     }
   2519 
   2520     Scale2Ratio(cm->horiz_scale, &hr, &hs);
   2521     Scale2Ratio(cm->vert_scale, &vr, &vs);
   2522 
   2523     vpx_scale_frame(sd, &cpi->scaled_source, cm->temp_scale_frame.y_buffer,
   2524                     tmp_height, hs, hr, vs, vr, 0);
   2525 
   2526     vp8_yv12_extend_frame_borders(&cpi->scaled_source);
   2527     cpi->Source = &cpi->scaled_source;
   2528 #endif
   2529   } else {
   2530     cpi->Source = sd;
   2531   }
   2532 }
   2533 
   2534 static int resize_key_frame(VP8_COMP *cpi) {
   2535 #if CONFIG_SPATIAL_RESAMPLING
   2536   VP8_COMMON *cm = &cpi->common;
   2537 
   2538   /* Do we need to apply resampling for one pass cbr.
   2539    * In one pass this is more limited than in two pass cbr.
   2540    * The test and any change is only made once per key frame sequence.
   2541    */
   2542   if (cpi->oxcf.allow_spatial_resampling &&
   2543       (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
   2544     int hr, hs, vr, vs;
   2545     int new_width, new_height;
   2546 
   2547     /* If we are below the resample DOWN watermark then scale down a
   2548      * notch.
   2549      */
   2550     if (cpi->buffer_level < (cpi->oxcf.resample_down_water_mark *
   2551                              cpi->oxcf.optimal_buffer_level / 100)) {
   2552       cm->horiz_scale =
   2553           (cm->horiz_scale < ONETWO) ? cm->horiz_scale + 1 : ONETWO;
   2554       cm->vert_scale = (cm->vert_scale < ONETWO) ? cm->vert_scale + 1 : ONETWO;
   2555     }
   2556     /* Should we now start scaling back up */
   2557     else if (cpi->buffer_level > (cpi->oxcf.resample_up_water_mark *
   2558                                   cpi->oxcf.optimal_buffer_level / 100)) {
   2559       cm->horiz_scale =
   2560           (cm->horiz_scale > NORMAL) ? cm->horiz_scale - 1 : NORMAL;
   2561       cm->vert_scale = (cm->vert_scale > NORMAL) ? cm->vert_scale - 1 : NORMAL;
   2562     }
   2563 
   2564     /* Get the new height and width */
   2565     Scale2Ratio(cm->horiz_scale, &hr, &hs);
   2566     Scale2Ratio(cm->vert_scale, &vr, &vs);
   2567     new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
   2568     new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
   2569 
   2570     /* If the image size has changed we need to reallocate the buffers
   2571      * and resample the source image
   2572      */
   2573     if ((cm->Width != new_width) || (cm->Height != new_height)) {
   2574       cm->Width = new_width;
   2575       cm->Height = new_height;
   2576       vp8_alloc_compressor_data(cpi);
   2577       scale_and_extend_source(cpi->un_scaled_source, cpi);
   2578       return 1;
   2579     }
   2580   }
   2581 
   2582 #endif
   2583   return 0;
   2584 }
   2585 
   2586 static void update_alt_ref_frame_stats(VP8_COMP *cpi) {
   2587   VP8_COMMON *cm = &cpi->common;
   2588 
   2589   /* Select an interval before next GF or altref */
   2590   if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
   2591 
   2592   if ((cpi->pass != 2) && cpi->frames_till_gf_update_due) {
   2593     cpi->current_gf_interval = cpi->frames_till_gf_update_due;
   2594 
   2595     /* Set the bits per frame that we should try and recover in
   2596      * subsequent inter frames to account for the extra GF spend...
   2597      * note that his does not apply for GF updates that occur
   2598      * coincident with a key frame as the extra cost of key frames is
   2599      * dealt with elsewhere.
   2600      */
   2601     cpi->gf_overspend_bits += cpi->projected_frame_size;
   2602     cpi->non_gf_bitrate_adjustment =
   2603         cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
   2604   }
   2605 
   2606   /* Update data structure that monitors level of reference to last GF */
   2607   memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
   2608   cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
   2609 
   2610   /* this frame refreshes means next frames don't unless specified by user */
   2611   cpi->frames_since_golden = 0;
   2612 
   2613   /* Clear the alternate reference update pending flag. */
   2614   cpi->source_alt_ref_pending = 0;
   2615 
   2616   /* Set the alternate reference frame active flag */
   2617   cpi->source_alt_ref_active = 1;
   2618 }
   2619 static void update_golden_frame_stats(VP8_COMP *cpi) {
   2620   VP8_COMMON *cm = &cpi->common;
   2621 
   2622   /* Update the Golden frame usage counts. */
   2623   if (cm->refresh_golden_frame) {
   2624     /* Select an interval before next GF */
   2625     if (!cpi->auto_gold) cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
   2626 
   2627     if ((cpi->pass != 2) && (cpi->frames_till_gf_update_due > 0)) {
   2628       cpi->current_gf_interval = cpi->frames_till_gf_update_due;
   2629 
   2630       /* Set the bits per frame that we should try and recover in
   2631        * subsequent inter frames to account for the extra GF spend...
   2632        * note that his does not apply for GF updates that occur
   2633        * coincident with a key frame as the extra cost of key frames
   2634        * is dealt with elsewhere.
   2635        */
   2636       if ((cm->frame_type != KEY_FRAME) && !cpi->source_alt_ref_active) {
   2637         /* Calcluate GF bits to be recovered
   2638          * Projected size - av frame bits available for inter
   2639          * frames for clip as a whole
   2640          */
   2641         cpi->gf_overspend_bits +=
   2642             (cpi->projected_frame_size - cpi->inter_frame_target);
   2643       }
   2644 
   2645       cpi->non_gf_bitrate_adjustment =
   2646           cpi->gf_overspend_bits / cpi->frames_till_gf_update_due;
   2647     }
   2648 
   2649     /* Update data structure that monitors level of reference to last GF */
   2650     memset(cpi->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols));
   2651     cpi->gf_active_count = cm->mb_rows * cm->mb_cols;
   2652 
   2653     /* this frame refreshes means next frames don't unless specified by
   2654      * user
   2655      */
   2656     cm->refresh_golden_frame = 0;
   2657     cpi->frames_since_golden = 0;
   2658 
   2659     cpi->recent_ref_frame_usage[INTRA_FRAME] = 1;
   2660     cpi->recent_ref_frame_usage[LAST_FRAME] = 1;
   2661     cpi->recent_ref_frame_usage[GOLDEN_FRAME] = 1;
   2662     cpi->recent_ref_frame_usage[ALTREF_FRAME] = 1;
   2663 
   2664     /* ******** Fixed Q test code only ************ */
   2665     /* If we are going to use the ALT reference for the next group of
   2666      * frames set a flag to say so.
   2667      */
   2668     if (cpi->oxcf.fixed_q >= 0 && cpi->oxcf.play_alternate &&
   2669         !cpi->common.refresh_alt_ref_frame) {
   2670       cpi->source_alt_ref_pending = 1;
   2671       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
   2672     }
   2673 
   2674     if (!cpi->source_alt_ref_pending) cpi->source_alt_ref_active = 0;
   2675 
   2676     /* Decrement count down till next gf */
   2677     if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
   2678 
   2679   } else if (!cpi->common.refresh_alt_ref_frame) {
   2680     /* Decrement count down till next gf */
   2681     if (cpi->frames_till_gf_update_due > 0) cpi->frames_till_gf_update_due--;
   2682 
   2683     if (cpi->frames_till_alt_ref_frame) cpi->frames_till_alt_ref_frame--;
   2684 
   2685     cpi->frames_since_golden++;
   2686 
   2687     if (cpi->frames_since_golden > 1) {
   2688       cpi->recent_ref_frame_usage[INTRA_FRAME] +=
   2689           cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME];
   2690       cpi->recent_ref_frame_usage[LAST_FRAME] +=
   2691           cpi->mb.count_mb_ref_frame_usage[LAST_FRAME];
   2692       cpi->recent_ref_frame_usage[GOLDEN_FRAME] +=
   2693           cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME];
   2694       cpi->recent_ref_frame_usage[ALTREF_FRAME] +=
   2695           cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
   2696     }
   2697   }
   2698 }
   2699 
   2700 /* This function updates the reference frame probability estimates that
   2701  * will be used during mode selection
   2702  */
   2703 static void update_rd_ref_frame_probs(VP8_COMP *cpi) {
   2704   VP8_COMMON *cm = &cpi->common;
   2705 
   2706   const int *const rfct = cpi->mb.count_mb_ref_frame_usage;
   2707   const int rf_intra = rfct[INTRA_FRAME];
   2708   const int rf_inter =
   2709       rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
   2710 
   2711   if (cm->frame_type == KEY_FRAME) {
   2712     cpi->prob_intra_coded = 255;
   2713     cpi->prob_last_coded = 128;
   2714     cpi->prob_gf_coded = 128;
   2715   } else if (!(rf_intra + rf_inter)) {
   2716     cpi->prob_intra_coded = 63;
   2717     cpi->prob_last_coded = 128;
   2718     cpi->prob_gf_coded = 128;
   2719   }
   2720 
   2721   /* update reference frame costs since we can do better than what we got
   2722    * last frame.
   2723    */
   2724   if (cpi->oxcf.number_of_layers == 1) {
   2725     if (cpi->common.refresh_alt_ref_frame) {
   2726       cpi->prob_intra_coded += 40;
   2727       if (cpi->prob_intra_coded > 255) cpi->prob_intra_coded = 255;
   2728       cpi->prob_last_coded = 200;
   2729       cpi->prob_gf_coded = 1;
   2730     } else if (cpi->frames_since_golden == 0) {
   2731       cpi->prob_last_coded = 214;
   2732     } else if (cpi->frames_since_golden == 1) {
   2733       cpi->prob_last_coded = 192;
   2734       cpi->prob_gf_coded = 220;
   2735     } else if (cpi->source_alt_ref_active) {
   2736       cpi->prob_gf_coded -= 20;
   2737 
   2738       if (cpi->prob_gf_coded < 10) cpi->prob_gf_coded = 10;
   2739     }
   2740     if (!cpi->source_alt_ref_active) cpi->prob_gf_coded = 255;
   2741   }
   2742 }
   2743 
   2744 #if !CONFIG_REALTIME_ONLY
   2745 /* 1 = key, 0 = inter */
   2746 static int decide_key_frame(VP8_COMP *cpi) {
   2747   VP8_COMMON *cm = &cpi->common;
   2748 
   2749   int code_key_frame = 0;
   2750 
   2751   cpi->kf_boost = 0;
   2752 
   2753   if (cpi->Speed > 11) return 0;
   2754 
   2755   /* Clear down mmx registers */
   2756   vpx_clear_system_state();
   2757 
   2758   if ((cpi->compressor_speed == 2) && (cpi->Speed >= 5) && (cpi->sf.RD == 0)) {
   2759     double change = 1.0 *
   2760                     abs((int)(cpi->mb.intra_error - cpi->last_intra_error)) /
   2761                     (1 + cpi->last_intra_error);
   2762     double change2 =
   2763         1.0 *
   2764         abs((int)(cpi->mb.prediction_error - cpi->last_prediction_error)) /
   2765         (1 + cpi->last_prediction_error);
   2766     double minerror = cm->MBs * 256;
   2767 
   2768     cpi->last_intra_error = cpi->mb.intra_error;
   2769     cpi->last_prediction_error = cpi->mb.prediction_error;
   2770 
   2771     if (10 * cpi->mb.intra_error / (1 + cpi->mb.prediction_error) < 15 &&
   2772         cpi->mb.prediction_error > minerror &&
   2773         (change > .25 || change2 > .25)) {
   2774       /*(change > 1.4 || change < .75)&& cpi->this_frame_percent_intra >
   2775        * cpi->last_frame_percent_intra + 3*/
   2776       return 1;
   2777     }
   2778 
   2779     return 0;
   2780   }
   2781 
   2782   /* If the following are true we might as well code a key frame */
   2783   if (((cpi->this_frame_percent_intra == 100) &&
   2784        (cpi->this_frame_percent_intra > (cpi->last_frame_percent_intra + 2))) ||
   2785       ((cpi->this_frame_percent_intra > 95) &&
   2786        (cpi->this_frame_percent_intra >=
   2787         (cpi->last_frame_percent_intra + 5)))) {
   2788     code_key_frame = 1;
   2789   }
   2790   /* in addition if the following are true and this is not a golden frame
   2791    * then code a key frame Note that on golden frames there often seems
   2792    * to be a pop in intra useage anyway hence this restriction is
   2793    * designed to prevent spurious key frames. The Intra pop needs to be
   2794    * investigated.
   2795    */
   2796   else if (((cpi->this_frame_percent_intra > 60) &&
   2797             (cpi->this_frame_percent_intra >
   2798              (cpi->last_frame_percent_intra * 2))) ||
   2799            ((cpi->this_frame_percent_intra > 75) &&
   2800             (cpi->this_frame_percent_intra >
   2801              (cpi->last_frame_percent_intra * 3 / 2))) ||
   2802            ((cpi->this_frame_percent_intra > 90) &&
   2803             (cpi->this_frame_percent_intra >
   2804              (cpi->last_frame_percent_intra + 10)))) {
   2805     if (!cm->refresh_golden_frame) code_key_frame = 1;
   2806   }
   2807 
   2808   return code_key_frame;
   2809 }
   2810 
   2811 static void Pass1Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
   2812                         unsigned int *frame_flags) {
   2813   (void)size;
   2814   (void)dest;
   2815   (void)frame_flags;
   2816   vp8_set_quantizer(cpi, 26);
   2817 
   2818   vp8_first_pass(cpi);
   2819 }
   2820 #endif
   2821 
   2822 #if 0
   2823 void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
   2824 {
   2825 
   2826     /* write the frame */
   2827     FILE *yframe;
   2828     int i;
   2829     char filename[255];
   2830 
   2831     sprintf(filename, "cx\\y%04d.raw", this_frame);
   2832     yframe = fopen(filename, "wb");
   2833 
   2834     for (i = 0; i < frame->y_height; ++i)
   2835         fwrite(frame->y_buffer + i * frame->y_stride, frame->y_width, 1, yframe);
   2836 
   2837     fclose(yframe);
   2838     sprintf(filename, "cx\\u%04d.raw", this_frame);
   2839     yframe = fopen(filename, "wb");
   2840 
   2841     for (i = 0; i < frame->uv_height; ++i)
   2842         fwrite(frame->u_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
   2843 
   2844     fclose(yframe);
   2845     sprintf(filename, "cx\\v%04d.raw", this_frame);
   2846     yframe = fopen(filename, "wb");
   2847 
   2848     for (i = 0; i < frame->uv_height; ++i)
   2849         fwrite(frame->v_buffer + i * frame->uv_stride, frame->uv_width, 1, yframe);
   2850 
   2851     fclose(yframe);
   2852 }
   2853 #endif
   2854 /* return of 0 means drop frame */
   2855 
   2856 #if !CONFIG_REALTIME_ONLY
   2857 /* Function to test for conditions that indeicate we should loop
   2858  * back and recode a frame.
   2859  */
   2860 static int recode_loop_test(VP8_COMP *cpi, int high_limit, int low_limit, int q,
   2861                             int maxq, int minq) {
   2862   int force_recode = 0;
   2863   VP8_COMMON *cm = &cpi->common;
   2864 
   2865   /* Is frame recode allowed at all
   2866    * Yes if either recode mode 1 is selected or mode two is selcted
   2867    * and the frame is a key frame. golden frame or alt_ref_frame
   2868    */
   2869   if ((cpi->sf.recode_loop == 1) ||
   2870       ((cpi->sf.recode_loop == 2) &&
   2871        ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
   2872         cm->refresh_alt_ref_frame))) {
   2873     /* General over and under shoot tests */
   2874     if (((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
   2875         ((cpi->projected_frame_size < low_limit) && (q > minq))) {
   2876       force_recode = 1;
   2877     }
   2878     /* Special Constrained quality tests */
   2879     else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
   2880       /* Undershoot and below auto cq level */
   2881       if ((q > cpi->cq_target_quality) &&
   2882           (cpi->projected_frame_size < ((cpi->this_frame_target * 7) >> 3))) {
   2883         force_recode = 1;
   2884       }
   2885       /* Severe undershoot and between auto and user cq level */
   2886       else if ((q > cpi->oxcf.cq_level) &&
   2887                (cpi->projected_frame_size < cpi->min_frame_bandwidth) &&
   2888                (cpi->active_best_quality > cpi->oxcf.cq_level)) {
   2889         force_recode = 1;
   2890         cpi->active_best_quality = cpi->oxcf.cq_level;
   2891       }
   2892     }
   2893   }
   2894 
   2895   return force_recode;
   2896 }
   2897 #endif  // !CONFIG_REALTIME_ONLY
   2898 
   2899 static void update_reference_frames(VP8_COMP *cpi) {
   2900   VP8_COMMON *cm = &cpi->common;
   2901   YV12_BUFFER_CONFIG *yv12_fb = cm->yv12_fb;
   2902 
   2903   /* At this point the new frame has been encoded.
   2904    * If any buffer copy / swapping is signaled it should be done here.
   2905    */
   2906 
   2907   if (cm->frame_type == KEY_FRAME) {
   2908     yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME | VP8_ALTR_FRAME;
   2909 
   2910     yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
   2911     yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
   2912 
   2913     cm->alt_fb_idx = cm->gld_fb_idx = cm->new_fb_idx;
   2914 
   2915     cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
   2916     cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
   2917   } else /* For non key frames */
   2918   {
   2919     if (cm->refresh_alt_ref_frame) {
   2920       assert(!cm->copy_buffer_to_arf);
   2921 
   2922       cm->yv12_fb[cm->new_fb_idx].flags |= VP8_ALTR_FRAME;
   2923       cm->yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
   2924       cm->alt_fb_idx = cm->new_fb_idx;
   2925 
   2926       cpi->current_ref_frames[ALTREF_FRAME] = cm->current_video_frame;
   2927     } else if (cm->copy_buffer_to_arf) {
   2928       assert(!(cm->copy_buffer_to_arf & ~0x3));
   2929 
   2930       if (cm->copy_buffer_to_arf == 1) {
   2931         if (cm->alt_fb_idx != cm->lst_fb_idx) {
   2932           yv12_fb[cm->lst_fb_idx].flags |= VP8_ALTR_FRAME;
   2933           yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
   2934           cm->alt_fb_idx = cm->lst_fb_idx;
   2935 
   2936           cpi->current_ref_frames[ALTREF_FRAME] =
   2937               cpi->current_ref_frames[LAST_FRAME];
   2938         }
   2939       } else /* if (cm->copy_buffer_to_arf == 2) */
   2940       {
   2941         if (cm->alt_fb_idx != cm->gld_fb_idx) {
   2942           yv12_fb[cm->gld_fb_idx].flags |= VP8_ALTR_FRAME;
   2943           yv12_fb[cm->alt_fb_idx].flags &= ~VP8_ALTR_FRAME;
   2944           cm->alt_fb_idx = cm->gld_fb_idx;
   2945 
   2946           cpi->current_ref_frames[ALTREF_FRAME] =
   2947               cpi->current_ref_frames[GOLDEN_FRAME];
   2948         }
   2949       }
   2950     }
   2951 
   2952     if (cm->refresh_golden_frame) {
   2953       assert(!cm->copy_buffer_to_gf);
   2954 
   2955       cm->yv12_fb[cm->new_fb_idx].flags |= VP8_GOLD_FRAME;
   2956       cm->yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
   2957       cm->gld_fb_idx = cm->new_fb_idx;
   2958 
   2959       cpi->current_ref_frames[GOLDEN_FRAME] = cm->current_video_frame;
   2960     } else if (cm->copy_buffer_to_gf) {
   2961       assert(!(cm->copy_buffer_to_arf & ~0x3));
   2962 
   2963       if (cm->copy_buffer_to_gf == 1) {
   2964         if (cm->gld_fb_idx != cm->lst_fb_idx) {
   2965           yv12_fb[cm->lst_fb_idx].flags |= VP8_GOLD_FRAME;
   2966           yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
   2967           cm->gld_fb_idx = cm->lst_fb_idx;
   2968 
   2969           cpi->current_ref_frames[GOLDEN_FRAME] =
   2970               cpi->current_ref_frames[LAST_FRAME];
   2971         }
   2972       } else /* if (cm->copy_buffer_to_gf == 2) */
   2973       {
   2974         if (cm->alt_fb_idx != cm->gld_fb_idx) {
   2975           yv12_fb[cm->alt_fb_idx].flags |= VP8_GOLD_FRAME;
   2976           yv12_fb[cm->gld_fb_idx].flags &= ~VP8_GOLD_FRAME;
   2977           cm->gld_fb_idx = cm->alt_fb_idx;
   2978 
   2979           cpi->current_ref_frames[GOLDEN_FRAME] =
   2980               cpi->current_ref_frames[ALTREF_FRAME];
   2981         }
   2982       }
   2983     }
   2984   }
   2985 
   2986   if (cm->refresh_last_frame) {
   2987     cm->yv12_fb[cm->new_fb_idx].flags |= VP8_LAST_FRAME;
   2988     cm->yv12_fb[cm->lst_fb_idx].flags &= ~VP8_LAST_FRAME;
   2989     cm->lst_fb_idx = cm->new_fb_idx;
   2990 
   2991     cpi->current_ref_frames[LAST_FRAME] = cm->current_video_frame;
   2992   }
   2993 
   2994 #if CONFIG_TEMPORAL_DENOISING
   2995   if (cpi->oxcf.noise_sensitivity) {
   2996     /* we shouldn't have to keep multiple copies as we know in advance which
   2997      * buffer we should start - for now to get something up and running
   2998      * I've chosen to copy the buffers
   2999      */
   3000     if (cm->frame_type == KEY_FRAME) {
   3001       int i;
   3002       for (i = LAST_FRAME; i < MAX_REF_FRAMES; ++i)
   3003         vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_running_avg[i]);
   3004     } else /* For non key frames */
   3005     {
   3006       vp8_yv12_extend_frame_borders(
   3007           &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
   3008 
   3009       if (cm->refresh_alt_ref_frame || cm->copy_buffer_to_arf) {
   3010         vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
   3011                             &cpi->denoiser.yv12_running_avg[ALTREF_FRAME]);
   3012       }
   3013       if (cm->refresh_golden_frame || cm->copy_buffer_to_gf) {
   3014         vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
   3015                             &cpi->denoiser.yv12_running_avg[GOLDEN_FRAME]);
   3016       }
   3017       if (cm->refresh_last_frame) {
   3018         vp8_yv12_copy_frame(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
   3019                             &cpi->denoiser.yv12_running_avg[LAST_FRAME]);
   3020       }
   3021     }
   3022     if (cpi->oxcf.noise_sensitivity == 4)
   3023       vp8_yv12_copy_frame(cpi->Source, &cpi->denoiser.yv12_last_source);
   3024   }
   3025 #endif
   3026 }
   3027 
   3028 static int measure_square_diff_partial(YV12_BUFFER_CONFIG *source,
   3029                                        YV12_BUFFER_CONFIG *dest,
   3030                                        VP8_COMP *cpi) {
   3031   int i, j;
   3032   int Total = 0;
   3033   int num_blocks = 0;
   3034   int skip = 2;
   3035   int min_consec_zero_last = 10;
   3036   int tot_num_blocks = (source->y_height * source->y_width) >> 8;
   3037   unsigned char *src = source->y_buffer;
   3038   unsigned char *dst = dest->y_buffer;
   3039 
   3040   /* Loop through the Y plane, every |skip| blocks along rows and colmumns,
   3041    * summing the square differences, and only for blocks that have been
   3042    * zero_last mode at least |x| frames in a row.
   3043    */
   3044   for (i = 0; i < source->y_height; i += 16 * skip) {
   3045     int block_index_row = (i >> 4) * cpi->common.mb_cols;
   3046     for (j = 0; j < source->y_width; j += 16 * skip) {
   3047       int index = block_index_row + (j >> 4);
   3048       if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
   3049         unsigned int sse;
   3050         Total += vpx_mse16x16(src + j, source->y_stride, dst + j,
   3051                               dest->y_stride, &sse);
   3052         num_blocks++;
   3053       }
   3054     }
   3055     src += 16 * skip * source->y_stride;
   3056     dst += 16 * skip * dest->y_stride;
   3057   }
   3058   // Only return non-zero if we have at least ~1/16 samples for estimate.
   3059   if (num_blocks > (tot_num_blocks >> 4)) {
   3060     assert(num_blocks != 0);
   3061     return (Total / num_blocks);
   3062   } else {
   3063     return 0;
   3064   }
   3065 }
   3066 
   3067 #if CONFIG_TEMPORAL_DENOISING
   3068 static void process_denoiser_mode_change(VP8_COMP *cpi) {
   3069   const VP8_COMMON *const cm = &cpi->common;
   3070   int i, j;
   3071   int total = 0;
   3072   int num_blocks = 0;
   3073   // Number of blocks skipped along row/column in computing the
   3074   // nmse (normalized mean square error) of source.
   3075   int skip = 2;
   3076   // Only select blocks for computing nmse that have been encoded
   3077   // as ZERO LAST min_consec_zero_last frames in a row.
   3078   // Scale with number of temporal layers.
   3079   int min_consec_zero_last = 12 / cpi->oxcf.number_of_layers;
   3080   // Decision is tested for changing the denoising mode every
   3081   // num_mode_change times this function is called. Note that this
   3082   // function called every 8 frames, so (8 * num_mode_change) is number
   3083   // of frames where denoising mode change is tested for switch.
   3084   int num_mode_change = 20;
   3085   // Framerate factor, to compensate for larger mse at lower framerates.
   3086   // Use ref_framerate, which is full source framerate for temporal layers.
   3087   // TODO(marpan): Adjust this factor.
   3088   int fac_framerate = cpi->ref_framerate < 25.0f ? 80 : 100;
   3089   int tot_num_blocks = cm->mb_rows * cm->mb_cols;
   3090   int ystride = cpi->Source->y_stride;
   3091   unsigned char *src = cpi->Source->y_buffer;
   3092   unsigned char *dst = cpi->denoiser.yv12_last_source.y_buffer;
   3093   static const unsigned char const_source[16] = { 128, 128, 128, 128, 128, 128,
   3094                                                   128, 128, 128, 128, 128, 128,
   3095                                                   128, 128, 128, 128 };
   3096   int bandwidth = (int)(cpi->target_bandwidth);
   3097   // For temporal layers, use full bandwidth (top layer).
   3098   if (cpi->oxcf.number_of_layers > 1) {
   3099     LAYER_CONTEXT *lc = &cpi->layer_context[cpi->oxcf.number_of_layers - 1];
   3100     bandwidth = (int)(lc->target_bandwidth);
   3101   }
   3102   // Loop through the Y plane, every skip blocks along rows and columns,
   3103   // summing the normalized mean square error, only for blocks that have
   3104   // been encoded as ZEROMV LAST at least min_consec_zero_last least frames in
   3105   // a row and have small sum difference between current and previous frame.
   3106   // Normalization here is by the contrast of the current frame block.
   3107   for (i = 0; i < cm->Height; i += 16 * skip) {
   3108     int block_index_row = (i >> 4) * cm->mb_cols;
   3109     for (j = 0; j < cm->Width; j += 16 * skip) {
   3110       int index = block_index_row + (j >> 4);
   3111       if (cpi->consec_zero_last[index] >= min_consec_zero_last) {
   3112         unsigned int sse;
   3113         const unsigned int var =
   3114             vpx_variance16x16(src + j, ystride, dst + j, ystride, &sse);
   3115         // Only consider this block as valid for noise measurement
   3116         // if the sum_diff average of the current and previous frame
   3117         // is small (to avoid effects from lighting change).
   3118         if ((sse - var) < 128) {
   3119           unsigned int sse2;
   3120           const unsigned int act =
   3121               vpx_variance16x16(src + j, ystride, const_source, 0, &sse2);
   3122           if (act > 0) total += sse / act;
   3123           num_blocks++;
   3124         }
   3125       }
   3126     }
   3127     src += 16 * skip * ystride;
   3128     dst += 16 * skip * ystride;
   3129   }
   3130   total = total * fac_framerate / 100;
   3131 
   3132   // Only consider this frame as valid sample if we have computed nmse over
   3133   // at least ~1/16 blocks, and Total > 0 (Total == 0 can happen if the
   3134   // application inputs duplicate frames, or contrast is all zero).
   3135   if (total > 0 && (num_blocks > (tot_num_blocks >> 4))) {
   3136     // Update the recursive mean square source_diff.
   3137     total = (total << 8) / num_blocks;
   3138     if (cpi->denoiser.nmse_source_diff_count == 0) {
   3139       // First sample in new interval.
   3140       cpi->denoiser.nmse_source_diff = total;
   3141       cpi->denoiser.qp_avg = cm->base_qindex;
   3142     } else {
   3143       // For subsequent samples, use average with weight ~1/4 for new sample.
   3144       cpi->denoiser.nmse_source_diff =
   3145           (int)((total + 3 * cpi->denoiser.nmse_source_diff) >> 2);
   3146       cpi->denoiser.qp_avg =
   3147           (int)((cm->base_qindex + 3 * cpi->denoiser.qp_avg) >> 2);
   3148     }
   3149     cpi->denoiser.nmse_source_diff_count++;
   3150   }
   3151   // Check for changing the denoiser mode, when we have obtained #samples =
   3152   // num_mode_change. Condition the change also on the bitrate and QP.
   3153   if (cpi->denoiser.nmse_source_diff_count == num_mode_change) {
   3154     // Check for going up: from normal to aggressive mode.
   3155     if ((cpi->denoiser.denoiser_mode == kDenoiserOnYUV) &&
   3156         (cpi->denoiser.nmse_source_diff >
   3157          cpi->denoiser.threshold_aggressive_mode) &&
   3158         (cpi->denoiser.qp_avg < cpi->denoiser.qp_threshold_up &&
   3159          bandwidth > cpi->denoiser.bitrate_threshold)) {
   3160       vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUVAggressive);
   3161     } else {
   3162       // Check for going down: from aggressive to normal mode.
   3163       if (((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
   3164            (cpi->denoiser.nmse_source_diff <
   3165             cpi->denoiser.threshold_aggressive_mode)) ||
   3166           ((cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) &&
   3167            (cpi->denoiser.qp_avg > cpi->denoiser.qp_threshold_down ||
   3168             bandwidth < cpi->denoiser.bitrate_threshold))) {
   3169         vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
   3170       }
   3171     }
   3172     // Reset metric and counter for next interval.
   3173     cpi->denoiser.nmse_source_diff = 0;
   3174     cpi->denoiser.qp_avg = 0;
   3175     cpi->denoiser.nmse_source_diff_count = 0;
   3176   }
   3177 }
   3178 #endif
   3179 
   3180 void vp8_loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) {
   3181   const FRAME_TYPE frame_type = cm->frame_type;
   3182 
   3183   int update_any_ref_buffers = 1;
   3184   if (cpi->common.refresh_last_frame == 0 &&
   3185       cpi->common.refresh_golden_frame == 0 &&
   3186       cpi->common.refresh_alt_ref_frame == 0) {
   3187     update_any_ref_buffers = 0;
   3188   }
   3189 
   3190   if (cm->no_lpf) {
   3191     cm->filter_level = 0;
   3192   } else {
   3193     struct vpx_usec_timer timer;
   3194 
   3195     vpx_clear_system_state();
   3196 
   3197     vpx_usec_timer_start(&timer);
   3198     if (cpi->sf.auto_filter == 0) {
   3199 #if CONFIG_TEMPORAL_DENOISING
   3200       if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
   3201         // Use the denoised buffer for selecting base loop filter level.
   3202         // Denoised signal for current frame is stored in INTRA_FRAME.
   3203         // No denoising on key frames.
   3204         vp8cx_pick_filter_level_fast(
   3205             &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi);
   3206       } else {
   3207         vp8cx_pick_filter_level_fast(cpi->Source, cpi);
   3208       }
   3209 #else
   3210       vp8cx_pick_filter_level_fast(cpi->Source, cpi);
   3211 #endif
   3212     } else {
   3213 #if CONFIG_TEMPORAL_DENOISING
   3214       if (cpi->oxcf.noise_sensitivity && cm->frame_type != KEY_FRAME) {
   3215         // Use the denoised buffer for selecting base loop filter level.
   3216         // Denoised signal for current frame is stored in INTRA_FRAME.
   3217         // No denoising on key frames.
   3218         vp8cx_pick_filter_level(&cpi->denoiser.yv12_running_avg[INTRA_FRAME],
   3219                                 cpi);
   3220       } else {
   3221         vp8cx_pick_filter_level(cpi->Source, cpi);
   3222       }
   3223 #else
   3224       vp8cx_pick_filter_level(cpi->Source, cpi);
   3225 #endif
   3226     }
   3227 
   3228     if (cm->filter_level > 0) {
   3229       vp8cx_set_alt_lf_level(cpi, cm->filter_level);
   3230     }
   3231 
   3232     vpx_usec_timer_mark(&timer);
   3233     cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
   3234   }
   3235 
   3236 #if CONFIG_MULTITHREAD
   3237   if (cpi->b_multi_threaded) {
   3238     sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
   3239   }
   3240 #endif
   3241 
   3242   // No need to apply loop-filter if the encoded frame does not update
   3243   // any reference buffers.
   3244   if (cm->filter_level > 0 && update_any_ref_buffers) {
   3245     vp8_loop_filter_frame(cm, &cpi->mb.e_mbd, frame_type);
   3246   }
   3247 
   3248   vp8_yv12_extend_frame_borders(cm->frame_to_show);
   3249 }
   3250 
   3251 static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size,
   3252                                       unsigned char *dest,
   3253                                       unsigned char *dest_end,
   3254                                       unsigned int *frame_flags) {
   3255   int Q;
   3256   int frame_over_shoot_limit;
   3257   int frame_under_shoot_limit;
   3258 
   3259   int Loop = 0;
   3260   int loop_count;
   3261 
   3262   VP8_COMMON *cm = &cpi->common;
   3263   int active_worst_qchanged = 0;
   3264 
   3265 #if !CONFIG_REALTIME_ONLY
   3266   int q_low;
   3267   int q_high;
   3268   int zbin_oq_high;
   3269   int zbin_oq_low = 0;
   3270   int top_index;
   3271   int bottom_index;
   3272   int overshoot_seen = 0;
   3273   int undershoot_seen = 0;
   3274 #endif
   3275 
   3276   int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
   3277                         cpi->oxcf.optimal_buffer_level / 100);
   3278   int drop_mark75 = drop_mark * 2 / 3;
   3279   int drop_mark50 = drop_mark / 4;
   3280   int drop_mark25 = drop_mark / 8;
   3281 
   3282   /* Clear down mmx registers to allow floating point in what follows */
   3283   vpx_clear_system_state();
   3284 
   3285   if (cpi->force_next_frame_intra) {
   3286     cm->frame_type = KEY_FRAME; /* delayed intra frame */
   3287     cpi->force_next_frame_intra = 0;
   3288   }
   3289 
   3290   /* For an alt ref frame in 2 pass we skip the call to the second pass
   3291    * function that sets the target bandwidth
   3292    */
   3293   switch (cpi->pass) {
   3294 #if !CONFIG_REALTIME_ONLY
   3295     case 2:
   3296       if (cpi->common.refresh_alt_ref_frame) {
   3297         /* Per frame bit target for the alt ref frame */
   3298         cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
   3299         /* per second target bitrate */
   3300         cpi->target_bandwidth =
   3301             (int)(cpi->twopass.gf_bits * cpi->output_framerate);
   3302       }
   3303       break;
   3304 #endif  // !CONFIG_REALTIME_ONLY
   3305     default:
   3306       cpi->per_frame_bandwidth =
   3307           (int)(cpi->target_bandwidth / cpi->output_framerate);
   3308       break;
   3309   }
   3310 
   3311   /* Default turn off buffer to buffer copying */
   3312   cm->copy_buffer_to_gf = 0;
   3313   cm->copy_buffer_to_arf = 0;
   3314 
   3315   /* Clear zbin over-quant value and mode boost values. */
   3316   cpi->mb.zbin_over_quant = 0;
   3317   cpi->mb.zbin_mode_boost = 0;
   3318 
   3319   /* Enable or disable mode based tweaking of the zbin
   3320    * For 2 Pass Only used where GF/ARF prediction quality
   3321    * is above a threshold
   3322    */
   3323   cpi->mb.zbin_mode_boost_enabled = 1;
   3324   if (cpi->pass == 2) {
   3325     if (cpi->gfu_boost <= 400) {
   3326       cpi->mb.zbin_mode_boost_enabled = 0;
   3327     }
   3328   }
   3329 
   3330   /* Current default encoder behaviour for the altref sign bias */
   3331   if (cpi->source_alt_ref_active) {
   3332     cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1;
   3333   } else {
   3334     cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 0;
   3335   }
   3336 
   3337   /* Check to see if a key frame is signaled
   3338    * For two pass with auto key frame enabled cm->frame_type may already
   3339    * be set, but not for one pass.
   3340    */
   3341   if ((cm->current_video_frame == 0) || (cm->frame_flags & FRAMEFLAGS_KEY) ||
   3342       (cpi->oxcf.auto_key &&
   3343        (cpi->frames_since_key % cpi->key_frame_frequency == 0))) {
   3344     /* Key frame from VFW/auto-keyframe/first frame */
   3345     cm->frame_type = KEY_FRAME;
   3346 #if CONFIG_TEMPORAL_DENOISING
   3347     if (cpi->oxcf.noise_sensitivity == 4) {
   3348       // For adaptive mode, reset denoiser to normal mode on key frame.
   3349       vp8_denoiser_set_parameters(&cpi->denoiser, kDenoiserOnYUV);
   3350     }
   3351 #endif
   3352   }
   3353 
   3354 #if CONFIG_MULTI_RES_ENCODING
   3355   if (cpi->oxcf.mr_total_resolutions > 1) {
   3356     LOWER_RES_FRAME_INFO *low_res_frame_info =
   3357         (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
   3358 
   3359     if (cpi->oxcf.mr_encoder_id) {
   3360       // TODO(marpan): This constraint shouldn't be needed, as we would like
   3361       // to allow for key frame setting (forced or periodic) defined per
   3362       // spatial layer. For now, keep this in.
   3363       cm->frame_type = low_res_frame_info->frame_type;
   3364 
   3365       // Check if lower resolution is available for motion vector reuse.
   3366       if (cm->frame_type != KEY_FRAME) {
   3367         cpi->mr_low_res_mv_avail = 1;
   3368         cpi->mr_low_res_mv_avail &= !(low_res_frame_info->is_frame_dropped);
   3369 
   3370         if (cpi->ref_frame_flags & VP8_LAST_FRAME)
   3371           cpi->mr_low_res_mv_avail &=
   3372               (cpi->current_ref_frames[LAST_FRAME] ==
   3373                low_res_frame_info->low_res_ref_frames[LAST_FRAME]);
   3374 
   3375         if (cpi->ref_frame_flags & VP8_GOLD_FRAME)
   3376           cpi->mr_low_res_mv_avail &=
   3377               (cpi->current_ref_frames[GOLDEN_FRAME] ==
   3378                low_res_frame_info->low_res_ref_frames[GOLDEN_FRAME]);
   3379 
   3380         // Don't use altref to determine whether low res is available.
   3381         // TODO (marpan): Should we make this type of condition on a
   3382         // per-reference frame basis?
   3383         /*
   3384         if (cpi->ref_frame_flags & VP8_ALTR_FRAME)
   3385             cpi->mr_low_res_mv_avail &= (cpi->current_ref_frames[ALTREF_FRAME]
   3386                      == low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
   3387         */
   3388       }
   3389     }
   3390 
   3391     // On a key frame: For the lowest resolution, keep track of the key frame
   3392     // counter value. For the higher resolutions, reset the current video
   3393     // frame counter to that of the lowest resolution.
   3394     // This is done to the handle the case where we may stop/start encoding
   3395     // higher layer(s). The restart-encoding of higher layer is only signaled
   3396     // by a key frame for now.
   3397     // TODO (marpan): Add flag to indicate restart-encoding of higher layer.
   3398     if (cm->frame_type == KEY_FRAME) {
   3399       if (cpi->oxcf.mr_encoder_id) {
   3400         // If the initial starting value of the buffer level is zero (this can
   3401         // happen because we may have not started encoding this higher stream),
   3402         // then reset it to non-zero value based on |starting_buffer_level|.
   3403         if (cpi->common.current_video_frame == 0 && cpi->buffer_level == 0) {
   3404           unsigned int i;
   3405           cpi->bits_off_target = cpi->oxcf.starting_buffer_level;
   3406           cpi->buffer_level = cpi->oxcf.starting_buffer_level;
   3407           for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
   3408             LAYER_CONTEXT *lc = &cpi->layer_context[i];
   3409             lc->bits_off_target = lc->starting_buffer_level;
   3410             lc->buffer_level = lc->starting_buffer_level;
   3411           }
   3412         }
   3413         cpi->common.current_video_frame =
   3414             low_res_frame_info->key_frame_counter_value;
   3415       } else {
   3416         low_res_frame_info->key_frame_counter_value =
   3417             cpi->common.current_video_frame;
   3418       }
   3419     }
   3420   }
   3421 #endif
   3422 
   3423   // Find the reference frame closest to the current frame.
   3424   cpi->closest_reference_frame = LAST_FRAME;
   3425   if (cm->frame_type != KEY_FRAME) {
   3426     int i;
   3427     MV_REFERENCE_FRAME closest_ref = INTRA_FRAME;
   3428     if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
   3429       closest_ref = LAST_FRAME;
   3430     } else if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
   3431       closest_ref = GOLDEN_FRAME;
   3432     } else if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
   3433       closest_ref = ALTREF_FRAME;
   3434     }
   3435     for (i = 1; i <= 3; ++i) {
   3436       vpx_ref_frame_type_t ref_frame_type =
   3437           (vpx_ref_frame_type_t)((i == 3) ? 4 : i);
   3438       if (cpi->ref_frame_flags & ref_frame_type) {
   3439         if ((cm->current_video_frame - cpi->current_ref_frames[i]) <
   3440             (cm->current_video_frame - cpi->current_ref_frames[closest_ref])) {
   3441           closest_ref = i;
   3442         }
   3443       }
   3444     }
   3445     cpi->closest_reference_frame = closest_ref;
   3446   }
   3447 
   3448   /* Set various flags etc to special state if it is a key frame */
   3449   if (cm->frame_type == KEY_FRAME) {
   3450     int i;
   3451 
   3452     // Set the loop filter deltas and segmentation map update
   3453     setup_features(cpi);
   3454 
   3455     /* The alternate reference frame cannot be active for a key frame */
   3456     cpi->source_alt_ref_active = 0;
   3457 
   3458     /* Reset the RD threshold multipliers to default of * 1 (128) */
   3459     for (i = 0; i < MAX_MODES; ++i) {
   3460       cpi->mb.rd_thresh_mult[i] = 128;
   3461     }
   3462 
   3463     // Reset the zero_last counter to 0 on key frame.
   3464     memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
   3465     memset(cpi->consec_zero_last_mvbias, 0,
   3466            (cpi->common.mb_rows * cpi->common.mb_cols));
   3467   }
   3468 
   3469 #if 0
   3470     /* Experimental code for lagged compress and one pass
   3471      * Initialise one_pass GF frames stats
   3472      * Update stats used for GF selection
   3473      */
   3474     {
   3475         cpi->one_pass_frame_index = cm->current_video_frame % MAX_LAG_BUFFERS;
   3476 
   3477         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frames_so_far = 0;
   3478         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_intra_error = 0.0;
   3479         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_coded_error = 0.0;
   3480         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_inter = 0.0;
   3481         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_pcnt_motion = 0.0;
   3482         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr = 0.0;
   3483         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvr_abs = 0.0;
   3484         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc = 0.0;
   3485         cpi->one_pass_frame_stats[cpi->one_pass_frame_index ].frame_mvc_abs = 0.0;
   3486     }
   3487 #endif
   3488 
   3489   update_rd_ref_frame_probs(cpi);
   3490 
   3491   if (cpi->drop_frames_allowed) {
   3492     /* The reset to decimation 0 is only done here for one pass.
   3493      * Once it is set two pass leaves decimation on till the next kf.
   3494      */
   3495     if ((cpi->buffer_level > drop_mark) && (cpi->decimation_factor > 0)) {
   3496       cpi->decimation_factor--;
   3497     }
   3498 
   3499     if (cpi->buffer_level > drop_mark75 && cpi->decimation_factor > 0) {
   3500       cpi->decimation_factor = 1;
   3501 
   3502     } else if (cpi->buffer_level < drop_mark25 &&
   3503                (cpi->decimation_factor == 2 || cpi->decimation_factor == 3)) {
   3504       cpi->decimation_factor = 3;
   3505     } else if (cpi->buffer_level < drop_mark50 &&
   3506                (cpi->decimation_factor == 1 || cpi->decimation_factor == 2)) {
   3507       cpi->decimation_factor = 2;
   3508     } else if (cpi->buffer_level < drop_mark75 &&
   3509                (cpi->decimation_factor == 0 || cpi->decimation_factor == 1)) {
   3510       cpi->decimation_factor = 1;
   3511     }
   3512   }
   3513 
   3514   /* The following decimates the frame rate according to a regular
   3515    * pattern (i.e. to 1/2 or 2/3 frame rate) This can be used to help
   3516    * prevent buffer under-run in CBR mode. Alternatively it might be
   3517    * desirable in some situations to drop frame rate but throw more bits
   3518    * at each frame.
   3519    *
   3520    * Note that dropping a key frame can be problematic if spatial
   3521    * resampling is also active
   3522    */
   3523   if (cpi->decimation_factor > 0) {
   3524     switch (cpi->decimation_factor) {
   3525       case 1:
   3526         cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 3 / 2;
   3527         break;
   3528       case 2:
   3529         cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
   3530         break;
   3531       case 3:
   3532         cpi->per_frame_bandwidth = cpi->per_frame_bandwidth * 5 / 4;
   3533         break;
   3534     }
   3535 
   3536     /* Note that we should not throw out a key frame (especially when
   3537      * spatial resampling is enabled).
   3538      */
   3539     if (cm->frame_type == KEY_FRAME) {
   3540       cpi->decimation_count = cpi->decimation_factor;
   3541     } else if (cpi->decimation_count > 0) {
   3542       cpi->decimation_count--;
   3543 
   3544       cpi->bits_off_target += cpi->av_per_frame_bandwidth;
   3545       if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
   3546         cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
   3547       }
   3548 
   3549 #if CONFIG_MULTI_RES_ENCODING
   3550       vp8_store_drop_frame_info(cpi);
   3551 #endif
   3552 
   3553       cm->current_video_frame++;
   3554       cpi->frames_since_key++;
   3555       // We advance the temporal pattern for dropped frames.
   3556       cpi->temporal_pattern_counter++;
   3557 
   3558 #if CONFIG_INTERNAL_STATS
   3559       cpi->count++;
   3560 #endif
   3561 
   3562       cpi->buffer_level = cpi->bits_off_target;
   3563 
   3564       if (cpi->oxcf.number_of_layers > 1) {
   3565         unsigned int i;
   3566 
   3567         /* Propagate bits saved by dropping the frame to higher
   3568          * layers
   3569          */
   3570         for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
   3571           LAYER_CONTEXT *lc = &cpi->layer_context[i];
   3572           lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
   3573           if (lc->bits_off_target > lc->maximum_buffer_size) {
   3574             lc->bits_off_target = lc->maximum_buffer_size;
   3575           }
   3576           lc->buffer_level = lc->bits_off_target;
   3577         }
   3578       }
   3579 
   3580       return;
   3581     } else {
   3582       cpi->decimation_count = cpi->decimation_factor;
   3583     }
   3584   } else {
   3585     cpi->decimation_count = 0;
   3586   }
   3587 
   3588   /* Decide how big to make the frame */
   3589   if (!vp8_pick_frame_size(cpi)) {
   3590 /*TODO: 2 drop_frame and return code could be put together. */
   3591 #if CONFIG_MULTI_RES_ENCODING
   3592     vp8_store_drop_frame_info(cpi);
   3593 #endif
   3594     cm->current_video_frame++;
   3595     cpi->frames_since_key++;
   3596     // We advance the temporal pattern for dropped frames.
   3597     cpi->temporal_pattern_counter++;
   3598     return;
   3599   }
   3600 
   3601   /* Reduce active_worst_allowed_q for CBR if our buffer is getting too full.
   3602    * This has a knock on effect on active best quality as well.
   3603    * For CBR if the buffer reaches its maximum level then we can no longer
   3604    * save up bits for later frames so we might as well use them up
   3605    * on the current frame.
   3606    */
   3607   if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
   3608       (cpi->buffer_level >= cpi->oxcf.optimal_buffer_level) &&
   3609       cpi->buffered_mode) {
   3610     /* Max adjustment is 1/4 */
   3611     int Adjustment = cpi->active_worst_quality / 4;
   3612 
   3613     if (Adjustment) {
   3614       int buff_lvl_step;
   3615 
   3616       if (cpi->buffer_level < cpi->oxcf.maximum_buffer_size) {
   3617         buff_lvl_step = (int)((cpi->oxcf.maximum_buffer_size -
   3618                                cpi->oxcf.optimal_buffer_level) /
   3619                               Adjustment);
   3620 
   3621         if (buff_lvl_step) {
   3622           Adjustment =
   3623               (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
   3624                     buff_lvl_step);
   3625         } else {
   3626           Adjustment = 0;
   3627         }
   3628       }
   3629 
   3630       cpi->active_worst_quality -= Adjustment;
   3631 
   3632       if (cpi->active_worst_quality < cpi->active_best_quality) {
   3633         cpi->active_worst_quality = cpi->active_best_quality;
   3634       }
   3635     }
   3636   }
   3637 
   3638   /* Set an active best quality and if necessary active worst quality
   3639    * There is some odd behavior for one pass here that needs attention.
   3640    */
   3641   if ((cpi->pass == 2) || (cpi->ni_frames > 150)) {
   3642     vpx_clear_system_state();
   3643 
   3644     Q = cpi->active_worst_quality;
   3645 
   3646     if (cm->frame_type == KEY_FRAME) {
   3647       if (cpi->pass == 2) {
   3648         if (cpi->gfu_boost > 600) {
   3649           cpi->active_best_quality = kf_low_motion_minq[Q];
   3650         } else {
   3651           cpi->active_best_quality = kf_high_motion_minq[Q];
   3652         }
   3653 
   3654         /* Special case for key frames forced because we have reached
   3655          * the maximum key frame interval. Here force the Q to a range
   3656          * based on the ambient Q to reduce the risk of popping
   3657          */
   3658         if (cpi->this_key_frame_forced) {
   3659           if (cpi->active_best_quality > cpi->avg_frame_qindex * 7 / 8) {
   3660             cpi->active_best_quality = cpi->avg_frame_qindex * 7 / 8;
   3661           } else if (cpi->active_best_quality<cpi->avg_frame_qindex>> 2) {
   3662             cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
   3663           }
   3664         }
   3665       }
   3666       /* One pass more conservative */
   3667       else {
   3668         cpi->active_best_quality = kf_high_motion_minq[Q];
   3669       }
   3670     }
   3671 
   3672     else if (cpi->oxcf.number_of_layers == 1 &&
   3673              (cm->refresh_golden_frame || cpi->common.refresh_alt_ref_frame)) {
   3674       /* Use the lower of cpi->active_worst_quality and recent
   3675        * average Q as basis for GF/ARF Q limit unless last frame was
   3676        * a key frame.
   3677        */
   3678       if ((cpi->frames_since_key > 1) &&
   3679           (cpi->avg_frame_qindex < cpi->active_worst_quality)) {
   3680         Q = cpi->avg_frame_qindex;
   3681       }
   3682 
   3683       /* For constrained quality dont allow Q less than the cq level */
   3684       if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
   3685           (Q < cpi->cq_target_quality)) {
   3686         Q = cpi->cq_target_quality;
   3687       }
   3688 
   3689       if (cpi->pass == 2) {
   3690         if (cpi->gfu_boost > 1000) {
   3691           cpi->active_best_quality = gf_low_motion_minq[Q];
   3692         } else if (cpi->gfu_boost < 400) {
   3693           cpi->active_best_quality = gf_high_motion_minq[Q];
   3694         } else {
   3695           cpi->active_best_quality = gf_mid_motion_minq[Q];
   3696         }
   3697 
   3698         /* Constrained quality use slightly lower active best. */
   3699         if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
   3700           cpi->active_best_quality = cpi->active_best_quality * 15 / 16;
   3701         }
   3702       }
   3703       /* One pass more conservative */
   3704       else {
   3705         cpi->active_best_quality = gf_high_motion_minq[Q];
   3706       }
   3707     } else {
   3708       cpi->active_best_quality = inter_minq[Q];
   3709 
   3710       /* For the constant/constrained quality mode we dont want
   3711        * q to fall below the cq level.
   3712        */
   3713       if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
   3714           (cpi->active_best_quality < cpi->cq_target_quality)) {
   3715         /* If we are strongly undershooting the target rate in the last
   3716          * frames then use the user passed in cq value not the auto
   3717          * cq value.
   3718          */
   3719         if (cpi->rolling_actual_bits < cpi->min_frame_bandwidth) {
   3720           cpi->active_best_quality = cpi->oxcf.cq_level;
   3721         } else {
   3722           cpi->active_best_quality = cpi->cq_target_quality;
   3723         }
   3724       }
   3725     }
   3726 
   3727     /* If CBR and the buffer is as full then it is reasonable to allow
   3728      * higher quality on the frames to prevent bits just going to waste.
   3729      */
   3730     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   3731       /* Note that the use of >= here elliminates the risk of a devide
   3732        * by 0 error in the else if clause
   3733        */
   3734       if (cpi->buffer_level >= cpi->oxcf.maximum_buffer_size) {
   3735         cpi->active_best_quality = cpi->best_quality;
   3736 
   3737       } else if (cpi->buffer_level > cpi->oxcf.optimal_buffer_level) {
   3738         int Fraction =
   3739             (int)(((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) * 128) /
   3740                   (cpi->oxcf.maximum_buffer_size -
   3741                    cpi->oxcf.optimal_buffer_level));
   3742         int min_qadjustment =
   3743             ((cpi->active_best_quality - cpi->best_quality) * Fraction) / 128;
   3744 
   3745         cpi->active_best_quality -= min_qadjustment;
   3746       }
   3747     }
   3748   }
   3749   /* Make sure constrained quality mode limits are adhered to for the first
   3750    * few frames of one pass encodes
   3751    */
   3752   else if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
   3753     if ((cm->frame_type == KEY_FRAME) || cm->refresh_golden_frame ||
   3754         cpi->common.refresh_alt_ref_frame) {
   3755       cpi->active_best_quality = cpi->best_quality;
   3756     } else if (cpi->active_best_quality < cpi->cq_target_quality) {
   3757       cpi->active_best_quality = cpi->cq_target_quality;
   3758     }
   3759   }
   3760 
   3761   /* Clip the active best and worst quality values to limits */
   3762   if (cpi->active_worst_quality > cpi->worst_quality) {
   3763     cpi->active_worst_quality = cpi->worst_quality;
   3764   }
   3765 
   3766   if (cpi->active_best_quality < cpi->best_quality) {
   3767     cpi->active_best_quality = cpi->best_quality;
   3768   }
   3769 
   3770   if (cpi->active_worst_quality < cpi->active_best_quality) {
   3771     cpi->active_worst_quality = cpi->active_best_quality;
   3772   }
   3773 
   3774   /* Determine initial Q to try */
   3775   Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   3776 
   3777 #if !CONFIG_REALTIME_ONLY
   3778 
   3779   /* Set highest allowed value for Zbin over quant */
   3780   if (cm->frame_type == KEY_FRAME) {
   3781     zbin_oq_high = 0;
   3782   } else if ((cpi->oxcf.number_of_layers == 1) &&
   3783              ((cm->refresh_alt_ref_frame ||
   3784                (cm->refresh_golden_frame && !cpi->source_alt_ref_active)))) {
   3785     zbin_oq_high = 16;
   3786   } else {
   3787     zbin_oq_high = ZBIN_OQ_MAX;
   3788   }
   3789 #endif
   3790 
   3791   /* Setup background Q adjustment for error resilient mode.
   3792    * For multi-layer encodes only enable this for the base layer.
   3793   */
   3794   if (cpi->cyclic_refresh_mode_enabled) {
   3795     // Special case for screen_content_mode with golden frame updates.
   3796     int disable_cr_gf =
   3797         (cpi->oxcf.screen_content_mode == 2 && cm->refresh_golden_frame);
   3798     if (cpi->current_layer == 0 && cpi->force_maxqp == 0 && !disable_cr_gf) {
   3799       cyclic_background_refresh(cpi, Q, 0);
   3800     } else {
   3801       disable_segmentation(cpi);
   3802     }
   3803   }
   3804 
   3805   vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
   3806                                 &frame_over_shoot_limit);
   3807 
   3808 #if !CONFIG_REALTIME_ONLY
   3809   /* Limit Q range for the adaptive loop. */
   3810   bottom_index = cpi->active_best_quality;
   3811   top_index = cpi->active_worst_quality;
   3812   q_low = cpi->active_best_quality;
   3813   q_high = cpi->active_worst_quality;
   3814 #endif
   3815 
   3816   vp8_save_coding_context(cpi);
   3817 
   3818   loop_count = 0;
   3819 
   3820   scale_and_extend_source(cpi->un_scaled_source, cpi);
   3821 
   3822 #if CONFIG_TEMPORAL_DENOISING && CONFIG_POSTPROC
   3823   // Option to apply spatial blur under the aggressive or adaptive
   3824   // (temporal denoising) mode.
   3825   if (cpi->oxcf.noise_sensitivity >= 3) {
   3826     if (cpi->denoiser.denoise_pars.spatial_blur != 0) {
   3827       vp8_de_noise(cm, cpi->Source, cpi->Source,
   3828                    cpi->denoiser.denoise_pars.spatial_blur, 1, 0, 0);
   3829     }
   3830   }
   3831 #endif
   3832 
   3833 #if !(CONFIG_REALTIME_ONLY) && CONFIG_POSTPROC && !(CONFIG_TEMPORAL_DENOISING)
   3834 
   3835   if (cpi->oxcf.noise_sensitivity > 0) {
   3836     unsigned char *src;
   3837     int l = 0;
   3838 
   3839     switch (cpi->oxcf.noise_sensitivity) {
   3840       case 1: l = 20; break;
   3841       case 2: l = 40; break;
   3842       case 3: l = 60; break;
   3843       case 4: l = 80; break;
   3844       case 5: l = 100; break;
   3845       case 6: l = 150; break;
   3846     }
   3847 
   3848     if (cm->frame_type == KEY_FRAME) {
   3849       vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
   3850     } else {
   3851       vp8_de_noise(cm, cpi->Source, cpi->Source, l, 1, 0, 1);
   3852 
   3853       src = cpi->Source->y_buffer;
   3854 
   3855       if (cpi->Source->y_stride < 0) {
   3856         src += cpi->Source->y_stride * (cpi->Source->y_height - 1);
   3857       }
   3858     }
   3859   }
   3860 
   3861 #endif
   3862 
   3863 #ifdef OUTPUT_YUV_SRC
   3864   vp8_write_yuv_frame(yuv_file, cpi->Source);
   3865 #endif
   3866 
   3867   do {
   3868     vpx_clear_system_state();
   3869 
   3870     vp8_set_quantizer(cpi, Q);
   3871 
   3872     /* setup skip prob for costing in mode/mv decision */
   3873     if (cpi->common.mb_no_coeff_skip) {
   3874       cpi->prob_skip_false = cpi->base_skip_false_prob[Q];
   3875 
   3876       if (cm->frame_type != KEY_FRAME) {
   3877         if (cpi->common.refresh_alt_ref_frame) {
   3878           if (cpi->last_skip_false_probs[2] != 0) {
   3879             cpi->prob_skip_false = cpi->last_skip_false_probs[2];
   3880           }
   3881 
   3882           /*
   3883                               if(cpi->last_skip_false_probs[2]!=0 && abs(Q-
   3884              cpi->last_skip_probs_q[2])<=16 )
   3885              cpi->prob_skip_false = cpi->last_skip_false_probs[2];
   3886                               else if (cpi->last_skip_false_probs[2]!=0)
   3887              cpi->prob_skip_false = (cpi->last_skip_false_probs[2]  +
   3888              cpi->prob_skip_false ) / 2;
   3889              */
   3890         } else if (cpi->common.refresh_golden_frame) {
   3891           if (cpi->last_skip_false_probs[1] != 0) {
   3892             cpi->prob_skip_false = cpi->last_skip_false_probs[1];
   3893           }
   3894 
   3895           /*
   3896                               if(cpi->last_skip_false_probs[1]!=0 && abs(Q-
   3897              cpi->last_skip_probs_q[1])<=16 )
   3898              cpi->prob_skip_false = cpi->last_skip_false_probs[1];
   3899                               else if (cpi->last_skip_false_probs[1]!=0)
   3900              cpi->prob_skip_false = (cpi->last_skip_false_probs[1]  +
   3901              cpi->prob_skip_false ) / 2;
   3902              */
   3903         } else {
   3904           if (cpi->last_skip_false_probs[0] != 0) {
   3905             cpi->prob_skip_false = cpi->last_skip_false_probs[0];
   3906           }
   3907 
   3908           /*
   3909           if(cpi->last_skip_false_probs[0]!=0 && abs(Q-
   3910           cpi->last_skip_probs_q[0])<=16 )
   3911               cpi->prob_skip_false = cpi->last_skip_false_probs[0];
   3912           else if(cpi->last_skip_false_probs[0]!=0)
   3913               cpi->prob_skip_false = (cpi->last_skip_false_probs[0]  +
   3914           cpi->prob_skip_false ) / 2;
   3915               */
   3916         }
   3917 
   3918         /* as this is for cost estimate, let's make sure it does not
   3919          * go extreme eitehr way
   3920          */
   3921         if (cpi->prob_skip_false < 5) cpi->prob_skip_false = 5;
   3922 
   3923         if (cpi->prob_skip_false > 250) cpi->prob_skip_false = 250;
   3924 
   3925         if (cpi->oxcf.number_of_layers == 1 && cpi->is_src_frame_alt_ref) {
   3926           cpi->prob_skip_false = 1;
   3927         }
   3928       }
   3929 
   3930 #if 0
   3931 
   3932             if (cpi->pass != 1)
   3933             {
   3934                 FILE *f = fopen("skip.stt", "a");
   3935                 fprintf(f, "%d, %d, %4d ", cpi->common.refresh_golden_frame, cpi->common.refresh_alt_ref_frame, cpi->prob_skip_false);
   3936                 fclose(f);
   3937             }
   3938 
   3939 #endif
   3940     }
   3941 
   3942     if (cm->frame_type == KEY_FRAME) {
   3943       if (resize_key_frame(cpi)) {
   3944         /* If the frame size has changed, need to reset Q, quantizer,
   3945          * and background refresh.
   3946          */
   3947         Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   3948         if (cpi->cyclic_refresh_mode_enabled) {
   3949           if (cpi->current_layer == 0) {
   3950             cyclic_background_refresh(cpi, Q, 0);
   3951           } else {
   3952             disable_segmentation(cpi);
   3953           }
   3954         }
   3955         // Reset the zero_last counter to 0 on key frame.
   3956         memset(cpi->consec_zero_last, 0, cm->mb_rows * cm->mb_cols);
   3957         memset(cpi->consec_zero_last_mvbias, 0,
   3958                (cpi->common.mb_rows * cpi->common.mb_cols));
   3959         vp8_set_quantizer(cpi, Q);
   3960       }
   3961 
   3962       vp8_setup_key_frame(cpi);
   3963     }
   3964 
   3965 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
   3966     {
   3967       if (cpi->oxcf.error_resilient_mode) cm->refresh_entropy_probs = 0;
   3968 
   3969       if (cpi->oxcf.error_resilient_mode & VPX_ERROR_RESILIENT_PARTITIONS) {
   3970         if (cm->frame_type == KEY_FRAME) cm->refresh_entropy_probs = 1;
   3971       }
   3972 
   3973       if (cm->refresh_entropy_probs == 0) {
   3974         /* save a copy for later refresh */
   3975         memcpy(&cm->lfc, &cm->fc, sizeof(cm->fc));
   3976       }
   3977 
   3978       vp8_update_coef_context(cpi);
   3979 
   3980       vp8_update_coef_probs(cpi);
   3981 
   3982       /* transform / motion compensation build reconstruction frame
   3983        * +pack coef partitions
   3984        */
   3985       vp8_encode_frame(cpi);
   3986 
   3987       /* cpi->projected_frame_size is not needed for RT mode */
   3988     }
   3989 #else
   3990     /* transform / motion compensation build reconstruction frame */
   3991     vp8_encode_frame(cpi);
   3992     if (cpi->oxcf.screen_content_mode == 2) {
   3993       if (vp8_drop_encodedframe_overshoot(cpi, Q)) return;
   3994     }
   3995 
   3996     cpi->projected_frame_size -= vp8_estimate_entropy_savings(cpi);
   3997     cpi->projected_frame_size =
   3998         (cpi->projected_frame_size > 0) ? cpi->projected_frame_size : 0;
   3999 #endif
   4000     vpx_clear_system_state();
   4001 
   4002     /* Test to see if the stats generated for this frame indicate that
   4003      * we should have coded a key frame (assuming that we didn't)!
   4004      */
   4005 
   4006     if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME &&
   4007         cpi->compressor_speed != 2) {
   4008 #if !CONFIG_REALTIME_ONLY
   4009       if (decide_key_frame(cpi)) {
   4010         /* Reset all our sizing numbers and recode */
   4011         cm->frame_type = KEY_FRAME;
   4012 
   4013         vp8_pick_frame_size(cpi);
   4014 
   4015         /* Clear the Alt reference frame active flag when we have
   4016          * a key frame
   4017          */
   4018         cpi->source_alt_ref_active = 0;
   4019 
   4020         // Set the loop filter deltas and segmentation map update
   4021         setup_features(cpi);
   4022 
   4023         vp8_restore_coding_context(cpi);
   4024 
   4025         Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   4026 
   4027         vp8_compute_frame_size_bounds(cpi, &frame_under_shoot_limit,
   4028                                       &frame_over_shoot_limit);
   4029 
   4030         /* Limit Q range for the adaptive loop. */
   4031         bottom_index = cpi->active_best_quality;
   4032         top_index = cpi->active_worst_quality;
   4033         q_low = cpi->active_best_quality;
   4034         q_high = cpi->active_worst_quality;
   4035 
   4036         loop_count++;
   4037         Loop = 1;
   4038 
   4039         continue;
   4040       }
   4041 #endif
   4042     }
   4043 
   4044     vpx_clear_system_state();
   4045 
   4046     if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
   4047 
   4048     /* Are we are overshooting and up against the limit of active max Q. */
   4049     if (((cpi->pass != 2) ||
   4050          (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) &&
   4051         (Q == cpi->active_worst_quality) &&
   4052         (cpi->active_worst_quality < cpi->worst_quality) &&
   4053         (cpi->projected_frame_size > frame_over_shoot_limit)) {
   4054       int over_size_percent =
   4055           ((cpi->projected_frame_size - frame_over_shoot_limit) * 100) /
   4056           frame_over_shoot_limit;
   4057 
   4058       /* If so is there any scope for relaxing it */
   4059       while ((cpi->active_worst_quality < cpi->worst_quality) &&
   4060              (over_size_percent > 0)) {
   4061         cpi->active_worst_quality++;
   4062         /* Assume 1 qstep = about 4% on frame size. */
   4063         over_size_percent = (int)(over_size_percent * 0.96);
   4064       }
   4065 #if !CONFIG_REALTIME_ONLY
   4066       top_index = cpi->active_worst_quality;
   4067 #endif  // !CONFIG_REALTIME_ONLY
   4068       /* If we have updated the active max Q do not call
   4069        * vp8_update_rate_correction_factors() this loop.
   4070        */
   4071       active_worst_qchanged = 1;
   4072     } else {
   4073       active_worst_qchanged = 0;
   4074     }
   4075 
   4076 #if CONFIG_REALTIME_ONLY
   4077     Loop = 0;
   4078 #else
   4079     /* Special case handling for forced key frames */
   4080     if ((cm->frame_type == KEY_FRAME) && cpi->this_key_frame_forced) {
   4081       int last_q = Q;
   4082       int kf_err = vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
   4083 
   4084       /* The key frame is not good enough */
   4085       if (kf_err > ((cpi->ambient_err * 7) >> 3)) {
   4086         /* Lower q_high */
   4087         q_high = (Q > q_low) ? (Q - 1) : q_low;
   4088 
   4089         /* Adjust Q */
   4090         Q = (q_high + q_low) >> 1;
   4091       }
   4092       /* The key frame is much better than the previous frame */
   4093       else if (kf_err < (cpi->ambient_err >> 1)) {
   4094         /* Raise q_low */
   4095         q_low = (Q < q_high) ? (Q + 1) : q_high;
   4096 
   4097         /* Adjust Q */
   4098         Q = (q_high + q_low + 1) >> 1;
   4099       }
   4100 
   4101       /* Clamp Q to upper and lower limits: */
   4102       if (Q > q_high) {
   4103         Q = q_high;
   4104       } else if (Q < q_low) {
   4105         Q = q_low;
   4106       }
   4107 
   4108       Loop = Q != last_q;
   4109     }
   4110 
   4111     /* Is the projected frame size out of range and are we allowed
   4112      * to attempt to recode.
   4113      */
   4114     else if (recode_loop_test(cpi, frame_over_shoot_limit,
   4115                               frame_under_shoot_limit, Q, top_index,
   4116                               bottom_index)) {
   4117       int last_q = Q;
   4118       int Retries = 0;
   4119 
   4120       /* Frame size out of permitted range. Update correction factor
   4121        * & compute new Q to try...
   4122        */
   4123 
   4124       /* Frame is too large */
   4125       if (cpi->projected_frame_size > cpi->this_frame_target) {
   4126         /* Raise Qlow as to at least the current value */
   4127         q_low = (Q < q_high) ? (Q + 1) : q_high;
   4128 
   4129         /* If we are using over quant do the same for zbin_oq_low */
   4130         if (cpi->mb.zbin_over_quant > 0) {
   4131           zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
   4132                             ? (cpi->mb.zbin_over_quant + 1)
   4133                             : zbin_oq_high;
   4134         }
   4135 
   4136         if (undershoot_seen) {
   4137           /* Update rate_correction_factor unless
   4138            * cpi->active_worst_quality has changed.
   4139            */
   4140           if (!active_worst_qchanged) {
   4141             vp8_update_rate_correction_factors(cpi, 1);
   4142           }
   4143 
   4144           Q = (q_high + q_low + 1) / 2;
   4145 
   4146           /* Adjust cpi->zbin_over_quant (only allowed when Q
   4147            * is max)
   4148            */
   4149           if (Q < MAXQ) {
   4150             cpi->mb.zbin_over_quant = 0;
   4151           } else {
   4152             zbin_oq_low = (cpi->mb.zbin_over_quant < zbin_oq_high)
   4153                               ? (cpi->mb.zbin_over_quant + 1)
   4154                               : zbin_oq_high;
   4155             cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
   4156           }
   4157         } else {
   4158           /* Update rate_correction_factor unless
   4159            * cpi->active_worst_quality has changed.
   4160            */
   4161           if (!active_worst_qchanged) {
   4162             vp8_update_rate_correction_factors(cpi, 0);
   4163           }
   4164 
   4165           Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   4166 
   4167           while (((Q < q_low) || (cpi->mb.zbin_over_quant < zbin_oq_low)) &&
   4168                  (Retries < 10)) {
   4169             vp8_update_rate_correction_factors(cpi, 0);
   4170             Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   4171             Retries++;
   4172           }
   4173         }
   4174 
   4175         overshoot_seen = 1;
   4176       }
   4177       /* Frame is too small */
   4178       else {
   4179         if (cpi->mb.zbin_over_quant == 0) {
   4180           /* Lower q_high if not using over quant */
   4181           q_high = (Q > q_low) ? (Q - 1) : q_low;
   4182         } else {
   4183           /* else lower zbin_oq_high */
   4184           zbin_oq_high = (cpi->mb.zbin_over_quant > zbin_oq_low)
   4185                              ? (cpi->mb.zbin_over_quant - 1)
   4186                              : zbin_oq_low;
   4187         }
   4188 
   4189         if (overshoot_seen) {
   4190           /* Update rate_correction_factor unless
   4191            * cpi->active_worst_quality has changed.
   4192            */
   4193           if (!active_worst_qchanged) {
   4194             vp8_update_rate_correction_factors(cpi, 1);
   4195           }
   4196 
   4197           Q = (q_high + q_low) / 2;
   4198 
   4199           /* Adjust cpi->zbin_over_quant (only allowed when Q
   4200            * is max)
   4201            */
   4202           if (Q < MAXQ) {
   4203             cpi->mb.zbin_over_quant = 0;
   4204           } else {
   4205             cpi->mb.zbin_over_quant = (zbin_oq_high + zbin_oq_low) / 2;
   4206           }
   4207         } else {
   4208           /* Update rate_correction_factor unless
   4209            * cpi->active_worst_quality has changed.
   4210            */
   4211           if (!active_worst_qchanged) {
   4212             vp8_update_rate_correction_factors(cpi, 0);
   4213           }
   4214 
   4215           Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   4216 
   4217           /* Special case reset for qlow for constrained quality.
   4218            * This should only trigger where there is very substantial
   4219            * undershoot on a frame and the auto cq level is above
   4220            * the user passsed in value.
   4221            */
   4222           if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
   4223               (Q < q_low)) {
   4224             q_low = Q;
   4225           }
   4226 
   4227           while (((Q > q_high) || (cpi->mb.zbin_over_quant > zbin_oq_high)) &&
   4228                  (Retries < 10)) {
   4229             vp8_update_rate_correction_factors(cpi, 0);
   4230             Q = vp8_regulate_q(cpi, cpi->this_frame_target);
   4231             Retries++;
   4232           }
   4233         }
   4234 
   4235         undershoot_seen = 1;
   4236       }
   4237 
   4238       /* Clamp Q to upper and lower limits: */
   4239       if (Q > q_high) {
   4240         Q = q_high;
   4241       } else if (Q < q_low) {
   4242         Q = q_low;
   4243       }
   4244 
   4245       /* Clamp cpi->zbin_over_quant */
   4246       cpi->mb.zbin_over_quant = (cpi->mb.zbin_over_quant < zbin_oq_low)
   4247                                     ? zbin_oq_low
   4248                                     : (cpi->mb.zbin_over_quant > zbin_oq_high)
   4249                                           ? zbin_oq_high
   4250                                           : cpi->mb.zbin_over_quant;
   4251 
   4252       Loop = Q != last_q;
   4253     } else {
   4254       Loop = 0;
   4255     }
   4256 #endif  // CONFIG_REALTIME_ONLY
   4257 
   4258     if (cpi->is_src_frame_alt_ref) Loop = 0;
   4259 
   4260     if (Loop == 1) {
   4261       vp8_restore_coding_context(cpi);
   4262       loop_count++;
   4263 #if CONFIG_INTERNAL_STATS
   4264       cpi->tot_recode_hits++;
   4265 #endif
   4266     }
   4267   } while (Loop == 1);
   4268 
   4269 #if defined(DROP_UNCODED_FRAMES)
   4270   /* if there are no coded macroblocks at all drop this frame */
   4271   if (cpi->common.MBs == cpi->mb.skip_true_count &&
   4272       (cpi->drop_frame_count & 7) != 7 && cm->frame_type != KEY_FRAME) {
   4273     cpi->common.current_video_frame++;
   4274     cpi->frames_since_key++;
   4275     cpi->drop_frame_count++;
   4276     // We advance the temporal pattern for dropped frames.
   4277     cpi->temporal_pattern_counter++;
   4278     return;
   4279   }
   4280   cpi->drop_frame_count = 0;
   4281 #endif
   4282 
   4283 #if 0
   4284     /* Experimental code for lagged and one pass
   4285      * Update stats used for one pass GF selection
   4286      */
   4287     {
   4288         cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_coded_error = (double)cpi->prediction_error;
   4289         cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_intra_error = (double)cpi->intra_error;
   4290         cpi->one_pass_frame_stats[cpi->one_pass_frame_index].frame_pcnt_inter = (double)(100 - cpi->this_frame_percent_intra) / 100.0;
   4291     }
   4292 #endif
   4293 
   4294   /* Special case code to reduce pulsing when key frames are forced at a
   4295    * fixed interval. Note the reconstruction error if it is the frame before
   4296    * the force key frame
   4297    */
   4298   if (cpi->next_key_frame_forced && (cpi->twopass.frames_to_key == 0)) {
   4299     cpi->ambient_err =
   4300         vp8_calc_ss_err(cpi->Source, &cm->yv12_fb[cm->new_fb_idx]);
   4301   }
   4302 
   4303 /* This frame's MVs are saved and will be used in next frame's MV predictor.
   4304  * Last frame has one more line(add to bottom) and one more column(add to
   4305  * right) than cm->mip. The edge elements are initialized to 0.
   4306  */
   4307 #if CONFIG_MULTI_RES_ENCODING
   4308   if (!cpi->oxcf.mr_encoder_id && cm->show_frame)
   4309 #else
   4310   if (cm->show_frame) /* do not save for altref frame */
   4311 #endif
   4312   {
   4313     int mb_row;
   4314     int mb_col;
   4315     /* Point to beginning of allocated MODE_INFO arrays. */
   4316     MODE_INFO *tmp = cm->mip;
   4317 
   4318     if (cm->frame_type != KEY_FRAME) {
   4319       for (mb_row = 0; mb_row < cm->mb_rows + 1; ++mb_row) {
   4320         for (mb_col = 0; mb_col < cm->mb_cols + 1; ++mb_col) {
   4321           if (tmp->mbmi.ref_frame != INTRA_FRAME) {
   4322             cpi->lfmv[mb_col + mb_row * (cm->mode_info_stride + 1)].as_int =
   4323                 tmp->mbmi.mv.as_int;
   4324           }
   4325 
   4326           cpi->lf_ref_frame_sign_bias[mb_col +
   4327                                       mb_row * (cm->mode_info_stride + 1)] =
   4328               cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
   4329           cpi->lf_ref_frame[mb_col + mb_row * (cm->mode_info_stride + 1)] =
   4330               tmp->mbmi.ref_frame;
   4331           tmp++;
   4332         }
   4333       }
   4334     }
   4335   }
   4336 
   4337   /* Count last ref frame 0,0 usage on current encoded frame. */
   4338   {
   4339     int mb_row;
   4340     int mb_col;
   4341     /* Point to beginning of MODE_INFO arrays. */
   4342     MODE_INFO *tmp = cm->mi;
   4343 
   4344     cpi->zeromv_count = 0;
   4345 
   4346     if (cm->frame_type != KEY_FRAME) {
   4347       for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
   4348         for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
   4349           if (tmp->mbmi.mode == ZEROMV && tmp->mbmi.ref_frame == LAST_FRAME) {
   4350             cpi->zeromv_count++;
   4351           }
   4352           tmp++;
   4353         }
   4354         tmp++;
   4355       }
   4356     }
   4357   }
   4358 
   4359 #if CONFIG_MULTI_RES_ENCODING
   4360   vp8_cal_dissimilarity(cpi);
   4361 #endif
   4362 
   4363   /* Update the GF useage maps.
   4364    * This is done after completing the compression of a frame when all
   4365    * modes etc. are finalized but before loop filter
   4366    */
   4367   if (cpi->oxcf.number_of_layers == 1) {
   4368     vp8_update_gf_useage_maps(cpi, cm, &cpi->mb);
   4369   }
   4370 
   4371   if (cm->frame_type == KEY_FRAME) cm->refresh_last_frame = 1;
   4372 
   4373 #if 0
   4374     {
   4375         FILE *f = fopen("gfactive.stt", "a");
   4376         fprintf(f, "%8d %8d %8d %8d %8d\n", cm->current_video_frame, (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols), cpi->this_iiratio, cpi->next_iiratio, cm->refresh_golden_frame);
   4377         fclose(f);
   4378     }
   4379 #endif
   4380 
   4381   /* For inter frames the current default behavior is that when
   4382    * cm->refresh_golden_frame is set we copy the old GF over to the ARF buffer
   4383    * This is purely an encoder decision at present.
   4384    */
   4385   if (!cpi->oxcf.error_resilient_mode && cm->refresh_golden_frame) {
   4386     cm->copy_buffer_to_arf = 2;
   4387   } else {
   4388     cm->copy_buffer_to_arf = 0;
   4389   }
   4390 
   4391   cm->frame_to_show = &cm->yv12_fb[cm->new_fb_idx];
   4392 
   4393 #if CONFIG_TEMPORAL_DENOISING
   4394   // Get some measure of the amount of noise, by measuring the (partial) mse
   4395   // between source and denoised buffer, for y channel. Partial refers to
   4396   // computing the sse for a sub-sample of the frame (i.e., skip x blocks along
   4397   // row/column),
   4398   // and only for blocks in that set that are consecutive ZEROMV_LAST mode.
   4399   // Do this every ~8 frames, to further reduce complexity.
   4400   // TODO(marpan): Keep this for now for the case cpi->oxcf.noise_sensitivity <
   4401   // 4,
   4402   // should be removed in favor of the process_denoiser_mode_change() function
   4403   // below.
   4404   if (cpi->oxcf.noise_sensitivity > 0 && cpi->oxcf.noise_sensitivity < 4 &&
   4405       !cpi->oxcf.screen_content_mode && cpi->frames_since_key % 8 == 0 &&
   4406       cm->frame_type != KEY_FRAME) {
   4407     cpi->mse_source_denoised = measure_square_diff_partial(
   4408         &cpi->denoiser.yv12_running_avg[INTRA_FRAME], cpi->Source, cpi);
   4409   }
   4410 
   4411   // For the adaptive denoising mode (noise_sensitivity == 4), sample the mse
   4412   // of source diff (between current and previous frame), and determine if we
   4413   // should switch the denoiser mode. Sampling refers to computing the mse for
   4414   // a sub-sample of the frame (i.e., skip x blocks along row/column), and
   4415   // only for blocks in that set that have used ZEROMV LAST, along with some
   4416   // constraint on the sum diff between blocks. This process is called every
   4417   // ~8 frames, to further reduce complexity.
   4418   if (cpi->oxcf.noise_sensitivity == 4 && !cpi->oxcf.screen_content_mode &&
   4419       cpi->frames_since_key % 8 == 0 && cm->frame_type != KEY_FRAME) {
   4420     process_denoiser_mode_change(cpi);
   4421   }
   4422 #endif
   4423 
   4424 #if CONFIG_MULTITHREAD
   4425   if (cpi->b_multi_threaded) {
   4426     /* start loopfilter in separate thread */
   4427     sem_post(&cpi->h_event_start_lpf);
   4428     cpi->b_lpf_running = 1;
   4429   } else
   4430 #endif
   4431   {
   4432     vp8_loopfilter_frame(cpi, cm);
   4433   }
   4434 
   4435   update_reference_frames(cpi);
   4436 
   4437 #ifdef OUTPUT_YUV_DENOISED
   4438   vp8_write_yuv_frame(yuv_denoised_file,
   4439                       &cpi->denoiser.yv12_running_avg[INTRA_FRAME]);
   4440 #endif
   4441 
   4442 #if !(CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
   4443   if (cpi->oxcf.error_resilient_mode) {
   4444     cm->refresh_entropy_probs = 0;
   4445   }
   4446 #endif
   4447 
   4448 #if CONFIG_MULTITHREAD
   4449   /* wait that filter_level is picked so that we can continue with stream
   4450    * packing */
   4451   if (cpi->b_multi_threaded) sem_wait(&cpi->h_event_end_lpf);
   4452 #endif
   4453 
   4454   /* build the bitstream */
   4455   vp8_pack_bitstream(cpi, dest, dest_end, size);
   4456 
   4457   /* Move storing frame_type out of the above loop since it is also
   4458    * needed in motion search besides loopfilter */
   4459   cm->last_frame_type = cm->frame_type;
   4460 
   4461   /* Update rate control heuristics */
   4462   cpi->total_byte_count += (*size);
   4463   cpi->projected_frame_size = (int)(*size) << 3;
   4464 
   4465   if (cpi->oxcf.number_of_layers > 1) {
   4466     unsigned int i;
   4467     for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
   4468       cpi->layer_context[i].total_byte_count += (*size);
   4469     }
   4470   }
   4471 
   4472   if (!active_worst_qchanged) vp8_update_rate_correction_factors(cpi, 2);
   4473 
   4474   cpi->last_q[cm->frame_type] = cm->base_qindex;
   4475 
   4476   if (cm->frame_type == KEY_FRAME) {
   4477     vp8_adjust_key_frame_context(cpi);
   4478   }
   4479 
   4480   /* Keep a record of ambient average Q. */
   4481   if (cm->frame_type != KEY_FRAME) {
   4482     cpi->avg_frame_qindex =
   4483         (2 + 3 * cpi->avg_frame_qindex + cm->base_qindex) >> 2;
   4484   }
   4485 
   4486   /* Keep a record from which we can calculate the average Q excluding
   4487    * GF updates and key frames
   4488    */
   4489   if ((cm->frame_type != KEY_FRAME) &&
   4490       ((cpi->oxcf.number_of_layers > 1) ||
   4491        (!cm->refresh_golden_frame && !cm->refresh_alt_ref_frame))) {
   4492     cpi->ni_frames++;
   4493 
   4494     /* Calculate the average Q for normal inter frames (not key or GFU
   4495      * frames).
   4496      */
   4497     if (cpi->pass == 2) {
   4498       cpi->ni_tot_qi += Q;
   4499       cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
   4500     } else {
   4501       /* Damp value for first few frames */
   4502       if (cpi->ni_frames > 150) {
   4503         cpi->ni_tot_qi += Q;
   4504         cpi->ni_av_qi = (cpi->ni_tot_qi / cpi->ni_frames);
   4505       }
   4506       /* For one pass, early in the clip ... average the current frame Q
   4507        * value with the worstq entered by the user as a dampening measure
   4508        */
   4509       else {
   4510         cpi->ni_tot_qi += Q;
   4511         cpi->ni_av_qi =
   4512             ((cpi->ni_tot_qi / cpi->ni_frames) + cpi->worst_quality + 1) / 2;
   4513       }
   4514 
   4515       /* If the average Q is higher than what was used in the last
   4516        * frame (after going through the recode loop to keep the frame
   4517        * size within range) then use the last frame value - 1. The -1
   4518        * is designed to stop Q and hence the data rate, from
   4519        * progressively falling away during difficult sections, but at
   4520        * the same time reduce the number of itterations around the
   4521        * recode loop.
   4522        */
   4523       if (Q > cpi->ni_av_qi) cpi->ni_av_qi = Q - 1;
   4524     }
   4525   }
   4526 
   4527   /* Update the buffer level variable. */
   4528   /* Non-viewable frames are a special case and are treated as pure overhead. */
   4529   if (!cm->show_frame) {
   4530     cpi->bits_off_target -= cpi->projected_frame_size;
   4531   } else {
   4532     cpi->bits_off_target +=
   4533         cpi->av_per_frame_bandwidth - cpi->projected_frame_size;
   4534   }
   4535 
   4536   /* Clip the buffer level to the maximum specified buffer size */
   4537   if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
   4538     cpi->bits_off_target = cpi->oxcf.maximum_buffer_size;
   4539   }
   4540 
   4541   // If the frame dropper is not enabled, don't let the buffer level go below
   4542   // some threshold, given here by -|maximum_buffer_size|. For now we only do
   4543   // this for screen content input.
   4544   if (cpi->drop_frames_allowed == 0 && cpi->oxcf.screen_content_mode &&
   4545       cpi->bits_off_target < -cpi->oxcf.maximum_buffer_size) {
   4546     cpi->bits_off_target = -cpi->oxcf.maximum_buffer_size;
   4547   }
   4548 
   4549   /* Rolling monitors of whether we are over or underspending used to
   4550    * help regulate min and Max Q in two pass.
   4551    */
   4552   cpi->rolling_target_bits =
   4553       ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4;
   4554   cpi->rolling_actual_bits =
   4555       ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4;
   4556   cpi->long_rolling_target_bits =
   4557       ((cpi->long_rolling_target_bits * 31) + cpi->this_frame_target + 16) / 32;
   4558   cpi->long_rolling_actual_bits =
   4559       ((cpi->long_rolling_actual_bits * 31) + cpi->projected_frame_size + 16) /
   4560       32;
   4561 
   4562   /* Actual bits spent */
   4563   cpi->total_actual_bits += cpi->projected_frame_size;
   4564 
   4565   /* Debug stats */
   4566   cpi->total_target_vs_actual +=
   4567       (cpi->this_frame_target - cpi->projected_frame_size);
   4568 
   4569   cpi->buffer_level = cpi->bits_off_target;
   4570 
   4571   /* Propagate values to higher temporal layers */
   4572   if (cpi->oxcf.number_of_layers > 1) {
   4573     unsigned int i;
   4574 
   4575     for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
   4576       LAYER_CONTEXT *lc = &cpi->layer_context[i];
   4577       int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
   4578                                           cpi->projected_frame_size);
   4579 
   4580       lc->bits_off_target += bits_off_for_this_layer;
   4581 
   4582       /* Clip buffer level to maximum buffer size for the layer */
   4583       if (lc->bits_off_target > lc->maximum_buffer_size) {
   4584         lc->bits_off_target = lc->maximum_buffer_size;
   4585       }
   4586 
   4587       lc->total_actual_bits += cpi->projected_frame_size;
   4588       lc->total_target_vs_actual += bits_off_for_this_layer;
   4589       lc->buffer_level = lc->bits_off_target;
   4590     }
   4591   }
   4592 
   4593   /* Update bits left to the kf and gf groups to account for overshoot
   4594    * or undershoot on these frames
   4595    */
   4596   if (cm->frame_type == KEY_FRAME) {
   4597     cpi->twopass.kf_group_bits +=
   4598         cpi->this_frame_target - cpi->projected_frame_size;
   4599 
   4600     if (cpi->twopass.kf_group_bits < 0) cpi->twopass.kf_group_bits = 0;
   4601   } else if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame) {
   4602     cpi->twopass.gf_group_bits +=
   4603         cpi->this_frame_target - cpi->projected_frame_size;
   4604 
   4605     if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
   4606   }
   4607 
   4608   if (cm->frame_type != KEY_FRAME) {
   4609     if (cpi->common.refresh_alt_ref_frame) {
   4610       cpi->last_skip_false_probs[2] = cpi->prob_skip_false;
   4611       cpi->last_skip_probs_q[2] = cm->base_qindex;
   4612     } else if (cpi->common.refresh_golden_frame) {
   4613       cpi->last_skip_false_probs[1] = cpi->prob_skip_false;
   4614       cpi->last_skip_probs_q[1] = cm->base_qindex;
   4615     } else {
   4616       cpi->last_skip_false_probs[0] = cpi->prob_skip_false;
   4617       cpi->last_skip_probs_q[0] = cm->base_qindex;
   4618 
   4619       /* update the baseline */
   4620       cpi->base_skip_false_prob[cm->base_qindex] = cpi->prob_skip_false;
   4621     }
   4622   }
   4623 
   4624 #if 0 && CONFIG_INTERNAL_STATS
   4625     {
   4626         FILE *f = fopen("tmp.stt", "a");
   4627 
   4628         vpx_clear_system_state();
   4629 
   4630         if (cpi->twopass.total_left_stats.coded_error != 0.0)
   4631             fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
   4632                        "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
   4633                        "%8.2lf %"PRId64" %10.3lf %10"PRId64" %8d\n",
   4634                        cpi->common.current_video_frame, cpi->this_frame_target,
   4635                        cpi->projected_frame_size,
   4636                        (cpi->projected_frame_size - cpi->this_frame_target),
   4637                        cpi->total_target_vs_actual,
   4638                        cpi->buffer_level,
   4639                        (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
   4640                        cpi->total_actual_bits, cm->base_qindex,
   4641                        cpi->active_best_quality, cpi->active_worst_quality,
   4642                        cpi->ni_av_qi, cpi->cq_target_quality,
   4643                        cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
   4644                        cm->frame_type, cpi->gfu_boost,
   4645                        cpi->twopass.est_max_qcorrection_factor,
   4646                        cpi->twopass.bits_left,
   4647                        cpi->twopass.total_left_stats.coded_error,
   4648                        (double)cpi->twopass.bits_left /
   4649                            cpi->twopass.total_left_stats.coded_error,
   4650                        cpi->tot_recode_hits);
   4651         else
   4652             fprintf(f, "%10d %10d %10d %10d %10d %10"PRId64" %10"PRId64
   4653                        "%10"PRId64" %10d %6d %6d %6d %6d %5d %5d %5d %8d "
   4654                        "%8.2lf %"PRId64" %10.3lf %8d\n",
   4655                        cpi->common.current_video_frame, cpi->this_frame_target,
   4656                        cpi->projected_frame_size,
   4657                        (cpi->projected_frame_size - cpi->this_frame_target),
   4658                        cpi->total_target_vs_actual,
   4659                        cpi->buffer_level,
   4660                        (cpi->oxcf.starting_buffer_level-cpi->bits_off_target),
   4661                        cpi->total_actual_bits, cm->base_qindex,
   4662                        cpi->active_best_quality, cpi->active_worst_quality,
   4663                        cpi->ni_av_qi, cpi->cq_target_quality,
   4664                        cm->refresh_golden_frame, cm->refresh_alt_ref_frame,
   4665                        cm->frame_type, cpi->gfu_boost,
   4666                        cpi->twopass.est_max_qcorrection_factor,
   4667                        cpi->twopass.bits_left,
   4668                        cpi->twopass.total_left_stats.coded_error,
   4669                        cpi->tot_recode_hits);
   4670 
   4671         fclose(f);
   4672 
   4673         {
   4674             FILE *fmodes = fopen("Modes.stt", "a");
   4675 
   4676             fprintf(fmodes, "%6d:%1d:%1d:%1d ",
   4677                         cpi->common.current_video_frame,
   4678                         cm->frame_type, cm->refresh_golden_frame,
   4679                         cm->refresh_alt_ref_frame);
   4680 
   4681             fprintf(fmodes, "\n");
   4682 
   4683             fclose(fmodes);
   4684         }
   4685     }
   4686 
   4687 #endif
   4688 
   4689   if (cm->refresh_golden_frame == 1) {
   4690     cm->frame_flags = cm->frame_flags | FRAMEFLAGS_GOLDEN;
   4691   } else {
   4692     cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_GOLDEN;
   4693   }
   4694 
   4695   if (cm->refresh_alt_ref_frame == 1) {
   4696     cm->frame_flags = cm->frame_flags | FRAMEFLAGS_ALTREF;
   4697   } else {
   4698     cm->frame_flags = cm->frame_flags & ~FRAMEFLAGS_ALTREF;
   4699   }
   4700 
   4701   if (cm->refresh_last_frame & cm->refresh_golden_frame) { /* both refreshed */
   4702     cpi->gold_is_last = 1;
   4703   } else if (cm->refresh_last_frame ^ cm->refresh_golden_frame) {
   4704     /* 1 refreshed but not the other */
   4705     cpi->gold_is_last = 0;
   4706   }
   4707 
   4708   if (cm->refresh_last_frame & cm->refresh_alt_ref_frame) { /* both refreshed */
   4709     cpi->alt_is_last = 1;
   4710   } else if (cm->refresh_last_frame ^ cm->refresh_alt_ref_frame) {
   4711     /* 1 refreshed but not the other */
   4712     cpi->alt_is_last = 0;
   4713   }
   4714 
   4715   if (cm->refresh_alt_ref_frame &
   4716       cm->refresh_golden_frame) { /* both refreshed */
   4717     cpi->gold_is_alt = 1;
   4718   } else if (cm->refresh_alt_ref_frame ^ cm->refresh_golden_frame) {
   4719     /* 1 refreshed but not the other */
   4720     cpi->gold_is_alt = 0;
   4721   }
   4722 
   4723   cpi->ref_frame_flags = VP8_ALTR_FRAME | VP8_GOLD_FRAME | VP8_LAST_FRAME;
   4724 
   4725   if (cpi->gold_is_last) cpi->ref_frame_flags &= ~VP8_GOLD_FRAME;
   4726 
   4727   if (cpi->alt_is_last) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
   4728 
   4729   if (cpi->gold_is_alt) cpi->ref_frame_flags &= ~VP8_ALTR_FRAME;
   4730 
   4731   if (!cpi->oxcf.error_resilient_mode) {
   4732     if (cpi->oxcf.play_alternate && cm->refresh_alt_ref_frame &&
   4733         (cm->frame_type != KEY_FRAME)) {
   4734       /* Update the alternate reference frame stats as appropriate. */
   4735       update_alt_ref_frame_stats(cpi);
   4736     } else {
   4737       /* Update the Golden frame stats as appropriate. */
   4738       update_golden_frame_stats(cpi);
   4739     }
   4740   }
   4741 
   4742   if (cm->frame_type == KEY_FRAME) {
   4743     /* Tell the caller that the frame was coded as a key frame */
   4744     *frame_flags = cm->frame_flags | FRAMEFLAGS_KEY;
   4745 
   4746     /* As this frame is a key frame  the next defaults to an inter frame. */
   4747     cm->frame_type = INTER_FRAME;
   4748 
   4749     cpi->last_frame_percent_intra = 100;
   4750   } else {
   4751     *frame_flags = cm->frame_flags & ~FRAMEFLAGS_KEY;
   4752 
   4753     cpi->last_frame_percent_intra = cpi->this_frame_percent_intra;
   4754   }
   4755 
   4756   /* Clear the one shot update flags for segmentation map and mode/ref
   4757    * loop filter deltas.
   4758    */
   4759   cpi->mb.e_mbd.update_mb_segmentation_map = 0;
   4760   cpi->mb.e_mbd.update_mb_segmentation_data = 0;
   4761   cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
   4762 
   4763   /* Dont increment frame counters if this was an altref buffer update
   4764    * not a real frame
   4765    */
   4766   if (cm->show_frame) {
   4767     cm->current_video_frame++;
   4768     cpi->frames_since_key++;
   4769     cpi->temporal_pattern_counter++;
   4770   }
   4771 
   4772 /* reset to normal state now that we are done. */
   4773 
   4774 #if 0
   4775     {
   4776         char filename[512];
   4777         FILE *recon_file;
   4778         sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
   4779         recon_file = fopen(filename, "wb");
   4780         fwrite(cm->yv12_fb[cm->lst_fb_idx].buffer_alloc,
   4781                cm->yv12_fb[cm->lst_fb_idx].frame_size, 1, recon_file);
   4782         fclose(recon_file);
   4783     }
   4784 #endif
   4785 
   4786   /* DEBUG */
   4787   /* vp8_write_yuv_frame("encoder_recon.yuv", cm->frame_to_show); */
   4788 }
   4789 #if !CONFIG_REALTIME_ONLY
   4790 static void Pass2Encode(VP8_COMP *cpi, size_t *size, unsigned char *dest,
   4791                         unsigned char *dest_end, unsigned int *frame_flags) {
   4792   if (!cpi->common.refresh_alt_ref_frame) vp8_second_pass(cpi);
   4793 
   4794   encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
   4795   cpi->twopass.bits_left -= 8 * (int)(*size);
   4796 
   4797   if (!cpi->common.refresh_alt_ref_frame) {
   4798     double two_pass_min_rate =
   4799         (double)(cpi->oxcf.target_bandwidth *
   4800                  cpi->oxcf.two_pass_vbrmin_section / 100);
   4801     cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / cpi->framerate);
   4802   }
   4803 }
   4804 #endif
   4805 
   4806 int vp8_receive_raw_frame(VP8_COMP *cpi, unsigned int frame_flags,
   4807                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
   4808                           int64_t end_time) {
   4809   struct vpx_usec_timer timer;
   4810   int res = 0;
   4811 
   4812   vpx_usec_timer_start(&timer);
   4813 
   4814   /* Reinit the lookahead buffer if the frame size changes */
   4815   if (sd->y_width != cpi->oxcf.Width || sd->y_height != cpi->oxcf.Height) {
   4816     assert(cpi->oxcf.lag_in_frames < 2);
   4817     dealloc_raw_frame_buffers(cpi);
   4818     alloc_raw_frame_buffers(cpi);
   4819   }
   4820 
   4821   if (vp8_lookahead_push(cpi->lookahead, sd, time_stamp, end_time, frame_flags,
   4822                          cpi->active_map_enabled ? cpi->active_map : NULL)) {
   4823     res = -1;
   4824   }
   4825   vpx_usec_timer_mark(&timer);
   4826   cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
   4827 
   4828   return res;
   4829 }
   4830 
   4831 static int frame_is_reference(const VP8_COMP *cpi) {
   4832   const VP8_COMMON *cm = &cpi->common;
   4833   const MACROBLOCKD *xd = &cpi->mb.e_mbd;
   4834 
   4835   return cm->frame_type == KEY_FRAME || cm->refresh_last_frame ||
   4836          cm->refresh_golden_frame || cm->refresh_alt_ref_frame ||
   4837          cm->copy_buffer_to_gf || cm->copy_buffer_to_arf ||
   4838          cm->refresh_entropy_probs || xd->mode_ref_lf_delta_update ||
   4839          xd->update_mb_segmentation_map || xd->update_mb_segmentation_data;
   4840 }
   4841 
   4842 int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags,
   4843                             size_t *size, unsigned char *dest,
   4844                             unsigned char *dest_end, int64_t *time_stamp,
   4845                             int64_t *time_end, int flush) {
   4846   VP8_COMMON *cm;
   4847   struct vpx_usec_timer tsctimer;
   4848   struct vpx_usec_timer ticktimer;
   4849   struct vpx_usec_timer cmptimer;
   4850   YV12_BUFFER_CONFIG *force_src_buffer = NULL;
   4851 
   4852   if (!cpi) return -1;
   4853 
   4854   cm = &cpi->common;
   4855 
   4856   if (setjmp(cpi->common.error.jmp)) {
   4857     cpi->common.error.setjmp = 0;
   4858     vpx_clear_system_state();
   4859     return VPX_CODEC_CORRUPT_FRAME;
   4860   }
   4861 
   4862   cpi->common.error.setjmp = 1;
   4863 
   4864   vpx_usec_timer_start(&cmptimer);
   4865 
   4866   cpi->source = NULL;
   4867 
   4868 #if !CONFIG_REALTIME_ONLY
   4869   /* Should we code an alternate reference frame */
   4870   if (cpi->oxcf.error_resilient_mode == 0 && cpi->oxcf.play_alternate &&
   4871       cpi->source_alt_ref_pending) {
   4872     if ((cpi->source = vp8_lookahead_peek(
   4873              cpi->lookahead, cpi->frames_till_gf_update_due, PEEK_FORWARD))) {
   4874       cpi->alt_ref_source = cpi->source;
   4875       if (cpi->oxcf.arnr_max_frames > 0) {
   4876         vp8_temporal_filter_prepare_c(cpi, cpi->frames_till_gf_update_due);
   4877         force_src_buffer = &cpi->alt_ref_buffer;
   4878       }
   4879       cpi->frames_till_alt_ref_frame = cpi->frames_till_gf_update_due;
   4880       cm->refresh_alt_ref_frame = 1;
   4881       cm->refresh_golden_frame = 0;
   4882       cm->refresh_last_frame = 0;
   4883       cm->show_frame = 0;
   4884       /* Clear Pending alt Ref flag. */
   4885       cpi->source_alt_ref_pending = 0;
   4886       cpi->is_src_frame_alt_ref = 0;
   4887     }
   4888   }
   4889 #endif
   4890 
   4891   if (!cpi->source) {
   4892     /* Read last frame source if we are encoding first pass. */
   4893     if (cpi->pass == 1 && cm->current_video_frame > 0) {
   4894       if ((cpi->last_source =
   4895                vp8_lookahead_peek(cpi->lookahead, 1, PEEK_BACKWARD)) == NULL) {
   4896         return -1;
   4897       }
   4898     }
   4899 
   4900     if ((cpi->source = vp8_lookahead_pop(cpi->lookahead, flush))) {
   4901       cm->show_frame = 1;
   4902 
   4903       cpi->is_src_frame_alt_ref =
   4904           cpi->alt_ref_source && (cpi->source == cpi->alt_ref_source);
   4905 
   4906       if (cpi->is_src_frame_alt_ref) cpi->alt_ref_source = NULL;
   4907     }
   4908   }
   4909 
   4910   if (cpi->source) {
   4911     cpi->Source = force_src_buffer ? force_src_buffer : &cpi->source->img;
   4912     cpi->un_scaled_source = cpi->Source;
   4913     *time_stamp = cpi->source->ts_start;
   4914     *time_end = cpi->source->ts_end;
   4915     *frame_flags = cpi->source->flags;
   4916 
   4917     if (cpi->pass == 1 && cm->current_video_frame > 0) {
   4918       cpi->last_frame_unscaled_source = &cpi->last_source->img;
   4919     }
   4920   } else {
   4921     *size = 0;
   4922 #if !CONFIG_REALTIME_ONLY
   4923 
   4924     if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) {
   4925       vp8_end_first_pass(cpi); /* get last stats packet */
   4926       cpi->twopass.first_pass_done = 1;
   4927     }
   4928 
   4929 #endif
   4930 
   4931     return -1;
   4932   }
   4933 
   4934   if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
   4935     cpi->first_time_stamp_ever = cpi->source->ts_start;
   4936     cpi->last_end_time_stamp_seen = cpi->source->ts_start;
   4937   }
   4938 
   4939   /* adjust frame rates based on timestamps given */
   4940   if (cm->show_frame) {
   4941     int64_t this_duration;
   4942     int step = 0;
   4943 
   4944     if (cpi->source->ts_start == cpi->first_time_stamp_ever) {
   4945       this_duration = cpi->source->ts_end - cpi->source->ts_start;
   4946       step = 1;
   4947     } else {
   4948       int64_t last_duration;
   4949 
   4950       this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen;
   4951       last_duration = cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
   4952       /* do a step update if the duration changes by 10% */
   4953       if (last_duration) {
   4954         step = (int)(((this_duration - last_duration) * 10 / last_duration));
   4955       }
   4956     }
   4957 
   4958     if (this_duration) {
   4959       if (step) {
   4960         cpi->ref_framerate = 10000000.0 / this_duration;
   4961       } else {
   4962         double avg_duration, interval;
   4963 
   4964         /* Average this frame's rate into the last second's average
   4965          * frame rate. If we haven't seen 1 second yet, then average
   4966          * over the whole interval seen.
   4967          */
   4968         interval = (double)(cpi->source->ts_end - cpi->first_time_stamp_ever);
   4969         if (interval > 10000000.0) interval = 10000000;
   4970 
   4971         avg_duration = 10000000.0 / cpi->ref_framerate;
   4972         avg_duration *= (interval - avg_duration + this_duration);
   4973         avg_duration /= interval;
   4974 
   4975         cpi->ref_framerate = 10000000.0 / avg_duration;
   4976       }
   4977 #if CONFIG_MULTI_RES_ENCODING
   4978       if (cpi->oxcf.mr_total_resolutions > 1) {
   4979         LOWER_RES_FRAME_INFO *low_res_frame_info =
   4980             (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
   4981         // Frame rate should be the same for all spatial layers in
   4982         // multi-res-encoding (simulcast), so we constrain the frame for
   4983         // higher layers to be that of lowest resolution. This is needed
   4984         // as he application may decide to skip encoding a high layer and
   4985         // then start again, in which case a big jump in time-stamps will
   4986         // be received for that high layer, which will yield an incorrect
   4987         // frame rate (from time-stamp adjustment in above calculation).
   4988         if (cpi->oxcf.mr_encoder_id) {
   4989           cpi->ref_framerate = low_res_frame_info->low_res_framerate;
   4990         } else {
   4991           // Keep track of frame rate for lowest resolution.
   4992           low_res_frame_info->low_res_framerate = cpi->ref_framerate;
   4993         }
   4994       }
   4995 #endif
   4996       if (cpi->oxcf.number_of_layers > 1) {
   4997         unsigned int i;
   4998 
   4999         /* Update frame rates for each layer */
   5000         assert(cpi->oxcf.number_of_layers <= VPX_TS_MAX_LAYERS);
   5001         for (i = 0; i < cpi->oxcf.number_of_layers && i < VPX_TS_MAX_LAYERS;
   5002              ++i) {
   5003           LAYER_CONTEXT *lc = &cpi->layer_context[i];
   5004           lc->framerate = cpi->ref_framerate / cpi->oxcf.rate_decimator[i];
   5005         }
   5006       } else {
   5007         vp8_new_framerate(cpi, cpi->ref_framerate);
   5008       }
   5009     }
   5010 
   5011     cpi->last_time_stamp_seen = cpi->source->ts_start;
   5012     cpi->last_end_time_stamp_seen = cpi->source->ts_end;
   5013   }
   5014 
   5015   if (cpi->oxcf.number_of_layers > 1) {
   5016     int layer;
   5017 
   5018     update_layer_contexts(cpi);
   5019 
   5020     /* Restore layer specific context & set frame rate */
   5021     if (cpi->temporal_layer_id >= 0) {
   5022       layer = cpi->temporal_layer_id;
   5023     } else {
   5024       layer =
   5025           cpi->oxcf
   5026               .layer_id[cpi->temporal_pattern_counter % cpi->oxcf.periodicity];
   5027     }
   5028     restore_layer_context(cpi, layer);
   5029     vp8_new_framerate(cpi, cpi->layer_context[layer].framerate);
   5030   }
   5031 
   5032   if (cpi->compressor_speed == 2) {
   5033     vpx_usec_timer_start(&tsctimer);
   5034     vpx_usec_timer_start(&ticktimer);
   5035   }
   5036 
   5037   cpi->lf_zeromv_pct = (cpi->zeromv_count * 100) / cm->MBs;
   5038 
   5039 #if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
   5040   {
   5041     int i;
   5042     const int num_part = (1 << cm->multi_token_partition);
   5043     /* the available bytes in dest */
   5044     const unsigned long dest_size = dest_end - dest;
   5045     const int tok_part_buff_size = (dest_size * 9) / (10 * num_part);
   5046 
   5047     unsigned char *dp = dest;
   5048 
   5049     cpi->partition_d[0] = dp;
   5050     dp += dest_size / 10; /* reserve 1/10 for control partition */
   5051     cpi->partition_d_end[0] = dp;
   5052 
   5053     for (i = 0; i < num_part; ++i) {
   5054       cpi->partition_d[i + 1] = dp;
   5055       dp += tok_part_buff_size;
   5056       cpi->partition_d_end[i + 1] = dp;
   5057     }
   5058   }
   5059 #endif
   5060 
   5061   /* start with a 0 size frame */
   5062   *size = 0;
   5063 
   5064   /* Clear down mmx registers */
   5065   vpx_clear_system_state();
   5066 
   5067   cm->frame_type = INTER_FRAME;
   5068   cm->frame_flags = *frame_flags;
   5069 
   5070 #if 0
   5071 
   5072     if (cm->refresh_alt_ref_frame)
   5073     {
   5074         cm->refresh_golden_frame = 0;
   5075         cm->refresh_last_frame = 0;
   5076     }
   5077     else
   5078     {
   5079         cm->refresh_golden_frame = 0;
   5080         cm->refresh_last_frame = 1;
   5081     }
   5082 
   5083 #endif
   5084   /* find a free buffer for the new frame */
   5085   {
   5086     int i = 0;
   5087     for (; i < NUM_YV12_BUFFERS; ++i) {
   5088       if (!cm->yv12_fb[i].flags) {
   5089         cm->new_fb_idx = i;
   5090         break;
   5091       }
   5092     }
   5093 
   5094     assert(i < NUM_YV12_BUFFERS);
   5095   }
   5096   switch (cpi->pass) {
   5097 #if !CONFIG_REALTIME_ONLY
   5098     case 1: Pass1Encode(cpi, size, dest, frame_flags); break;
   5099     case 2: Pass2Encode(cpi, size, dest, dest_end, frame_flags); break;
   5100 #endif  // !CONFIG_REALTIME_ONLY
   5101     default:
   5102       encode_frame_to_data_rate(cpi, size, dest, dest_end, frame_flags);
   5103       break;
   5104   }
   5105 
   5106   if (cpi->compressor_speed == 2) {
   5107     unsigned int duration, duration2;
   5108     vpx_usec_timer_mark(&tsctimer);
   5109     vpx_usec_timer_mark(&ticktimer);
   5110 
   5111     duration = (int)(vpx_usec_timer_elapsed(&ticktimer));
   5112     duration2 = (unsigned int)((double)duration / 2);
   5113 
   5114     if (cm->frame_type != KEY_FRAME) {
   5115       if (cpi->avg_encode_time == 0) {
   5116         cpi->avg_encode_time = duration;
   5117       } else {
   5118         cpi->avg_encode_time = (7 * cpi->avg_encode_time + duration) >> 3;
   5119       }
   5120     }
   5121 
   5122     if (duration2) {
   5123       {
   5124         if (cpi->avg_pick_mode_time == 0) {
   5125           cpi->avg_pick_mode_time = duration2;
   5126         } else {
   5127           cpi->avg_pick_mode_time =
   5128               (7 * cpi->avg_pick_mode_time + duration2) >> 3;
   5129         }
   5130       }
   5131     }
   5132   }
   5133 
   5134   if (cm->refresh_entropy_probs == 0) {
   5135     memcpy(&cm->fc, &cm->lfc, sizeof(cm->fc));
   5136   }
   5137 
   5138   /* Save the contexts separately for alt ref, gold and last. */
   5139   /* (TODO jbb -> Optimize this with pointers to avoid extra copies. ) */
   5140   if (cm->refresh_alt_ref_frame) memcpy(&cpi->lfc_a, &cm->fc, sizeof(cm->fc));
   5141 
   5142   if (cm->refresh_golden_frame) memcpy(&cpi->lfc_g, &cm->fc, sizeof(cm->fc));
   5143 
   5144   if (cm->refresh_last_frame) memcpy(&cpi->lfc_n, &cm->fc, sizeof(cm->fc));
   5145 
   5146   /* if its a dropped frame honor the requests on subsequent frames */
   5147   if (*size > 0) {
   5148     cpi->droppable = !frame_is_reference(cpi);
   5149 
   5150     /* return to normal state */
   5151     cm->refresh_entropy_probs = 1;
   5152     cm->refresh_alt_ref_frame = 0;
   5153     cm->refresh_golden_frame = 0;
   5154     cm->refresh_last_frame = 1;
   5155     cm->frame_type = INTER_FRAME;
   5156   }
   5157 
   5158   /* Save layer specific state */
   5159   if (cpi->oxcf.number_of_layers > 1) save_layer_context(cpi);
   5160 
   5161   vpx_usec_timer_mark(&cmptimer);
   5162   cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
   5163 
   5164   if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) {
   5165     generate_psnr_packet(cpi);
   5166   }
   5167 
   5168 #if CONFIG_INTERNAL_STATS
   5169 
   5170   if (cpi->pass != 1) {
   5171     cpi->bytes += *size;
   5172 
   5173     if (cm->show_frame) {
   5174       cpi->common.show_frame_mi = cpi->common.mi;
   5175       cpi->count++;
   5176 
   5177       if (cpi->b_calculate_psnr) {
   5178         uint64_t ye, ue, ve;
   5179         double frame_psnr;
   5180         YV12_BUFFER_CONFIG *orig = cpi->Source;
   5181         YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
   5182         unsigned int y_width = cpi->common.Width;
   5183         unsigned int y_height = cpi->common.Height;
   5184         unsigned int uv_width = (y_width + 1) / 2;
   5185         unsigned int uv_height = (y_height + 1) / 2;
   5186         int y_samples = y_height * y_width;
   5187         int uv_samples = uv_height * uv_width;
   5188         int t_samples = y_samples + 2 * uv_samples;
   5189         double sq_error;
   5190 
   5191         ye = calc_plane_error(orig->y_buffer, orig->y_stride, recon->y_buffer,
   5192                               recon->y_stride, y_width, y_height);
   5193 
   5194         ue = calc_plane_error(orig->u_buffer, orig->uv_stride, recon->u_buffer,
   5195                               recon->uv_stride, uv_width, uv_height);
   5196 
   5197         ve = calc_plane_error(orig->v_buffer, orig->uv_stride, recon->v_buffer,
   5198                               recon->uv_stride, uv_width, uv_height);
   5199 
   5200         sq_error = (double)(ye + ue + ve);
   5201 
   5202         frame_psnr = vpx_sse_to_psnr(t_samples, 255.0, sq_error);
   5203 
   5204         cpi->total_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
   5205         cpi->total_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
   5206         cpi->total_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
   5207         cpi->total_sq_error += sq_error;
   5208         cpi->total += frame_psnr;
   5209 #if CONFIG_POSTPROC
   5210         {
   5211           YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
   5212           double sq_error2;
   5213           double frame_psnr2, frame_ssim2 = 0;
   5214           double weight = 0;
   5215 
   5216           vp8_deblock(cm, cm->frame_to_show, &cm->post_proc_buffer,
   5217                       cm->filter_level * 10 / 6, 1, 0);
   5218           vpx_clear_system_state();
   5219 
   5220           ye = calc_plane_error(orig->y_buffer, orig->y_stride, pp->y_buffer,
   5221                                 pp->y_stride, y_width, y_height);
   5222 
   5223           ue = calc_plane_error(orig->u_buffer, orig->uv_stride, pp->u_buffer,
   5224                                 pp->uv_stride, uv_width, uv_height);
   5225 
   5226           ve = calc_plane_error(orig->v_buffer, orig->uv_stride, pp->v_buffer,
   5227                                 pp->uv_stride, uv_width, uv_height);
   5228 
   5229           sq_error2 = (double)(ye + ue + ve);
   5230 
   5231           frame_psnr2 = vpx_sse_to_psnr(t_samples, 255.0, sq_error2);
   5232 
   5233           cpi->totalp_y += vpx_sse_to_psnr(y_samples, 255.0, (double)ye);
   5234           cpi->totalp_u += vpx_sse_to_psnr(uv_samples, 255.0, (double)ue);
   5235           cpi->totalp_v += vpx_sse_to_psnr(uv_samples, 255.0, (double)ve);
   5236           cpi->total_sq_error2 += sq_error2;
   5237           cpi->totalp += frame_psnr2;
   5238 
   5239           frame_ssim2 =
   5240               vpx_calc_ssim(cpi->Source, &cm->post_proc_buffer, &weight);
   5241 
   5242           cpi->summed_quality += frame_ssim2 * weight;
   5243           cpi->summed_weights += weight;
   5244 
   5245           if (cpi->oxcf.number_of_layers > 1) {
   5246             unsigned int i;
   5247 
   5248             for (i = cpi->current_layer; i < cpi->oxcf.number_of_layers; ++i) {
   5249               cpi->frames_in_layer[i]++;
   5250 
   5251               cpi->bytes_in_layer[i] += *size;
   5252               cpi->sum_psnr[i] += frame_psnr;
   5253               cpi->sum_psnr_p[i] += frame_psnr2;
   5254               cpi->total_error2[i] += sq_error;
   5255               cpi->total_error2_p[i] += sq_error2;
   5256               cpi->sum_ssim[i] += frame_ssim2 * weight;
   5257               cpi->sum_weights[i] += weight;
   5258             }
   5259           }
   5260         }
   5261 #endif
   5262       }
   5263     }
   5264   }
   5265 
   5266 #if 0
   5267 
   5268     if (cpi->common.frame_type != 0 && cpi->common.base_qindex == cpi->oxcf.worst_allowed_q)
   5269     {
   5270         skiptruecount += cpi->skip_true_count;
   5271         skipfalsecount += cpi->skip_false_count;
   5272     }
   5273 
   5274 #endif
   5275 #if 0
   5276 
   5277     if (cpi->pass != 1)
   5278     {
   5279         FILE *f = fopen("skip.stt", "a");
   5280         fprintf(f, "frame:%4d flags:%4x Q:%4d P:%4d Size:%5d\n", cpi->common.current_video_frame, *frame_flags, cpi->common.base_qindex, cpi->prob_skip_false, *size);
   5281 
   5282         if (cpi->is_src_frame_alt_ref == 1)
   5283             fprintf(f, "skipcount: %4d framesize: %d\n", cpi->skip_true_count , *size);
   5284 
   5285         fclose(f);
   5286     }
   5287 
   5288 #endif
   5289 #endif
   5290 
   5291   cpi->common.error.setjmp = 0;
   5292 
   5293 #if CONFIG_MULTITHREAD
   5294   /* wait for the lpf thread done */
   5295   if (cpi->b_multi_threaded && cpi->b_lpf_running) {
   5296     sem_wait(&cpi->h_event_end_lpf);
   5297     cpi->b_lpf_running = 0;
   5298   }
   5299 #endif
   5300 
   5301   return 0;
   5302 }
   5303 
   5304 int vp8_get_preview_raw_frame(VP8_COMP *cpi, YV12_BUFFER_CONFIG *dest,
   5305                               vp8_ppflags_t *flags) {
   5306   if (cpi->common.refresh_alt_ref_frame) {
   5307     return -1;
   5308   } else {
   5309     int ret;
   5310 
   5311 #if CONFIG_POSTPROC
   5312     cpi->common.show_frame_mi = cpi->common.mi;
   5313     ret = vp8_post_proc_frame(&cpi->common, dest, flags);
   5314 #else
   5315     (void)flags;
   5316 
   5317     if (cpi->common.frame_to_show) {
   5318       *dest = *cpi->common.frame_to_show;
   5319       dest->y_width = cpi->common.Width;
   5320       dest->y_height = cpi->common.Height;
   5321       dest->uv_height = cpi->common.Height / 2;
   5322       ret = 0;
   5323     } else {
   5324       ret = -1;
   5325     }
   5326 
   5327 #endif
   5328     vpx_clear_system_state();
   5329     return ret;
   5330   }
   5331 }
   5332 
   5333 int vp8_set_roimap(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
   5334                    unsigned int cols, int delta_q[4], int delta_lf[4],
   5335                    unsigned int threshold[4]) {
   5336   signed char feature_data[MB_LVL_MAX][MAX_MB_SEGMENTS];
   5337   int internal_delta_q[MAX_MB_SEGMENTS];
   5338   const int range = 63;
   5339   int i;
   5340 
   5341   // This method is currently incompatible with the cyclic refresh method
   5342   if (cpi->cyclic_refresh_mode_enabled) return -1;
   5343 
   5344   // Check number of rows and columns match
   5345   if (cpi->common.mb_rows != (int)rows || cpi->common.mb_cols != (int)cols) {
   5346     return -1;
   5347   }
   5348 
   5349   // Range check the delta Q values and convert the external Q range values
   5350   // to internal ones.
   5351   if ((abs(delta_q[0]) > range) || (abs(delta_q[1]) > range) ||
   5352       (abs(delta_q[2]) > range) || (abs(delta_q[3]) > range)) {
   5353     return -1;
   5354   }
   5355 
   5356   // Range check the delta lf values
   5357   if ((abs(delta_lf[0]) > range) || (abs(delta_lf[1]) > range) ||
   5358       (abs(delta_lf[2]) > range) || (abs(delta_lf[3]) > range)) {
   5359     return -1;
   5360   }
   5361 
   5362   if (!map) {
   5363     disable_segmentation(cpi);
   5364     return 0;
   5365   }
   5366 
   5367   // Translate the external delta q values to internal values.
   5368   for (i = 0; i < MAX_MB_SEGMENTS; ++i) {
   5369     internal_delta_q[i] =
   5370         (delta_q[i] >= 0) ? q_trans[delta_q[i]] : -q_trans[-delta_q[i]];
   5371   }
   5372 
   5373   /* Set the segmentation Map */
   5374   set_segmentation_map(cpi, map);
   5375 
   5376   /* Activate segmentation. */
   5377   enable_segmentation(cpi);
   5378 
   5379   /* Set up the quant segment data */
   5380   feature_data[MB_LVL_ALT_Q][0] = internal_delta_q[0];
   5381   feature_data[MB_LVL_ALT_Q][1] = internal_delta_q[1];
   5382   feature_data[MB_LVL_ALT_Q][2] = internal_delta_q[2];
   5383   feature_data[MB_LVL_ALT_Q][3] = internal_delta_q[3];
   5384 
   5385   /* Set up the loop segment data s */
   5386   feature_data[MB_LVL_ALT_LF][0] = delta_lf[0];
   5387   feature_data[MB_LVL_ALT_LF][1] = delta_lf[1];
   5388   feature_data[MB_LVL_ALT_LF][2] = delta_lf[2];
   5389   feature_data[MB_LVL_ALT_LF][3] = delta_lf[3];
   5390 
   5391   cpi->segment_encode_breakout[0] = threshold[0];
   5392   cpi->segment_encode_breakout[1] = threshold[1];
   5393   cpi->segment_encode_breakout[2] = threshold[2];
   5394   cpi->segment_encode_breakout[3] = threshold[3];
   5395 
   5396   /* Initialise the feature data structure */
   5397   set_segment_data(cpi, &feature_data[0][0], SEGMENT_DELTADATA);
   5398 
   5399   return 0;
   5400 }
   5401 
   5402 int vp8_set_active_map(VP8_COMP *cpi, unsigned char *map, unsigned int rows,
   5403                        unsigned int cols) {
   5404   if ((int)rows == cpi->common.mb_rows && (int)cols == cpi->common.mb_cols) {
   5405     if (map) {
   5406       memcpy(cpi->active_map, map, rows * cols);
   5407       cpi->active_map_enabled = 1;
   5408     } else {
   5409       cpi->active_map_enabled = 0;
   5410     }
   5411 
   5412     return 0;
   5413   } else {
   5414     return -1;
   5415   }
   5416 }
   5417 
   5418 int vp8_set_internal_size(VP8_COMP *cpi, VPX_SCALING horiz_mode,
   5419                           VPX_SCALING vert_mode) {
   5420   if (horiz_mode <= ONETWO) {
   5421     cpi->common.horiz_scale = horiz_mode;
   5422   } else {
   5423     return -1;
   5424   }
   5425 
   5426   if (vert_mode <= ONETWO) {
   5427     cpi->common.vert_scale = vert_mode;
   5428   } else {
   5429     return -1;
   5430   }
   5431 
   5432   return 0;
   5433 }
   5434 
   5435 int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest) {
   5436   int i, j;
   5437   int Total = 0;
   5438 
   5439   unsigned char *src = source->y_buffer;
   5440   unsigned char *dst = dest->y_buffer;
   5441 
   5442   /* Loop through the Y plane raw and reconstruction data summing
   5443    * (square differences)
   5444    */
   5445   for (i = 0; i < source->y_height; i += 16) {
   5446     for (j = 0; j < source->y_width; j += 16) {
   5447       unsigned int sse;
   5448       Total += vpx_mse16x16(src + j, source->y_stride, dst + j, dest->y_stride,
   5449                             &sse);
   5450     }
   5451 
   5452     src += 16 * source->y_stride;
   5453     dst += 16 * dest->y_stride;
   5454   }
   5455 
   5456   return Total;
   5457 }
   5458 
   5459 int vp8_get_quantizer(VP8_COMP *cpi) { return cpi->common.base_qindex; }
   5460