Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <math.h>
     12 #include <limits.h>
     13 #include <stdio.h>
     14 
     15 #include "./vpx_dsp_rtcd.h"
     16 #include "./vpx_scale_rtcd.h"
     17 #include "block.h"
     18 #include "onyx_int.h"
     19 #include "vpx_dsp/variance.h"
     20 #include "encodeintra.h"
     21 #include "vp8/common/common.h"
     22 #include "vp8/common/setupintrarecon.h"
     23 #include "vp8/common/systemdependent.h"
     24 #include "mcomp.h"
     25 #include "firstpass.h"
     26 #include "vpx_scale/vpx_scale.h"
     27 #include "encodemb.h"
     28 #include "vp8/common/extend.h"
     29 #include "vpx_ports/system_state.h"
     30 #include "vpx_mem/vpx_mem.h"
     31 #include "vp8/common/swapyv12buffer.h"
     32 #include "rdopt.h"
     33 #include "vp8/common/quant_common.h"
     34 #include "encodemv.h"
     35 #include "encodeframe.h"
     36 
     37 #define OUTPUT_FPF 0
     38 
     39 extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi);
     40 
     41 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
     42 extern int vp8_kf_boost_qadjustment[QINDEX_RANGE];
     43 
     44 extern const int vp8_gf_boost_qadjustment[QINDEX_RANGE];
     45 
     46 #define IIFACTOR 1.5
     47 #define IIKFACTOR1 1.40
     48 #define IIKFACTOR2 1.5
     49 #define RMAX 14.0
     50 #define GF_RMAX 48.0
     51 
     52 #define KF_MB_INTRA_MIN 300
     53 #define GF_MB_INTRA_MIN 200
     54 
     55 #define DOUBLE_DIVIDE_CHECK(X) ((X) < 0 ? (X)-.000001 : (X) + .000001)
     56 
     57 #define POW1 (double)cpi->oxcf.two_pass_vbrbias / 100.0
     58 #define POW2 (double)cpi->oxcf.two_pass_vbrbias / 100.0
     59 
     60 #define NEW_BOOST 1
     61 
     62 static int vscale_lookup[7] = { 0, 1, 1, 2, 2, 3, 3 };
     63 static int hscale_lookup[7] = { 0, 0, 1, 1, 2, 2, 3 };
     64 
     65 static const int cq_level[QINDEX_RANGE] = {
     66   0,  0,  1,  1,  2,  3,  3,  4,  4,  5,  6,  6,  7,  8,  8,  9,  9,  10, 11,
     67   11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24,
     68   24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38,
     69   39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53,
     70   54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69,
     71   70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86,
     72   87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100
     73 };
     74 
     75 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame);
     76 
     77 /* Resets the first pass file to the given position using a relative seek
     78  * from the current position
     79  */
     80 static void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position) {
     81   cpi->twopass.stats_in = Position;
     82 }
     83 
     84 static int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame) {
     85   if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) return EOF;
     86 
     87   *next_frame = *cpi->twopass.stats_in;
     88   return 1;
     89 }
     90 
     91 /* Read frame stats at an offset from the current position */
     92 static int read_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *frame_stats,
     93                             int offset) {
     94   FIRSTPASS_STATS *fps_ptr = cpi->twopass.stats_in;
     95 
     96   /* Check legality of offset */
     97   if (offset >= 0) {
     98     if (&fps_ptr[offset] >= cpi->twopass.stats_in_end) return EOF;
     99   } else if (offset < 0) {
    100     if (&fps_ptr[offset] < cpi->twopass.stats_in_start) return EOF;
    101   }
    102 
    103   *frame_stats = fps_ptr[offset];
    104   return 1;
    105 }
    106 
    107 static int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps) {
    108   if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) return EOF;
    109 
    110   *fps = *cpi->twopass.stats_in;
    111   cpi->twopass.stats_in =
    112       (void *)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS));
    113   return 1;
    114 }
    115 
    116 static void output_stats(const VP8_COMP *cpi,
    117                          struct vpx_codec_pkt_list *pktlist,
    118                          FIRSTPASS_STATS *stats) {
    119   struct vpx_codec_cx_pkt pkt;
    120   (void)cpi;
    121   pkt.kind = VPX_CODEC_STATS_PKT;
    122   pkt.data.twopass_stats.buf = stats;
    123   pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS);
    124   vpx_codec_pkt_list_add(pktlist, &pkt);
    125 
    126 /* TEMP debug code */
    127 #if OUTPUT_FPF
    128 
    129   {
    130     FILE *fpfile;
    131     fpfile = fopen("firstpass.stt", "a");
    132 
    133     fprintf(fpfile,
    134             "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f"
    135             " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
    136             " %12.0f %12.0f %12.4f\n",
    137             stats->frame, stats->intra_error, stats->coded_error,
    138             stats->ssim_weighted_pred_err, stats->pcnt_inter,
    139             stats->pcnt_motion, stats->pcnt_second_ref, stats->pcnt_neutral,
    140             stats->MVr, stats->mvr_abs, stats->MVc, stats->mvc_abs, stats->MVrv,
    141             stats->MVcv, stats->mv_in_out_count, stats->new_mv_count,
    142             stats->count, stats->duration);
    143     fclose(fpfile);
    144   }
    145 #endif
    146 }
    147 
    148 static void zero_stats(FIRSTPASS_STATS *section) {
    149   section->frame = 0.0;
    150   section->intra_error = 0.0;
    151   section->coded_error = 0.0;
    152   section->ssim_weighted_pred_err = 0.0;
    153   section->pcnt_inter = 0.0;
    154   section->pcnt_motion = 0.0;
    155   section->pcnt_second_ref = 0.0;
    156   section->pcnt_neutral = 0.0;
    157   section->MVr = 0.0;
    158   section->mvr_abs = 0.0;
    159   section->MVc = 0.0;
    160   section->mvc_abs = 0.0;
    161   section->MVrv = 0.0;
    162   section->MVcv = 0.0;
    163   section->mv_in_out_count = 0.0;
    164   section->new_mv_count = 0.0;
    165   section->count = 0.0;
    166   section->duration = 1.0;
    167 }
    168 
    169 static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) {
    170   section->frame += frame->frame;
    171   section->intra_error += frame->intra_error;
    172   section->coded_error += frame->coded_error;
    173   section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
    174   section->pcnt_inter += frame->pcnt_inter;
    175   section->pcnt_motion += frame->pcnt_motion;
    176   section->pcnt_second_ref += frame->pcnt_second_ref;
    177   section->pcnt_neutral += frame->pcnt_neutral;
    178   section->MVr += frame->MVr;
    179   section->mvr_abs += frame->mvr_abs;
    180   section->MVc += frame->MVc;
    181   section->mvc_abs += frame->mvc_abs;
    182   section->MVrv += frame->MVrv;
    183   section->MVcv += frame->MVcv;
    184   section->mv_in_out_count += frame->mv_in_out_count;
    185   section->new_mv_count += frame->new_mv_count;
    186   section->count += frame->count;
    187   section->duration += frame->duration;
    188 }
    189 
    190 static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) {
    191   section->frame -= frame->frame;
    192   section->intra_error -= frame->intra_error;
    193   section->coded_error -= frame->coded_error;
    194   section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
    195   section->pcnt_inter -= frame->pcnt_inter;
    196   section->pcnt_motion -= frame->pcnt_motion;
    197   section->pcnt_second_ref -= frame->pcnt_second_ref;
    198   section->pcnt_neutral -= frame->pcnt_neutral;
    199   section->MVr -= frame->MVr;
    200   section->mvr_abs -= frame->mvr_abs;
    201   section->MVc -= frame->MVc;
    202   section->mvc_abs -= frame->mvc_abs;
    203   section->MVrv -= frame->MVrv;
    204   section->MVcv -= frame->MVcv;
    205   section->mv_in_out_count -= frame->mv_in_out_count;
    206   section->new_mv_count -= frame->new_mv_count;
    207   section->count -= frame->count;
    208   section->duration -= frame->duration;
    209 }
    210 
    211 static void avg_stats(FIRSTPASS_STATS *section) {
    212   if (section->count < 1.0) return;
    213 
    214   section->intra_error /= section->count;
    215   section->coded_error /= section->count;
    216   section->ssim_weighted_pred_err /= section->count;
    217   section->pcnt_inter /= section->count;
    218   section->pcnt_second_ref /= section->count;
    219   section->pcnt_neutral /= section->count;
    220   section->pcnt_motion /= section->count;
    221   section->MVr /= section->count;
    222   section->mvr_abs /= section->count;
    223   section->MVc /= section->count;
    224   section->mvc_abs /= section->count;
    225   section->MVrv /= section->count;
    226   section->MVcv /= section->count;
    227   section->mv_in_out_count /= section->count;
    228   section->duration /= section->count;
    229 }
    230 
    231 /* Calculate a modified Error used in distributing bits between easier
    232  * and harder frames
    233  */
    234 static double calculate_modified_err(VP8_COMP *cpi,
    235                                      FIRSTPASS_STATS *this_frame) {
    236   double av_err = (cpi->twopass.total_stats.ssim_weighted_pred_err /
    237                    cpi->twopass.total_stats.count);
    238   double this_err = this_frame->ssim_weighted_pred_err;
    239   double modified_err;
    240 
    241   if (this_err > av_err) {
    242     modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW1);
    243   } else {
    244     modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW2);
    245   }
    246 
    247   return modified_err;
    248 }
    249 
    250 static const double weight_table[256] = {
    251   0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
    252   0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
    253   0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
    254   0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
    255   0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.031250, 0.062500,
    256   0.093750, 0.125000, 0.156250, 0.187500, 0.218750, 0.250000, 0.281250,
    257   0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, 0.500000,
    258   0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750,
    259   0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500,
    260   0.968750, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    261   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    262   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    263   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    264   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    265   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    266   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    267   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    268   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    269   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    270   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    271   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    272   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    273   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    274   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    275   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    276   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    277   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    278   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    279   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    280   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    281   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    282   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    283   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    284   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    285   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    286   1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
    287   1.000000, 1.000000, 1.000000, 1.000000
    288 };
    289 
    290 static double simple_weight(YV12_BUFFER_CONFIG *source) {
    291   int i, j;
    292 
    293   unsigned char *src = source->y_buffer;
    294   double sum_weights = 0.0;
    295 
    296   /* Loop throught the Y plane raw examining levels and creating a weight
    297    * for the image
    298    */
    299   i = source->y_height;
    300   do {
    301     j = source->y_width;
    302     do {
    303       sum_weights += weight_table[*src];
    304       src++;
    305     } while (--j);
    306     src -= source->y_width;
    307     src += source->y_stride;
    308   } while (--i);
    309 
    310   sum_weights /= (source->y_height * source->y_width);
    311 
    312   return sum_weights;
    313 }
    314 
    315 /* This function returns the current per frame maximum bitrate target */
    316 static int frame_max_bits(VP8_COMP *cpi) {
    317   /* Max allocation for a single frame based on the max section guidelines
    318    * passed in and how many bits are left
    319    */
    320   int max_bits;
    321 
    322   /* For CBR we need to also consider buffer fullness.
    323    * If we are running below the optimal level then we need to gradually
    324    * tighten up on max_bits.
    325    */
    326   if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
    327     double buffer_fullness_ratio =
    328         (double)cpi->buffer_level /
    329         DOUBLE_DIVIDE_CHECK((double)cpi->oxcf.optimal_buffer_level);
    330 
    331     /* For CBR base this on the target average bits per frame plus the
    332      * maximum sedction rate passed in by the user
    333      */
    334     max_bits = (int)(cpi->av_per_frame_bandwidth *
    335                      ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
    336 
    337     /* If our buffer is below the optimum level */
    338     if (buffer_fullness_ratio < 1.0) {
    339       /* The lower of max_bits / 4 or cpi->av_per_frame_bandwidth / 4. */
    340       int min_max_bits = ((cpi->av_per_frame_bandwidth >> 2) < (max_bits >> 2))
    341                              ? cpi->av_per_frame_bandwidth >> 2
    342                              : max_bits >> 2;
    343 
    344       max_bits = (int)(max_bits * buffer_fullness_ratio);
    345 
    346       /* Lowest value we will set ... which should allow the buffer to
    347        * refill.
    348        */
    349       if (max_bits < min_max_bits) max_bits = min_max_bits;
    350     }
    351   }
    352   /* VBR */
    353   else {
    354     /* For VBR base this on the bits and frames left plus the
    355      * two_pass_vbrmax_section rate passed in by the user
    356      */
    357     max_bits = (int)(((double)cpi->twopass.bits_left /
    358                       (cpi->twopass.total_stats.count -
    359                        (double)cpi->common.current_video_frame)) *
    360                      ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
    361   }
    362 
    363   /* Trap case where we are out of bits */
    364   if (max_bits < 0) max_bits = 0;
    365 
    366   return max_bits;
    367 }
    368 
    369 void vp8_init_first_pass(VP8_COMP *cpi) {
    370   zero_stats(&cpi->twopass.total_stats);
    371 }
    372 
    373 void vp8_end_first_pass(VP8_COMP *cpi) {
    374   output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats);
    375 }
    376 
    377 static void zz_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
    378                              YV12_BUFFER_CONFIG *raw_buffer,
    379                              int *raw_motion_err,
    380                              YV12_BUFFER_CONFIG *recon_buffer,
    381                              int *best_motion_err, int recon_yoffset) {
    382   MACROBLOCKD *const xd = &x->e_mbd;
    383   BLOCK *b = &x->block[0];
    384   BLOCKD *d = &x->e_mbd.block[0];
    385 
    386   unsigned char *src_ptr = (*(b->base_src) + b->src);
    387   int src_stride = b->src_stride;
    388   unsigned char *raw_ptr;
    389   int raw_stride = raw_buffer->y_stride;
    390   unsigned char *ref_ptr;
    391   int ref_stride = x->e_mbd.pre.y_stride;
    392   (void)cpi;
    393 
    394   /* Set up pointers for this macro block raw buffer */
    395   raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset + d->offset);
    396   vpx_mse16x16(src_ptr, src_stride, raw_ptr, raw_stride,
    397                (unsigned int *)(raw_motion_err));
    398 
    399   /* Set up pointers for this macro block recon buffer */
    400   xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
    401   ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset);
    402   vpx_mse16x16(src_ptr, src_stride, ref_ptr, ref_stride,
    403                (unsigned int *)(best_motion_err));
    404 }
    405 
    406 static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
    407                                      int_mv *ref_mv, MV *best_mv,
    408                                      YV12_BUFFER_CONFIG *recon_buffer,
    409                                      int *best_motion_err, int recon_yoffset) {
    410   MACROBLOCKD *const xd = &x->e_mbd;
    411   BLOCK *b = &x->block[0];
    412   BLOCKD *d = &x->e_mbd.block[0];
    413   int num00;
    414 
    415   int_mv tmp_mv;
    416   int_mv ref_mv_full;
    417 
    418   int tmp_err;
    419   int step_param = 3; /* Dont search over full range for first pass */
    420   int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
    421   int n;
    422   vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16];
    423   int new_mv_mode_penalty = 256;
    424 
    425   /* override the default variance function to use MSE */
    426   v_fn_ptr.vf = vpx_mse16x16;
    427 
    428   /* Set up pointers for this macro block recon buffer */
    429   xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
    430 
    431   /* Initial step/diamond search centred on best mv */
    432   tmp_mv.as_int = 0;
    433   ref_mv_full.as_mv.col = ref_mv->as_mv.col >> 3;
    434   ref_mv_full.as_mv.row = ref_mv->as_mv.row >> 3;
    435   tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
    436                                     x->sadperbit16, &num00, &v_fn_ptr,
    437                                     x->mvcost, ref_mv);
    438   if (tmp_err < INT_MAX - new_mv_mode_penalty) tmp_err += new_mv_mode_penalty;
    439 
    440   if (tmp_err < *best_motion_err) {
    441     *best_motion_err = tmp_err;
    442     best_mv->row = tmp_mv.as_mv.row;
    443     best_mv->col = tmp_mv.as_mv.col;
    444   }
    445 
    446   /* Further step/diamond searches as necessary */
    447   n = num00;
    448   num00 = 0;
    449 
    450   while (n < further_steps) {
    451     n++;
    452 
    453     if (num00) {
    454       num00--;
    455     } else {
    456       tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
    457                                         step_param + n, x->sadperbit16, &num00,
    458                                         &v_fn_ptr, x->mvcost, ref_mv);
    459       if (tmp_err < INT_MAX - new_mv_mode_penalty) {
    460         tmp_err += new_mv_mode_penalty;
    461       }
    462 
    463       if (tmp_err < *best_motion_err) {
    464         *best_motion_err = tmp_err;
    465         best_mv->row = tmp_mv.as_mv.row;
    466         best_mv->col = tmp_mv.as_mv.col;
    467       }
    468     }
    469   }
    470 }
    471 
    472 void vp8_first_pass(VP8_COMP *cpi) {
    473   int mb_row, mb_col;
    474   MACROBLOCK *const x = &cpi->mb;
    475   VP8_COMMON *const cm = &cpi->common;
    476   MACROBLOCKD *const xd = &x->e_mbd;
    477 
    478   int recon_yoffset, recon_uvoffset;
    479   YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
    480   YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
    481   YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
    482   int recon_y_stride = lst_yv12->y_stride;
    483   int recon_uv_stride = lst_yv12->uv_stride;
    484   int64_t intra_error = 0;
    485   int64_t coded_error = 0;
    486 
    487   int sum_mvr = 0, sum_mvc = 0;
    488   int sum_mvr_abs = 0, sum_mvc_abs = 0;
    489   int sum_mvrs = 0, sum_mvcs = 0;
    490   int mvcount = 0;
    491   int intercount = 0;
    492   int second_ref_count = 0;
    493   int intrapenalty = 256;
    494   int neutral_count = 0;
    495   int new_mv_count = 0;
    496   int sum_in_vectors = 0;
    497   uint32_t lastmv_as_int = 0;
    498 
    499   int_mv zero_ref_mv;
    500 
    501   zero_ref_mv.as_int = 0;
    502 
    503   vpx_clear_system_state();
    504 
    505   x->src = *cpi->Source;
    506   xd->pre = *lst_yv12;
    507   xd->dst = *new_yv12;
    508 
    509   x->partition_info = x->pi;
    510 
    511   xd->mode_info_context = cm->mi;
    512 
    513   if (!cm->use_bilinear_mc_filter) {
    514     xd->subpixel_predict = vp8_sixtap_predict4x4;
    515     xd->subpixel_predict8x4 = vp8_sixtap_predict8x4;
    516     xd->subpixel_predict8x8 = vp8_sixtap_predict8x8;
    517     xd->subpixel_predict16x16 = vp8_sixtap_predict16x16;
    518   } else {
    519     xd->subpixel_predict = vp8_bilinear_predict4x4;
    520     xd->subpixel_predict8x4 = vp8_bilinear_predict8x4;
    521     xd->subpixel_predict8x8 = vp8_bilinear_predict8x8;
    522     xd->subpixel_predict16x16 = vp8_bilinear_predict16x16;
    523   }
    524 
    525   vp8_build_block_offsets(x);
    526 
    527   /* set up frame new frame for intra coded blocks */
    528   vp8_setup_intra_recon(new_yv12);
    529   vp8cx_frame_init_quantizer(cpi);
    530 
    531   /* Initialise the MV cost table to the defaults */
    532   {
    533     int flag[2] = { 1, 1 };
    534     vp8_initialize_rd_consts(cpi, x,
    535                              vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
    536     memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
    537     vp8_build_component_cost_table(cpi->mb.mvcost,
    538                                    (const MV_CONTEXT *)cm->fc.mvc, flag);
    539   }
    540 
    541   /* for each macroblock row in image */
    542   for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
    543     int_mv best_ref_mv;
    544 
    545     best_ref_mv.as_int = 0;
    546 
    547     /* reset above block coeffs */
    548     xd->up_available = (mb_row != 0);
    549     recon_yoffset = (mb_row * recon_y_stride * 16);
    550     recon_uvoffset = (mb_row * recon_uv_stride * 8);
    551 
    552     /* Set up limit values for motion vectors to prevent them extending
    553      * outside the UMV borders
    554      */
    555     x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
    556     x->mv_row_max =
    557         ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
    558 
    559     /* for each macroblock col in image */
    560     for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
    561       int this_error;
    562       int gf_motion_error = INT_MAX;
    563       int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
    564 
    565       xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
    566       xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset;
    567       xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
    568       xd->left_available = (mb_col != 0);
    569 
    570       /* Copy current mb to a buffer */
    571       vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
    572 
    573       /* do intra 16x16 prediction */
    574       this_error = vp8_encode_intra(cpi, x, use_dc_pred);
    575 
    576       /* "intrapenalty" below deals with situations where the intra
    577        * and inter error scores are very low (eg a plain black frame)
    578        * We do not have special cases in first pass for 0,0 and
    579        * nearest etc so all inter modes carry an overhead cost
    580        * estimate fot the mv. When the error score is very low this
    581        * causes us to pick all or lots of INTRA modes and throw lots
    582        * of key frames. This penalty adds a cost matching that of a
    583        * 0,0 mv to the intra case.
    584        */
    585       this_error += intrapenalty;
    586 
    587       /* Cumulative intra error total */
    588       intra_error += (int64_t)this_error;
    589 
    590       /* Set up limit values for motion vectors to prevent them
    591        * extending outside the UMV borders
    592        */
    593       x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
    594       x->mv_col_max =
    595           ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
    596 
    597       /* Other than for the first frame do a motion search */
    598       if (cm->current_video_frame > 0) {
    599         BLOCKD *d = &x->e_mbd.block[0];
    600         MV tmp_mv = { 0, 0 };
    601         int tmp_err;
    602         int motion_error = INT_MAX;
    603         int raw_motion_error = INT_MAX;
    604 
    605         /* Simple 0,0 motion with no mv overhead */
    606         zz_motion_search(cpi, x, cpi->last_frame_unscaled_source,
    607                          &raw_motion_error, lst_yv12, &motion_error,
    608                          recon_yoffset);
    609         d->bmi.mv.as_mv.row = 0;
    610         d->bmi.mv.as_mv.col = 0;
    611 
    612         if (raw_motion_error < cpi->oxcf.encode_breakout) {
    613           goto skip_motion_search;
    614         }
    615 
    616         /* Test last reference frame using the previous best mv as the
    617          * starting point (best reference) for the search
    618          */
    619         first_pass_motion_search(cpi, x, &best_ref_mv, &d->bmi.mv.as_mv,
    620                                  lst_yv12, &motion_error, recon_yoffset);
    621 
    622         /* If the current best reference mv is not centred on 0,0
    623          * then do a 0,0 based search as well
    624          */
    625         if (best_ref_mv.as_int) {
    626           tmp_err = INT_MAX;
    627           first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, lst_yv12,
    628                                    &tmp_err, recon_yoffset);
    629 
    630           if (tmp_err < motion_error) {
    631             motion_error = tmp_err;
    632             d->bmi.mv.as_mv.row = tmp_mv.row;
    633             d->bmi.mv.as_mv.col = tmp_mv.col;
    634           }
    635         }
    636 
    637         /* Experimental search in a second reference frame ((0,0)
    638          * based only)
    639          */
    640         if (cm->current_video_frame > 1) {
    641           first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12,
    642                                    &gf_motion_error, recon_yoffset);
    643 
    644           if ((gf_motion_error < motion_error) &&
    645               (gf_motion_error < this_error)) {
    646             second_ref_count++;
    647           }
    648 
    649           /* Reset to last frame as reference buffer */
    650           xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset;
    651           xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset;
    652           xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset;
    653         }
    654 
    655       skip_motion_search:
    656         /* Intra assumed best */
    657         best_ref_mv.as_int = 0;
    658 
    659         if (motion_error <= this_error) {
    660           /* Keep a count of cases where the inter and intra were
    661            * very close and very low. This helps with scene cut
    662            * detection for example in cropped clips with black bars
    663            * at the sides or top and bottom.
    664            */
    665           if ((((this_error - intrapenalty) * 9) <= (motion_error * 10)) &&
    666               (this_error < (2 * intrapenalty))) {
    667             neutral_count++;
    668           }
    669 
    670           d->bmi.mv.as_mv.row *= 8;
    671           d->bmi.mv.as_mv.col *= 8;
    672           this_error = motion_error;
    673           vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv);
    674           vp8_encode_inter16x16y(x);
    675           sum_mvr += d->bmi.mv.as_mv.row;
    676           sum_mvr_abs += abs(d->bmi.mv.as_mv.row);
    677           sum_mvc += d->bmi.mv.as_mv.col;
    678           sum_mvc_abs += abs(d->bmi.mv.as_mv.col);
    679           sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row;
    680           sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col;
    681           intercount++;
    682 
    683           best_ref_mv.as_int = d->bmi.mv.as_int;
    684 
    685           /* Was the vector non-zero */
    686           if (d->bmi.mv.as_int) {
    687             mvcount++;
    688 
    689             /* Was it different from the last non zero vector */
    690             if (d->bmi.mv.as_int != lastmv_as_int) new_mv_count++;
    691             lastmv_as_int = d->bmi.mv.as_int;
    692 
    693             /* Does the Row vector point inwards or outwards */
    694             if (mb_row < cm->mb_rows / 2) {
    695               if (d->bmi.mv.as_mv.row > 0) {
    696                 sum_in_vectors--;
    697               } else if (d->bmi.mv.as_mv.row < 0) {
    698                 sum_in_vectors++;
    699               }
    700             } else if (mb_row > cm->mb_rows / 2) {
    701               if (d->bmi.mv.as_mv.row > 0) {
    702                 sum_in_vectors++;
    703               } else if (d->bmi.mv.as_mv.row < 0) {
    704                 sum_in_vectors--;
    705               }
    706             }
    707 
    708             /* Does the Row vector point inwards or outwards */
    709             if (mb_col < cm->mb_cols / 2) {
    710               if (d->bmi.mv.as_mv.col > 0) {
    711                 sum_in_vectors--;
    712               } else if (d->bmi.mv.as_mv.col < 0) {
    713                 sum_in_vectors++;
    714               }
    715             } else if (mb_col > cm->mb_cols / 2) {
    716               if (d->bmi.mv.as_mv.col > 0) {
    717                 sum_in_vectors++;
    718               } else if (d->bmi.mv.as_mv.col < 0) {
    719                 sum_in_vectors--;
    720               }
    721             }
    722           }
    723         }
    724       }
    725 
    726       coded_error += (int64_t)this_error;
    727 
    728       /* adjust to the next column of macroblocks */
    729       x->src.y_buffer += 16;
    730       x->src.u_buffer += 8;
    731       x->src.v_buffer += 8;
    732 
    733       recon_yoffset += 16;
    734       recon_uvoffset += 8;
    735     }
    736 
    737     /* adjust to the next row of mbs */
    738     x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
    739     x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
    740     x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
    741 
    742     /* extend the recon for intra prediction */
    743     vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8,
    744                       xd->dst.v_buffer + 8);
    745     vpx_clear_system_state();
    746   }
    747 
    748   vpx_clear_system_state();
    749   {
    750     double weight = 0.0;
    751 
    752     FIRSTPASS_STATS fps;
    753 
    754     fps.frame = cm->current_video_frame;
    755     fps.intra_error = (double)(intra_error >> 8);
    756     fps.coded_error = (double)(coded_error >> 8);
    757     weight = simple_weight(cpi->Source);
    758 
    759     if (weight < 0.1) weight = 0.1;
    760 
    761     fps.ssim_weighted_pred_err = fps.coded_error * weight;
    762 
    763     fps.pcnt_inter = 0.0;
    764     fps.pcnt_motion = 0.0;
    765     fps.MVr = 0.0;
    766     fps.mvr_abs = 0.0;
    767     fps.MVc = 0.0;
    768     fps.mvc_abs = 0.0;
    769     fps.MVrv = 0.0;
    770     fps.MVcv = 0.0;
    771     fps.mv_in_out_count = 0.0;
    772     fps.new_mv_count = 0.0;
    773     fps.count = 1.0;
    774 
    775     fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs;
    776     fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs;
    777     fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs;
    778 
    779     if (mvcount > 0) {
    780       fps.MVr = (double)sum_mvr / (double)mvcount;
    781       fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount;
    782       fps.MVc = (double)sum_mvc / (double)mvcount;
    783       fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount;
    784       fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) /
    785                  (double)mvcount;
    786       fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) /
    787                  (double)mvcount;
    788       fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2);
    789       fps.new_mv_count = new_mv_count;
    790 
    791       fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs;
    792     }
    793 
    794     /* TODO:  handle the case when duration is set to 0, or something less
    795      * than the full time between subsequent cpi->source_time_stamps
    796      */
    797     fps.duration = (double)(cpi->source->ts_end - cpi->source->ts_start);
    798 
    799     /* don't want to do output stats with a stack variable! */
    800     memcpy(&cpi->twopass.this_frame_stats, &fps, sizeof(FIRSTPASS_STATS));
    801     output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats);
    802     accumulate_stats(&cpi->twopass.total_stats, &fps);
    803   }
    804 
    805   /* Copy the previous Last Frame into the GF buffer if specific
    806    * conditions for doing so are met
    807    */
    808   if ((cm->current_video_frame > 0) &&
    809       (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) &&
    810       ((cpi->twopass.this_frame_stats.intra_error /
    811         DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) >
    812        2.0)) {
    813     vp8_yv12_copy_frame(lst_yv12, gld_yv12);
    814   }
    815 
    816   /* swap frame pointers so last frame refers to the frame we just
    817    * compressed
    818    */
    819   vp8_swap_yv12_buffer(lst_yv12, new_yv12);
    820   vp8_yv12_extend_frame_borders(lst_yv12);
    821 
    822   /* Special case for the first frame. Copy into the GF buffer as a
    823    * second reference.
    824    */
    825   if (cm->current_video_frame == 0) {
    826     vp8_yv12_copy_frame(lst_yv12, gld_yv12);
    827   }
    828 
    829   /* use this to see what the first pass reconstruction looks like */
    830   if (0) {
    831     char filename[512];
    832     FILE *recon_file;
    833     sprintf(filename, "enc%04d.yuv", (int)cm->current_video_frame);
    834 
    835     if (cm->current_video_frame == 0) {
    836       recon_file = fopen(filename, "wb");
    837     } else {
    838       recon_file = fopen(filename, "ab");
    839     }
    840 
    841     (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file);
    842     fclose(recon_file);
    843   }
    844 
    845   cm->current_video_frame++;
    846 }
    847 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
    848 
    849 /* Estimate a cost per mb attributable to overheads such as the coding of
    850  * modes and motion vectors.
    851  * Currently simplistic in its assumptions for testing.
    852  */
    853 
    854 static double bitcost(double prob) {
    855   if (prob > 0.000122) {
    856     return -log(prob) / log(2.0);
    857   } else {
    858     return 13.0;
    859   }
    860 }
    861 static int64_t estimate_modemvcost(VP8_COMP *cpi, FIRSTPASS_STATS *fpstats) {
    862   int mv_cost;
    863   int64_t mode_cost;
    864 
    865   double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
    866   double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
    867   double av_intra = (1.0 - av_pct_inter);
    868 
    869   double zz_cost;
    870   double motion_cost;
    871   double intra_cost;
    872 
    873   zz_cost = bitcost(av_pct_inter - av_pct_motion);
    874   motion_cost = bitcost(av_pct_motion);
    875   intra_cost = bitcost(av_intra);
    876 
    877   /* Estimate of extra bits per mv overhead for mbs
    878    * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb
    879    */
    880   mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
    881 
    882   /* Crude estimate of overhead cost from modes
    883    * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb
    884    */
    885   mode_cost =
    886       (int64_t)((((av_pct_inter - av_pct_motion) * zz_cost) +
    887                  (av_pct_motion * motion_cost) + (av_intra * intra_cost)) *
    888                 cpi->common.MBs) *
    889       512;
    890 
    891   return mv_cost + mode_cost;
    892 }
    893 
    894 static double calc_correction_factor(double err_per_mb, double err_devisor,
    895                                      double pt_low, double pt_high, int Q) {
    896   double power_term;
    897   double error_term = err_per_mb / err_devisor;
    898   double correction_factor;
    899 
    900   /* Adjustment based on Q to power term. */
    901   power_term = pt_low + (Q * 0.01);
    902   power_term = (power_term > pt_high) ? pt_high : power_term;
    903 
    904   /* Adjustments to error term */
    905   /* TBD */
    906 
    907   /* Calculate correction factor */
    908   correction_factor = pow(error_term, power_term);
    909 
    910   /* Clip range */
    911   correction_factor = (correction_factor < 0.05)
    912                           ? 0.05
    913                           : (correction_factor > 5.0) ? 5.0 : correction_factor;
    914 
    915   return correction_factor;
    916 }
    917 
    918 static int estimate_max_q(VP8_COMP *cpi, FIRSTPASS_STATS *fpstats,
    919                           int section_target_bandwitdh, int overhead_bits) {
    920   int Q;
    921   int num_mbs = cpi->common.MBs;
    922   int target_norm_bits_per_mb;
    923 
    924   double section_err = (fpstats->coded_error / fpstats->count);
    925   double err_per_mb = section_err / num_mbs;
    926   double err_correction_factor;
    927   double speed_correction = 1.0;
    928   int overhead_bits_per_mb;
    929 
    930   if (section_target_bandwitdh <= 0) {
    931     return cpi->twopass.maxq_max_limit; /* Highest value allowed */
    932   }
    933 
    934   target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
    935                                 ? (512 * section_target_bandwitdh) / num_mbs
    936                                 : 512 * (section_target_bandwitdh / num_mbs);
    937 
    938   /* Calculate a corrective factor based on a rolling ratio of bits spent
    939    * vs target bits
    940    */
    941   if ((cpi->rolling_target_bits > 0) &&
    942       (cpi->active_worst_quality < cpi->worst_quality)) {
    943     double rolling_ratio;
    944 
    945     rolling_ratio =
    946         (double)cpi->rolling_actual_bits / (double)cpi->rolling_target_bits;
    947 
    948     if (rolling_ratio < 0.95) {
    949       cpi->twopass.est_max_qcorrection_factor -= 0.005;
    950     } else if (rolling_ratio > 1.05) {
    951       cpi->twopass.est_max_qcorrection_factor += 0.005;
    952     }
    953 
    954     cpi->twopass.est_max_qcorrection_factor =
    955         (cpi->twopass.est_max_qcorrection_factor < 0.1)
    956             ? 0.1
    957             : (cpi->twopass.est_max_qcorrection_factor > 10.0)
    958                   ? 10.0
    959                   : cpi->twopass.est_max_qcorrection_factor;
    960   }
    961 
    962   /* Corrections for higher compression speed settings
    963    * (reduced compression expected)
    964    */
    965   if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) {
    966     if (cpi->oxcf.cpu_used <= 5) {
    967       speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
    968     } else {
    969       speed_correction = 1.25;
    970     }
    971   }
    972 
    973   /* Estimate of overhead bits per mb */
    974   /* Correction to overhead bits for min allowed Q. */
    975   overhead_bits_per_mb = overhead_bits / num_mbs;
    976   overhead_bits_per_mb = (int)(overhead_bits_per_mb *
    977                                pow(0.98, (double)cpi->twopass.maxq_min_limit));
    978 
    979   /* Try and pick a max Q that will be high enough to encode the
    980    * content at the given rate.
    981    */
    982   for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; ++Q) {
    983     int bits_per_mb_at_this_q;
    984 
    985     /* Error per MB based correction factor */
    986     err_correction_factor =
    987         calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
    988 
    989     bits_per_mb_at_this_q =
    990         vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
    991 
    992     bits_per_mb_at_this_q = (int)(.5 +
    993                                   err_correction_factor * speed_correction *
    994                                       cpi->twopass.est_max_qcorrection_factor *
    995                                       cpi->twopass.section_max_qfactor *
    996                                       (double)bits_per_mb_at_this_q);
    997 
    998     /* Mode and motion overhead */
    999     /* As Q rises in real encode loop rd code will force overhead down
   1000      * We make a crude adjustment for this here as *.98 per Q step.
   1001      */
   1002     overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
   1003 
   1004     if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) break;
   1005   }
   1006 
   1007   /* Restriction on active max q for constrained quality mode. */
   1008   if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
   1009       (Q < cpi->cq_target_quality)) {
   1010     Q = cpi->cq_target_quality;
   1011   }
   1012 
   1013   /* Adjust maxq_min_limit and maxq_max_limit limits based on
   1014    * average q observed in clip for non kf/gf.arf frames
   1015    * Give average a chance to settle though.
   1016    */
   1017   if ((cpi->ni_frames > ((int)cpi->twopass.total_stats.count >> 8)) &&
   1018       (cpi->ni_frames > 150)) {
   1019     cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality)
   1020                                       ? (cpi->ni_av_qi + 32)
   1021                                       : cpi->worst_quality;
   1022     cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality)
   1023                                       ? (cpi->ni_av_qi - 32)
   1024                                       : cpi->best_quality;
   1025   }
   1026 
   1027   return Q;
   1028 }
   1029 
   1030 /* For cq mode estimate a cq level that matches the observed
   1031  * complexity and data rate.
   1032  */
   1033 static int estimate_cq(VP8_COMP *cpi, FIRSTPASS_STATS *fpstats,
   1034                        int section_target_bandwitdh, int overhead_bits) {
   1035   int Q;
   1036   int num_mbs = cpi->common.MBs;
   1037   int target_norm_bits_per_mb;
   1038 
   1039   double section_err = (fpstats->coded_error / fpstats->count);
   1040   double err_per_mb = section_err / num_mbs;
   1041   double err_correction_factor;
   1042   double speed_correction = 1.0;
   1043   double clip_iiratio;
   1044   double clip_iifactor;
   1045   int overhead_bits_per_mb;
   1046 
   1047   if (0) {
   1048     FILE *f = fopen("epmp.stt", "a");
   1049     fprintf(f, "%10.2f\n", err_per_mb);
   1050     fclose(f);
   1051   }
   1052 
   1053   target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
   1054                                 ? (512 * section_target_bandwitdh) / num_mbs
   1055                                 : 512 * (section_target_bandwitdh / num_mbs);
   1056 
   1057   /* Estimate of overhead bits per mb */
   1058   overhead_bits_per_mb = overhead_bits / num_mbs;
   1059 
   1060   /* Corrections for higher compression speed settings
   1061    * (reduced compression expected)
   1062    */
   1063   if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) {
   1064     if (cpi->oxcf.cpu_used <= 5) {
   1065       speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
   1066     } else {
   1067       speed_correction = 1.25;
   1068     }
   1069   }
   1070 
   1071   /* II ratio correction factor for clip as a whole */
   1072   clip_iiratio = cpi->twopass.total_stats.intra_error /
   1073                  DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error);
   1074   clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025);
   1075   if (clip_iifactor < 0.80) clip_iifactor = 0.80;
   1076 
   1077   /* Try and pick a Q that can encode the content at the given rate. */
   1078   for (Q = 0; Q < MAXQ; ++Q) {
   1079     int bits_per_mb_at_this_q;
   1080 
   1081     /* Error per MB based correction factor */
   1082     err_correction_factor =
   1083         calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q);
   1084 
   1085     bits_per_mb_at_this_q =
   1086         vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
   1087 
   1088     bits_per_mb_at_this_q =
   1089         (int)(.5 +
   1090               err_correction_factor * speed_correction * clip_iifactor *
   1091                   (double)bits_per_mb_at_this_q);
   1092 
   1093     /* Mode and motion overhead */
   1094     /* As Q rises in real encode loop rd code will force overhead down
   1095      * We make a crude adjustment for this here as *.98 per Q step.
   1096      */
   1097     overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
   1098 
   1099     if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) break;
   1100   }
   1101 
   1102   /* Clip value to range "best allowed to (worst allowed - 1)" */
   1103   Q = cq_level[Q];
   1104   if (Q >= cpi->worst_quality) Q = cpi->worst_quality - 1;
   1105   if (Q < cpi->best_quality) Q = cpi->best_quality;
   1106 
   1107   return Q;
   1108 }
   1109 
   1110 static int estimate_q(VP8_COMP *cpi, double section_err,
   1111                       int section_target_bandwitdh) {
   1112   int Q;
   1113   int num_mbs = cpi->common.MBs;
   1114   int target_norm_bits_per_mb;
   1115 
   1116   double err_per_mb = section_err / num_mbs;
   1117   double err_correction_factor;
   1118   double speed_correction = 1.0;
   1119 
   1120   target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
   1121                                 ? (512 * section_target_bandwitdh) / num_mbs
   1122                                 : 512 * (section_target_bandwitdh / num_mbs);
   1123 
   1124   /* Corrections for higher compression speed settings
   1125    * (reduced compression expected)
   1126    */
   1127   if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) {
   1128     if (cpi->oxcf.cpu_used <= 5) {
   1129       speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
   1130     } else {
   1131       speed_correction = 1.25;
   1132     }
   1133   }
   1134 
   1135   /* Try and pick a Q that can encode the content at the given rate. */
   1136   for (Q = 0; Q < MAXQ; ++Q) {
   1137     int bits_per_mb_at_this_q;
   1138 
   1139     /* Error per MB based correction factor */
   1140     err_correction_factor =
   1141         calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
   1142 
   1143     bits_per_mb_at_this_q =
   1144         (int)(.5 + (err_correction_factor * speed_correction *
   1145                     cpi->twopass.est_max_qcorrection_factor *
   1146                     (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0));
   1147 
   1148     if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) break;
   1149   }
   1150 
   1151   return Q;
   1152 }
   1153 
   1154 /* Estimate a worst case Q for a KF group */
   1155 static int estimate_kf_group_q(VP8_COMP *cpi, double section_err,
   1156                                int section_target_bandwitdh,
   1157                                double group_iiratio) {
   1158   int Q;
   1159   int num_mbs = cpi->common.MBs;
   1160   int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs;
   1161   int bits_per_mb_at_this_q;
   1162 
   1163   double err_per_mb = section_err / num_mbs;
   1164   double err_correction_factor;
   1165   double speed_correction = 1.0;
   1166   double current_spend_ratio = 1.0;
   1167 
   1168   double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90;
   1169   double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80;
   1170 
   1171   double iiratio_correction_factor = 1.0;
   1172 
   1173   double combined_correction_factor;
   1174 
   1175   /* Trap special case where the target is <= 0 */
   1176   if (target_norm_bits_per_mb <= 0) return MAXQ * 2;
   1177 
   1178   /* Calculate a corrective factor based on a rolling ratio of bits spent
   1179    *  vs target bits
   1180    * This is clamped to the range 0.1 to 10.0
   1181    */
   1182   if (cpi->long_rolling_target_bits <= 0) {
   1183     current_spend_ratio = 10.0;
   1184   } else {
   1185     current_spend_ratio = (double)cpi->long_rolling_actual_bits /
   1186                           (double)cpi->long_rolling_target_bits;
   1187     current_spend_ratio =
   1188         (current_spend_ratio > 10.0)
   1189             ? 10.0
   1190             : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio;
   1191   }
   1192 
   1193   /* Calculate a correction factor based on the quality of prediction in
   1194    * the sequence as indicated by intra_inter error score ratio (IIRatio)
   1195    * The idea here is to favour subsampling in the hardest sections vs
   1196    * the easyest.
   1197    */
   1198   iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1);
   1199 
   1200   if (iiratio_correction_factor < 0.5) iiratio_correction_factor = 0.5;
   1201 
   1202   /* Corrections for higher compression speed settings
   1203    * (reduced compression expected)
   1204    */
   1205   if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1)) {
   1206     if (cpi->oxcf.cpu_used <= 5) {
   1207       speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
   1208     } else {
   1209       speed_correction = 1.25;
   1210     }
   1211   }
   1212 
   1213   /* Combine the various factors calculated above */
   1214   combined_correction_factor =
   1215       speed_correction * iiratio_correction_factor * current_spend_ratio;
   1216 
   1217   /* Try and pick a Q that should be high enough to encode the content at
   1218    * the given rate.
   1219    */
   1220   for (Q = 0; Q < MAXQ; ++Q) {
   1221     /* Error per MB based correction factor */
   1222     err_correction_factor =
   1223         calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q);
   1224 
   1225     bits_per_mb_at_this_q =
   1226         (int)(.5 + (err_correction_factor * combined_correction_factor *
   1227                     (double)vp8_bits_per_mb[INTER_FRAME][Q]));
   1228 
   1229     if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) break;
   1230   }
   1231 
   1232   /* If we could not hit the target even at Max Q then estimate what Q
   1233    * would have been required
   1234    */
   1235   while ((bits_per_mb_at_this_q > target_norm_bits_per_mb) &&
   1236          (Q < (MAXQ * 2))) {
   1237     bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q);
   1238     Q++;
   1239   }
   1240 
   1241   if (0) {
   1242     FILE *f = fopen("estkf_q.stt", "a");
   1243     fprintf(f, "%8d %8d %8d %8.2f %8.3f %8.2f %8.3f %8.3f %8.3f %8d\n",
   1244             cpi->common.current_video_frame, bits_per_mb_at_this_q,
   1245             target_norm_bits_per_mb, err_per_mb, err_correction_factor,
   1246             current_spend_ratio, group_iiratio, iiratio_correction_factor,
   1247             (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level,
   1248             Q);
   1249     fclose(f);
   1250   }
   1251 
   1252   return Q;
   1253 }
   1254 
   1255 void vp8_init_second_pass(VP8_COMP *cpi) {
   1256   FIRSTPASS_STATS this_frame;
   1257   FIRSTPASS_STATS *start_pos;
   1258 
   1259   double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth *
   1260                                       cpi->oxcf.two_pass_vbrmin_section / 100);
   1261 
   1262   zero_stats(&cpi->twopass.total_stats);
   1263   zero_stats(&cpi->twopass.total_left_stats);
   1264 
   1265   if (!cpi->twopass.stats_in_end) return;
   1266 
   1267   cpi->twopass.total_stats = *cpi->twopass.stats_in_end;
   1268   cpi->twopass.total_left_stats = cpi->twopass.total_stats;
   1269 
   1270   /* each frame can have a different duration, as the frame rate in the
   1271    * source isn't guaranteed to be constant.   The frame rate prior to
   1272    * the first frame encoded in the second pass is a guess.  However the
   1273    * sum duration is not. Its calculated based on the actual durations of
   1274    * all frames from the first pass.
   1275    */
   1276   vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count /
   1277                              cpi->twopass.total_stats.duration);
   1278 
   1279   cpi->output_framerate = cpi->framerate;
   1280   cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration *
   1281                                      cpi->oxcf.target_bandwidth / 10000000.0);
   1282   cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration *
   1283                                       two_pass_min_rate / 10000000.0);
   1284 
   1285   /* Calculate a minimum intra value to be used in determining the IIratio
   1286    * scores used in the second pass. We have this minimum to make sure
   1287    * that clips that are static but "low complexity" in the intra domain
   1288    * are still boosted appropriately for KF/GF/ARF
   1289    */
   1290   cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
   1291   cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
   1292 
   1293   /* Scan the first pass file and calculate an average Intra / Inter error
   1294    * score ratio for the sequence
   1295    */
   1296   {
   1297     double sum_iiratio = 0.0;
   1298     double IIRatio;
   1299 
   1300     start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
   1301 
   1302     while (input_stats(cpi, &this_frame) != EOF) {
   1303       IIRatio =
   1304           this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error);
   1305       IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio;
   1306       sum_iiratio += IIRatio;
   1307     }
   1308 
   1309     cpi->twopass.avg_iiratio =
   1310         sum_iiratio /
   1311         DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count);
   1312 
   1313     /* Reset file position */
   1314     reset_fpf_position(cpi, start_pos);
   1315   }
   1316 
   1317   /* Scan the first pass file and calculate a modified total error based
   1318    * upon the bias/power function used to allocate bits
   1319    */
   1320   {
   1321     start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
   1322 
   1323     cpi->twopass.modified_error_total = 0.0;
   1324     cpi->twopass.modified_error_used = 0.0;
   1325 
   1326     while (input_stats(cpi, &this_frame) != EOF) {
   1327       cpi->twopass.modified_error_total +=
   1328           calculate_modified_err(cpi, &this_frame);
   1329     }
   1330     cpi->twopass.modified_error_left = cpi->twopass.modified_error_total;
   1331 
   1332     reset_fpf_position(cpi, start_pos); /* Reset file position */
   1333   }
   1334 }
   1335 
   1336 void vp8_end_second_pass(VP8_COMP *cpi) { (void)cpi; }
   1337 
   1338 /* This function gives and estimate of how badly we believe the prediction
   1339  * quality is decaying from frame to frame.
   1340  */
   1341 static double get_prediction_decay_rate(VP8_COMP *cpi,
   1342                                         FIRSTPASS_STATS *next_frame) {
   1343   double prediction_decay_rate;
   1344   double motion_decay;
   1345   double motion_pct = next_frame->pcnt_motion;
   1346   (void)cpi;
   1347 
   1348   /* Initial basis is the % mbs inter coded */
   1349   prediction_decay_rate = next_frame->pcnt_inter;
   1350 
   1351   /* High % motion -> somewhat higher decay rate */
   1352   motion_decay = (1.0 - (motion_pct / 20.0));
   1353   if (motion_decay < prediction_decay_rate) {
   1354     prediction_decay_rate = motion_decay;
   1355   }
   1356 
   1357   /* Adjustment to decay rate based on speed of motion */
   1358   {
   1359     double this_mv_rabs;
   1360     double this_mv_cabs;
   1361     double distance_factor;
   1362 
   1363     this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct);
   1364     this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct);
   1365 
   1366     distance_factor =
   1367         sqrt((this_mv_rabs * this_mv_rabs) + (this_mv_cabs * this_mv_cabs)) /
   1368         250.0;
   1369     distance_factor = ((distance_factor > 1.0) ? 0.0 : (1.0 - distance_factor));
   1370     if (distance_factor < prediction_decay_rate) {
   1371       prediction_decay_rate = distance_factor;
   1372     }
   1373   }
   1374 
   1375   return prediction_decay_rate;
   1376 }
   1377 
   1378 /* Function to test for a condition where a complex transition is followed
   1379  * by a static section. For example in slide shows where there is a fade
   1380  * between slides. This is to help with more optimal kf and gf positioning.
   1381  */
   1382 static int detect_transition_to_still(VP8_COMP *cpi, int frame_interval,
   1383                                       int still_interval,
   1384                                       double loop_decay_rate,
   1385                                       double decay_accumulator) {
   1386   int trans_to_still = 0;
   1387 
   1388   /* Break clause to detect very still sections after motion
   1389    * For example a static image after a fade or other transition
   1390    * instead of a clean scene cut.
   1391    */
   1392   if ((frame_interval > MIN_GF_INTERVAL) && (loop_decay_rate >= 0.999) &&
   1393       (decay_accumulator < 0.9)) {
   1394     int j;
   1395     FIRSTPASS_STATS *position = cpi->twopass.stats_in;
   1396     FIRSTPASS_STATS tmp_next_frame;
   1397     double decay_rate;
   1398 
   1399     /* Look ahead a few frames to see if static condition persists... */
   1400     for (j = 0; j < still_interval; ++j) {
   1401       if (EOF == input_stats(cpi, &tmp_next_frame)) break;
   1402 
   1403       decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame);
   1404       if (decay_rate < 0.999) break;
   1405     }
   1406     /* Reset file position */
   1407     reset_fpf_position(cpi, position);
   1408 
   1409     /* Only if it does do we signal a transition to still */
   1410     if (j == still_interval) trans_to_still = 1;
   1411   }
   1412 
   1413   return trans_to_still;
   1414 }
   1415 
   1416 /* This function detects a flash through the high relative pcnt_second_ref
   1417  * score in the frame following a flash frame. The offset passed in should
   1418  * reflect this
   1419  */
   1420 static int detect_flash(VP8_COMP *cpi, int offset) {
   1421   FIRSTPASS_STATS next_frame;
   1422 
   1423   int flash_detected = 0;
   1424 
   1425   /* Read the frame data. */
   1426   /* The return is 0 (no flash detected) if not a valid frame */
   1427   if (read_frame_stats(cpi, &next_frame, offset) != EOF) {
   1428     /* What we are looking for here is a situation where there is a
   1429      * brief break in prediction (such as a flash) but subsequent frames
   1430      * are reasonably well predicted by an earlier (pre flash) frame.
   1431      * The recovery after a flash is indicated by a high pcnt_second_ref
   1432      * comapred to pcnt_inter.
   1433      */
   1434     if ((next_frame.pcnt_second_ref > next_frame.pcnt_inter) &&
   1435         (next_frame.pcnt_second_ref >= 0.5)) {
   1436       flash_detected = 1;
   1437 
   1438       /*if (1)
   1439       {
   1440           FILE *f = fopen("flash.stt", "a");
   1441           fprintf(f, "%8.0f %6.2f %6.2f\n",
   1442               next_frame.frame,
   1443               next_frame.pcnt_inter,
   1444               next_frame.pcnt_second_ref);
   1445           fclose(f);
   1446       }*/
   1447     }
   1448   }
   1449 
   1450   return flash_detected;
   1451 }
   1452 
   1453 /* Update the motion related elements to the GF arf boost calculation */
   1454 static void accumulate_frame_motion_stats(VP8_COMP *cpi,
   1455                                           FIRSTPASS_STATS *this_frame,
   1456                                           double *this_frame_mv_in_out,
   1457                                           double *mv_in_out_accumulator,
   1458                                           double *abs_mv_in_out_accumulator,
   1459                                           double *mv_ratio_accumulator) {
   1460   double this_frame_mvr_ratio;
   1461   double this_frame_mvc_ratio;
   1462   double motion_pct;
   1463   (void)cpi;
   1464 
   1465   /* Accumulate motion stats. */
   1466   motion_pct = this_frame->pcnt_motion;
   1467 
   1468   /* Accumulate Motion In/Out of frame stats */
   1469   *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct;
   1470   *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct;
   1471   *abs_mv_in_out_accumulator += fabs(this_frame->mv_in_out_count * motion_pct);
   1472 
   1473   /* Accumulate a measure of how uniform (or conversely how random)
   1474    * the motion field is. (A ratio of absmv / mv)
   1475    */
   1476   if (motion_pct > 0.05) {
   1477     this_frame_mvr_ratio =
   1478         fabs(this_frame->mvr_abs) / DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr));
   1479 
   1480     this_frame_mvc_ratio =
   1481         fabs(this_frame->mvc_abs) / DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc));
   1482 
   1483     *mv_ratio_accumulator += (this_frame_mvr_ratio < this_frame->mvr_abs)
   1484                                  ? (this_frame_mvr_ratio * motion_pct)
   1485                                  : this_frame->mvr_abs * motion_pct;
   1486 
   1487     *mv_ratio_accumulator += (this_frame_mvc_ratio < this_frame->mvc_abs)
   1488                                  ? (this_frame_mvc_ratio * motion_pct)
   1489                                  : this_frame->mvc_abs * motion_pct;
   1490   }
   1491 }
   1492 
   1493 /* Calculate a baseline boost number for the current frame. */
   1494 static double calc_frame_boost(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame,
   1495                                double this_frame_mv_in_out) {
   1496   double frame_boost;
   1497 
   1498   /* Underlying boost factor is based on inter intra error ratio */
   1499   if (this_frame->intra_error > cpi->twopass.gf_intra_err_min) {
   1500     frame_boost = (IIFACTOR * this_frame->intra_error /
   1501                    DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
   1502   } else {
   1503     frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min /
   1504                    DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
   1505   }
   1506 
   1507   /* Increase boost for frames where new data coming into frame
   1508    * (eg zoom out). Slightly reduce boost if there is a net balance
   1509    * of motion out of the frame (zoom in).
   1510    * The range for this_frame_mv_in_out is -1.0 to +1.0
   1511    */
   1512   if (this_frame_mv_in_out > 0.0) {
   1513     frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
   1514     /* In extreme case boost is halved */
   1515   } else {
   1516     frame_boost += frame_boost * (this_frame_mv_in_out / 2.0);
   1517   }
   1518 
   1519   /* Clip to maximum */
   1520   if (frame_boost > GF_RMAX) frame_boost = GF_RMAX;
   1521 
   1522   return frame_boost;
   1523 }
   1524 
   1525 #if NEW_BOOST
   1526 static int calc_arf_boost(VP8_COMP *cpi, int offset, int f_frames, int b_frames,
   1527                           int *f_boost, int *b_boost) {
   1528   FIRSTPASS_STATS this_frame;
   1529 
   1530   int i;
   1531   double boost_score = 0.0;
   1532   double mv_ratio_accumulator = 0.0;
   1533   double decay_accumulator = 1.0;
   1534   double this_frame_mv_in_out = 0.0;
   1535   double mv_in_out_accumulator = 0.0;
   1536   double abs_mv_in_out_accumulator = 0.0;
   1537   double r;
   1538   int flash_detected = 0;
   1539 
   1540   /* Search forward from the proposed arf/next gf position */
   1541   for (i = 0; i < f_frames; ++i) {
   1542     if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) break;
   1543 
   1544     /* Update the motion related elements to the boost calculation */
   1545     accumulate_frame_motion_stats(
   1546         cpi, &this_frame, &this_frame_mv_in_out, &mv_in_out_accumulator,
   1547         &abs_mv_in_out_accumulator, &mv_ratio_accumulator);
   1548 
   1549     /* Calculate the baseline boost number for this frame */
   1550     r = calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out);
   1551 
   1552     /* We want to discount the the flash frame itself and the recovery
   1553      * frame that follows as both will have poor scores.
   1554      */
   1555     flash_detected =
   1556         detect_flash(cpi, (i + offset)) || detect_flash(cpi, (i + offset + 1));
   1557 
   1558     /* Cumulative effect of prediction quality decay */
   1559     if (!flash_detected) {
   1560       decay_accumulator =
   1561           decay_accumulator * get_prediction_decay_rate(cpi, &this_frame);
   1562       decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
   1563     }
   1564     boost_score += (decay_accumulator * r);
   1565 
   1566     /* Break out conditions. */
   1567     if ((!flash_detected) &&
   1568         ((mv_ratio_accumulator > 100.0) || (abs_mv_in_out_accumulator > 3.0) ||
   1569          (mv_in_out_accumulator < -2.0))) {
   1570       break;
   1571     }
   1572   }
   1573 
   1574   *f_boost = (int)(boost_score * 100.0) >> 4;
   1575 
   1576   /* Reset for backward looking loop */
   1577   boost_score = 0.0;
   1578   mv_ratio_accumulator = 0.0;
   1579   decay_accumulator = 1.0;
   1580   this_frame_mv_in_out = 0.0;
   1581   mv_in_out_accumulator = 0.0;
   1582   abs_mv_in_out_accumulator = 0.0;
   1583 
   1584   /* Search forward from the proposed arf/next gf position */
   1585   for (i = -1; i >= -b_frames; i--) {
   1586     if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF) break;
   1587 
   1588     /* Update the motion related elements to the boost calculation */
   1589     accumulate_frame_motion_stats(
   1590         cpi, &this_frame, &this_frame_mv_in_out, &mv_in_out_accumulator,
   1591         &abs_mv_in_out_accumulator, &mv_ratio_accumulator);
   1592 
   1593     /* Calculate the baseline boost number for this frame */
   1594     r = calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out);
   1595 
   1596     /* We want to discount the the flash frame itself and the recovery
   1597      * frame that follows as both will have poor scores.
   1598      */
   1599     flash_detected =
   1600         detect_flash(cpi, (i + offset)) || detect_flash(cpi, (i + offset + 1));
   1601 
   1602     /* Cumulative effect of prediction quality decay */
   1603     if (!flash_detected) {
   1604       decay_accumulator =
   1605           decay_accumulator * get_prediction_decay_rate(cpi, &this_frame);
   1606       decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
   1607     }
   1608 
   1609     boost_score += (decay_accumulator * r);
   1610 
   1611     /* Break out conditions. */
   1612     if ((!flash_detected) &&
   1613         ((mv_ratio_accumulator > 100.0) || (abs_mv_in_out_accumulator > 3.0) ||
   1614          (mv_in_out_accumulator < -2.0))) {
   1615       break;
   1616     }
   1617   }
   1618   *b_boost = (int)(boost_score * 100.0) >> 4;
   1619 
   1620   return (*f_boost + *b_boost);
   1621 }
   1622 #endif
   1623 
   1624 /* Analyse and define a gf/arf group . */
   1625 static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) {
   1626   FIRSTPASS_STATS next_frame;
   1627   FIRSTPASS_STATS *start_pos;
   1628   int i;
   1629   double r;
   1630   double boost_score = 0.0;
   1631   double old_boost_score = 0.0;
   1632   double gf_group_err = 0.0;
   1633   double gf_first_frame_err = 0.0;
   1634   double mod_frame_err = 0.0;
   1635 
   1636   double mv_ratio_accumulator = 0.0;
   1637   double decay_accumulator = 1.0;
   1638 
   1639   double loop_decay_rate = 1.00; /* Starting decay rate */
   1640 
   1641   double this_frame_mv_in_out = 0.0;
   1642   double mv_in_out_accumulator = 0.0;
   1643   double abs_mv_in_out_accumulator = 0.0;
   1644   double mod_err_per_mb_accumulator = 0.0;
   1645 
   1646   int max_bits = frame_max_bits(cpi); /* Max for a single frame */
   1647 
   1648   unsigned int allow_alt_ref =
   1649       cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
   1650 
   1651   int alt_boost = 0;
   1652   int f_boost = 0;
   1653   int b_boost = 0;
   1654   int flash_detected;
   1655 
   1656   cpi->twopass.gf_group_bits = 0;
   1657   cpi->twopass.gf_decay_rate = 0;
   1658 
   1659   vpx_clear_system_state();
   1660 
   1661   start_pos = cpi->twopass.stats_in;
   1662 
   1663   memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */
   1664 
   1665   /* Load stats for the current frame. */
   1666   mod_frame_err = calculate_modified_err(cpi, this_frame);
   1667 
   1668   /* Note the error of the frame at the start of the group (this will be
   1669    * the GF frame error if we code a normal gf
   1670    */
   1671   gf_first_frame_err = mod_frame_err;
   1672 
   1673   /* Special treatment if the current frame is a key frame (which is also
   1674    * a gf). If it is then its error score (and hence bit allocation) need
   1675    * to be subtracted out from the calculation for the GF group
   1676    */
   1677   if (cpi->common.frame_type == KEY_FRAME) gf_group_err -= gf_first_frame_err;
   1678 
   1679   /* Scan forward to try and work out how many frames the next gf group
   1680    * should contain and what level of boost is appropriate for the GF
   1681    * or ARF that will be coded with the group
   1682    */
   1683   i = 0;
   1684 
   1685   while (((i < cpi->twopass.static_scene_max_gf_interval) ||
   1686           ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
   1687          (i < cpi->twopass.frames_to_key)) {
   1688     i++;
   1689 
   1690     /* Accumulate error score of frames in this gf group */
   1691     mod_frame_err = calculate_modified_err(cpi, this_frame);
   1692 
   1693     gf_group_err += mod_frame_err;
   1694 
   1695     mod_err_per_mb_accumulator +=
   1696         mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs);
   1697 
   1698     if (EOF == input_stats(cpi, &next_frame)) break;
   1699 
   1700     /* Test for the case where there is a brief flash but the prediction
   1701      * quality back to an earlier frame is then restored.
   1702      */
   1703     flash_detected = detect_flash(cpi, 0);
   1704 
   1705     /* Update the motion related elements to the boost calculation */
   1706     accumulate_frame_motion_stats(
   1707         cpi, &next_frame, &this_frame_mv_in_out, &mv_in_out_accumulator,
   1708         &abs_mv_in_out_accumulator, &mv_ratio_accumulator);
   1709 
   1710     /* Calculate a baseline boost number for this frame */
   1711     r = calc_frame_boost(cpi, &next_frame, this_frame_mv_in_out);
   1712 
   1713     /* Cumulative effect of prediction quality decay */
   1714     if (!flash_detected) {
   1715       loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
   1716       decay_accumulator = decay_accumulator * loop_decay_rate;
   1717       decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
   1718     }
   1719     boost_score += (decay_accumulator * r);
   1720 
   1721     /* Break clause to detect very still sections after motion
   1722      * For example a staic image after a fade or other transition.
   1723      */
   1724     if (detect_transition_to_still(cpi, i, 5, loop_decay_rate,
   1725                                    decay_accumulator)) {
   1726       allow_alt_ref = 0;
   1727       boost_score = old_boost_score;
   1728       break;
   1729     }
   1730 
   1731     /* Break out conditions. */
   1732     if (
   1733         /* Break at cpi->max_gf_interval unless almost totally static */
   1734         (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) ||
   1735         (
   1736             /* Dont break out with a very short interval */
   1737             (i > MIN_GF_INTERVAL) &&
   1738             /* Dont break out very close to a key frame */
   1739             ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
   1740             ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
   1741             (!flash_detected) && ((mv_ratio_accumulator > 100.0) ||
   1742                                   (abs_mv_in_out_accumulator > 3.0) ||
   1743                                   (mv_in_out_accumulator < -2.0) ||
   1744                                   ((boost_score - old_boost_score) < 2.0)))) {
   1745       boost_score = old_boost_score;
   1746       break;
   1747     }
   1748 
   1749     memcpy(this_frame, &next_frame, sizeof(*this_frame));
   1750 
   1751     old_boost_score = boost_score;
   1752   }
   1753 
   1754   cpi->twopass.gf_decay_rate =
   1755       (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0;
   1756 
   1757   /* When using CBR apply additional buffer related upper limits */
   1758   if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   1759     double max_boost;
   1760 
   1761     /* For cbr apply buffer related limits */
   1762     if (cpi->drop_frames_allowed) {
   1763       int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark *
   1764                                 (cpi->oxcf.optimal_buffer_level / 100);
   1765 
   1766       if (cpi->buffer_level > df_buffer_level) {
   1767         max_boost =
   1768             ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) /
   1769             DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
   1770       } else {
   1771         max_boost = 0.0;
   1772       }
   1773     } else if (cpi->buffer_level > 0) {
   1774       max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) /
   1775                   DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
   1776     } else {
   1777       max_boost = 0.0;
   1778     }
   1779 
   1780     if (boost_score > max_boost) boost_score = max_boost;
   1781   }
   1782 
   1783   /* Dont allow conventional gf too near the next kf */
   1784   if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL) {
   1785     while (i < cpi->twopass.frames_to_key) {
   1786       i++;
   1787 
   1788       if (EOF == input_stats(cpi, this_frame)) break;
   1789 
   1790       if (i < cpi->twopass.frames_to_key) {
   1791         mod_frame_err = calculate_modified_err(cpi, this_frame);
   1792         gf_group_err += mod_frame_err;
   1793       }
   1794     }
   1795   }
   1796 
   1797   cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
   1798 
   1799 #if NEW_BOOST
   1800   /* Alterrnative boost calculation for alt ref */
   1801   alt_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, &b_boost);
   1802 #endif
   1803 
   1804   /* Should we use the alternate refernce frame */
   1805   if (allow_alt_ref && (i >= MIN_GF_INTERVAL) &&
   1806       /* dont use ARF very near next kf */
   1807       (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
   1808 #if NEW_BOOST
   1809       ((next_frame.pcnt_inter > 0.75) || (next_frame.pcnt_second_ref > 0.5)) &&
   1810       ((mv_in_out_accumulator / (double)i > -0.2) ||
   1811        (mv_in_out_accumulator > -2.0)) &&
   1812       (b_boost > 100) && (f_boost > 100))
   1813 #else
   1814       (next_frame.pcnt_inter > 0.75) &&
   1815       ((mv_in_out_accumulator / (double)i > -0.2) ||
   1816        (mv_in_out_accumulator > -2.0)) &&
   1817       (cpi->gfu_boost > 100) && (cpi->twopass.gf_decay_rate <=
   1818                                  (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))))
   1819 #endif
   1820   {
   1821     int Boost;
   1822     int allocation_chunks;
   1823     int Q =
   1824         (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
   1825     int tmp_q;
   1826     int arf_frame_bits = 0;
   1827     int group_bits;
   1828 
   1829 #if NEW_BOOST
   1830     cpi->gfu_boost = alt_boost;
   1831 #endif
   1832 
   1833     /* Estimate the bits to be allocated to the group as a whole */
   1834     if ((cpi->twopass.kf_group_bits > 0) &&
   1835         (cpi->twopass.kf_group_error_left > 0)) {
   1836       group_bits =
   1837           (int)((double)cpi->twopass.kf_group_bits *
   1838                 (gf_group_err / (double)cpi->twopass.kf_group_error_left));
   1839     } else {
   1840       group_bits = 0;
   1841     }
   1842 
   1843 /* Boost for arf frame */
   1844 #if NEW_BOOST
   1845     Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
   1846 #else
   1847     Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
   1848 #endif
   1849     Boost += (i * 50);
   1850 
   1851     /* Set max and minimum boost and hence minimum allocation */
   1852     if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) {
   1853       Boost = ((cpi->baseline_gf_interval + 1) * 200);
   1854     } else if (Boost < 125) {
   1855       Boost = 125;
   1856     }
   1857 
   1858     allocation_chunks = (i * 100) + Boost;
   1859 
   1860     /* Normalize Altboost and allocations chunck down to prevent overflow */
   1861     while (Boost > 1000) {
   1862       Boost /= 2;
   1863       allocation_chunks /= 2;
   1864     }
   1865 
   1866     /* Calculate the number of bits to be spent on the arf based on the
   1867      * boost number
   1868      */
   1869     arf_frame_bits =
   1870         (int)((double)Boost * (group_bits / (double)allocation_chunks));
   1871 
   1872     /* Estimate if there are enough bits available to make worthwhile use
   1873      * of an arf.
   1874      */
   1875     tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits);
   1876 
   1877     /* Only use an arf if it is likely we will be able to code
   1878      * it at a lower Q than the surrounding frames.
   1879      */
   1880     if (tmp_q < cpi->worst_quality) {
   1881       int half_gf_int;
   1882       int frames_after_arf;
   1883       int frames_bwd = cpi->oxcf.arnr_max_frames - 1;
   1884       int frames_fwd = cpi->oxcf.arnr_max_frames - 1;
   1885 
   1886       cpi->source_alt_ref_pending = 1;
   1887 
   1888       /*
   1889        * For alt ref frames the error score for the end frame of the
   1890        * group (the alt ref frame) should not contribute to the group
   1891        * total and hence the number of bit allocated to the group.
   1892        * Rather it forms part of the next group (it is the GF at the
   1893        * start of the next group)
   1894        * gf_group_err -= mod_frame_err;
   1895        *
   1896        * For alt ref frames alt ref frame is technically part of the
   1897        * GF frame for the next group but we always base the error
   1898        * calculation and bit allocation on the current group of frames.
   1899        *
   1900        * Set the interval till the next gf or arf.
   1901        * For ARFs this is the number of frames to be coded before the
   1902        * future frame that is coded as an ARF.
   1903        * The future frame itself is part of the next group
   1904        */
   1905       cpi->baseline_gf_interval = i;
   1906 
   1907       /*
   1908        * Define the arnr filter width for this group of frames:
   1909        * We only filter frames that lie within a distance of half
   1910        * the GF interval from the ARF frame. We also have to trap
   1911        * cases where the filter extends beyond the end of clip.
   1912        * Note: this_frame->frame has been updated in the loop
   1913        * so it now points at the ARF frame.
   1914        */
   1915       half_gf_int = cpi->baseline_gf_interval >> 1;
   1916       frames_after_arf =
   1917           (int)(cpi->twopass.total_stats.count - this_frame->frame - 1);
   1918 
   1919       switch (cpi->oxcf.arnr_type) {
   1920         case 1: /* Backward filter */
   1921           frames_fwd = 0;
   1922           if (frames_bwd > half_gf_int) frames_bwd = half_gf_int;
   1923           break;
   1924 
   1925         case 2: /* Forward filter */
   1926           if (frames_fwd > half_gf_int) frames_fwd = half_gf_int;
   1927           if (frames_fwd > frames_after_arf) frames_fwd = frames_after_arf;
   1928           frames_bwd = 0;
   1929           break;
   1930 
   1931         case 3: /* Centered filter */
   1932         default:
   1933           frames_fwd >>= 1;
   1934           if (frames_fwd > frames_after_arf) frames_fwd = frames_after_arf;
   1935           if (frames_fwd > half_gf_int) frames_fwd = half_gf_int;
   1936 
   1937           frames_bwd = frames_fwd;
   1938 
   1939           /* For even length filter there is one more frame backward
   1940            * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
   1941            */
   1942           if (frames_bwd < half_gf_int) {
   1943             frames_bwd += (cpi->oxcf.arnr_max_frames + 1) & 0x1;
   1944           }
   1945           break;
   1946       }
   1947 
   1948       cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
   1949     } else {
   1950       cpi->source_alt_ref_pending = 0;
   1951       cpi->baseline_gf_interval = i;
   1952     }
   1953   } else {
   1954     cpi->source_alt_ref_pending = 0;
   1955     cpi->baseline_gf_interval = i;
   1956   }
   1957 
   1958   /*
   1959    * Now decide how many bits should be allocated to the GF group as  a
   1960    * proportion of those remaining in the kf group.
   1961    * The final key frame group in the clip is treated as a special case
   1962    * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
   1963    * This is also important for short clips where there may only be one
   1964    * key frame.
   1965    */
   1966   if (cpi->twopass.frames_to_key >=
   1967       (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame)) {
   1968     cpi->twopass.kf_group_bits =
   1969         (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
   1970   }
   1971 
   1972   /* Calculate the bits to be allocated to the group as a whole */
   1973   if ((cpi->twopass.kf_group_bits > 0) &&
   1974       (cpi->twopass.kf_group_error_left > 0)) {
   1975     cpi->twopass.gf_group_bits =
   1976         (int64_t)(cpi->twopass.kf_group_bits *
   1977                   (gf_group_err / cpi->twopass.kf_group_error_left));
   1978   } else {
   1979     cpi->twopass.gf_group_bits = 0;
   1980   }
   1981 
   1982   cpi->twopass.gf_group_bits =
   1983       (cpi->twopass.gf_group_bits < 0)
   1984           ? 0
   1985           : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits)
   1986                 ? cpi->twopass.kf_group_bits
   1987                 : cpi->twopass.gf_group_bits;
   1988 
   1989   /* Clip cpi->twopass.gf_group_bits based on user supplied data rate
   1990    * variability limit (cpi->oxcf.two_pass_vbrmax_section)
   1991    */
   1992   if (cpi->twopass.gf_group_bits >
   1993       (int64_t)max_bits * cpi->baseline_gf_interval) {
   1994     cpi->twopass.gf_group_bits = (int64_t)max_bits * cpi->baseline_gf_interval;
   1995   }
   1996 
   1997   /* Reset the file position */
   1998   reset_fpf_position(cpi, start_pos);
   1999 
   2000   /* Update the record of error used so far (only done once per gf group) */
   2001   cpi->twopass.modified_error_used += gf_group_err;
   2002 
   2003   /* Assign  bits to the arf or gf. */
   2004   for (i = 0; i <= (cpi->source_alt_ref_pending &&
   2005                     cpi->common.frame_type != KEY_FRAME);
   2006        i++) {
   2007     int Boost;
   2008     int allocation_chunks;
   2009     int Q =
   2010         (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
   2011     int gf_bits;
   2012 
   2013     /* For ARF frames */
   2014     if (cpi->source_alt_ref_pending && i == 0) {
   2015 #if NEW_BOOST
   2016       Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
   2017 #else
   2018       Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
   2019 #endif
   2020       Boost += (cpi->baseline_gf_interval * 50);
   2021 
   2022       /* Set max and minimum boost and hence minimum allocation */
   2023       if (Boost > ((cpi->baseline_gf_interval + 1) * 200)) {
   2024         Boost = ((cpi->baseline_gf_interval + 1) * 200);
   2025       } else if (Boost < 125) {
   2026         Boost = 125;
   2027       }
   2028 
   2029       allocation_chunks = ((cpi->baseline_gf_interval + 1) * 100) + Boost;
   2030     }
   2031     /* Else for standard golden frames */
   2032     else {
   2033       /* boost based on inter / intra ratio of subsequent frames */
   2034       Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100;
   2035 
   2036       /* Set max and minimum boost and hence minimum allocation */
   2037       if (Boost > (cpi->baseline_gf_interval * 150)) {
   2038         Boost = (cpi->baseline_gf_interval * 150);
   2039       } else if (Boost < 125) {
   2040         Boost = 125;
   2041       }
   2042 
   2043       allocation_chunks = (cpi->baseline_gf_interval * 100) + (Boost - 100);
   2044     }
   2045 
   2046     /* Normalize Altboost and allocations chunck down to prevent overflow */
   2047     while (Boost > 1000) {
   2048       Boost /= 2;
   2049       allocation_chunks /= 2;
   2050     }
   2051 
   2052     /* Calculate the number of bits to be spent on the gf or arf based on
   2053      * the boost number
   2054      */
   2055     gf_bits = (int)((double)Boost *
   2056                     (cpi->twopass.gf_group_bits / (double)allocation_chunks));
   2057 
   2058     /* If the frame that is to be boosted is simpler than the average for
   2059      * the gf/arf group then use an alternative calculation
   2060      * based on the error score of the frame itself
   2061      */
   2062     if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval) {
   2063       double alt_gf_grp_bits;
   2064       int alt_gf_bits;
   2065 
   2066       alt_gf_grp_bits =
   2067           (double)cpi->twopass.kf_group_bits *
   2068           (mod_frame_err * (double)cpi->baseline_gf_interval) /
   2069           DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left);
   2070 
   2071       alt_gf_bits =
   2072           (int)((double)Boost * (alt_gf_grp_bits / (double)allocation_chunks));
   2073 
   2074       if (gf_bits > alt_gf_bits) {
   2075         gf_bits = alt_gf_bits;
   2076       }
   2077     }
   2078     /* Else if it is harder than other frames in the group make sure it at
   2079      * least receives an allocation in keeping with its relative error
   2080      * score, otherwise it may be worse off than an "un-boosted" frame
   2081      */
   2082     else {
   2083       int alt_gf_bits =
   2084           (int)((double)cpi->twopass.kf_group_bits * mod_frame_err /
   2085                 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left));
   2086 
   2087       if (alt_gf_bits > gf_bits) {
   2088         gf_bits = alt_gf_bits;
   2089       }
   2090     }
   2091 
   2092     /* Apply an additional limit for CBR */
   2093     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   2094       if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1)) {
   2095         cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1);
   2096       }
   2097     }
   2098 
   2099     /* Dont allow a negative value for gf_bits */
   2100     if (gf_bits < 0) gf_bits = 0;
   2101 
   2102     /* Add in minimum for a frame */
   2103     gf_bits += cpi->min_frame_bandwidth;
   2104 
   2105     if (i == 0) {
   2106       cpi->twopass.gf_bits = gf_bits;
   2107     }
   2108     if (i == 1 || (!cpi->source_alt_ref_pending &&
   2109                    (cpi->common.frame_type != KEY_FRAME))) {
   2110       /* Per frame bit target for this frame */
   2111       cpi->per_frame_bandwidth = gf_bits;
   2112     }
   2113   }
   2114 
   2115   {
   2116     /* Adjust KF group bits and error remainin */
   2117     cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err;
   2118     cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits;
   2119 
   2120     if (cpi->twopass.kf_group_bits < 0) cpi->twopass.kf_group_bits = 0;
   2121 
   2122     /* Note the error score left in the remaining frames of the group.
   2123      * For normal GFs we want to remove the error score for the first
   2124      * frame of the group (except in Key frame case where this has
   2125      * already happened)
   2126      */
   2127     if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME) {
   2128       cpi->twopass.gf_group_error_left =
   2129           (int)(gf_group_err - gf_first_frame_err);
   2130     } else {
   2131       cpi->twopass.gf_group_error_left = (int)gf_group_err;
   2132     }
   2133 
   2134     cpi->twopass.gf_group_bits -=
   2135         cpi->twopass.gf_bits - cpi->min_frame_bandwidth;
   2136 
   2137     if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
   2138 
   2139     /* This condition could fail if there are two kfs very close together
   2140      * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the
   2141      * calculation of cpi->twopass.alt_extra_bits.
   2142      */
   2143     if (cpi->baseline_gf_interval >= 3) {
   2144 #if NEW_BOOST
   2145       int boost = (cpi->source_alt_ref_pending) ? b_boost : cpi->gfu_boost;
   2146 #else
   2147       int boost = cpi->gfu_boost;
   2148 #endif
   2149       if (boost >= 150) {
   2150         int pct_extra;
   2151 
   2152         pct_extra = (boost - 100) / 50;
   2153         pct_extra = (pct_extra > 20) ? 20 : pct_extra;
   2154 
   2155         cpi->twopass.alt_extra_bits =
   2156             (int)(cpi->twopass.gf_group_bits * pct_extra) / 100;
   2157         cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits;
   2158         cpi->twopass.alt_extra_bits /= ((cpi->baseline_gf_interval - 1) >> 1);
   2159       } else {
   2160         cpi->twopass.alt_extra_bits = 0;
   2161       }
   2162     } else {
   2163       cpi->twopass.alt_extra_bits = 0;
   2164     }
   2165   }
   2166 
   2167   /* Adjustments based on a measure of complexity of the section */
   2168   if (cpi->common.frame_type != KEY_FRAME) {
   2169     FIRSTPASS_STATS sectionstats;
   2170     double Ratio;
   2171 
   2172     zero_stats(&sectionstats);
   2173     reset_fpf_position(cpi, start_pos);
   2174 
   2175     for (i = 0; i < cpi->baseline_gf_interval; ++i) {
   2176       input_stats(cpi, &next_frame);
   2177       accumulate_stats(&sectionstats, &next_frame);
   2178     }
   2179 
   2180     avg_stats(&sectionstats);
   2181 
   2182     cpi->twopass.section_intra_rating =
   2183         (unsigned int)(sectionstats.intra_error /
   2184                        DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
   2185 
   2186     Ratio = sectionstats.intra_error /
   2187             DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
   2188     cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
   2189 
   2190     if (cpi->twopass.section_max_qfactor < 0.80) {
   2191       cpi->twopass.section_max_qfactor = 0.80;
   2192     }
   2193 
   2194     reset_fpf_position(cpi, start_pos);
   2195   }
   2196 }
   2197 
   2198 /* Allocate bits to a normal frame that is neither a gf an arf or a key frame.
   2199  */
   2200 static void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) {
   2201   int target_frame_size;
   2202 
   2203   double modified_err;
   2204   double err_fraction;
   2205 
   2206   int max_bits = frame_max_bits(cpi); /* Max for a single frame */
   2207 
   2208   /* Calculate modified prediction error used in bit allocation */
   2209   modified_err = calculate_modified_err(cpi, this_frame);
   2210 
   2211   /* What portion of the remaining GF group error is used by this frame */
   2212   if (cpi->twopass.gf_group_error_left > 0) {
   2213     err_fraction = modified_err / cpi->twopass.gf_group_error_left;
   2214   } else {
   2215     err_fraction = 0.0;
   2216   }
   2217 
   2218   /* How many of those bits available for allocation should we give it? */
   2219   target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction);
   2220 
   2221   /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits)
   2222    * at the top end.
   2223    */
   2224   if (target_frame_size < 0) {
   2225     target_frame_size = 0;
   2226   } else {
   2227     if (target_frame_size > max_bits) target_frame_size = max_bits;
   2228 
   2229     if (target_frame_size > cpi->twopass.gf_group_bits) {
   2230       target_frame_size = (int)cpi->twopass.gf_group_bits;
   2231     }
   2232   }
   2233 
   2234   /* Adjust error and bits remaining */
   2235   cpi->twopass.gf_group_error_left -= (int)modified_err;
   2236   cpi->twopass.gf_group_bits -= target_frame_size;
   2237 
   2238   if (cpi->twopass.gf_group_bits < 0) cpi->twopass.gf_group_bits = 0;
   2239 
   2240   /* Add in the minimum number of bits that is set aside for every frame. */
   2241   target_frame_size += cpi->min_frame_bandwidth;
   2242 
   2243   /* Every other frame gets a few extra bits */
   2244   if ((cpi->frames_since_golden & 0x01) &&
   2245       (cpi->frames_till_gf_update_due > 0)) {
   2246     target_frame_size += cpi->twopass.alt_extra_bits;
   2247   }
   2248 
   2249   /* Per frame bit target for this frame */
   2250   cpi->per_frame_bandwidth = target_frame_size;
   2251 }
   2252 
   2253 void vp8_second_pass(VP8_COMP *cpi) {
   2254   int tmp_q;
   2255   int frames_left =
   2256       (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame);
   2257 
   2258   FIRSTPASS_STATS this_frame;
   2259   FIRSTPASS_STATS this_frame_copy;
   2260 
   2261   double this_frame_intra_error;
   2262   double this_frame_coded_error;
   2263 
   2264   int overhead_bits;
   2265 
   2266   vp8_zero(this_frame);
   2267 
   2268   if (!cpi->twopass.stats_in) {
   2269     return;
   2270   }
   2271 
   2272   vpx_clear_system_state();
   2273 
   2274   if (EOF == input_stats(cpi, &this_frame)) return;
   2275 
   2276   this_frame_intra_error = this_frame.intra_error;
   2277   this_frame_coded_error = this_frame.coded_error;
   2278 
   2279   /* keyframe and section processing ! */
   2280   if (cpi->twopass.frames_to_key == 0) {
   2281     /* Define next KF group and assign bits to it */
   2282     memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
   2283     find_next_key_frame(cpi, &this_frame_copy);
   2284 
   2285     /* Special case: Error error_resilient_mode mode does not make much
   2286      * sense for two pass but with its current meaning this code is
   2287      * designed to stop outlandish behaviour if someone does set it when
   2288      * using two pass. It effectively disables GF groups. This is
   2289      * temporary code until we decide what should really happen in this
   2290      * case.
   2291      */
   2292     if (cpi->oxcf.error_resilient_mode) {
   2293       cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits;
   2294       cpi->twopass.gf_group_error_left = (int)cpi->twopass.kf_group_error_left;
   2295       cpi->baseline_gf_interval = cpi->twopass.frames_to_key;
   2296       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
   2297       cpi->source_alt_ref_pending = 0;
   2298     }
   2299   }
   2300 
   2301   /* Is this a GF / ARF (Note that a KF is always also a GF) */
   2302   if (cpi->frames_till_gf_update_due == 0) {
   2303     /* Define next gf group and assign bits to it */
   2304     memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
   2305     define_gf_group(cpi, &this_frame_copy);
   2306 
   2307     /* If we are going to code an altref frame at the end of the group
   2308      * and the current frame is not a key frame.... If the previous
   2309      * group used an arf this frame has already benefited from that arf
   2310      * boost and it should not be given extra bits If the previous
   2311      * group was NOT coded using arf we may want to apply some boost to
   2312      * this GF as well
   2313      */
   2314     if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) {
   2315       /* Assign a standard frames worth of bits from those allocated
   2316        * to the GF group
   2317        */
   2318       int bak = cpi->per_frame_bandwidth;
   2319       memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
   2320       assign_std_frame_bits(cpi, &this_frame_copy);
   2321       cpi->per_frame_bandwidth = bak;
   2322     }
   2323   }
   2324 
   2325   /* Otherwise this is an ordinary frame */
   2326   else {
   2327     /* Special case: Error error_resilient_mode mode does not make much
   2328      * sense for two pass but with its current meaning but this code is
   2329      * designed to stop outlandish behaviour if someone does set it
   2330      * when using two pass. It effectively disables GF groups. This is
   2331      * temporary code till we decide what should really happen in this
   2332      * case.
   2333      */
   2334     if (cpi->oxcf.error_resilient_mode) {
   2335       cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key;
   2336 
   2337       if (cpi->common.frame_type != KEY_FRAME) {
   2338         /* Assign bits from those allocated to the GF group */
   2339         memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
   2340         assign_std_frame_bits(cpi, &this_frame_copy);
   2341       }
   2342     } else {
   2343       /* Assign bits from those allocated to the GF group */
   2344       memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
   2345       assign_std_frame_bits(cpi, &this_frame_copy);
   2346     }
   2347   }
   2348 
   2349   /* Keep a globally available copy of this and the next frame's iiratio. */
   2350   cpi->twopass.this_iiratio =
   2351       (unsigned int)(this_frame_intra_error /
   2352                      DOUBLE_DIVIDE_CHECK(this_frame_coded_error));
   2353   {
   2354     FIRSTPASS_STATS next_frame;
   2355     if (lookup_next_frame_stats(cpi, &next_frame) != EOF) {
   2356       cpi->twopass.next_iiratio =
   2357           (unsigned int)(next_frame.intra_error /
   2358                          DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
   2359     }
   2360   }
   2361 
   2362   /* Set nominal per second bandwidth for this frame */
   2363   cpi->target_bandwidth =
   2364       (int)(cpi->per_frame_bandwidth * cpi->output_framerate);
   2365   if (cpi->target_bandwidth < 0) cpi->target_bandwidth = 0;
   2366 
   2367   /* Account for mv, mode and other overheads. */
   2368   overhead_bits = (int)estimate_modemvcost(cpi, &cpi->twopass.total_left_stats);
   2369 
   2370   /* Special case code for first frame. */
   2371   if (cpi->common.current_video_frame == 0) {
   2372     cpi->twopass.est_max_qcorrection_factor = 1.0;
   2373 
   2374     /* Set a cq_level in constrained quality mode. */
   2375     if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
   2376       int est_cq;
   2377 
   2378       est_cq = estimate_cq(cpi, &cpi->twopass.total_left_stats,
   2379                            (int)(cpi->twopass.bits_left / frames_left),
   2380                            overhead_bits);
   2381 
   2382       cpi->cq_target_quality = cpi->oxcf.cq_level;
   2383       if (est_cq > cpi->cq_target_quality) cpi->cq_target_quality = est_cq;
   2384     }
   2385 
   2386     /* guess at maxq needed in 2nd pass */
   2387     cpi->twopass.maxq_max_limit = cpi->worst_quality;
   2388     cpi->twopass.maxq_min_limit = cpi->best_quality;
   2389 
   2390     tmp_q = estimate_max_q(cpi, &cpi->twopass.total_left_stats,
   2391                            (int)(cpi->twopass.bits_left / frames_left),
   2392                            overhead_bits);
   2393 
   2394     /* Limit the maxq value returned subsequently.
   2395      * This increases the risk of overspend or underspend if the initial
   2396      * estimate for the clip is bad, but helps prevent excessive
   2397      * variation in Q, especially near the end of a clip
   2398      * where for example a small overspend may cause Q to crash
   2399      */
   2400     cpi->twopass.maxq_max_limit =
   2401         ((tmp_q + 32) < cpi->worst_quality) ? (tmp_q + 32) : cpi->worst_quality;
   2402     cpi->twopass.maxq_min_limit =
   2403         ((tmp_q - 32) > cpi->best_quality) ? (tmp_q - 32) : cpi->best_quality;
   2404 
   2405     cpi->active_worst_quality = tmp_q;
   2406     cpi->ni_av_qi = tmp_q;
   2407   }
   2408 
   2409   /* The last few frames of a clip almost always have to few or too many
   2410    * bits and for the sake of over exact rate control we dont want to make
   2411    * radical adjustments to the allowed quantizer range just to use up a
   2412    * few surplus bits or get beneath the target rate.
   2413    */
   2414   else if ((cpi->common.current_video_frame <
   2415             (((unsigned int)cpi->twopass.total_stats.count * 255) >> 8)) &&
   2416            ((cpi->common.current_video_frame + cpi->baseline_gf_interval) <
   2417             (unsigned int)cpi->twopass.total_stats.count)) {
   2418     if (frames_left < 1) frames_left = 1;
   2419 
   2420     tmp_q = estimate_max_q(cpi, &cpi->twopass.total_left_stats,
   2421                            (int)(cpi->twopass.bits_left / frames_left),
   2422                            overhead_bits);
   2423 
   2424     /* Move active_worst_quality but in a damped way */
   2425     if (tmp_q > cpi->active_worst_quality) {
   2426       cpi->active_worst_quality++;
   2427     } else if (tmp_q < cpi->active_worst_quality) {
   2428       cpi->active_worst_quality--;
   2429     }
   2430 
   2431     cpi->active_worst_quality =
   2432         ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4;
   2433   }
   2434 
   2435   cpi->twopass.frames_to_key--;
   2436 
   2437   /* Update the total stats remaining sturcture */
   2438   subtract_stats(&cpi->twopass.total_left_stats, &this_frame);
   2439 }
   2440 
   2441 static int test_candidate_kf(VP8_COMP *cpi, FIRSTPASS_STATS *last_frame,
   2442                              FIRSTPASS_STATS *this_frame,
   2443                              FIRSTPASS_STATS *next_frame) {
   2444   int is_viable_kf = 0;
   2445 
   2446   /* Does the frame satisfy the primary criteria of a key frame
   2447    *      If so, then examine how well it predicts subsequent frames
   2448    */
   2449   if ((this_frame->pcnt_second_ref < 0.10) &&
   2450       (next_frame->pcnt_second_ref < 0.10) &&
   2451       ((this_frame->pcnt_inter < 0.05) ||
   2452        (((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) &&
   2453         ((this_frame->intra_error /
   2454           DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) &&
   2455         ((fabs(last_frame->coded_error - this_frame->coded_error) /
   2456               DOUBLE_DIVIDE_CHECK(this_frame->coded_error) >
   2457           .40) ||
   2458          (fabs(last_frame->intra_error - this_frame->intra_error) /
   2459               DOUBLE_DIVIDE_CHECK(this_frame->intra_error) >
   2460           .40) ||
   2461          ((next_frame->intra_error /
   2462            DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5))))) {
   2463     int i;
   2464     FIRSTPASS_STATS *start_pos;
   2465 
   2466     FIRSTPASS_STATS local_next_frame;
   2467 
   2468     double boost_score = 0.0;
   2469     double old_boost_score = 0.0;
   2470     double decay_accumulator = 1.0;
   2471     double next_iiratio;
   2472 
   2473     memcpy(&local_next_frame, next_frame, sizeof(*next_frame));
   2474 
   2475     /* Note the starting file position so we can reset to it */
   2476     start_pos = cpi->twopass.stats_in;
   2477 
   2478     /* Examine how well the key frame predicts subsequent frames */
   2479     for (i = 0; i < 16; ++i) {
   2480       next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error /
   2481                       DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error));
   2482 
   2483       if (next_iiratio > RMAX) next_iiratio = RMAX;
   2484 
   2485       /* Cumulative effect of decay in prediction quality */
   2486       if (local_next_frame.pcnt_inter > 0.85) {
   2487         decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
   2488       } else {
   2489         decay_accumulator =
   2490             decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0);
   2491       }
   2492 
   2493       /* Keep a running total */
   2494       boost_score += (decay_accumulator * next_iiratio);
   2495 
   2496       /* Test various breakout clauses */
   2497       if ((local_next_frame.pcnt_inter < 0.05) || (next_iiratio < 1.5) ||
   2498           (((local_next_frame.pcnt_inter - local_next_frame.pcnt_neutral) <
   2499             0.20) &&
   2500            (next_iiratio < 3.0)) ||
   2501           ((boost_score - old_boost_score) < 0.5) ||
   2502           (local_next_frame.intra_error < 200)) {
   2503         break;
   2504       }
   2505 
   2506       old_boost_score = boost_score;
   2507 
   2508       /* Get the next frame details */
   2509       if (EOF == input_stats(cpi, &local_next_frame)) break;
   2510     }
   2511 
   2512     /* If there is tolerable prediction for at least the next 3 frames
   2513      * then break out else discard this pottential key frame and move on
   2514      */
   2515     if (boost_score > 5.0 && (i > 3)) {
   2516       is_viable_kf = 1;
   2517     } else {
   2518       /* Reset the file position */
   2519       reset_fpf_position(cpi, start_pos);
   2520 
   2521       is_viable_kf = 0;
   2522     }
   2523   }
   2524 
   2525   return is_viable_kf;
   2526 }
   2527 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame) {
   2528   int i, j;
   2529   FIRSTPASS_STATS last_frame;
   2530   FIRSTPASS_STATS first_frame;
   2531   FIRSTPASS_STATS next_frame;
   2532   FIRSTPASS_STATS *start_position;
   2533 
   2534   double decay_accumulator = 1.0;
   2535   double boost_score = 0;
   2536   double old_boost_score = 0.0;
   2537   double loop_decay_rate;
   2538 
   2539   double kf_mod_err = 0.0;
   2540   double kf_group_err = 0.0;
   2541   double kf_group_intra_err = 0.0;
   2542   double kf_group_coded_err = 0.0;
   2543   double recent_loop_decay[8] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
   2544 
   2545   memset(&next_frame, 0, sizeof(next_frame));
   2546 
   2547   vpx_clear_system_state();
   2548   start_position = cpi->twopass.stats_in;
   2549 
   2550   cpi->common.frame_type = KEY_FRAME;
   2551 
   2552   /* is this a forced key frame by interval */
   2553   cpi->this_key_frame_forced = cpi->next_key_frame_forced;
   2554 
   2555   /* Clear the alt ref active flag as this can never be active on a key
   2556    * frame
   2557    */
   2558   cpi->source_alt_ref_active = 0;
   2559 
   2560   /* Kf is always a gf so clear frames till next gf counter */
   2561   cpi->frames_till_gf_update_due = 0;
   2562 
   2563   cpi->twopass.frames_to_key = 1;
   2564 
   2565   /* Take a copy of the initial frame details */
   2566   memcpy(&first_frame, this_frame, sizeof(*this_frame));
   2567 
   2568   cpi->twopass.kf_group_bits = 0;
   2569   cpi->twopass.kf_group_error_left = 0;
   2570 
   2571   kf_mod_err = calculate_modified_err(cpi, this_frame);
   2572 
   2573   /* find the next keyframe */
   2574   i = 0;
   2575   while (cpi->twopass.stats_in < cpi->twopass.stats_in_end) {
   2576     /* Accumulate kf group error */
   2577     kf_group_err += calculate_modified_err(cpi, this_frame);
   2578 
   2579     /* These figures keep intra and coded error counts for all frames
   2580      * including key frames in the group. The effect of the key frame
   2581      * itself can be subtracted out using the first_frame data
   2582      * collected above
   2583      */
   2584     kf_group_intra_err += this_frame->intra_error;
   2585     kf_group_coded_err += this_frame->coded_error;
   2586 
   2587     /* Load the next frame's stats. */
   2588     memcpy(&last_frame, this_frame, sizeof(*this_frame));
   2589     input_stats(cpi, this_frame);
   2590 
   2591     /* Provided that we are not at the end of the file... */
   2592     if (cpi->oxcf.auto_key &&
   2593         lookup_next_frame_stats(cpi, &next_frame) != EOF) {
   2594       /* Normal scene cut check */
   2595       if ((i >= MIN_GF_INTERVAL) &&
   2596           test_candidate_kf(cpi, &last_frame, this_frame, &next_frame)) {
   2597         break;
   2598       }
   2599 
   2600       /* How fast is prediction quality decaying */
   2601       loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
   2602 
   2603       /* We want to know something about the recent past... rather than
   2604        * as used elsewhere where we are concened with decay in prediction
   2605        * quality since the last GF or KF.
   2606        */
   2607       recent_loop_decay[i % 8] = loop_decay_rate;
   2608       decay_accumulator = 1.0;
   2609       for (j = 0; j < 8; ++j) {
   2610         decay_accumulator = decay_accumulator * recent_loop_decay[j];
   2611       }
   2612 
   2613       /* Special check for transition or high motion followed by a
   2614        * static scene.
   2615        */
   2616       if (detect_transition_to_still(cpi, i,
   2617                                      ((int)(cpi->key_frame_frequency) - (int)i),
   2618                                      loop_decay_rate, decay_accumulator)) {
   2619         break;
   2620       }
   2621 
   2622       /* Step on to the next frame */
   2623       cpi->twopass.frames_to_key++;
   2624 
   2625       /* If we don't have a real key frame within the next two
   2626        * forcekeyframeevery intervals then break out of the loop.
   2627        */
   2628       if (cpi->twopass.frames_to_key >= 2 * (int)cpi->key_frame_frequency) {
   2629         break;
   2630       }
   2631     } else {
   2632       cpi->twopass.frames_to_key++;
   2633     }
   2634 
   2635     i++;
   2636   }
   2637 
   2638   /* If there is a max kf interval set by the user we must obey it.
   2639    * We already breakout of the loop above at 2x max.
   2640    * This code centers the extra kf if the actual natural
   2641    * interval is between 1x and 2x
   2642    */
   2643   if (cpi->oxcf.auto_key &&
   2644       cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency) {
   2645     FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
   2646     FIRSTPASS_STATS tmp_frame;
   2647 
   2648     cpi->twopass.frames_to_key /= 2;
   2649 
   2650     /* Copy first frame details */
   2651     memcpy(&tmp_frame, &first_frame, sizeof(first_frame));
   2652 
   2653     /* Reset to the start of the group */
   2654     reset_fpf_position(cpi, start_position);
   2655 
   2656     kf_group_err = 0;
   2657     kf_group_intra_err = 0;
   2658     kf_group_coded_err = 0;
   2659 
   2660     /* Rescan to get the correct error data for the forced kf group */
   2661     for (i = 0; i < cpi->twopass.frames_to_key; ++i) {
   2662       /* Accumulate kf group errors */
   2663       kf_group_err += calculate_modified_err(cpi, &tmp_frame);
   2664       kf_group_intra_err += tmp_frame.intra_error;
   2665       kf_group_coded_err += tmp_frame.coded_error;
   2666 
   2667       /* Load a the next frame's stats */
   2668       input_stats(cpi, &tmp_frame);
   2669     }
   2670 
   2671     /* Reset to the start of the group */
   2672     reset_fpf_position(cpi, current_pos);
   2673 
   2674     cpi->next_key_frame_forced = 1;
   2675   } else {
   2676     cpi->next_key_frame_forced = 0;
   2677   }
   2678 
   2679   /* Special case for the last frame of the file */
   2680   if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) {
   2681     /* Accumulate kf group error */
   2682     kf_group_err += calculate_modified_err(cpi, this_frame);
   2683 
   2684     /* These figures keep intra and coded error counts for all frames
   2685      * including key frames in the group. The effect of the key frame
   2686      * itself can be subtracted out using the first_frame data
   2687      * collected above
   2688      */
   2689     kf_group_intra_err += this_frame->intra_error;
   2690     kf_group_coded_err += this_frame->coded_error;
   2691   }
   2692 
   2693   /* Calculate the number of bits that should be assigned to the kf group. */
   2694   if ((cpi->twopass.bits_left > 0) &&
   2695       (cpi->twopass.modified_error_left > 0.0)) {
   2696     /* Max for a single normal frame (not key frame) */
   2697     int max_bits = frame_max_bits(cpi);
   2698 
   2699     /* Maximum bits for the kf group */
   2700     int64_t max_grp_bits;
   2701 
   2702     /* Default allocation based on bits left and relative
   2703      * complexity of the section
   2704      */
   2705     cpi->twopass.kf_group_bits =
   2706         (int64_t)(cpi->twopass.bits_left *
   2707                   (kf_group_err / cpi->twopass.modified_error_left));
   2708 
   2709     /* Clip based on maximum per frame rate defined by the user. */
   2710     max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
   2711     if (cpi->twopass.kf_group_bits > max_grp_bits) {
   2712       cpi->twopass.kf_group_bits = max_grp_bits;
   2713     }
   2714 
   2715     /* Additional special case for CBR if buffer is getting full. */
   2716     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   2717       int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level;
   2718       int64_t buffer_lvl = cpi->buffer_level;
   2719 
   2720       /* If the buffer is near or above the optimal and this kf group is
   2721        * not being allocated much then increase the allocation a bit.
   2722        */
   2723       if (buffer_lvl >= opt_buffer_lvl) {
   2724         int64_t high_water_mark =
   2725             (opt_buffer_lvl + cpi->oxcf.maximum_buffer_size) >> 1;
   2726 
   2727         int64_t av_group_bits;
   2728 
   2729         /* Av bits per frame * number of frames */
   2730         av_group_bits = (int64_t)cpi->av_per_frame_bandwidth *
   2731                         (int64_t)cpi->twopass.frames_to_key;
   2732 
   2733         /* We are at or above the maximum. */
   2734         if (cpi->buffer_level >= high_water_mark) {
   2735           int64_t min_group_bits;
   2736 
   2737           min_group_bits =
   2738               av_group_bits + (int64_t)(buffer_lvl - high_water_mark);
   2739 
   2740           if (cpi->twopass.kf_group_bits < min_group_bits) {
   2741             cpi->twopass.kf_group_bits = min_group_bits;
   2742           }
   2743         }
   2744         /* We are above optimal but below the maximum */
   2745         else if (cpi->twopass.kf_group_bits < av_group_bits) {
   2746           int64_t bits_below_av = av_group_bits - cpi->twopass.kf_group_bits;
   2747 
   2748           cpi->twopass.kf_group_bits += (int64_t)(
   2749               (double)bits_below_av * (double)(buffer_lvl - opt_buffer_lvl) /
   2750               (double)(high_water_mark - opt_buffer_lvl));
   2751         }
   2752       }
   2753     }
   2754   } else {
   2755     cpi->twopass.kf_group_bits = 0;
   2756   }
   2757 
   2758   /* Reset the first pass file position */
   2759   reset_fpf_position(cpi, start_position);
   2760 
   2761   /* determine how big to make this keyframe based on how well the
   2762    * subsequent frames use inter blocks
   2763    */
   2764   decay_accumulator = 1.0;
   2765   boost_score = 0.0;
   2766 
   2767   for (i = 0; i < cpi->twopass.frames_to_key; ++i) {
   2768     double r;
   2769 
   2770     if (EOF == input_stats(cpi, &next_frame)) break;
   2771 
   2772     if (next_frame.intra_error > cpi->twopass.kf_intra_err_min) {
   2773       r = (IIKFACTOR2 * next_frame.intra_error /
   2774            DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
   2775     } else {
   2776       r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min /
   2777            DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
   2778     }
   2779 
   2780     if (r > RMAX) r = RMAX;
   2781 
   2782     /* How fast is prediction quality decaying */
   2783     loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
   2784 
   2785     decay_accumulator = decay_accumulator * loop_decay_rate;
   2786     decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
   2787 
   2788     boost_score += (decay_accumulator * r);
   2789 
   2790     if ((i > MIN_GF_INTERVAL) && ((boost_score - old_boost_score) < 1.0)) {
   2791       break;
   2792     }
   2793 
   2794     old_boost_score = boost_score;
   2795   }
   2796 
   2797   if (1) {
   2798     FIRSTPASS_STATS sectionstats;
   2799     double Ratio;
   2800 
   2801     zero_stats(&sectionstats);
   2802     reset_fpf_position(cpi, start_position);
   2803 
   2804     for (i = 0; i < cpi->twopass.frames_to_key; ++i) {
   2805       input_stats(cpi, &next_frame);
   2806       accumulate_stats(&sectionstats, &next_frame);
   2807     }
   2808 
   2809     avg_stats(&sectionstats);
   2810 
   2811     cpi->twopass.section_intra_rating =
   2812         (unsigned int)(sectionstats.intra_error /
   2813                        DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
   2814 
   2815     Ratio = sectionstats.intra_error /
   2816             DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
   2817     cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
   2818 
   2819     if (cpi->twopass.section_max_qfactor < 0.80) {
   2820       cpi->twopass.section_max_qfactor = 0.80;
   2821     }
   2822   }
   2823 
   2824   /* When using CBR apply additional buffer fullness related upper limits */
   2825   if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   2826     double max_boost;
   2827 
   2828     if (cpi->drop_frames_allowed) {
   2829       int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark *
   2830                                   (cpi->oxcf.optimal_buffer_level / 100));
   2831 
   2832       if (cpi->buffer_level > df_buffer_level) {
   2833         max_boost =
   2834             ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) /
   2835             DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
   2836       } else {
   2837         max_boost = 0.0;
   2838       }
   2839     } else if (cpi->buffer_level > 0) {
   2840       max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) /
   2841                   DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
   2842     } else {
   2843       max_boost = 0.0;
   2844     }
   2845 
   2846     if (boost_score > max_boost) boost_score = max_boost;
   2847   }
   2848 
   2849   /* Reset the first pass file position */
   2850   reset_fpf_position(cpi, start_position);
   2851 
   2852   /* Work out how many bits to allocate for the key frame itself */
   2853   if (1) {
   2854     int kf_boost = (int)boost_score;
   2855     int allocation_chunks;
   2856     int Counter = cpi->twopass.frames_to_key;
   2857     int alt_kf_bits;
   2858     YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
   2859 /* Min boost based on kf interval */
   2860 #if 0
   2861 
   2862         while ((kf_boost < 48) && (Counter > 0))
   2863         {
   2864             Counter -= 2;
   2865             kf_boost ++;
   2866         }
   2867 
   2868 #endif
   2869 
   2870     if (kf_boost < 48) {
   2871       kf_boost += ((Counter + 1) >> 1);
   2872 
   2873       if (kf_boost > 48) kf_boost = 48;
   2874     }
   2875 
   2876     /* bigger frame sizes need larger kf boosts, smaller frames smaller
   2877      * boosts...
   2878      */
   2879     if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240)) {
   2880       kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
   2881     } else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240)) {
   2882       kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
   2883     }
   2884 
   2885     /* Min KF boost */
   2886     kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */
   2887     if (kf_boost < 250) kf_boost = 250;
   2888 
   2889     /*
   2890      * We do three calculations for kf size.
   2891      * The first is based on the error score for the whole kf group.
   2892      * The second (optionaly) on the key frames own error if this is
   2893      * smaller than the average for the group.
   2894      * The final one insures that the frame receives at least the
   2895      * allocation it would have received based on its own error score vs
   2896      * the error score remaining
   2897      * Special case if the sequence appears almost totaly static
   2898      * as measured by the decay accumulator. In this case we want to
   2899      * spend almost all of the bits on the key frame.
   2900      * cpi->twopass.frames_to_key-1 because key frame itself is taken
   2901      * care of by kf_boost.
   2902      */
   2903     if (decay_accumulator >= 0.99) {
   2904       allocation_chunks = ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
   2905     } else {
   2906       allocation_chunks = ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
   2907     }
   2908 
   2909     /* Normalize Altboost and allocations chunck down to prevent overflow */
   2910     while (kf_boost > 1000) {
   2911       kf_boost /= 2;
   2912       allocation_chunks /= 2;
   2913     }
   2914 
   2915     cpi->twopass.kf_group_bits =
   2916         (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;
   2917 
   2918     /* Calculate the number of bits to be spent on the key frame */
   2919     cpi->twopass.kf_bits =
   2920         (int)((double)kf_boost *
   2921               ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks));
   2922 
   2923     /* Apply an additional limit for CBR */
   2924     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   2925       if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2)) {
   2926         cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2);
   2927       }
   2928     }
   2929 
   2930     /* If the key frame is actually easier than the average for the
   2931      * kf group (which does sometimes happen... eg a blank intro frame)
   2932      * Then use an alternate calculation based on the kf error score
   2933      * which should give a smaller key frame.
   2934      */
   2935     if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key) {
   2936       double alt_kf_grp_bits =
   2937           ((double)cpi->twopass.bits_left *
   2938            (kf_mod_err * (double)cpi->twopass.frames_to_key) /
   2939            DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
   2940 
   2941       alt_kf_bits = (int)((double)kf_boost *
   2942                           (alt_kf_grp_bits / (double)allocation_chunks));
   2943 
   2944       if (cpi->twopass.kf_bits > alt_kf_bits) {
   2945         cpi->twopass.kf_bits = alt_kf_bits;
   2946       }
   2947     }
   2948     /* Else if it is much harder than other frames in the group make sure
   2949      * it at least receives an allocation in keeping with its relative
   2950      * error score
   2951      */
   2952     else {
   2953       alt_kf_bits = (int)((double)cpi->twopass.bits_left *
   2954                           (kf_mod_err / DOUBLE_DIVIDE_CHECK(
   2955                                             cpi->twopass.modified_error_left)));
   2956 
   2957       if (alt_kf_bits > cpi->twopass.kf_bits) {
   2958         cpi->twopass.kf_bits = alt_kf_bits;
   2959       }
   2960     }
   2961 
   2962     cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits;
   2963     /* Add in the minimum frame allowance */
   2964     cpi->twopass.kf_bits += cpi->min_frame_bandwidth;
   2965 
   2966     /* Peer frame bit target for this frame */
   2967     cpi->per_frame_bandwidth = cpi->twopass.kf_bits;
   2968 
   2969     /* Convert to a per second bitrate */
   2970     cpi->target_bandwidth = (int)(cpi->twopass.kf_bits * cpi->output_framerate);
   2971   }
   2972 
   2973   /* Note the total error score of the kf group minus the key frame itself */
   2974   cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
   2975 
   2976   /* Adjust the count of total modified error left. The count of bits left
   2977    * is adjusted elsewhere based on real coded frame sizes
   2978    */
   2979   cpi->twopass.modified_error_left -= kf_group_err;
   2980 
   2981   if (cpi->oxcf.allow_spatial_resampling) {
   2982     int resample_trigger = 0;
   2983     int last_kf_resampled = 0;
   2984     int kf_q;
   2985     int scale_val = 0;
   2986     int hr, hs, vr, vs;
   2987     int new_width = cpi->oxcf.Width;
   2988     int new_height = cpi->oxcf.Height;
   2989 
   2990     int projected_buffer_level;
   2991     int tmp_q;
   2992 
   2993     double projected_bits_perframe;
   2994     double group_iiratio = (kf_group_intra_err - first_frame.intra_error) /
   2995                            (kf_group_coded_err - first_frame.coded_error);
   2996     double err_per_frame = kf_group_err / cpi->twopass.frames_to_key;
   2997     double bits_per_frame;
   2998     double av_bits_per_frame;
   2999     double effective_size_ratio;
   3000 
   3001     if ((cpi->common.Width != cpi->oxcf.Width) ||
   3002         (cpi->common.Height != cpi->oxcf.Height)) {
   3003       last_kf_resampled = 1;
   3004     }
   3005 
   3006     /* Set back to unscaled by defaults */
   3007     cpi->common.horiz_scale = NORMAL;
   3008     cpi->common.vert_scale = NORMAL;
   3009 
   3010     /* Calculate Average bits per frame. */
   3011     av_bits_per_frame = cpi->oxcf.target_bandwidth /
   3012                         DOUBLE_DIVIDE_CHECK((double)cpi->framerate);
   3013 
   3014     /* CBR... Use the clip average as the target for deciding resample */
   3015     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   3016       bits_per_frame = av_bits_per_frame;
   3017     }
   3018 
   3019     /* In VBR we want to avoid downsampling in easy section unless we
   3020      * are under extreme pressure So use the larger of target bitrate
   3021      * for this section or average bitrate for sequence
   3022      */
   3023     else {
   3024       /* This accounts for how hard the section is... */
   3025       bits_per_frame =
   3026           (double)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key);
   3027 
   3028       /* Dont turn to resampling in easy sections just because they
   3029        * have been assigned a small number of bits
   3030        */
   3031       if (bits_per_frame < av_bits_per_frame) {
   3032         bits_per_frame = av_bits_per_frame;
   3033       }
   3034     }
   3035 
   3036     /* bits_per_frame should comply with our minimum */
   3037     if (bits_per_frame < (cpi->oxcf.target_bandwidth *
   3038                           cpi->oxcf.two_pass_vbrmin_section / 100)) {
   3039       bits_per_frame = (cpi->oxcf.target_bandwidth *
   3040                         cpi->oxcf.two_pass_vbrmin_section / 100);
   3041     }
   3042 
   3043     /* Work out if spatial resampling is necessary */
   3044     kf_q = estimate_kf_group_q(cpi, err_per_frame, (int)bits_per_frame,
   3045                                group_iiratio);
   3046 
   3047     /* If we project a required Q higher than the maximum allowed Q then
   3048      * make a guess at the actual size of frames in this section
   3049      */
   3050     projected_bits_perframe = bits_per_frame;
   3051     tmp_q = kf_q;
   3052 
   3053     while (tmp_q > cpi->worst_quality) {
   3054       projected_bits_perframe *= 1.04;
   3055       tmp_q--;
   3056     }
   3057 
   3058     /* Guess at buffer level at the end of the section */
   3059     projected_buffer_level =
   3060         (int)(cpi->buffer_level -
   3061               (int)((projected_bits_perframe - av_bits_per_frame) *
   3062                     cpi->twopass.frames_to_key));
   3063 
   3064     if (0) {
   3065       FILE *f = fopen("Subsamle.stt", "a");
   3066       fprintf(f, " %8d %8d %8d %8d %12.0f %8d %8d %8d\n",
   3067               cpi->common.current_video_frame, kf_q, cpi->common.horiz_scale,
   3068               cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key,
   3069               (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key),
   3070               new_height, new_width);
   3071       fclose(f);
   3072     }
   3073 
   3074     /* The trigger for spatial resampling depends on the various
   3075      * parameters such as whether we are streaming (CBR) or VBR.
   3076      */
   3077     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
   3078       /* Trigger resample if we are projected to fall below down
   3079        * sample level or resampled last time and are projected to
   3080        * remain below the up sample level
   3081        */
   3082       if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark *
   3083                                      cpi->oxcf.optimal_buffer_level / 100)) ||
   3084           (last_kf_resampled &&
   3085            (projected_buffer_level < (cpi->oxcf.resample_up_water_mark *
   3086                                       cpi->oxcf.optimal_buffer_level / 100)))) {
   3087         resample_trigger = 1;
   3088       } else {
   3089         resample_trigger = 0;
   3090       }
   3091     } else {
   3092       int64_t clip_bits = (int64_t)(
   3093           cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth /
   3094           DOUBLE_DIVIDE_CHECK((double)cpi->framerate));
   3095       int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level;
   3096 
   3097       /* If triggered last time the threshold for triggering again is
   3098        * reduced:
   3099        *
   3100        * Projected Q higher than allowed and Overspend > 5% of total
   3101        * bits
   3102        */
   3103       if ((last_kf_resampled && (kf_q > cpi->worst_quality)) ||
   3104           ((kf_q > cpi->worst_quality) && (over_spend > clip_bits / 20))) {
   3105         resample_trigger = 1;
   3106       } else {
   3107         resample_trigger = 0;
   3108       }
   3109     }
   3110 
   3111     if (resample_trigger) {
   3112       while ((kf_q >= cpi->worst_quality) && (scale_val < 6)) {
   3113         scale_val++;
   3114 
   3115         cpi->common.vert_scale = vscale_lookup[scale_val];
   3116         cpi->common.horiz_scale = hscale_lookup[scale_val];
   3117 
   3118         Scale2Ratio(cpi->common.horiz_scale, &hr, &hs);
   3119         Scale2Ratio(cpi->common.vert_scale, &vr, &vs);
   3120 
   3121         new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
   3122         new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
   3123 
   3124         /* Reducing the area to 1/4 does not reduce the complexity
   3125          * (err_per_frame) to 1/4... effective_sizeratio attempts
   3126          * to provide a crude correction for this
   3127          */
   3128         effective_size_ratio = (double)(new_width * new_height) /
   3129                                (double)(cpi->oxcf.Width * cpi->oxcf.Height);
   3130         effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0;
   3131 
   3132         /* Now try again and see what Q we get with the smaller
   3133          * image size
   3134          */
   3135         kf_q = estimate_kf_group_q(cpi, err_per_frame * effective_size_ratio,
   3136                                    (int)bits_per_frame, group_iiratio);
   3137 
   3138         if (0) {
   3139           FILE *f = fopen("Subsamle.stt", "a");
   3140           fprintf(
   3141               f, "******** %8d %8d %8d %12.0f %8d %8d %8d\n", kf_q,
   3142               cpi->common.horiz_scale, cpi->common.vert_scale,
   3143               kf_group_err / cpi->twopass.frames_to_key,
   3144               (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key),
   3145               new_height, new_width);
   3146           fclose(f);
   3147         }
   3148       }
   3149     }
   3150 
   3151     if ((cpi->common.Width != new_width) ||
   3152         (cpi->common.Height != new_height)) {
   3153       cpi->common.Width = new_width;
   3154       cpi->common.Height = new_height;
   3155       vp8_alloc_compressor_data(cpi);
   3156     }
   3157   }
   3158 }
   3159