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