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