media/libvpx/vp8/encoder/firstpass.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  */
    11 #include <math.h>
    12 #include <limits.h>
    13 #include <stdio.h>
    15 #include "./vpx_scale_rtcd.h"
    16 #include "block.h"
    17 #include "onyx_int.h"
    18 #include "vp8/common/variance.h"
    19 #include "encodeintra.h"
    20 #include "vp8/common/setupintrarecon.h"
    21 #include "vp8/common/systemdependent.h"
    22 #include "mcomp.h"
    23 #include "firstpass.h"
    24 #include "vpx_scale/vpx_scale.h"
    25 #include "encodemb.h"
    26 #include "vp8/common/extend.h"
    27 #include "vpx_mem/vpx_mem.h"
    28 #include "vp8/common/swapyv12buffer.h"
    29 #include "rdopt.h"
    30 #include "vp8/common/quant_common.h"
    31 #include "encodemv.h"
    32 #include "encodeframe.h"
    34 /* #define OUTPUT_FPF 1 */
    36 extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi);
    37 extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
    38 extern void vp8_alloc_compressor_data(VP8_COMP *cpi);
    40 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
    41 extern int vp8_kf_boost_qadjustment[QINDEX_RANGE];
    43 extern const int vp8_gf_boost_qadjustment[QINDEX_RANGE];
    45 #define IIFACTOR   1.5
    46 #define IIKFACTOR1 1.40
    47 #define IIKFACTOR2 1.5
    48 #define RMAX       14.0
    49 #define GF_RMAX    48.0
    51 #define KF_MB_INTRA_MIN 300
    52 #define GF_MB_INTRA_MIN 200
    54 #define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001)
    56 #define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
    57 #define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0
    59 #define NEW_BOOST 1
    61 static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3};
    62 static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3};
    65 static const int cq_level[QINDEX_RANGE] =
    66 {
    67     0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
    68     9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
    69     20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
    70     32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
    71     44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
    72     57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
    73     71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
    74     86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
    75 };
    77 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame);
    79 /* Resets the first pass file to the given position using a relative seek
    80  * from the current position
    81  */
    82 static void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position)
    83 {
    84     cpi->twopass.stats_in = Position;
    85 }
    87 static int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
    88 {
    89     if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
    90         return EOF;
    92     *next_frame = *cpi->twopass.stats_in;
    93     return 1;
    94 }
    96 /* Read frame stats at an offset from the current position */
    97 static int read_frame_stats( VP8_COMP *cpi,
    98                              FIRSTPASS_STATS *frame_stats,
    99                              int offset )
   100 {
   101     FIRSTPASS_STATS * fps_ptr = cpi->twopass.stats_in;
   103     /* Check legality of offset */
   104     if ( offset >= 0 )
   105     {
   106         if ( &fps_ptr[offset] >= cpi->twopass.stats_in_end )
   107              return EOF;
   108     }
   109     else if ( offset < 0 )
   110     {
   111         if ( &fps_ptr[offset] < cpi->twopass.stats_in_start )
   112              return EOF;
   113     }
   115     *frame_stats = fps_ptr[offset];
   116     return 1;
   117 }
   119 static int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps)
   120 {
   121     if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
   122         return EOF;
   124     *fps = *cpi->twopass.stats_in;
   125     cpi->twopass.stats_in =
   126          (void*)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS));
   127     return 1;
   128 }
   130 static void output_stats(const VP8_COMP            *cpi,
   131                          struct vpx_codec_pkt_list *pktlist,
   132                          FIRSTPASS_STATS            *stats)
   133 {
   134     struct vpx_codec_cx_pkt pkt;
   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);
   140 /* TEMP debug code */
   141 #if OUTPUT_FPF
   143     {
   144         FILE *fpfile;
   145         fpfile = fopen("firstpass.stt", "a");
   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 }
   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 }
   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 }
   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 }
   239 static void avg_stats(FIRSTPASS_STATS *section)
   240 {
   241     if (section->count < 1.0)
   242         return;
   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 }
   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;
   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);
   276     return modified_err;
   277 }
   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 };
   314 static double simple_weight(YV12_BUFFER_CONFIG *source)
   315 {
   316     int i, j;
   318     unsigned char *src = source->y_buffer;
   319     double sum_weights = 0.0;
   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);
   337     sum_weights /= (source->y_height * source->y_width);
   339     return sum_weights;
   340 }
   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;
   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);
   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));
   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;
   370             max_bits = (int)(max_bits * buffer_fullness_ratio);
   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     }
   388     /* Trap case where we are out of bits */
   389     if (max_bits < 0)
   390         max_bits = 0;
   392     return max_bits;
   393 }
   395 void vp8_init_first_pass(VP8_COMP *cpi)
   396 {
   397     zero_stats(&cpi->twopass.total_stats);
   398 }
   400 void vp8_end_first_pass(VP8_COMP *cpi)
   401 {
   402     output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats);
   403 }
   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];
   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;
   422     /* Set up pointers for this macro block raw buffer */
   423     raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset
   424                                 + d->offset);
   425     vp8_mse16x16 ( src_ptr, src_stride, raw_ptr, raw_stride,
   426                    (unsigned int *)(raw_motion_err));
   428     /* Set up pointers for this macro block recon buffer */
   429     xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
   430     ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset );
   431     vp8_mse16x16 ( src_ptr, src_stride, ref_ptr, ref_stride,
   432                    (unsigned int *)(best_motion_err));
   433 }
   435 static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
   436                                      int_mv *ref_mv, MV *best_mv,
   437                                      YV12_BUFFER_CONFIG *recon_buffer,
   438                                      int *best_motion_err, int recon_yoffset )
   439 {
   440     MACROBLOCKD *const xd = & x->e_mbd;
   441     BLOCK *b = &x->block[0];
   442     BLOCKD *d = &x->e_mbd.block[0];
   443     int num00;
   445     int_mv tmp_mv;
   446     int_mv ref_mv_full;
   448     int tmp_err;
   449     int step_param = 3; /* Dont search over full range for first pass */
   450     int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
   451     int n;
   452     vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16];
   453     int new_mv_mode_penalty = 256;
   455     /* override the default variance function to use MSE */
   456     v_fn_ptr.vf    = vp8_mse16x16;
   458     /* Set up pointers for this macro block recon buffer */
   459     xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
   461     /* Initial step/diamond search centred on best mv */
   462     tmp_mv.as_int = 0;
   463     ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3;
   464     ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3;
   465     tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
   466                                       x->sadperbit16, &num00, &v_fn_ptr,
   467                                       x->mvcost, ref_mv);
   468     if ( tmp_err < INT_MAX-new_mv_mode_penalty )
   469         tmp_err += new_mv_mode_penalty;
   471     if (tmp_err < *best_motion_err)
   472     {
   473         *best_motion_err = tmp_err;
   474         best_mv->row = tmp_mv.as_mv.row;
   475         best_mv->col = tmp_mv.as_mv.col;
   476     }
   478     /* Further step/diamond searches as necessary */
   479     n = num00;
   480     num00 = 0;
   482     while (n < further_steps)
   483     {
   484         n++;
   486         if (num00)
   487             num00--;
   488         else
   489         {
   490             tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
   491                                               step_param + n, x->sadperbit16,
   492                                               &num00, &v_fn_ptr, x->mvcost,
   493                                               ref_mv);
   494             if ( tmp_err < INT_MAX-new_mv_mode_penalty )
   495                 tmp_err += new_mv_mode_penalty;
   497             if (tmp_err < *best_motion_err)
   498             {
   499                 *best_motion_err = tmp_err;
   500                 best_mv->row = tmp_mv.as_mv.row;
   501                 best_mv->col = tmp_mv.as_mv.col;
   502             }
   503         }
   504     }
   505 }
   507 void vp8_first_pass(VP8_COMP *cpi)
   508 {
   509     int mb_row, mb_col;
   510     MACROBLOCK *const x = & cpi->mb;
   511     VP8_COMMON *const cm = & cpi->common;
   512     MACROBLOCKD *const xd = & x->e_mbd;
   514     int recon_yoffset, recon_uvoffset;
   515     YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
   516     YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
   517     YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
   518     int recon_y_stride = lst_yv12->y_stride;
   519     int recon_uv_stride = lst_yv12->uv_stride;
   520     int64_t intra_error = 0;
   521     int64_t coded_error = 0;
   523     int sum_mvr = 0, sum_mvc = 0;
   524     int sum_mvr_abs = 0, sum_mvc_abs = 0;
   525     int sum_mvrs = 0, sum_mvcs = 0;
   526     int mvcount = 0;
   527     int intercount = 0;
   528     int second_ref_count = 0;
   529     int intrapenalty = 256;
   530     int neutral_count = 0;
   531     int new_mv_count = 0;
   532     int sum_in_vectors = 0;
   533     uint32_t lastmv_as_int = 0;
   535     int_mv zero_ref_mv;
   537     zero_ref_mv.as_int = 0;
   539     vp8_clear_system_state();
   541     x->src = * cpi->Source;
   542     xd->pre = *lst_yv12;
   543     xd->dst = *new_yv12;
   545     x->partition_info = x->pi;
   547     xd->mode_info_context = cm->mi;
   549     if(!cm->use_bilinear_mc_filter)
   550     {
   551          xd->subpixel_predict        = vp8_sixtap_predict4x4;
   552          xd->subpixel_predict8x4     = vp8_sixtap_predict8x4;
   553          xd->subpixel_predict8x8     = vp8_sixtap_predict8x8;
   554          xd->subpixel_predict16x16   = vp8_sixtap_predict16x16;
   555      }
   556      else
   557      {
   558          xd->subpixel_predict        = vp8_bilinear_predict4x4;
   559          xd->subpixel_predict8x4     = vp8_bilinear_predict8x4;
   560          xd->subpixel_predict8x8     = vp8_bilinear_predict8x8;
   561          xd->subpixel_predict16x16   = vp8_bilinear_predict16x16;
   562      }
   564     vp8_build_block_offsets(x);
   566     /* set up frame new frame for intra coded blocks */
   567     vp8_setup_intra_recon(new_yv12);
   568     vp8cx_frame_init_quantizer(cpi);
   570     /* Initialise the MV cost table to the defaults */
   571     {
   572         int flag[2] = {1, 1};
   573         vp8_initialize_rd_consts(cpi, x, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
   574         vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
   575         vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
   576     }
   578     /* for each macroblock row in image */
   579     for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
   580     {
   581         int_mv best_ref_mv;
   583         best_ref_mv.as_int = 0;
   585         /* reset above block coeffs */
   586         xd->up_available = (mb_row != 0);
   587         recon_yoffset = (mb_row * recon_y_stride * 16);
   588         recon_uvoffset = (mb_row * recon_uv_stride * 8);
   590         /* Set up limit values for motion vectors to prevent them extending
   591          * outside the UMV borders
   592          */
   593         x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
   594         x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
   597         /* for each macroblock col in image */
   598         for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
   599         {
   600             int this_error;
   601             int gf_motion_error = INT_MAX;
   602             int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
   604             xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
   605             xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset;
   606             xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
   607             xd->left_available = (mb_col != 0);
   609             /* Copy current mb to a buffer */
   610             vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
   612             /* do intra 16x16 prediction */
   613             this_error = vp8_encode_intra(cpi, x, use_dc_pred);
   615             /* "intrapenalty" below deals with situations where the intra
   616              * and inter error scores are very low (eg a plain black frame)
   617              * We do not have special cases in first pass for 0,0 and
   618              * nearest etc so all inter modes carry an overhead cost
   619              * estimate fot the mv. When the error score is very low this
   620              * causes us to pick all or lots of INTRA modes and throw lots
   621              * of key frames. This penalty adds a cost matching that of a
   622              * 0,0 mv to the intra case.
   623              */
   624             this_error += intrapenalty;
   626             /* Cumulative intra error total */
   627             intra_error += (int64_t)this_error;
   629             /* Set up limit values for motion vectors to prevent them
   630              * extending outside the UMV borders
   631              */
   632             x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
   633             x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
   635             /* Other than for the first frame do a motion search */
   636             if (cm->current_video_frame > 0)
   637             {
   638                 BLOCKD *d = &x->e_mbd.block[0];
   639                 MV tmp_mv = {0, 0};
   640                 int tmp_err;
   641                 int motion_error = INT_MAX;
   642                 int raw_motion_error = INT_MAX;
   644                 /* Simple 0,0 motion with no mv overhead */
   645                 zz_motion_search( cpi, x, cpi->last_frame_unscaled_source,
   646                                   &raw_motion_error, lst_yv12, &motion_error,
   647                                   recon_yoffset );
   648                 d->bmi.mv.as_mv.row = 0;
   649                 d->bmi.mv.as_mv.col = 0;
   651                 if (raw_motion_error < cpi->oxcf.encode_breakout)
   652                     goto skip_motion_search;
   654                 /* Test last reference frame using the previous best mv as the
   655                  * starting point (best reference) for the search
   656                  */
   657                 first_pass_motion_search(cpi, x, &best_ref_mv,
   658                                         &d->bmi.mv.as_mv, lst_yv12,
   659                                         &motion_error, recon_yoffset);
   661                 /* If the current best reference mv is not centred on 0,0
   662                  * then do a 0,0 based search as well
   663                  */
   664                 if (best_ref_mv.as_int)
   665                 {
   666                    tmp_err = INT_MAX;
   667                    first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv,
   668                                      lst_yv12, &tmp_err, recon_yoffset);
   670                    if ( tmp_err < motion_error )
   671                    {
   672                         motion_error = tmp_err;
   673                         d->bmi.mv.as_mv.row = tmp_mv.row;
   674                         d->bmi.mv.as_mv.col = tmp_mv.col;
   675                    }
   676                 }
   678                 /* Experimental search in a second reference frame ((0,0)
   679                  * based only)
   680                  */
   681                 if (cm->current_video_frame > 1)
   682                 {
   683                     first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12, &gf_motion_error, recon_yoffset);
   685                     if ((gf_motion_error < motion_error) && (gf_motion_error < this_error))
   686                     {
   687                         second_ref_count++;
   688                     }
   690                     /* Reset to last frame as reference buffer */
   691                     xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset;
   692                     xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset;
   693                     xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset;
   694                 }
   696 skip_motion_search:
   697                 /* Intra assumed best */
   698                 best_ref_mv.as_int = 0;
   700                 if (motion_error <= this_error)
   701                 {
   702                     /* Keep a count of cases where the inter and intra were
   703                      * very close and very low. This helps with scene cut
   704                      * detection for example in cropped clips with black bars
   705                      * at the sides or top and bottom.
   706                      */
   707                     if( (((this_error-intrapenalty) * 9) <=
   708                          (motion_error*10)) &&
   709                         (this_error < (2*intrapenalty)) )
   710                     {
   711                         neutral_count++;
   712                     }
   714                     d->bmi.mv.as_mv.row *= 8;
   715                     d->bmi.mv.as_mv.col *= 8;
   716                     this_error = motion_error;
   717                     vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv);
   718                     vp8_encode_inter16x16y(x);
   719                     sum_mvr += d->bmi.mv.as_mv.row;
   720                     sum_mvr_abs += abs(d->bmi.mv.as_mv.row);
   721                     sum_mvc += d->bmi.mv.as_mv.col;
   722                     sum_mvc_abs += abs(d->bmi.mv.as_mv.col);
   723                     sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row;
   724                     sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col;
   725                     intercount++;
   727                     best_ref_mv.as_int = d->bmi.mv.as_int;
   729                     /* Was the vector non-zero */
   730                     if (d->bmi.mv.as_int)
   731                     {
   732                         mvcount++;
   734                         /* Was it different from the last non zero vector */
   735                         if ( d->bmi.mv.as_int != lastmv_as_int )
   736                             new_mv_count++;
   737                         lastmv_as_int = d->bmi.mv.as_int;
   739                         /* Does the Row vector point inwards or outwards */
   740                         if (mb_row < cm->mb_rows / 2)
   741                         {
   742                             if (d->bmi.mv.as_mv.row > 0)
   743                                 sum_in_vectors--;
   744                             else if (d->bmi.mv.as_mv.row < 0)
   745                                 sum_in_vectors++;
   746                         }
   747                         else if (mb_row > cm->mb_rows / 2)
   748                         {
   749                             if (d->bmi.mv.as_mv.row > 0)
   750                                 sum_in_vectors++;
   751                             else if (d->bmi.mv.as_mv.row < 0)
   752                                 sum_in_vectors--;
   753                         }
   755                         /* Does the Row vector point inwards or outwards */
   756                         if (mb_col < cm->mb_cols / 2)
   757                         {
   758                             if (d->bmi.mv.as_mv.col > 0)
   759                                 sum_in_vectors--;
   760                             else if (d->bmi.mv.as_mv.col < 0)
   761                                 sum_in_vectors++;
   762                         }
   763                         else if (mb_col > cm->mb_cols / 2)
   764                         {
   765                             if (d->bmi.mv.as_mv.col > 0)
   766                                 sum_in_vectors++;
   767                             else if (d->bmi.mv.as_mv.col < 0)
   768                                 sum_in_vectors--;
   769                         }
   770                     }
   771                 }
   772             }
   774             coded_error += (int64_t)this_error;
   776             /* adjust to the next column of macroblocks */
   777             x->src.y_buffer += 16;
   778             x->src.u_buffer += 8;
   779             x->src.v_buffer += 8;
   781             recon_yoffset += 16;
   782             recon_uvoffset += 8;
   783         }
   785         /* adjust to the next row of mbs */
   786         x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
   787         x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
   788         x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
   790         /* extend the recon for intra prediction */
   791         vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8);
   792         vp8_clear_system_state();
   793     }
   795     vp8_clear_system_state();
   796     {
   797         double weight = 0.0;
   799         FIRSTPASS_STATS fps;
   801         fps.frame      = cm->current_video_frame ;
   802         fps.intra_error = (double)(intra_error >> 8);
   803         fps.coded_error = (double)(coded_error >> 8);
   804         weight = simple_weight(cpi->Source);
   807         if (weight < 0.1)
   808             weight = 0.1;
   810         fps.ssim_weighted_pred_err = fps.coded_error * weight;
   812         fps.pcnt_inter  = 0.0;
   813         fps.pcnt_motion = 0.0;
   814         fps.MVr        = 0.0;
   815         fps.mvr_abs     = 0.0;
   816         fps.MVc        = 0.0;
   817         fps.mvc_abs     = 0.0;
   818         fps.MVrv       = 0.0;
   819         fps.MVcv       = 0.0;
   820         fps.mv_in_out_count  = 0.0;
   821         fps.new_mv_count = 0.0;
   822         fps.count      = 1.0;
   824         fps.pcnt_inter   = 1.0 * (double)intercount / cm->MBs;
   825         fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs;
   826         fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs;
   828         if (mvcount > 0)
   829         {
   830             fps.MVr = (double)sum_mvr / (double)mvcount;
   831             fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount;
   832             fps.MVc = (double)sum_mvc / (double)mvcount;
   833             fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount;
   834             fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) / (double)mvcount;
   835             fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) / (double)mvcount;
   836             fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2);
   837             fps.new_mv_count = new_mv_count;
   839             fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs;
   840         }
   842         /* TODO:  handle the case when duration is set to 0, or something less
   843          * than the full time between subsequent cpi->source_time_stamps
   844          */
   845         fps.duration = (double)(cpi->source->ts_end
   846                        - cpi->source->ts_start);
   848         /* don't want to do output stats with a stack variable! */
   849         memcpy(&cpi->twopass.this_frame_stats,
   850                &fps,
   851                sizeof(FIRSTPASS_STATS));
   852         output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats);
   853         accumulate_stats(&cpi->twopass.total_stats, &fps);
   854     }
   856     /* Copy the previous Last Frame into the GF buffer if specific
   857      * conditions for doing so are met
   858      */
   859     if ((cm->current_video_frame > 0) &&
   860         (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) &&
   861         ((cpi->twopass.this_frame_stats.intra_error /
   862           DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) >
   863          2.0))
   864     {
   865         vp8_yv12_copy_frame(lst_yv12, gld_yv12);
   866     }
   868     /* swap frame pointers so last frame refers to the frame we just
   869      * compressed
   870      */
   871     vp8_swap_yv12_buffer(lst_yv12, new_yv12);
   872     vp8_yv12_extend_frame_borders(lst_yv12);
   874     /* Special case for the first frame. Copy into the GF buffer as a
   875      * second reference.
   876      */
   877     if (cm->current_video_frame == 0)
   878     {
   879         vp8_yv12_copy_frame(lst_yv12, gld_yv12);
   880     }
   883     /* use this to see what the first pass reconstruction looks like */
   884     if (0)
   885     {
   886         char filename[512];
   887         FILE *recon_file;
   888         sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
   890         if (cm->current_video_frame == 0)
   891             recon_file = fopen(filename, "wb");
   892         else
   893             recon_file = fopen(filename, "ab");
   895         (void) fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1,
   896                       recon_file);
   897         fclose(recon_file);
   898     }
   900     cm->current_video_frame++;
   902 }
   903 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
   905 /* Estimate a cost per mb attributable to overheads such as the coding of
   906  * modes and motion vectors.
   907  * Currently simplistic in its assumptions for testing.
   908  */
   910 static double bitcost( double prob )
   911 {
   912   if (prob > 0.000122)
   913     return -log(prob) / log(2.0);
   914   else
   915     return 13.0;
   916 }
   917 static int64_t estimate_modemvcost(VP8_COMP *cpi,
   918                                      FIRSTPASS_STATS * fpstats)
   919 {
   920     int mv_cost;
   921     int64_t mode_cost;
   923     double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
   924     double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
   925     double av_intra = (1.0 - av_pct_inter);
   927     double zz_cost;
   928     double motion_cost;
   929     double intra_cost;
   931     zz_cost = bitcost(av_pct_inter - av_pct_motion);
   932     motion_cost = bitcost(av_pct_motion);
   933     intra_cost = bitcost(av_intra);
   935     /* Estimate of extra bits per mv overhead for mbs
   936      * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb
   937      */
   938     mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
   940     /* Crude estimate of overhead cost from modes
   941      * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb
   942      */
   943     mode_cost =((((av_pct_inter - av_pct_motion) * zz_cost) +
   944                 (av_pct_motion * motion_cost) +
   945                 (av_intra * intra_cost)) * cpi->common.MBs) * 512;
   947     return mv_cost + mode_cost;
   948 }
   950 static double calc_correction_factor( double err_per_mb,
   951                                       double err_devisor,
   952                                       double pt_low,
   953                                       double pt_high,
   954                                       int Q )
   955 {
   956     double power_term;
   957     double error_term = err_per_mb / err_devisor;
   958     double correction_factor;
   960     /* Adjustment based on Q to power term. */
   961     power_term = pt_low + (Q * 0.01);
   962     power_term = (power_term > pt_high) ? pt_high : power_term;
   964     /* Adjustments to error term */
   965     /* TBD */
   967     /* Calculate correction factor */
   968     correction_factor = pow(error_term, power_term);
   970     /* Clip range */
   971     correction_factor =
   972         (correction_factor < 0.05)
   973             ? 0.05 : (correction_factor > 5.0) ? 5.0 : correction_factor;
   975     return correction_factor;
   976 }
   978 static int estimate_max_q(VP8_COMP *cpi,
   979                           FIRSTPASS_STATS * fpstats,
   980                           int section_target_bandwitdh,
   981                           int overhead_bits )
   982 {
   983     int Q;
   984     int num_mbs = cpi->common.MBs;
   985     int target_norm_bits_per_mb;
   987     double section_err = (fpstats->coded_error / fpstats->count);
   988     double err_per_mb = section_err / num_mbs;
   989     double err_correction_factor;
   990     double speed_correction = 1.0;
   991     int overhead_bits_per_mb;
   993     if (section_target_bandwitdh <= 0)
   994         return cpi->twopass.maxq_max_limit;       /* Highest value allowed */
   996     target_norm_bits_per_mb =
   997         (section_target_bandwitdh < (1 << 20))
   998             ? (512 * section_target_bandwitdh) / num_mbs
   999             : 512 * (section_target_bandwitdh / num_mbs);
  1001     /* Calculate a corrective factor based on a rolling ratio of bits spent
  1002      * vs target bits
  1003      */
  1004     if ((cpi->rolling_target_bits > 0) &&
  1005         (cpi->active_worst_quality < cpi->worst_quality))
  1007         double rolling_ratio;
  1009         rolling_ratio = (double)cpi->rolling_actual_bits /
  1010                         (double)cpi->rolling_target_bits;
  1012         if (rolling_ratio < 0.95)
  1013             cpi->twopass.est_max_qcorrection_factor -= 0.005;
  1014         else if (rolling_ratio > 1.05)
  1015             cpi->twopass.est_max_qcorrection_factor += 0.005;
  1017         cpi->twopass.est_max_qcorrection_factor =
  1018             (cpi->twopass.est_max_qcorrection_factor < 0.1)
  1019                 ? 0.1
  1020                 : (cpi->twopass.est_max_qcorrection_factor > 10.0)
  1021                     ? 10.0 : cpi->twopass.est_max_qcorrection_factor;
  1024     /* Corrections for higher compression speed settings
  1025      * (reduced compression expected)
  1026      */
  1027     if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
  1029         if (cpi->oxcf.cpu_used <= 5)
  1030             speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
  1031         else
  1032             speed_correction = 1.25;
  1035     /* Estimate of overhead bits per mb */
  1036     /* Correction to overhead bits for min allowed Q. */
  1037     overhead_bits_per_mb = overhead_bits / num_mbs;
  1038     overhead_bits_per_mb = (int)(overhead_bits_per_mb *
  1039                             pow( 0.98, (double)cpi->twopass.maxq_min_limit ));
  1041     /* Try and pick a max Q that will be high enough to encode the
  1042      * content at the given rate.
  1043      */
  1044     for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; Q++)
  1046         int bits_per_mb_at_this_q;
  1048         /* Error per MB based correction factor */
  1049         err_correction_factor =
  1050             calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
  1052         bits_per_mb_at_this_q =
  1053             vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
  1055         bits_per_mb_at_this_q = (int)(.5 + err_correction_factor
  1056             * speed_correction * cpi->twopass.est_max_qcorrection_factor
  1057             * cpi->twopass.section_max_qfactor
  1058             * (double)bits_per_mb_at_this_q);
  1060         /* Mode and motion overhead */
  1061         /* As Q rises in real encode loop rd code will force overhead down
  1062          * We make a crude adjustment for this here as *.98 per Q step.
  1063          */
  1064         overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
  1066         if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
  1067             break;
  1070     /* Restriction on active max q for constrained quality mode. */
  1071     if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
  1072          (Q < cpi->cq_target_quality) )
  1074         Q = cpi->cq_target_quality;
  1077     /* Adjust maxq_min_limit and maxq_max_limit limits based on
  1078      * average q observed in clip for non kf/gf.arf frames
  1079      * Give average a chance to settle though.
  1080      */
  1081     if ( (cpi->ni_frames >
  1082                   ((int)cpi->twopass.total_stats.count >> 8)) &&
  1083          (cpi->ni_frames > 150) )
  1085         cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality)
  1086                                   ? (cpi->ni_av_qi + 32) : cpi->worst_quality;
  1087         cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality)
  1088                                   ? (cpi->ni_av_qi - 32) : cpi->best_quality;
  1091     return Q;
  1094 /* For cq mode estimate a cq level that matches the observed
  1095  * complexity and data rate.
  1096  */
  1097 static int estimate_cq( VP8_COMP *cpi,
  1098                         FIRSTPASS_STATS * fpstats,
  1099                         int section_target_bandwitdh,
  1100                         int overhead_bits )
  1102     int Q;
  1103     int num_mbs = cpi->common.MBs;
  1104     int target_norm_bits_per_mb;
  1106     double section_err = (fpstats->coded_error / fpstats->count);
  1107     double err_per_mb = section_err / num_mbs;
  1108     double err_correction_factor;
  1109     double speed_correction = 1.0;
  1110     double clip_iiratio;
  1111     double clip_iifactor;
  1112     int overhead_bits_per_mb;
  1114     if (0)
  1116         FILE *f = fopen("epmp.stt", "a");
  1117         fprintf(f, "%10.2f\n", err_per_mb );
  1118         fclose(f);
  1121     target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
  1122                               ? (512 * section_target_bandwitdh) / num_mbs
  1123                               : 512 * (section_target_bandwitdh / num_mbs);
  1125     /* Estimate of overhead bits per mb */
  1126     overhead_bits_per_mb = overhead_bits / num_mbs;
  1128     /* Corrections for higher compression speed settings
  1129      * (reduced compression expected)
  1130      */
  1131     if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
  1133         if (cpi->oxcf.cpu_used <= 5)
  1134             speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
  1135         else
  1136             speed_correction = 1.25;
  1139     /* II ratio correction factor for clip as a whole */
  1140     clip_iiratio = cpi->twopass.total_stats.intra_error /
  1141                    DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error);
  1142     clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025);
  1143     if (clip_iifactor < 0.80)
  1144         clip_iifactor = 0.80;
  1146     /* Try and pick a Q that can encode the content at the given rate. */
  1147     for (Q = 0; Q < MAXQ; Q++)
  1149         int bits_per_mb_at_this_q;
  1151         /* Error per MB based correction factor */
  1152         err_correction_factor =
  1153             calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q);
  1155         bits_per_mb_at_this_q =
  1156             vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
  1158         bits_per_mb_at_this_q =
  1159             (int)( .5 + err_correction_factor *
  1160                         speed_correction *
  1161                         clip_iifactor *
  1162                         (double)bits_per_mb_at_this_q);
  1164         /* Mode and motion overhead */
  1165         /* As Q rises in real encode loop rd code will force overhead down
  1166          * We make a crude adjustment for this here as *.98 per Q step.
  1167          */
  1168         overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
  1170         if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
  1171             break;
  1174     /* Clip value to range "best allowed to (worst allowed - 1)" */
  1175     Q = cq_level[Q];
  1176     if ( Q >= cpi->worst_quality )
  1177         Q = cpi->worst_quality - 1;
  1178     if ( Q < cpi->best_quality )
  1179         Q = cpi->best_quality;
  1181     return Q;
  1184 static int estimate_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh)
  1186     int Q;
  1187     int num_mbs = cpi->common.MBs;
  1188     int target_norm_bits_per_mb;
  1190     double err_per_mb = section_err / num_mbs;
  1191     double err_correction_factor;
  1192     double speed_correction = 1.0;
  1194     target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) ? (512 * section_target_bandwitdh) / num_mbs : 512 * (section_target_bandwitdh / num_mbs);
  1196     /* Corrections for higher compression speed settings
  1197      * (reduced compression expected)
  1198      */
  1199     if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
  1201         if (cpi->oxcf.cpu_used <= 5)
  1202             speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
  1203         else
  1204             speed_correction = 1.25;
  1207     /* Try and pick a Q that can encode the content at the given rate. */
  1208     for (Q = 0; Q < MAXQ; Q++)
  1210         int bits_per_mb_at_this_q;
  1212         /* Error per MB based correction factor */
  1213         err_correction_factor =
  1214             calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
  1216         bits_per_mb_at_this_q =
  1217             (int)( .5 + ( err_correction_factor *
  1218                           speed_correction *
  1219                           cpi->twopass.est_max_qcorrection_factor *
  1220                           (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0 ) );
  1222         if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
  1223             break;
  1226     return Q;
  1229 /* Estimate a worst case Q for a KF group */
  1230 static int estimate_kf_group_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh, double group_iiratio)
  1232     int Q;
  1233     int num_mbs = cpi->common.MBs;
  1234     int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs;
  1235     int bits_per_mb_at_this_q;
  1237     double err_per_mb = section_err / num_mbs;
  1238     double err_correction_factor;
  1239     double speed_correction = 1.0;
  1240     double current_spend_ratio = 1.0;
  1242     double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90;
  1243     double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80;
  1245     double iiratio_correction_factor = 1.0;
  1247     double combined_correction_factor;
  1249     /* Trap special case where the target is <= 0 */
  1250     if (target_norm_bits_per_mb <= 0)
  1251         return MAXQ * 2;
  1253     /* Calculate a corrective factor based on a rolling ratio of bits spent
  1254      *  vs target bits
  1255      * This is clamped to the range 0.1 to 10.0
  1256      */
  1257     if (cpi->long_rolling_target_bits <= 0)
  1258         current_spend_ratio = 10.0;
  1259     else
  1261         current_spend_ratio = (double)cpi->long_rolling_actual_bits / (double)cpi->long_rolling_target_bits;
  1262         current_spend_ratio = (current_spend_ratio > 10.0) ? 10.0 : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio;
  1265     /* Calculate a correction factor based on the quality of prediction in
  1266      * the sequence as indicated by intra_inter error score ratio (IIRatio)
  1267      * The idea here is to favour subsampling in the hardest sections vs
  1268      * the easyest.
  1269      */
  1270     iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1);
  1272     if (iiratio_correction_factor < 0.5)
  1273         iiratio_correction_factor = 0.5;
  1275     /* Corrections for higher compression speed settings
  1276      * (reduced compression expected)
  1277      */
  1278     if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
  1280         if (cpi->oxcf.cpu_used <= 5)
  1281             speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
  1282         else
  1283             speed_correction = 1.25;
  1286     /* Combine the various factors calculated above */
  1287     combined_correction_factor = speed_correction * iiratio_correction_factor * current_spend_ratio;
  1289     /* Try and pick a Q that should be high enough to encode the content at
  1290      * the given rate.
  1291      */
  1292     for (Q = 0; Q < MAXQ; Q++)
  1294         /* Error per MB based correction factor */
  1295         err_correction_factor =
  1296             calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q);
  1298         bits_per_mb_at_this_q =
  1299             (int)(.5 + ( err_correction_factor *
  1300                          combined_correction_factor *
  1301                          (double)vp8_bits_per_mb[INTER_FRAME][Q]) );
  1303         if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
  1304             break;
  1307     /* If we could not hit the target even at Max Q then estimate what Q
  1308      * would have been required
  1309      */
  1310     while ((bits_per_mb_at_this_q > target_norm_bits_per_mb)  && (Q < (MAXQ * 2)))
  1313         bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q);
  1314         Q++;
  1317     if (0)
  1319         FILE *f = fopen("estkf_q.stt", "a");
  1320         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,
  1321                 target_norm_bits_per_mb, err_per_mb, err_correction_factor,
  1322                 current_spend_ratio, group_iiratio, iiratio_correction_factor,
  1323                 (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level, Q);
  1324         fclose(f);
  1327     return Q;
  1330 extern void vp8_new_framerate(VP8_COMP *cpi, double framerate);
  1332 void vp8_init_second_pass(VP8_COMP *cpi)
  1334     FIRSTPASS_STATS this_frame;
  1335     FIRSTPASS_STATS *start_pos;
  1337     double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
  1339     zero_stats(&cpi->twopass.total_stats);
  1340     zero_stats(&cpi->twopass.total_left_stats);
  1342     if (!cpi->twopass.stats_in_end)
  1343         return;
  1345     cpi->twopass.total_stats = *cpi->twopass.stats_in_end;
  1346     cpi->twopass.total_left_stats = cpi->twopass.total_stats;
  1348     /* each frame can have a different duration, as the frame rate in the
  1349      * source isn't guaranteed to be constant.   The frame rate prior to
  1350      * the first frame encoded in the second pass is a guess.  However the
  1351      * sum duration is not. Its calculated based on the actual durations of
  1352      * all frames from the first pass.
  1353      */
  1354     vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count / cpi->twopass.total_stats.duration);
  1356     cpi->output_framerate = cpi->framerate;
  1357     cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0) ;
  1358     cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * two_pass_min_rate / 10000000.0);
  1360     /* Calculate a minimum intra value to be used in determining the IIratio
  1361      * scores used in the second pass. We have this minimum to make sure
  1362      * that clips that are static but "low complexity" in the intra domain
  1363      * are still boosted appropriately for KF/GF/ARF
  1364      */
  1365     cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
  1366     cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
  1368     /* Scan the first pass file and calculate an average Intra / Inter error
  1369      * score ratio for the sequence
  1370      */
  1372         double sum_iiratio = 0.0;
  1373         double IIRatio;
  1375         start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
  1377         while (input_stats(cpi, &this_frame) != EOF)
  1379             IIRatio = this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error);
  1380             IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio;
  1381             sum_iiratio += IIRatio;
  1384         cpi->twopass.avg_iiratio = sum_iiratio / DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count);
  1386         /* Reset file position */
  1387         reset_fpf_position(cpi, start_pos);
  1390     /* Scan the first pass file and calculate a modified total error based
  1391      * upon the bias/power function used to allocate bits
  1392      */
  1394         start_pos = cpi->twopass.stats_in;  /* Note starting "file" position */
  1396         cpi->twopass.modified_error_total = 0.0;
  1397         cpi->twopass.modified_error_used = 0.0;
  1399         while (input_stats(cpi, &this_frame) != EOF)
  1401             cpi->twopass.modified_error_total += calculate_modified_err(cpi, &this_frame);
  1403         cpi->twopass.modified_error_left = cpi->twopass.modified_error_total;
  1405         reset_fpf_position(cpi, start_pos);  /* Reset file position */
  1410 void vp8_end_second_pass(VP8_COMP *cpi)
  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)
  1419     double prediction_decay_rate;
  1420     double motion_decay;
  1421     double motion_pct = next_frame->pcnt_motion;
  1423     /* Initial basis is the % mbs inter coded */
  1424     prediction_decay_rate = next_frame->pcnt_inter;
  1426     /* High % motion -> somewhat higher decay rate */
  1427     motion_decay = (1.0 - (motion_pct / 20.0));
  1428     if (motion_decay < prediction_decay_rate)
  1429         prediction_decay_rate = motion_decay;
  1431     /* Adjustment to decay rate based on speed of motion */
  1433         double this_mv_rabs;
  1434         double this_mv_cabs;
  1435         double distance_factor;
  1437         this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct);
  1438         this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct);
  1440         distance_factor = sqrt((this_mv_rabs * this_mv_rabs) +
  1441                                (this_mv_cabs * this_mv_cabs)) / 250.0;
  1442         distance_factor = ((distance_factor > 1.0)
  1443                                 ? 0.0 : (1.0 - distance_factor));
  1444         if (distance_factor < prediction_decay_rate)
  1445             prediction_decay_rate = distance_factor;
  1448     return prediction_decay_rate;
  1451 /* Function to test for a condition where a complex transition is followed
  1452  * by a static section. For example in slide shows where there is a fade
  1453  * between slides. This is to help with more optimal kf and gf positioning.
  1454  */
  1455 static int detect_transition_to_still(
  1456     VP8_COMP *cpi,
  1457     int frame_interval,
  1458     int still_interval,
  1459     double loop_decay_rate,
  1460     double decay_accumulator )
  1462     int trans_to_still = 0;
  1464     /* Break clause to detect very still sections after motion
  1465      * For example a static image after a fade or other transition
  1466      * instead of a clean scene cut.
  1467      */
  1468     if ( (frame_interval > MIN_GF_INTERVAL) &&
  1469          (loop_decay_rate >= 0.999) &&
  1470          (decay_accumulator < 0.9) )
  1472         int j;
  1473         FIRSTPASS_STATS * position = cpi->twopass.stats_in;
  1474         FIRSTPASS_STATS tmp_next_frame;
  1475         double decay_rate;
  1477         /* Look ahead a few frames to see if static condition persists... */
  1478         for ( j = 0; j < still_interval; j++ )
  1480             if (EOF == input_stats(cpi, &tmp_next_frame))
  1481                 break;
  1483             decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame);
  1484             if ( decay_rate < 0.999 )
  1485                 break;
  1487         /* Reset file position */
  1488         reset_fpf_position(cpi, position);
  1490         /* Only if it does do we signal a transition to still */
  1491         if ( j == still_interval )
  1492             trans_to_still = 1;
  1495     return trans_to_still;
  1498 /* This function detects a flash through the high relative pcnt_second_ref
  1499  * score in the frame following a flash frame. The offset passed in should
  1500  * reflect this
  1501  */
  1502 static int detect_flash( VP8_COMP *cpi, int offset )
  1504     FIRSTPASS_STATS next_frame;
  1506     int flash_detected = 0;
  1508     /* Read the frame data. */
  1509     /* The return is 0 (no flash detected) if not a valid frame */
  1510     if ( read_frame_stats(cpi, &next_frame, offset) != EOF )
  1512         /* What we are looking for here is a situation where there is a
  1513          * brief break in prediction (such as a flash) but subsequent frames
  1514          * are reasonably well predicted by an earlier (pre flash) frame.
  1515          * The recovery after a flash is indicated by a high pcnt_second_ref
  1516          * comapred to pcnt_inter.
  1517          */
  1518         if ( (next_frame.pcnt_second_ref > next_frame.pcnt_inter) &&
  1519              (next_frame.pcnt_second_ref >= 0.5 ) )
  1521             flash_detected = 1;
  1523             /*if (1)
  1525                 FILE *f = fopen("flash.stt", "a");
  1526                 fprintf(f, "%8.0f %6.2f %6.2f\n",
  1527                     next_frame.frame,
  1528                     next_frame.pcnt_inter,
  1529                     next_frame.pcnt_second_ref);
  1530                 fclose(f);
  1531             }*/
  1535     return flash_detected;
  1538 /* Update the motion related elements to the GF arf boost calculation */
  1539 static void accumulate_frame_motion_stats(
  1540     VP8_COMP *cpi,
  1541     FIRSTPASS_STATS * this_frame,
  1542     double * this_frame_mv_in_out,
  1543     double * mv_in_out_accumulator,
  1544     double * abs_mv_in_out_accumulator,
  1545     double * mv_ratio_accumulator )
  1547     double this_frame_mvr_ratio;
  1548     double this_frame_mvc_ratio;
  1549     double motion_pct;
  1551     /* Accumulate motion stats. */
  1552     motion_pct = this_frame->pcnt_motion;
  1554     /* Accumulate Motion In/Out of frame stats */
  1555     *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct;
  1556     *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct;
  1557     *abs_mv_in_out_accumulator +=
  1558         fabs(this_frame->mv_in_out_count * motion_pct);
  1560     /* Accumulate a measure of how uniform (or conversely how random)
  1561      * the motion field is. (A ratio of absmv / mv)
  1562      */
  1563     if (motion_pct > 0.05)
  1565         this_frame_mvr_ratio = fabs(this_frame->mvr_abs) /
  1566                                DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr));
  1568         this_frame_mvc_ratio = fabs(this_frame->mvc_abs) /
  1569                                DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc));
  1571          *mv_ratio_accumulator +=
  1572             (this_frame_mvr_ratio < this_frame->mvr_abs)
  1573                 ? (this_frame_mvr_ratio * motion_pct)
  1574                 : this_frame->mvr_abs * motion_pct;
  1576         *mv_ratio_accumulator +=
  1577             (this_frame_mvc_ratio < this_frame->mvc_abs)
  1578                 ? (this_frame_mvc_ratio * motion_pct)
  1579                 : this_frame->mvc_abs * motion_pct;
  1584 /* Calculate a baseline boost number for the current frame. */
  1585 static double calc_frame_boost(
  1586     VP8_COMP *cpi,
  1587     FIRSTPASS_STATS * this_frame,
  1588     double this_frame_mv_in_out )
  1590     double frame_boost;
  1592     /* Underlying boost factor is based on inter intra error ratio */
  1593     if (this_frame->intra_error > cpi->twopass.gf_intra_err_min)
  1594         frame_boost = (IIFACTOR * this_frame->intra_error /
  1595                       DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
  1596     else
  1597         frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min /
  1598                       DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
  1600     /* Increase boost for frames where new data coming into frame
  1601      * (eg zoom out). Slightly reduce boost if there is a net balance
  1602      * of motion out of the frame (zoom in).
  1603      * The range for this_frame_mv_in_out is -1.0 to +1.0
  1604      */
  1605     if (this_frame_mv_in_out > 0.0)
  1606         frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
  1607     /* In extreme case boost is halved */
  1608     else
  1609         frame_boost += frame_boost * (this_frame_mv_in_out / 2.0);
  1611     /* Clip to maximum */
  1612     if (frame_boost > GF_RMAX)
  1613         frame_boost = GF_RMAX;
  1615     return frame_boost;
  1618 #if NEW_BOOST
  1619 static int calc_arf_boost(
  1620     VP8_COMP *cpi,
  1621     int offset,
  1622     int f_frames,
  1623     int b_frames,
  1624     int *f_boost,
  1625     int *b_boost )
  1627     FIRSTPASS_STATS this_frame;
  1629     int i;
  1630     double boost_score = 0.0;
  1631     double mv_ratio_accumulator = 0.0;
  1632     double decay_accumulator = 1.0;
  1633     double this_frame_mv_in_out = 0.0;
  1634     double mv_in_out_accumulator = 0.0;
  1635     double abs_mv_in_out_accumulator = 0.0;
  1636     double r;
  1637     int flash_detected = 0;
  1639     /* Search forward from the proposed arf/next gf position */
  1640     for ( i = 0; i < f_frames; i++ )
  1642         if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
  1643             break;
  1645         /* Update the motion related elements to the boost calculation */
  1646         accumulate_frame_motion_stats( cpi, &this_frame,
  1647             &this_frame_mv_in_out, &mv_in_out_accumulator,
  1648             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
  1650         /* Calculate the baseline boost number for this frame */
  1651         r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
  1653         /* We want to discount the the flash frame itself and the recovery
  1654          * frame that follows as both will have poor scores.
  1655          */
  1656         flash_detected = detect_flash(cpi, (i+offset)) ||
  1657                          detect_flash(cpi, (i+offset+1));
  1659         /* Cumulative effect of prediction quality decay */
  1660         if ( !flash_detected )
  1662             decay_accumulator =
  1663                 decay_accumulator *
  1664                 get_prediction_decay_rate(cpi, &this_frame);
  1665             decay_accumulator =
  1666                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
  1668         boost_score += (decay_accumulator * r);
  1670         /* Break out conditions. */
  1671         if  ( (!flash_detected) &&
  1672               ((mv_ratio_accumulator > 100.0) ||
  1673                (abs_mv_in_out_accumulator > 3.0) ||
  1674                (mv_in_out_accumulator < -2.0) ) )
  1676             break;
  1680     *f_boost = (int)(boost_score * 100.0) >> 4;
  1682     /* Reset for backward looking loop */
  1683     boost_score = 0.0;
  1684     mv_ratio_accumulator = 0.0;
  1685     decay_accumulator = 1.0;
  1686     this_frame_mv_in_out = 0.0;
  1687     mv_in_out_accumulator = 0.0;
  1688     abs_mv_in_out_accumulator = 0.0;
  1690     /* Search forward from the proposed arf/next gf position */
  1691     for ( i = -1; i >= -b_frames; i-- )
  1693         if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
  1694             break;
  1696         /* Update the motion related elements to the boost calculation */
  1697         accumulate_frame_motion_stats( cpi, &this_frame,
  1698             &this_frame_mv_in_out, &mv_in_out_accumulator,
  1699             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
  1701         /* Calculate the baseline boost number for this frame */
  1702         r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
  1704         /* We want to discount the the flash frame itself and the recovery
  1705          * frame that follows as both will have poor scores.
  1706          */
  1707         flash_detected = detect_flash(cpi, (i+offset)) ||
  1708                          detect_flash(cpi, (i+offset+1));
  1710         /* Cumulative effect of prediction quality decay */
  1711         if ( !flash_detected )
  1713             decay_accumulator =
  1714                 decay_accumulator *
  1715                 get_prediction_decay_rate(cpi, &this_frame);
  1716             decay_accumulator =
  1717                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
  1720         boost_score += (decay_accumulator * r);
  1722         /* Break out conditions. */
  1723         if  ( (!flash_detected) &&
  1724               ((mv_ratio_accumulator > 100.0) ||
  1725                (abs_mv_in_out_accumulator > 3.0) ||
  1726                (mv_in_out_accumulator < -2.0) ) )
  1728             break;
  1731     *b_boost = (int)(boost_score * 100.0) >> 4;
  1733     return (*f_boost + *b_boost);
  1735 #endif
  1737 /* Analyse and define a gf/arf group . */
  1738 static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
  1740     FIRSTPASS_STATS next_frame;
  1741     FIRSTPASS_STATS *start_pos;
  1742     int i;
  1743     double r;
  1744     double boost_score = 0.0;
  1745     double old_boost_score = 0.0;
  1746     double gf_group_err = 0.0;
  1747     double gf_first_frame_err = 0.0;
  1748     double mod_frame_err = 0.0;
  1750     double mv_ratio_accumulator = 0.0;
  1751     double decay_accumulator = 1.0;
  1753     double loop_decay_rate = 1.00;          /* Starting decay rate */
  1755     double this_frame_mv_in_out = 0.0;
  1756     double mv_in_out_accumulator = 0.0;
  1757     double abs_mv_in_out_accumulator = 0.0;
  1758     double mod_err_per_mb_accumulator = 0.0;
  1760     int max_bits = frame_max_bits(cpi);     /* Max for a single frame */
  1762     unsigned int allow_alt_ref =
  1763                     cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
  1765     int alt_boost = 0;
  1766     int f_boost = 0;
  1767     int b_boost = 0;
  1768     int flash_detected;
  1770     cpi->twopass.gf_group_bits = 0;
  1771     cpi->twopass.gf_decay_rate = 0;
  1773     vp8_clear_system_state();
  1775     start_pos = cpi->twopass.stats_in;
  1777     vpx_memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */
  1779     /* Load stats for the current frame. */
  1780     mod_frame_err = calculate_modified_err(cpi, this_frame);
  1782     /* Note the error of the frame at the start of the group (this will be
  1783      * the GF frame error if we code a normal gf
  1784      */
  1785     gf_first_frame_err = mod_frame_err;
  1787     /* Special treatment if the current frame is a key frame (which is also
  1788      * a gf). If it is then its error score (and hence bit allocation) need
  1789      * to be subtracted out from the calculation for the GF group
  1790      */
  1791     if (cpi->common.frame_type == KEY_FRAME)
  1792         gf_group_err -= gf_first_frame_err;
  1794     /* Scan forward to try and work out how many frames the next gf group
  1795      * should contain and what level of boost is appropriate for the GF
  1796      * or ARF that will be coded with the group
  1797      */
  1798     i = 0;
  1800     while (((i < cpi->twopass.static_scene_max_gf_interval) ||
  1801             ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
  1802            (i < cpi->twopass.frames_to_key))
  1804         i++;
  1806         /* Accumulate error score of frames in this gf group */
  1807         mod_frame_err = calculate_modified_err(cpi, this_frame);
  1809         gf_group_err += mod_frame_err;
  1811         mod_err_per_mb_accumulator +=
  1812             mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs);
  1814         if (EOF == input_stats(cpi, &next_frame))
  1815             break;
  1817         /* Test for the case where there is a brief flash but the prediction
  1818          * quality back to an earlier frame is then restored.
  1819          */
  1820         flash_detected = detect_flash(cpi, 0);
  1822         /* Update the motion related elements to the boost calculation */
  1823         accumulate_frame_motion_stats( cpi, &next_frame,
  1824             &this_frame_mv_in_out, &mv_in_out_accumulator,
  1825             &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
  1827         /* Calculate a baseline boost number for this frame */
  1828         r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out );
  1830         /* Cumulative effect of prediction quality decay */
  1831         if ( !flash_detected )
  1833             loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
  1834             decay_accumulator = decay_accumulator * loop_decay_rate;
  1835             decay_accumulator =
  1836                 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
  1838         boost_score += (decay_accumulator * r);
  1840         /* Break clause to detect very still sections after motion
  1841          * For example a staic image after a fade or other transition.
  1842          */
  1843         if ( detect_transition_to_still( cpi, i, 5,
  1844                                          loop_decay_rate,
  1845                                          decay_accumulator ) )
  1847             allow_alt_ref = 0;
  1848             boost_score = old_boost_score;
  1849             break;
  1852         /* Break out conditions. */
  1853         if  (
  1854             /* Break at cpi->max_gf_interval unless almost totally static */
  1855             (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) ||
  1857                 /* Dont break out with a very short interval */
  1858                 (i > MIN_GF_INTERVAL) &&
  1859                 /* Dont break out very close to a key frame */
  1860                 ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
  1861                 ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
  1862                 (!flash_detected) &&
  1863                 ((mv_ratio_accumulator > 100.0) ||
  1864                  (abs_mv_in_out_accumulator > 3.0) ||
  1865                  (mv_in_out_accumulator < -2.0) ||
  1866                  ((boost_score - old_boost_score) < 2.0))
  1867             ) )
  1869             boost_score = old_boost_score;
  1870             break;
  1873         vpx_memcpy(this_frame, &next_frame, sizeof(*this_frame));
  1875         old_boost_score = boost_score;
  1878     cpi->twopass.gf_decay_rate =
  1879         (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0;
  1881     /* When using CBR apply additional buffer related upper limits */
  1882     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  1884         double max_boost;
  1886         /* For cbr apply buffer related limits */
  1887         if (cpi->drop_frames_allowed)
  1889             int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark *
  1890                                   (cpi->oxcf.optimal_buffer_level / 100);
  1892             if (cpi->buffer_level > df_buffer_level)
  1893                 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
  1894             else
  1895                 max_boost = 0.0;
  1897         else if (cpi->buffer_level > 0)
  1899             max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
  1901         else
  1903             max_boost = 0.0;
  1906         if (boost_score > max_boost)
  1907             boost_score = max_boost;
  1910     /* Dont allow conventional gf too near the next kf */
  1911     if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)
  1913         while (i < cpi->twopass.frames_to_key)
  1915             i++;
  1917             if (EOF == input_stats(cpi, this_frame))
  1918                 break;
  1920             if (i < cpi->twopass.frames_to_key)
  1922                 mod_frame_err = calculate_modified_err(cpi, this_frame);
  1923                 gf_group_err += mod_frame_err;
  1928     cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
  1930 #if NEW_BOOST
  1931     /* Alterrnative boost calculation for alt ref */
  1932     alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost );
  1933 #endif
  1935     /* Should we use the alternate refernce frame */
  1936     if (allow_alt_ref &&
  1937         (i >= MIN_GF_INTERVAL) &&
  1938         /* dont use ARF very near next kf */
  1939         (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
  1940 #if NEW_BOOST
  1941         ((next_frame.pcnt_inter > 0.75) ||
  1942          (next_frame.pcnt_second_ref > 0.5)) &&
  1943         ((mv_in_out_accumulator / (double)i > -0.2) ||
  1944          (mv_in_out_accumulator > -2.0)) &&
  1945         (b_boost > 100) &&
  1946         (f_boost > 100) )
  1947 #else
  1948         (next_frame.pcnt_inter > 0.75) &&
  1949         ((mv_in_out_accumulator / (double)i > -0.2) ||
  1950          (mv_in_out_accumulator > -2.0)) &&
  1951         (cpi->gfu_boost > 100) &&
  1952         (cpi->twopass.gf_decay_rate <=
  1953             (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) )
  1954 #endif
  1956         int Boost;
  1957         int allocation_chunks;
  1958         int Q = (cpi->oxcf.fixed_q < 0)
  1959                 ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
  1960         int tmp_q;
  1961         int arf_frame_bits = 0;
  1962         int group_bits;
  1964 #if NEW_BOOST
  1965         cpi->gfu_boost = alt_boost;
  1966 #endif
  1968         /* Estimate the bits to be allocated to the group as a whole */
  1969         if ((cpi->twopass.kf_group_bits > 0) &&
  1970             (cpi->twopass.kf_group_error_left > 0))
  1972             group_bits = (int)((double)cpi->twopass.kf_group_bits *
  1973                 (gf_group_err / (double)cpi->twopass.kf_group_error_left));
  1975         else
  1976             group_bits = 0;
  1978         /* Boost for arf frame */
  1979 #if NEW_BOOST
  1980         Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
  1981 #else
  1982         Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
  1983 #endif
  1984         Boost += (i * 50);
  1986         /* Set max and minimum boost and hence minimum allocation */
  1987         if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
  1988             Boost = ((cpi->baseline_gf_interval + 1) * 200);
  1989         else if (Boost < 125)
  1990             Boost = 125;
  1992         allocation_chunks = (i * 100) + Boost;
  1994         /* Normalize Altboost and allocations chunck down to prevent overflow */
  1995         while (Boost > 1000)
  1997             Boost /= 2;
  1998             allocation_chunks /= 2;
  2001         /* Calculate the number of bits to be spent on the arf based on the
  2002          * boost number
  2003          */
  2004         arf_frame_bits = (int)((double)Boost * (group_bits /
  2005                                (double)allocation_chunks));
  2007         /* Estimate if there are enough bits available to make worthwhile use
  2008          * of an arf.
  2009          */
  2010         tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits);
  2012         /* Only use an arf if it is likely we will be able to code
  2013          * it at a lower Q than the surrounding frames.
  2014          */
  2015         if (tmp_q < cpi->worst_quality)
  2017             int half_gf_int;
  2018             int frames_after_arf;
  2019             int frames_bwd = cpi->oxcf.arnr_max_frames - 1;
  2020             int frames_fwd = cpi->oxcf.arnr_max_frames - 1;
  2022             cpi->source_alt_ref_pending = 1;
  2024             /*
  2025              * For alt ref frames the error score for the end frame of the
  2026              * group (the alt ref frame) should not contribute to the group
  2027              * total and hence the number of bit allocated to the group.
  2028              * Rather it forms part of the next group (it is the GF at the
  2029              * start of the next group)
  2030              * gf_group_err -= mod_frame_err;
  2032              * For alt ref frames alt ref frame is technically part of the
  2033              * GF frame for the next group but we always base the error
  2034              * calculation and bit allocation on the current group of frames.
  2036              * Set the interval till the next gf or arf.
  2037              * For ARFs this is the number of frames to be coded before the
  2038              * future frame that is coded as an ARF.
  2039              * The future frame itself is part of the next group
  2040              */
  2041             cpi->baseline_gf_interval = i;
  2043             /*
  2044              * Define the arnr filter width for this group of frames:
  2045              * We only filter frames that lie within a distance of half
  2046              * the GF interval from the ARF frame. We also have to trap
  2047              * cases where the filter extends beyond the end of clip.
  2048              * Note: this_frame->frame has been updated in the loop
  2049              * so it now points at the ARF frame.
  2050              */
  2051             half_gf_int = cpi->baseline_gf_interval >> 1;
  2052             frames_after_arf = (int)(cpi->twopass.total_stats.count -
  2053                                this_frame->frame - 1);
  2055             switch (cpi->oxcf.arnr_type)
  2057             case 1: /* Backward filter */
  2058                 frames_fwd = 0;
  2059                 if (frames_bwd > half_gf_int)
  2060                     frames_bwd = half_gf_int;
  2061                 break;
  2063             case 2: /* Forward filter */
  2064                 if (frames_fwd > half_gf_int)
  2065                     frames_fwd = half_gf_int;
  2066                 if (frames_fwd > frames_after_arf)
  2067                     frames_fwd = frames_after_arf;
  2068                 frames_bwd = 0;
  2069                 break;
  2071             case 3: /* Centered filter */
  2072             default:
  2073                 frames_fwd >>= 1;
  2074                 if (frames_fwd > frames_after_arf)
  2075                     frames_fwd = frames_after_arf;
  2076                 if (frames_fwd > half_gf_int)
  2077                     frames_fwd = half_gf_int;
  2079                 frames_bwd = frames_fwd;
  2081                 /* For even length filter there is one more frame backward
  2082                  * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
  2083                  */
  2084                 if (frames_bwd < half_gf_int)
  2085                     frames_bwd += (cpi->oxcf.arnr_max_frames+1) & 0x1;
  2086                 break;
  2089             cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
  2091         else
  2093             cpi->source_alt_ref_pending = 0;
  2094             cpi->baseline_gf_interval = i;
  2097     else
  2099         cpi->source_alt_ref_pending = 0;
  2100         cpi->baseline_gf_interval = i;
  2103     /*
  2104      * Now decide how many bits should be allocated to the GF group as  a
  2105      * proportion of those remaining in the kf group.
  2106      * The final key frame group in the clip is treated as a special case
  2107      * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
  2108      * This is also important for short clips where there may only be one
  2109      * key frame.
  2110      */
  2111     if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count -
  2112                                             cpi->common.current_video_frame))
  2114         cpi->twopass.kf_group_bits =
  2115             (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
  2118     /* Calculate the bits to be allocated to the group as a whole */
  2119     if ((cpi->twopass.kf_group_bits > 0) &&
  2120         (cpi->twopass.kf_group_error_left > 0))
  2122         cpi->twopass.gf_group_bits =
  2123             (int64_t)(cpi->twopass.kf_group_bits *
  2124                       (gf_group_err / cpi->twopass.kf_group_error_left));
  2126     else
  2127         cpi->twopass.gf_group_bits = 0;
  2129     cpi->twopass.gf_group_bits =
  2130         (cpi->twopass.gf_group_bits < 0)
  2131             ? 0
  2132             : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits)
  2133                 ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits;
  2135     /* Clip cpi->twopass.gf_group_bits based on user supplied data rate
  2136      * variability limit (cpi->oxcf.two_pass_vbrmax_section)
  2137      */
  2138     if (cpi->twopass.gf_group_bits >
  2139         (int64_t)max_bits * cpi->baseline_gf_interval)
  2140         cpi->twopass.gf_group_bits =
  2141             (int64_t)max_bits * cpi->baseline_gf_interval;
  2143     /* Reset the file position */
  2144     reset_fpf_position(cpi, start_pos);
  2146     /* Update the record of error used so far (only done once per gf group) */
  2147     cpi->twopass.modified_error_used += gf_group_err;
  2149     /* Assign  bits to the arf or gf. */
  2150     for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) {
  2151         int Boost;
  2152         int allocation_chunks;
  2153         int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
  2154         int gf_bits;
  2156         /* For ARF frames */
  2157         if (cpi->source_alt_ref_pending && i == 0)
  2159 #if NEW_BOOST
  2160             Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
  2161 #else
  2162             Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
  2163 #endif
  2164             Boost += (cpi->baseline_gf_interval * 50);
  2166             /* Set max and minimum boost and hence minimum allocation */
  2167             if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
  2168                 Boost = ((cpi->baseline_gf_interval + 1) * 200);
  2169             else if (Boost < 125)
  2170                 Boost = 125;
  2172             allocation_chunks =
  2173                 ((cpi->baseline_gf_interval + 1) * 100) + Boost;
  2175         /* Else for standard golden frames */
  2176         else
  2178             /* boost based on inter / intra ratio of subsequent frames */
  2179             Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100;
  2181             /* Set max and minimum boost and hence minimum allocation */
  2182             if (Boost > (cpi->baseline_gf_interval * 150))
  2183                 Boost = (cpi->baseline_gf_interval * 150);
  2184             else if (Boost < 125)
  2185                 Boost = 125;
  2187             allocation_chunks =
  2188                 (cpi->baseline_gf_interval * 100) + (Boost - 100);
  2191         /* Normalize Altboost and allocations chunck down to prevent overflow */
  2192         while (Boost > 1000)
  2194             Boost /= 2;
  2195             allocation_chunks /= 2;
  2198         /* Calculate the number of bits to be spent on the gf or arf based on
  2199          * the boost number
  2200          */
  2201         gf_bits = (int)((double)Boost *
  2202                         (cpi->twopass.gf_group_bits /
  2203                          (double)allocation_chunks));
  2205         /* If the frame that is to be boosted is simpler than the average for
  2206          * the gf/arf group then use an alternative calculation
  2207          * based on the error score of the frame itself
  2208          */
  2209         if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval)
  2211             double  alt_gf_grp_bits;
  2212             int     alt_gf_bits;
  2214             alt_gf_grp_bits =
  2215                 (double)cpi->twopass.kf_group_bits  *
  2216                 (mod_frame_err * (double)cpi->baseline_gf_interval) /
  2217                 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left);
  2219             alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits /
  2220                                                  (double)allocation_chunks));
  2222             if (gf_bits > alt_gf_bits)
  2224                 gf_bits = alt_gf_bits;
  2227         /* Else if it is harder than other frames in the group make sure it at
  2228          * least receives an allocation in keeping with its relative error
  2229          * score, otherwise it may be worse off than an "un-boosted" frame
  2230          */
  2231         else
  2233             int alt_gf_bits =
  2234                 (int)((double)cpi->twopass.kf_group_bits *
  2235                       mod_frame_err /
  2236                       DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left));
  2238             if (alt_gf_bits > gf_bits)
  2240                 gf_bits = alt_gf_bits;
  2244         /* Apply an additional limit for CBR */
  2245         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  2247             if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1))
  2248                 cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1);
  2251         /* Dont allow a negative value for gf_bits */
  2252         if (gf_bits < 0)
  2253             gf_bits = 0;
  2255         /* Add in minimum for a frame */
  2256         gf_bits += cpi->min_frame_bandwidth;
  2258         if (i == 0)
  2260             cpi->twopass.gf_bits = gf_bits;
  2262         if (i == 1 || (!cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)))
  2264             /* Per frame bit target for this frame */
  2265             cpi->per_frame_bandwidth = gf_bits;
  2270         /* Adjust KF group bits and error remainin */
  2271         cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err;
  2272         cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits;
  2274         if (cpi->twopass.kf_group_bits < 0)
  2275             cpi->twopass.kf_group_bits = 0;
  2277         /* Note the error score left in the remaining frames of the group.
  2278          * For normal GFs we want to remove the error score for the first
  2279          * frame of the group (except in Key frame case where this has
  2280          * already happened)
  2281          */
  2282         if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
  2283             cpi->twopass.gf_group_error_left = (int)(gf_group_err -
  2284                                                      gf_first_frame_err);
  2285         else
  2286             cpi->twopass.gf_group_error_left = (int) gf_group_err;
  2288         cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits - cpi->min_frame_bandwidth;
  2290         if (cpi->twopass.gf_group_bits < 0)
  2291             cpi->twopass.gf_group_bits = 0;
  2293         /* This condition could fail if there are two kfs very close together
  2294          * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the
  2295          * calculation of cpi->twopass.alt_extra_bits.
  2296          */
  2297         if ( cpi->baseline_gf_interval >= 3 )
  2299 #if NEW_BOOST
  2300             int boost = (cpi->source_alt_ref_pending)
  2301                         ? b_boost : cpi->gfu_boost;
  2302 #else
  2303             int boost = cpi->gfu_boost;
  2304 #endif
  2305             if ( boost >= 150 )
  2307                 int pct_extra;
  2309                 pct_extra = (boost - 100) / 50;
  2310                 pct_extra = (pct_extra > 20) ? 20 : pct_extra;
  2312                 cpi->twopass.alt_extra_bits =
  2313                     (cpi->twopass.gf_group_bits * pct_extra) / 100;
  2314                 cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits;
  2315                 cpi->twopass.alt_extra_bits /=
  2316                     ((cpi->baseline_gf_interval-1)>>1);
  2318             else
  2319                 cpi->twopass.alt_extra_bits = 0;
  2321         else
  2322             cpi->twopass.alt_extra_bits = 0;
  2325     /* Adjustments based on a measure of complexity of the section */
  2326     if (cpi->common.frame_type != KEY_FRAME)
  2328         FIRSTPASS_STATS sectionstats;
  2329         double Ratio;
  2331         zero_stats(&sectionstats);
  2332         reset_fpf_position(cpi, start_pos);
  2334         for (i = 0 ; i < cpi->baseline_gf_interval ; i++)
  2336             input_stats(cpi, &next_frame);
  2337             accumulate_stats(&sectionstats, &next_frame);
  2340         avg_stats(&sectionstats);
  2342         cpi->twopass.section_intra_rating = (unsigned int)
  2343             (sectionstats.intra_error /
  2344             DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
  2346         Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
  2347         cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
  2349         if (cpi->twopass.section_max_qfactor < 0.80)
  2350             cpi->twopass.section_max_qfactor = 0.80;
  2352         reset_fpf_position(cpi, start_pos);
  2356 /* Allocate bits to a normal frame that is neither a gf an arf or a key frame. */
  2357 static void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
  2359     int    target_frame_size;
  2361     double modified_err;
  2362     double err_fraction;
  2364     int max_bits = frame_max_bits(cpi);  /* Max for a single frame */
  2366     /* Calculate modified prediction error used in bit allocation */
  2367     modified_err = calculate_modified_err(cpi, this_frame);
  2369     /* What portion of the remaining GF group error is used by this frame */
  2370     if (cpi->twopass.gf_group_error_left > 0)
  2371         err_fraction = modified_err / cpi->twopass.gf_group_error_left;
  2372     else
  2373         err_fraction = 0.0;
  2375     /* How many of those bits available for allocation should we give it? */
  2376     target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction);
  2378     /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits)
  2379      * at the top end.
  2380      */
  2381     if (target_frame_size < 0)
  2382         target_frame_size = 0;
  2383     else
  2385         if (target_frame_size > max_bits)
  2386             target_frame_size = max_bits;
  2388         if (target_frame_size > cpi->twopass.gf_group_bits)
  2389             target_frame_size = cpi->twopass.gf_group_bits;
  2392     /* Adjust error and bits remaining */
  2393     cpi->twopass.gf_group_error_left -= (int)modified_err;
  2394     cpi->twopass.gf_group_bits -= target_frame_size;
  2396     if (cpi->twopass.gf_group_bits < 0)
  2397         cpi->twopass.gf_group_bits = 0;
  2399     /* Add in the minimum number of bits that is set aside for every frame. */
  2400     target_frame_size += cpi->min_frame_bandwidth;
  2402     /* Every other frame gets a few extra bits */
  2403     if ( (cpi->frames_since_golden & 0x01) &&
  2404          (cpi->frames_till_gf_update_due > 0) )
  2406         target_frame_size += cpi->twopass.alt_extra_bits;
  2409     /* Per frame bit target for this frame */
  2410     cpi->per_frame_bandwidth = target_frame_size;
  2413 void vp8_second_pass(VP8_COMP *cpi)
  2415     int tmp_q;
  2416     int frames_left = (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame);
  2418     FIRSTPASS_STATS this_frame = {0};
  2419     FIRSTPASS_STATS this_frame_copy;
  2421     double this_frame_intra_error;
  2422     double this_frame_coded_error;
  2424     int overhead_bits;
  2426     if (!cpi->twopass.stats_in)
  2428         return ;
  2431     vp8_clear_system_state();
  2433     if (EOF == input_stats(cpi, &this_frame))
  2434         return;
  2436     this_frame_intra_error = this_frame.intra_error;
  2437     this_frame_coded_error = this_frame.coded_error;
  2439     /* keyframe and section processing ! */
  2440     if (cpi->twopass.frames_to_key == 0)
  2442         /* Define next KF group and assign bits to it */
  2443         vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
  2444         find_next_key_frame(cpi, &this_frame_copy);
  2446         /* Special case: Error error_resilient_mode mode does not make much
  2447          * sense for two pass but with its current meaning but this code is
  2448          * designed to stop outlandish behaviour if someone does set it when
  2449          * using two pass. It effectively disables GF groups. This is
  2450          * temporary code till we decide what should really happen in this
  2451          * case.
  2452          */
  2453         if (cpi->oxcf.error_resilient_mode)
  2455             cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits;
  2456             cpi->twopass.gf_group_error_left =
  2457                                   (int)cpi->twopass.kf_group_error_left;
  2458             cpi->baseline_gf_interval = cpi->twopass.frames_to_key;
  2459             cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
  2460             cpi->source_alt_ref_pending = 0;
  2465     /* Is this a GF / ARF (Note that a KF is always also a GF) */
  2466     if (cpi->frames_till_gf_update_due == 0)
  2468         /* Define next gf group and assign bits to it */
  2469         vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
  2470         define_gf_group(cpi, &this_frame_copy);
  2472         /* If we are going to code an altref frame at the end of the group
  2473          * and the current frame is not a key frame.... If the previous
  2474          * group used an arf this frame has already benefited from that arf
  2475          * boost and it should not be given extra bits If the previous
  2476          * group was NOT coded using arf we may want to apply some boost to
  2477          * this GF as well
  2478          */
  2479         if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME))
  2481             /* Assign a standard frames worth of bits from those allocated
  2482              * to the GF group
  2483              */
  2484             int bak = cpi->per_frame_bandwidth;
  2485             vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
  2486             assign_std_frame_bits(cpi, &this_frame_copy);
  2487             cpi->per_frame_bandwidth = bak;
  2491     /* Otherwise this is an ordinary frame */
  2492     else
  2494         /* Special case: Error error_resilient_mode mode does not make much
  2495          * sense for two pass but with its current meaning but this code is
  2496          * designed to stop outlandish behaviour if someone does set it
  2497          * when using two pass. It effectively disables GF groups. This is
  2498          * temporary code till we decide what should really happen in this
  2499          * case.
  2500          */
  2501         if (cpi->oxcf.error_resilient_mode)
  2503             cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key;
  2505             if (cpi->common.frame_type != KEY_FRAME)
  2507                 /* Assign bits from those allocated to the GF group */
  2508                 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
  2509                 assign_std_frame_bits(cpi, &this_frame_copy);
  2512         else
  2514             /* Assign bits from those allocated to the GF group */
  2515             vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
  2516             assign_std_frame_bits(cpi, &this_frame_copy);
  2520     /* Keep a globally available copy of this and the next frame's iiratio. */
  2521     cpi->twopass.this_iiratio = (unsigned int)(this_frame_intra_error /
  2522                         DOUBLE_DIVIDE_CHECK(this_frame_coded_error));
  2524         FIRSTPASS_STATS next_frame;
  2525         if ( lookup_next_frame_stats(cpi, &next_frame) != EOF )
  2527             cpi->twopass.next_iiratio = (unsigned int)(next_frame.intra_error /
  2528                                 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
  2532     /* Set nominal per second bandwidth for this frame */
  2533     cpi->target_bandwidth = (int)
  2534     (cpi->per_frame_bandwidth * cpi->output_framerate);
  2535     if (cpi->target_bandwidth < 0)
  2536         cpi->target_bandwidth = 0;
  2539     /* Account for mv, mode and other overheads. */
  2540     overhead_bits = (int)estimate_modemvcost(
  2541                         cpi, &cpi->twopass.total_left_stats );
  2543     /* Special case code for first frame. */
  2544     if (cpi->common.current_video_frame == 0)
  2546         cpi->twopass.est_max_qcorrection_factor = 1.0;
  2548         /* Set a cq_level in constrained quality mode. */
  2549         if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
  2551             int est_cq;
  2553             est_cq =
  2554                 estimate_cq( cpi,
  2555                              &cpi->twopass.total_left_stats,
  2556                              (int)(cpi->twopass.bits_left / frames_left),
  2557                              overhead_bits );
  2559             cpi->cq_target_quality = cpi->oxcf.cq_level;
  2560             if ( est_cq > cpi->cq_target_quality )
  2561                 cpi->cq_target_quality = est_cq;
  2564         /* guess at maxq needed in 2nd pass */
  2565         cpi->twopass.maxq_max_limit = cpi->worst_quality;
  2566         cpi->twopass.maxq_min_limit = cpi->best_quality;
  2568         tmp_q = estimate_max_q(
  2569                     cpi,
  2570                     &cpi->twopass.total_left_stats,
  2571                     (int)(cpi->twopass.bits_left / frames_left),
  2572                     overhead_bits );
  2574         /* Limit the maxq value returned subsequently.
  2575          * This increases the risk of overspend or underspend if the initial
  2576          * estimate for the clip is bad, but helps prevent excessive
  2577          * variation in Q, especially near the end of a clip
  2578          * where for example a small overspend may cause Q to crash
  2579          */
  2580         cpi->twopass.maxq_max_limit = ((tmp_q + 32) < cpi->worst_quality)
  2581                                   ? (tmp_q + 32) : cpi->worst_quality;
  2582         cpi->twopass.maxq_min_limit = ((tmp_q - 32) > cpi->best_quality)
  2583                                   ? (tmp_q - 32) : cpi->best_quality;
  2585         cpi->active_worst_quality         = tmp_q;
  2586         cpi->ni_av_qi                     = tmp_q;
  2589     /* The last few frames of a clip almost always have to few or too many
  2590      * bits and for the sake of over exact rate control we dont want to make
  2591      * radical adjustments to the allowed quantizer range just to use up a
  2592      * few surplus bits or get beneath the target rate.
  2593      */
  2594     else if ( (cpi->common.current_video_frame <
  2595                  (((unsigned int)cpi->twopass.total_stats.count * 255)>>8)) &&
  2596               ((cpi->common.current_video_frame + cpi->baseline_gf_interval) <
  2597                  (unsigned int)cpi->twopass.total_stats.count) )
  2599         if (frames_left < 1)
  2600             frames_left = 1;
  2602         tmp_q = estimate_max_q(
  2603                     cpi,
  2604                     &cpi->twopass.total_left_stats,
  2605                     (int)(cpi->twopass.bits_left / frames_left),
  2606                     overhead_bits );
  2608         /* Move active_worst_quality but in a damped way */
  2609         if (tmp_q > cpi->active_worst_quality)
  2610             cpi->active_worst_quality ++;
  2611         else if (tmp_q < cpi->active_worst_quality)
  2612             cpi->active_worst_quality --;
  2614         cpi->active_worst_quality =
  2615             ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4;
  2618     cpi->twopass.frames_to_key --;
  2620     /* Update the total stats remaining sturcture */
  2621     subtract_stats(&cpi->twopass.total_left_stats, &this_frame );
  2625 static int test_candidate_kf(VP8_COMP *cpi,  FIRSTPASS_STATS *last_frame, FIRSTPASS_STATS *this_frame, FIRSTPASS_STATS *next_frame)
  2627     int is_viable_kf = 0;
  2629     /* Does the frame satisfy the primary criteria of a key frame
  2630      *      If so, then examine how well it predicts subsequent frames
  2631      */
  2632     if ((this_frame->pcnt_second_ref < 0.10) &&
  2633         (next_frame->pcnt_second_ref < 0.10) &&
  2634         ((this_frame->pcnt_inter < 0.05) ||
  2636              ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) &&
  2637              ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) &&
  2638              ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > .40) ||
  2639               (fabs(last_frame->intra_error - this_frame->intra_error) / DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > .40) ||
  2640               ((next_frame->intra_error / DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5)
  2646         int i;
  2647         FIRSTPASS_STATS *start_pos;
  2649         FIRSTPASS_STATS local_next_frame;
  2651         double boost_score = 0.0;
  2652         double old_boost_score = 0.0;
  2653         double decay_accumulator = 1.0;
  2654         double next_iiratio;
  2656         vpx_memcpy(&local_next_frame, next_frame, sizeof(*next_frame));
  2658         /* Note the starting file position so we can reset to it */
  2659         start_pos = cpi->twopass.stats_in;
  2661         /* Examine how well the key frame predicts subsequent frames */
  2662         for (i = 0 ; i < 16; i++)
  2664             next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)) ;
  2666             if (next_iiratio > RMAX)
  2667                 next_iiratio = RMAX;
  2669             /* Cumulative effect of decay in prediction quality */
  2670             if (local_next_frame.pcnt_inter > 0.85)
  2671                 decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
  2672             else
  2673                 decay_accumulator = decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0);
  2675             /* Keep a running total */
  2676             boost_score += (decay_accumulator * next_iiratio);
  2678             /* Test various breakout clauses */
  2679             if ((local_next_frame.pcnt_inter < 0.05) ||
  2680                 (next_iiratio < 1.5) ||
  2681                 (((local_next_frame.pcnt_inter -
  2682                    local_next_frame.pcnt_neutral) < 0.20) &&
  2683                  (next_iiratio < 3.0)) ||
  2684                 ((boost_score - old_boost_score) < 0.5) ||
  2685                 (local_next_frame.intra_error < 200)
  2688                 break;
  2691             old_boost_score = boost_score;
  2693             /* Get the next frame details */
  2694             if (EOF == input_stats(cpi, &local_next_frame))
  2695                 break;
  2698         /* If there is tolerable prediction for at least the next 3 frames
  2699          * then break out else discard this pottential key frame and move on
  2700          */
  2701         if (boost_score > 5.0 && (i > 3))
  2702             is_viable_kf = 1;
  2703         else
  2705             /* Reset the file position */
  2706             reset_fpf_position(cpi, start_pos);
  2708             is_viable_kf = 0;
  2712     return is_viable_kf;
  2714 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
  2716     int i,j;
  2717     FIRSTPASS_STATS last_frame;
  2718     FIRSTPASS_STATS first_frame;
  2719     FIRSTPASS_STATS next_frame;
  2720     FIRSTPASS_STATS *start_position;
  2722     double decay_accumulator = 1.0;
  2723     double boost_score = 0;
  2724     double old_boost_score = 0.0;
  2725     double loop_decay_rate;
  2727     double kf_mod_err = 0.0;
  2728     double kf_group_err = 0.0;
  2729     double kf_group_intra_err = 0.0;
  2730     double kf_group_coded_err = 0.0;
  2731     double recent_loop_decay[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0};
  2733     vpx_memset(&next_frame, 0, sizeof(next_frame));
  2735     vp8_clear_system_state();
  2736     start_position = cpi->twopass.stats_in;
  2738     cpi->common.frame_type = KEY_FRAME;
  2740     /* is this a forced key frame by interval */
  2741     cpi->this_key_frame_forced = cpi->next_key_frame_forced;
  2743     /* Clear the alt ref active flag as this can never be active on a key
  2744      * frame
  2745      */
  2746     cpi->source_alt_ref_active = 0;
  2748     /* Kf is always a gf so clear frames till next gf counter */
  2749     cpi->frames_till_gf_update_due = 0;
  2751     cpi->twopass.frames_to_key = 1;
  2753     /* Take a copy of the initial frame details */
  2754     vpx_memcpy(&first_frame, this_frame, sizeof(*this_frame));
  2756     cpi->twopass.kf_group_bits = 0;
  2757     cpi->twopass.kf_group_error_left = 0;
  2759     kf_mod_err = calculate_modified_err(cpi, this_frame);
  2761     /* find the next keyframe */
  2762     i = 0;
  2763     while (cpi->twopass.stats_in < cpi->twopass.stats_in_end)
  2765         /* Accumulate kf group error */
  2766         kf_group_err += calculate_modified_err(cpi, this_frame);
  2768         /* These figures keep intra and coded error counts for all frames
  2769          * including key frames in the group. The effect of the key frame
  2770          * itself can be subtracted out using the first_frame data
  2771          * collected above
  2772          */
  2773         kf_group_intra_err += this_frame->intra_error;
  2774         kf_group_coded_err += this_frame->coded_error;
  2776         /* load a the next frame's stats */
  2777         vpx_memcpy(&last_frame, this_frame, sizeof(*this_frame));
  2778         input_stats(cpi, this_frame);
  2780         /* Provided that we are not at the end of the file... */
  2781         if (cpi->oxcf.auto_key
  2782             && lookup_next_frame_stats(cpi, &next_frame) != EOF)
  2784             /* Normal scene cut check */
  2785             if ( ( i >= MIN_GF_INTERVAL ) &&
  2786                  test_candidate_kf(cpi, &last_frame, this_frame, &next_frame) )
  2788                 break;
  2791             /* How fast is prediction quality decaying */
  2792             loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
  2794             /* We want to know something about the recent past... rather than
  2795              * as used elsewhere where we are concened with decay in prediction
  2796              * quality since the last GF or KF.
  2797              */
  2798             recent_loop_decay[i%8] = loop_decay_rate;
  2799             decay_accumulator = 1.0;
  2800             for (j = 0; j < 8; j++)
  2802                 decay_accumulator = decay_accumulator * recent_loop_decay[j];
  2805             /* Special check for transition or high motion followed by a
  2806              * static scene.
  2807              */
  2808             if ( detect_transition_to_still( cpi, i,
  2809                                              (cpi->key_frame_frequency-i),
  2810                                              loop_decay_rate,
  2811                                              decay_accumulator ) )
  2813                 break;
  2817             /* Step on to the next frame */
  2818             cpi->twopass.frames_to_key ++;
  2820             /* If we don't have a real key frame within the next two
  2821              * forcekeyframeevery intervals then break out of the loop.
  2822              */
  2823             if (cpi->twopass.frames_to_key >= 2 *(int)cpi->key_frame_frequency)
  2824                 break;
  2825         } else
  2826             cpi->twopass.frames_to_key ++;
  2828         i++;
  2831     /* If there is a max kf interval set by the user we must obey it.
  2832      * We already breakout of the loop above at 2x max.
  2833      * This code centers the extra kf if the actual natural
  2834      * interval is between 1x and 2x
  2835      */
  2836     if (cpi->oxcf.auto_key
  2837         && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency )
  2839         FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
  2840         FIRSTPASS_STATS tmp_frame;
  2842         cpi->twopass.frames_to_key /= 2;
  2844         /* Copy first frame details */
  2845         vpx_memcpy(&tmp_frame, &first_frame, sizeof(first_frame));
  2847         /* Reset to the start of the group */
  2848         reset_fpf_position(cpi, start_position);
  2850         kf_group_err = 0;
  2851         kf_group_intra_err = 0;
  2852         kf_group_coded_err = 0;
  2854         /* Rescan to get the correct error data for the forced kf group */
  2855         for( i = 0; i < cpi->twopass.frames_to_key; i++ )
  2857             /* Accumulate kf group errors */
  2858             kf_group_err += calculate_modified_err(cpi, &tmp_frame);
  2859             kf_group_intra_err += tmp_frame.intra_error;
  2860             kf_group_coded_err += tmp_frame.coded_error;
  2862             /* Load a the next frame's stats */
  2863             input_stats(cpi, &tmp_frame);
  2866         /* Reset to the start of the group */
  2867         reset_fpf_position(cpi, current_pos);
  2869         cpi->next_key_frame_forced = 1;
  2871     else
  2872         cpi->next_key_frame_forced = 0;
  2874     /* Special case for the last frame of the file */
  2875     if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
  2877         /* Accumulate kf group error */
  2878         kf_group_err += calculate_modified_err(cpi, this_frame);
  2880         /* These figures keep intra and coded error counts for all frames
  2881          * including key frames in the group. The effect of the key frame
  2882          * itself can be subtracted out using the first_frame data
  2883          * collected above
  2884          */
  2885         kf_group_intra_err += this_frame->intra_error;
  2886         kf_group_coded_err += this_frame->coded_error;
  2889     /* Calculate the number of bits that should be assigned to the kf group. */
  2890     if ((cpi->twopass.bits_left > 0) && (cpi->twopass.modified_error_left > 0.0))
  2892         /* Max for a single normal frame (not key frame) */
  2893         int max_bits = frame_max_bits(cpi);
  2895         /* Maximum bits for the kf group */
  2896         int64_t max_grp_bits;
  2898         /* Default allocation based on bits left and relative
  2899          * complexity of the section
  2900          */
  2901         cpi->twopass.kf_group_bits = (int64_t)( cpi->twopass.bits_left *
  2902                                           ( kf_group_err /
  2903                                             cpi->twopass.modified_error_left ));
  2905         /* Clip based on maximum per frame rate defined by the user. */
  2906         max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
  2907         if (cpi->twopass.kf_group_bits > max_grp_bits)
  2908             cpi->twopass.kf_group_bits = max_grp_bits;
  2910         /* Additional special case for CBR if buffer is getting full. */
  2911         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  2913             int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level;
  2914             int64_t buffer_lvl = cpi->buffer_level;
  2916             /* If the buffer is near or above the optimal and this kf group is
  2917              * not being allocated much then increase the allocation a bit.
  2918              */
  2919             if (buffer_lvl >= opt_buffer_lvl)
  2921                 int64_t high_water_mark = (opt_buffer_lvl +
  2922                                        cpi->oxcf.maximum_buffer_size) >> 1;
  2924                 int64_t av_group_bits;
  2926                 /* Av bits per frame * number of frames */
  2927                 av_group_bits = (int64_t)cpi->av_per_frame_bandwidth *
  2928                                 (int64_t)cpi->twopass.frames_to_key;
  2930                 /* We are at or above the maximum. */
  2931                 if (cpi->buffer_level >= high_water_mark)
  2933                     int64_t min_group_bits;
  2935                     min_group_bits = av_group_bits +
  2936                                      (int64_t)(buffer_lvl -
  2937                                                  high_water_mark);
  2939                     if (cpi->twopass.kf_group_bits < min_group_bits)
  2940                         cpi->twopass.kf_group_bits = min_group_bits;
  2942                 /* We are above optimal but below the maximum */
  2943                 else if (cpi->twopass.kf_group_bits < av_group_bits)
  2945                     int64_t bits_below_av = av_group_bits -
  2946                                               cpi->twopass.kf_group_bits;
  2948                     cpi->twopass.kf_group_bits +=
  2949                        (int64_t)((double)bits_below_av *
  2950                                    (double)(buffer_lvl - opt_buffer_lvl) /
  2951                                    (double)(high_water_mark - opt_buffer_lvl));
  2956     else
  2957         cpi->twopass.kf_group_bits = 0;
  2959     /* Reset the first pass file position */
  2960     reset_fpf_position(cpi, start_position);
  2962     /* determine how big to make this keyframe based on how well the
  2963      * subsequent frames use inter blocks
  2964      */
  2965     decay_accumulator = 1.0;
  2966     boost_score = 0.0;
  2967     loop_decay_rate = 1.00;       /* Starting decay rate */
  2969     for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
  2971         double r;
  2973         if (EOF == input_stats(cpi, &next_frame))
  2974             break;
  2976         if (next_frame.intra_error > cpi->twopass.kf_intra_err_min)
  2977             r = (IIKFACTOR2 * next_frame.intra_error /
  2978                      DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
  2979         else
  2980             r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min /
  2981                      DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
  2983         if (r > RMAX)
  2984             r = RMAX;
  2986         /* How fast is prediction quality decaying */
  2987         loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
  2989         decay_accumulator = decay_accumulator * loop_decay_rate;
  2990         decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
  2992         boost_score += (decay_accumulator * r);
  2994         if ((i > MIN_GF_INTERVAL) &&
  2995             ((boost_score - old_boost_score) < 1.0))
  2997             break;
  3000         old_boost_score = boost_score;
  3003     if (1)
  3005         FIRSTPASS_STATS sectionstats;
  3006         double Ratio;
  3008         zero_stats(&sectionstats);
  3009         reset_fpf_position(cpi, start_position);
  3011         for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
  3013             input_stats(cpi, &next_frame);
  3014             accumulate_stats(&sectionstats, &next_frame);
  3017         avg_stats(&sectionstats);
  3019         cpi->twopass.section_intra_rating = (unsigned int)
  3020             (sectionstats.intra_error
  3021             / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
  3023         Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
  3024         cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
  3026         if (cpi->twopass.section_max_qfactor < 0.80)
  3027             cpi->twopass.section_max_qfactor = 0.80;
  3030     /* When using CBR apply additional buffer fullness related upper limits */
  3031     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  3033         double max_boost;
  3035         if (cpi->drop_frames_allowed)
  3037             int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark
  3038                                   * (cpi->oxcf.optimal_buffer_level / 100));
  3040             if (cpi->buffer_level > df_buffer_level)
  3041                 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
  3042             else
  3043                 max_boost = 0.0;
  3045         else if (cpi->buffer_level > 0)
  3047             max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
  3049         else
  3051             max_boost = 0.0;
  3054         if (boost_score > max_boost)
  3055             boost_score = max_boost;
  3058     /* Reset the first pass file position */
  3059     reset_fpf_position(cpi, start_position);
  3061     /* Work out how many bits to allocate for the key frame itself */
  3062     if (1)
  3064         int kf_boost = (int)boost_score;
  3065         int allocation_chunks;
  3066         int Counter = cpi->twopass.frames_to_key;
  3067         int alt_kf_bits;
  3068         YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
  3069         /* Min boost based on kf interval */
  3070 #if 0
  3072         while ((kf_boost < 48) && (Counter > 0))
  3074             Counter -= 2;
  3075             kf_boost ++;
  3078 #endif
  3080         if (kf_boost < 48)
  3082             kf_boost += ((Counter + 1) >> 1);
  3084             if (kf_boost > 48) kf_boost = 48;
  3087         /* bigger frame sizes need larger kf boosts, smaller frames smaller
  3088          * boosts...
  3089          */
  3090         if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240))
  3091             kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
  3092         else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240))
  3093             kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
  3095         /* Min KF boost */
  3096         kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */
  3097         if (kf_boost < 250)
  3098             kf_boost = 250;
  3100         /*
  3101          * We do three calculations for kf size.
  3102          * The first is based on the error score for the whole kf group.
  3103          * The second (optionaly) on the key frames own error if this is
  3104          * smaller than the average for the group.
  3105          * The final one insures that the frame receives at least the
  3106          * allocation it would have received based on its own error score vs
  3107          * the error score remaining
  3108          * Special case if the sequence appears almost totaly static
  3109          * as measured by the decay accumulator. In this case we want to
  3110          * spend almost all of the bits on the key frame.
  3111          * cpi->twopass.frames_to_key-1 because key frame itself is taken
  3112          * care of by kf_boost.
  3113          */
  3114         if ( decay_accumulator >= 0.99 )
  3116             allocation_chunks =
  3117                 ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
  3119         else
  3121             allocation_chunks =
  3122                 ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
  3125         /* Normalize Altboost and allocations chunck down to prevent overflow */
  3126         while (kf_boost > 1000)
  3128             kf_boost /= 2;
  3129             allocation_chunks /= 2;
  3132         cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;
  3134         /* Calculate the number of bits to be spent on the key frame */
  3135         cpi->twopass.kf_bits  = (int)((double)kf_boost * ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks));
  3137         /* Apply an additional limit for CBR */
  3138         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  3140             if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2))
  3141                 cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2);
  3144         /* If the key frame is actually easier than the average for the
  3145          * kf group (which does sometimes happen... eg a blank intro frame)
  3146          * Then use an alternate calculation based on the kf error score
  3147          * which should give a smaller key frame.
  3148          */
  3149         if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key)
  3151             double  alt_kf_grp_bits =
  3152                         ((double)cpi->twopass.bits_left *
  3153                          (kf_mod_err * (double)cpi->twopass.frames_to_key) /
  3154                          DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
  3156             alt_kf_bits = (int)((double)kf_boost *
  3157                                 (alt_kf_grp_bits / (double)allocation_chunks));
  3159             if (cpi->twopass.kf_bits > alt_kf_bits)
  3161                 cpi->twopass.kf_bits = alt_kf_bits;
  3164         /* Else if it is much harder than other frames in the group make sure
  3165          * it at least receives an allocation in keeping with its relative
  3166          * error score
  3167          */
  3168         else
  3170             alt_kf_bits =
  3171                 (int)((double)cpi->twopass.bits_left *
  3172                       (kf_mod_err /
  3173                        DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)));
  3175             if (alt_kf_bits > cpi->twopass.kf_bits)
  3177                 cpi->twopass.kf_bits = alt_kf_bits;
  3181         cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits;
  3182         /* Add in the minimum frame allowance */
  3183         cpi->twopass.kf_bits += cpi->min_frame_bandwidth;
  3185         /* Peer frame bit target for this frame */
  3186         cpi->per_frame_bandwidth = cpi->twopass.kf_bits;
  3188         /* Convert to a per second bitrate */
  3189         cpi->target_bandwidth = (int)(cpi->twopass.kf_bits *
  3190                                       cpi->output_framerate);
  3193     /* Note the total error score of the kf group minus the key frame itself */
  3194     cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
  3196     /* Adjust the count of total modified error left. The count of bits left
  3197      * is adjusted elsewhere based on real coded frame sizes
  3198      */
  3199     cpi->twopass.modified_error_left -= kf_group_err;
  3201     if (cpi->oxcf.allow_spatial_resampling)
  3203         int resample_trigger = 0;
  3204         int last_kf_resampled = 0;
  3205         int kf_q;
  3206         int scale_val = 0;
  3207         int hr, hs, vr, vs;
  3208         int new_width = cpi->oxcf.Width;
  3209         int new_height = cpi->oxcf.Height;
  3211         int projected_buffer_level = (int)cpi->buffer_level;
  3212         int tmp_q;
  3214         double projected_bits_perframe;
  3215         double group_iiratio = (kf_group_intra_err - first_frame.intra_error) / (kf_group_coded_err - first_frame.coded_error);
  3216         double err_per_frame = kf_group_err / cpi->twopass.frames_to_key;
  3217         double bits_per_frame;
  3218         double av_bits_per_frame;
  3219         double effective_size_ratio;
  3221         if ((cpi->common.Width != cpi->oxcf.Width) || (cpi->common.Height != cpi->oxcf.Height))
  3222             last_kf_resampled = 1;
  3224         /* Set back to unscaled by defaults */
  3225         cpi->common.horiz_scale = NORMAL;
  3226         cpi->common.vert_scale = NORMAL;
  3228         /* Calculate Average bits per frame. */
  3229         av_bits_per_frame = cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate);
  3231         /* CBR... Use the clip average as the target for deciding resample */
  3232         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  3234             bits_per_frame = av_bits_per_frame;
  3237         /* In VBR we want to avoid downsampling in easy section unless we
  3238          * are under extreme pressure So use the larger of target bitrate
  3239          * for this section or average bitrate for sequence
  3240          */
  3241         else
  3243             /* This accounts for how hard the section is... */
  3244             bits_per_frame = (double)
  3245                 (cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key);
  3247             /* Dont turn to resampling in easy sections just because they
  3248              * have been assigned a small number of bits
  3249              */
  3250             if (bits_per_frame < av_bits_per_frame)
  3251                 bits_per_frame = av_bits_per_frame;
  3254         /* bits_per_frame should comply with our minimum */
  3255         if (bits_per_frame < (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100))
  3256             bits_per_frame = (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
  3258         /* Work out if spatial resampling is necessary */
  3259         kf_q = estimate_kf_group_q(cpi, err_per_frame,
  3260                                   (int)bits_per_frame, group_iiratio);
  3262         /* If we project a required Q higher than the maximum allowed Q then
  3263          * make a guess at the actual size of frames in this section
  3264          */
  3265         projected_bits_perframe = bits_per_frame;
  3266         tmp_q = kf_q;
  3268         while (tmp_q > cpi->worst_quality)
  3270             projected_bits_perframe *= 1.04;
  3271             tmp_q--;
  3274         /* Guess at buffer level at the end of the section */
  3275         projected_buffer_level = (int)
  3276                     (cpi->buffer_level - (int)
  3277                     ((projected_bits_perframe - av_bits_per_frame) *
  3278                     cpi->twopass.frames_to_key));
  3280         if (0)
  3282             FILE *f = fopen("Subsamle.stt", "a");
  3283             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);
  3284             fclose(f);
  3287         /* The trigger for spatial resampling depends on the various
  3288          * parameters such as whether we are streaming (CBR) or VBR.
  3289          */
  3290         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
  3292             /* Trigger resample if we are projected to fall below down
  3293              * sample level or resampled last time and are projected to
  3294              * remain below the up sample level
  3295              */
  3296             if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100)) ||
  3297                 (last_kf_resampled && (projected_buffer_level < (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))))
  3298                 resample_trigger = 1;
  3299             else
  3300                 resample_trigger = 0;
  3302         else
  3304             int64_t clip_bits = (int64_t)(cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate));
  3305             int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level;
  3307             /* If triggered last time the threshold for triggering again is
  3308              * reduced:
  3310              * Projected Q higher than allowed and Overspend > 5% of total
  3311              * bits
  3312              */
  3313             if ((last_kf_resampled && (kf_q > cpi->worst_quality)) ||
  3314                 ((kf_q > cpi->worst_quality) &&
  3315                  (over_spend > clip_bits / 20)))
  3316                 resample_trigger = 1;
  3317             else
  3318                 resample_trigger = 0;
  3322         if (resample_trigger)
  3324             while ((kf_q >= cpi->worst_quality) && (scale_val < 6))
  3326                 scale_val ++;
  3328                 cpi->common.vert_scale   = vscale_lookup[scale_val];
  3329                 cpi->common.horiz_scale  = hscale_lookup[scale_val];
  3331                 Scale2Ratio(cpi->common.horiz_scale, &hr, &hs);
  3332                 Scale2Ratio(cpi->common.vert_scale, &vr, &vs);
  3334                 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
  3335                 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
  3337                 /* Reducing the area to 1/4 does not reduce the complexity
  3338                  * (err_per_frame) to 1/4... effective_sizeratio attempts
  3339                  * to provide a crude correction for this
  3340                  */
  3341                 effective_size_ratio = (double)(new_width * new_height) / (double)(cpi->oxcf.Width * cpi->oxcf.Height);
  3342                 effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0;
  3344                 /* Now try again and see what Q we get with the smaller
  3345                  * image size
  3346                  */
  3347                 kf_q = estimate_kf_group_q(cpi,
  3348                                           err_per_frame * effective_size_ratio,
  3349                                           (int)bits_per_frame, group_iiratio);
  3351                 if (0)
  3353                     FILE *f = fopen("Subsamle.stt", "a");
  3354                     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);
  3355                     fclose(f);
  3360         if ((cpi->common.Width != new_width) || (cpi->common.Height != new_height))
  3362             cpi->common.Width = new_width;
  3363             cpi->common.Height = new_height;
  3364             vp8_alloc_compressor_data(cpi);

mercurial