Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 
     12 #include <stdlib.h>
     13 #include <stdio.h>
     14 #include <string.h>
     15 #include <limits.h>
     16 #include <assert.h>
     17 
     18 #include "math.h"
     19 #include "vp8/common/common.h"
     20 #include "ratectrl.h"
     21 #include "vp8/common/entropymode.h"
     22 #include "vpx_mem/vpx_mem.h"
     23 #include "vp8/common/systemdependent.h"
     24 #include "encodemv.h"
     25 
     26 
     27 #define MIN_BPB_FACTOR          0.01
     28 #define MAX_BPB_FACTOR          50
     29 
     30 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
     31 
     32 
     33 
     34 #ifdef MODE_STATS
     35 extern int y_modes[5];
     36 extern int uv_modes[4];
     37 extern int b_modes[10];
     38 
     39 extern int inter_y_modes[10];
     40 extern int inter_uv_modes[4];
     41 extern int inter_b_modes[10];
     42 #endif
     43 
     44 /* Bits Per MB at different Q (Multiplied by 512) */
     45 #define BPER_MB_NORMBITS    9
     46 
     47 /* Work in progress recalibration of baseline rate tables based on
     48  * the assumption that bits per mb is inversely proportional to the
     49  * quantizer value.
     50  */
     51 const int vp8_bits_per_mb[2][QINDEX_RANGE] =
     52 {
     53     /* Intra case 450000/Qintra */
     54     {
     55         1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000,
     56         409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705,
     57         250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545,
     58         195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714,
     59         155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000,
     60         121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651,
     61         102272, 100000, 97826,  97826,  95744,  93750,  91836,  90000,
     62         88235,  86538,  84905,  83333,  81818,  80357,  78947,  77586,
     63         76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
     64         67164,  66176,  65217,  64285,  63380,  62500,  61643,  60810,
     65         60000,  59210,  59210,  58441,  57692,  56962,  56250,  55555,
     66         54878,  54216,  53571,  52941,  52325,  51724,  51136,  50561,
     67         49450,  48387,  47368,  46875,  45918,  45000,  44554,  44117,
     68         43269,  42452,  41666,  40909,  40178,  39473,  38793,  38135,
     69         36885,  36290,  35714,  35156,  34615,  34090,  33582,  33088,
     70         32608,  32142,  31468,  31034,  30405,  29801,  29220,  28662,
     71     },
     72     /* Inter case 285000/Qinter */
     73     {
     74         712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090,
     75         237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000,
     76         142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555,
     77         101785, 98275,  95000,  91935,  89062,  86363,  83823,  81428,
     78         79166,  77027,  75000,  73076,  71250,  69512,  67857,  66279,
     79         64772,  63333,  61956,  60638,  59375,  58163,  57000,  55882,
     80         54807,  53773,  52777,  51818,  50892,  50000,  49137,  47500,
     81         45967,  44531,  43181,  41911,  40714,  39583,  38513,  37500,
     82         36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
     83         30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,
     84         25909,  25446,  25000,  24568,  23949,  23360,  22800,  22265,
     85         21755,  21268,  20802,  20357,  19930,  19520,  19127,  18750,
     86         18387,  18037,  17701,  17378,  17065,  16764,  16473,  16101,
     87         15745,  15405,  15079,  14766,  14467,  14179,  13902,  13636,
     88         13380,  13133,  12895,  12666,  12445,  12179,  11924,  11632,
     89         11445,  11220,  11003,  10795,  10594,  10401,  10215,  10035,
     90     }
     91 };
     92 
     93 static const int kf_boost_qadjustment[QINDEX_RANGE] =
     94 {
     95     128, 129, 130, 131, 132, 133, 134, 135,
     96     136, 137, 138, 139, 140, 141, 142, 143,
     97     144, 145, 146, 147, 148, 149, 150, 151,
     98     152, 153, 154, 155, 156, 157, 158, 159,
     99     160, 161, 162, 163, 164, 165, 166, 167,
    100     168, 169, 170, 171, 172, 173, 174, 175,
    101     176, 177, 178, 179, 180, 181, 182, 183,
    102     184, 185, 186, 187, 188, 189, 190, 191,
    103     192, 193, 194, 195, 196, 197, 198, 199,
    104     200, 200, 201, 201, 202, 203, 203, 203,
    105     204, 204, 205, 205, 206, 206, 207, 207,
    106     208, 208, 209, 209, 210, 210, 211, 211,
    107     212, 212, 213, 213, 214, 214, 215, 215,
    108     216, 216, 217, 217, 218, 218, 219, 219,
    109     220, 220, 220, 220, 220, 220, 220, 220,
    110     220, 220, 220, 220, 220, 220, 220, 220,
    111 };
    112 
    113 /* #define GFQ_ADJUSTMENT (Q+100) */
    114 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
    115 const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
    116 {
    117     80, 82, 84, 86, 88, 90, 92, 94,
    118     96, 97, 98, 99, 100, 101, 102, 103,
    119     104, 105, 106, 107, 108, 109, 110, 111,
    120     112, 113, 114, 115, 116, 117, 118, 119,
    121     120, 121, 122, 123, 124, 125, 126, 127,
    122     128, 129, 130, 131, 132, 133, 134, 135,
    123     136, 137, 138, 139, 140, 141, 142, 143,
    124     144, 145, 146, 147, 148, 149, 150, 151,
    125     152, 153, 154, 155, 156, 157, 158, 159,
    126     160, 161, 162, 163, 164, 165, 166, 167,
    127     168, 169, 170, 171, 172, 173, 174, 175,
    128     176, 177, 178, 179, 180, 181, 182, 183,
    129     184, 184, 185, 185, 186, 186, 187, 187,
    130     188, 188, 189, 189, 190, 190, 191, 191,
    131     192, 192, 193, 193, 194, 194, 194, 194,
    132     195, 195, 196, 196, 197, 197, 198, 198
    133 };
    134 
    135 /*
    136 const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
    137 {
    138     100,101,102,103,104,105,105,106,
    139     106,107,107,108,109,109,110,111,
    140     112,113,114,115,116,117,118,119,
    141     120,121,122,123,124,125,126,127,
    142     128,129,130,131,132,133,134,135,
    143     136,137,138,139,140,141,142,143,
    144     144,145,146,147,148,149,150,151,
    145     152,153,154,155,156,157,158,159,
    146     160,161,162,163,164,165,166,167,
    147     168,169,170,170,171,171,172,172,
    148     173,173,173,174,174,174,175,175,
    149     175,176,176,176,177,177,177,177,
    150     178,178,179,179,180,180,181,181,
    151     182,182,183,183,184,184,185,185,
    152     186,186,187,187,188,188,189,189,
    153     190,190,191,191,192,192,193,193,
    154 };
    155 */
    156 
    157 static const int kf_gf_boost_qlimits[QINDEX_RANGE] =
    158 {
    159     150, 155, 160, 165, 170, 175, 180, 185,
    160     190, 195, 200, 205, 210, 215, 220, 225,
    161     230, 235, 240, 245, 250, 255, 260, 265,
    162     270, 275, 280, 285, 290, 295, 300, 305,
    163     310, 320, 330, 340, 350, 360, 370, 380,
    164     390, 400, 410, 420, 430, 440, 450, 460,
    165     470, 480, 490, 500, 510, 520, 530, 540,
    166     550, 560, 570, 580, 590, 600, 600, 600,
    167     600, 600, 600, 600, 600, 600, 600, 600,
    168     600, 600, 600, 600, 600, 600, 600, 600,
    169     600, 600, 600, 600, 600, 600, 600, 600,
    170     600, 600, 600, 600, 600, 600, 600, 600,
    171     600, 600, 600, 600, 600, 600, 600, 600,
    172     600, 600, 600, 600, 600, 600, 600, 600,
    173     600, 600, 600, 600, 600, 600, 600, 600,
    174     600, 600, 600, 600, 600, 600, 600, 600,
    175 };
    176 
    177 /* % adjustment to target kf size based on seperation from previous frame */
    178 static const int kf_boost_seperation_adjustment[16] =
    179 {
    180     30,   40,   50,   55,   60,   65,   70,   75,
    181     80,   85,   90,   95,  100,  100,  100,  100,
    182 };
    183 
    184 
    185 static const int gf_adjust_table[101] =
    186 {
    187     100,
    188     115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
    189     240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
    190     350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
    191     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    192     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    193     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    194     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    195     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    196     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    197     400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
    198 };
    199 
    200 static const int gf_intra_usage_adjustment[20] =
    201 {
    202     125, 120, 115, 110, 105, 100,  95,  85,  80,  75,
    203     70,  65,  60,  55,  50,  50,  50,  50,  50,  50,
    204 };
    205 
    206 static const int gf_interval_table[101] =
    207 {
    208     7,
    209     7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    210     7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    211     7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    212     8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    213     8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    214     9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    215     9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    216     10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    217     10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    218     11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    219 };
    220 
    221 static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
    222 
    223 
    224 void vp8_save_coding_context(VP8_COMP *cpi)
    225 {
    226     CODING_CONTEXT *const cc = & cpi->coding_context;
    227 
    228     /* Stores a snapshot of key state variables which can subsequently be
    229      * restored with a call to vp8_restore_coding_context. These functions are
    230      * intended for use in a re-code loop in vp8_compress_frame where the
    231      * quantizer value is adjusted between loop iterations.
    232      */
    233 
    234     cc->frames_since_key          = cpi->frames_since_key;
    235     cc->filter_level             = cpi->common.filter_level;
    236     cc->frames_till_gf_update_due   = cpi->frames_till_gf_update_due;
    237     cc->frames_since_golden       = cpi->frames_since_golden;
    238 
    239     vp8_copy(cc->mvc,      cpi->common.fc.mvc);
    240     vp8_copy(cc->mvcosts,  cpi->rd_costs.mvcosts);
    241 
    242     vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
    243     vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
    244 
    245     vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
    246     vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
    247 
    248 
    249     /* Stats */
    250 #ifdef MODE_STATS
    251     vp8_copy(cc->y_modes,       y_modes);
    252     vp8_copy(cc->uv_modes,      uv_modes);
    253     vp8_copy(cc->b_modes,       b_modes);
    254     vp8_copy(cc->inter_y_modes,  inter_y_modes);
    255     vp8_copy(cc->inter_uv_modes, inter_uv_modes);
    256     vp8_copy(cc->inter_b_modes,  inter_b_modes);
    257 #endif
    258 
    259     cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
    260 }
    261 
    262 
    263 void vp8_restore_coding_context(VP8_COMP *cpi)
    264 {
    265     CODING_CONTEXT *const cc = & cpi->coding_context;
    266 
    267     /* Restore key state variables to the snapshot state stored in the
    268      * previous call to vp8_save_coding_context.
    269      */
    270 
    271     cpi->frames_since_key         =   cc->frames_since_key;
    272     cpi->common.filter_level     =   cc->filter_level;
    273     cpi->frames_till_gf_update_due  =   cc->frames_till_gf_update_due;
    274     cpi->frames_since_golden       =   cc->frames_since_golden;
    275 
    276     vp8_copy(cpi->common.fc.mvc, cc->mvc);
    277 
    278     vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
    279 
    280     vp8_copy(cpi->common.fc.ymode_prob,   cc->ymode_prob);
    281     vp8_copy(cpi->common.fc.uv_mode_prob,  cc->uv_mode_prob);
    282 
    283     vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
    284     vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
    285 
    286     /* Stats */
    287 #ifdef MODE_STATS
    288     vp8_copy(y_modes, cc->y_modes);
    289     vp8_copy(uv_modes, cc->uv_modes);
    290     vp8_copy(b_modes, cc->b_modes);
    291     vp8_copy(inter_y_modes, cc->inter_y_modes);
    292     vp8_copy(inter_uv_modes, cc->inter_uv_modes);
    293     vp8_copy(inter_b_modes, cc->inter_b_modes);
    294 #endif
    295 
    296 
    297     cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
    298 }
    299 
    300 
    301 void vp8_setup_key_frame(VP8_COMP *cpi)
    302 {
    303     /* Setup for Key frame: */
    304 
    305     vp8_default_coef_probs(& cpi->common);
    306 
    307     vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
    308     {
    309         int flag[2] = {1, 1};
    310         vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
    311     }
    312 
    313     /* Make sure we initialize separate contexts for altref,gold, and normal.
    314      * TODO shouldn't need 3 different copies of structure to do this!
    315      */
    316     vpx_memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
    317     vpx_memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
    318     vpx_memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
    319 
    320     cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
    321 
    322     /* Provisional interval before next GF */
    323     if (cpi->auto_gold)
    324         cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
    325     else
    326         cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
    327 
    328     cpi->common.refresh_golden_frame = 1;
    329     cpi->common.refresh_alt_ref_frame = 1;
    330 }
    331 
    332 
    333 static int estimate_bits_at_q(int frame_kind, int Q, int MBs,
    334                               double correction_factor)
    335 {
    336     int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
    337 
    338     /* Attempt to retain reasonable accuracy without overflow. The cutoff is
    339      * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
    340      * largest Bpm takes 20 bits.
    341      */
    342     if (MBs > (1 << 11))
    343         return (Bpm >> BPER_MB_NORMBITS) * MBs;
    344     else
    345         return (Bpm * MBs) >> BPER_MB_NORMBITS;
    346 }
    347 
    348 
    349 static void calc_iframe_target_size(VP8_COMP *cpi)
    350 {
    351     /* boost defaults to half second */
    352     int kf_boost;
    353     uint64_t target;
    354 
    355     /* Clear down mmx registers to allow floating point in what follows */
    356     vp8_clear_system_state();
    357 
    358     if (cpi->oxcf.fixed_q >= 0)
    359     {
    360         int Q = cpi->oxcf.key_q;
    361 
    362         target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
    363                                     cpi->key_frame_rate_correction_factor);
    364     }
    365     else if (cpi->pass == 2)
    366     {
    367         /* New Two pass RC */
    368         target = cpi->per_frame_bandwidth;
    369     }
    370     /* First Frame is a special case */
    371     else if (cpi->common.current_video_frame == 0)
    372     {
    373         /* 1 Pass there is no information on which to base size so use
    374          * bandwidth per second * fraction of the initial buffer
    375          * level
    376          */
    377         target = cpi->oxcf.starting_buffer_level / 2;
    378 
    379         if(target > cpi->oxcf.target_bandwidth * 3 / 2)
    380             target = cpi->oxcf.target_bandwidth * 3 / 2;
    381     }
    382     else
    383     {
    384         /* if this keyframe was forced, use a more recent Q estimate */
    385         int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY)
    386                 ? cpi->avg_frame_qindex : cpi->ni_av_qi;
    387 
    388         int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
    389         /* Boost depends somewhat on frame rate: only used for 1 layer case. */
    390         if (cpi->oxcf.number_of_layers == 1) {
    391           kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
    392         }
    393         else {
    394           /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
    395           kf_boost = initial_boost;
    396         }
    397 
    398         /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
    399         kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
    400 
    401         /* frame separation adjustment ( down) */
    402         if (cpi->frames_since_key  < cpi->output_framerate / 2)
    403             kf_boost = (int)(kf_boost
    404                        * cpi->frames_since_key / (cpi->output_framerate / 2));
    405 
    406         /* Minimal target size is |2* per_frame_bandwidth|. */
    407         if (kf_boost < 16)
    408             kf_boost = 16;
    409 
    410         target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
    411     }
    412 
    413 
    414     if (cpi->oxcf.rc_max_intra_bitrate_pct)
    415     {
    416         unsigned int max_rate = cpi->per_frame_bandwidth
    417                                 * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
    418 
    419         if (target > max_rate)
    420             target = max_rate;
    421     }
    422 
    423     cpi->this_frame_target = (int)target;
    424 
    425     /* TODO: if we separate rate targeting from Q targetting, move this.
    426      * Reset the active worst quality to the baseline value for key frames.
    427      */
    428     if (cpi->pass != 2)
    429         cpi->active_worst_quality = cpi->worst_quality;
    430 
    431 #if 0
    432     {
    433         FILE *f;
    434 
    435         f = fopen("kf_boost.stt", "a");
    436         fprintf(f, " %8u %10d %10d %10d\n",
    437                 cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
    438 
    439         fclose(f);
    440     }
    441 #endif
    442 }
    443 
    444 
    445 /* Do the best we can to define the parameters for the next GF based on what
    446  * information we have available.
    447  */
    448 static void calc_gf_params(VP8_COMP *cpi)
    449 {
    450     int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
    451     int Boost = 0;
    452 
    453     int gf_frame_useage = 0;      /* Golden frame useage since last GF */
    454     int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
    455                   cpi->recent_ref_frame_usage[LAST_FRAME]   +
    456                   cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
    457                   cpi->recent_ref_frame_usage[ALTREF_FRAME];
    458 
    459     int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
    460 
    461     if (tot_mbs)
    462         gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
    463 
    464     if (pct_gf_active > gf_frame_useage)
    465         gf_frame_useage = pct_gf_active;
    466 
    467     /* Not two pass */
    468     if (cpi->pass != 2)
    469     {
    470         /* Single Pass lagged mode: TBD */
    471         if (0)
    472         {
    473         }
    474 
    475         /* Single Pass compression: Has to use current and historical data */
    476         else
    477         {
    478 #if 0
    479             /* Experimental code */
    480             int index = cpi->one_pass_frame_index;
    481             int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
    482 
    483             /* ************** Experimental code - incomplete */
    484             /*
    485             double decay_val = 1.0;
    486             double IIAccumulator = 0.0;
    487             double last_iiaccumulator = 0.0;
    488             double IIRatio;
    489 
    490             cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
    491 
    492             for ( i = 0; i < (frames_to_scan - 1); i++ )
    493             {
    494                 if ( index < 0 )
    495                     index = MAX_LAG_BUFFERS;
    496                 index --;
    497 
    498                 if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
    499                 {
    500                     IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
    501 
    502                     if ( IIRatio > 30.0 )
    503                         IIRatio = 30.0;
    504                 }
    505                 else
    506                     IIRatio = 30.0;
    507 
    508                 IIAccumulator += IIRatio * decay_val;
    509 
    510                 decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
    511 
    512                 if (    (i > MIN_GF_INTERVAL) &&
    513                         ((IIAccumulator - last_iiaccumulator) < 2.0) )
    514                 {
    515                     break;
    516                 }
    517                 last_iiaccumulator = IIAccumulator;
    518             }
    519 
    520             Boost = IIAccumulator*100.0/16.0;
    521             cpi->baseline_gf_interval = i;
    522 
    523             */
    524 #else
    525 
    526             /*************************************************************/
    527             /* OLD code */
    528 
    529             /* Adjust boost based upon ambient Q */
    530             Boost = GFQ_ADJUSTMENT;
    531 
    532             /* Adjust based upon most recently measure intra useage */
    533             Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
    534 
    535             /* Adjust gf boost based upon GF usage since last GF */
    536             Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
    537 #endif
    538         }
    539 
    540         /* golden frame boost without recode loop often goes awry.  be
    541          * safe by keeping numbers down.
    542          */
    543         if (!cpi->sf.recode_loop)
    544         {
    545             if (cpi->compressor_speed == 2)
    546                 Boost = Boost / 2;
    547         }
    548 
    549         /* Apply an upper limit based on Q for 1 pass encodes */
    550         if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
    551             Boost = kf_gf_boost_qlimits[Q];
    552 
    553         /* Apply lower limits to boost. */
    554         else if (Boost < 110)
    555             Boost = 110;
    556 
    557         /* Note the boost used */
    558         cpi->last_boost = Boost;
    559 
    560     }
    561 
    562     /* Estimate next interval
    563      * This is updated once the real frame size/boost is known.
    564      */
    565     if (cpi->oxcf.fixed_q == -1)
    566     {
    567         if (cpi->pass == 2)         /* 2 Pass */
    568         {
    569             cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
    570         }
    571         else                            /* 1 Pass */
    572         {
    573             cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
    574 
    575             if (cpi->last_boost > 750)
    576                 cpi->frames_till_gf_update_due++;
    577 
    578             if (cpi->last_boost > 1000)
    579                 cpi->frames_till_gf_update_due++;
    580 
    581             if (cpi->last_boost > 1250)
    582                 cpi->frames_till_gf_update_due++;
    583 
    584             if (cpi->last_boost >= 1500)
    585                 cpi->frames_till_gf_update_due ++;
    586 
    587             if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
    588                 cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
    589 
    590             if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
    591                 cpi->frames_till_gf_update_due = cpi->max_gf_interval;
    592         }
    593     }
    594     else
    595         cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
    596 
    597     /* ARF on or off */
    598     if (cpi->pass != 2)
    599     {
    600         /* For now Alt ref is not allowed except in 2 pass modes. */
    601         cpi->source_alt_ref_pending = 0;
    602 
    603         /*if ( cpi->oxcf.fixed_q == -1)
    604         {
    605             if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
    606                 cpi->source_alt_ref_pending = 1;
    607             else
    608                 cpi->source_alt_ref_pending = 0;
    609         }*/
    610     }
    611 }
    612 
    613 
    614 static void calc_pframe_target_size(VP8_COMP *cpi)
    615 {
    616     int min_frame_target;
    617     int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
    618 
    619     if ( cpi->current_layer > 0)
    620         cpi->per_frame_bandwidth =
    621             cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
    622 
    623     min_frame_target = 0;
    624 
    625     if (cpi->pass == 2)
    626     {
    627         min_frame_target = cpi->min_frame_bandwidth;
    628 
    629         if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
    630             min_frame_target = cpi->av_per_frame_bandwidth >> 5;
    631     }
    632     else if (min_frame_target < cpi->per_frame_bandwidth / 4)
    633         min_frame_target = cpi->per_frame_bandwidth / 4;
    634 
    635 
    636     /* Special alt reference frame case */
    637     if((cpi->common.refresh_alt_ref_frame) && (cpi->oxcf.number_of_layers == 1))
    638     {
    639         if (cpi->pass == 2)
    640         {
    641             /* Per frame bit target for the alt ref frame */
    642             cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
    643             cpi->this_frame_target = cpi->per_frame_bandwidth;
    644         }
    645 
    646         /* One Pass ??? TBD */
    647     }
    648 
    649     /* Normal frames (gf,and inter) */
    650     else
    651     {
    652         /* 2 pass */
    653         if (cpi->pass == 2)
    654         {
    655             cpi->this_frame_target = cpi->per_frame_bandwidth;
    656         }
    657         /* 1 pass */
    658         else
    659         {
    660             int Adjustment;
    661             /* Make rate adjustment to recover bits spent in key frame
    662              * Test to see if the key frame inter data rate correction
    663              * should still be in force
    664              */
    665             if (cpi->kf_overspend_bits > 0)
    666             {
    667                 Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
    668 
    669                 if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
    670                     Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
    671 
    672                 cpi->kf_overspend_bits -= Adjustment;
    673 
    674                 /* Calculate an inter frame bandwidth target for the next
    675                  * few frames designed to recover any extra bits spent on
    676                  * the key frame.
    677                  */
    678                 cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
    679 
    680                 if (cpi->this_frame_target < min_frame_target)
    681                     cpi->this_frame_target = min_frame_target;
    682             }
    683             else
    684                 cpi->this_frame_target = cpi->per_frame_bandwidth;
    685 
    686             /* If appropriate make an adjustment to recover bits spent on a
    687              * recent GF
    688              */
    689             if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
    690             {
    691                 Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
    692 
    693                 if (Adjustment > (cpi->this_frame_target - min_frame_target))
    694                     Adjustment = (cpi->this_frame_target - min_frame_target);
    695 
    696                 cpi->gf_overspend_bits -= Adjustment;
    697                 cpi->this_frame_target -= Adjustment;
    698             }
    699 
    700             /* Apply small + and - boosts for non gf frames */
    701             if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
    702                 (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
    703             {
    704                 /* % Adjustment limited to the range 1% to 10% */
    705                 Adjustment = (cpi->last_boost - 100) >> 5;
    706 
    707                 if (Adjustment < 1)
    708                     Adjustment = 1;
    709                 else if (Adjustment > 10)
    710                     Adjustment = 10;
    711 
    712                 /* Convert to bits */
    713                 Adjustment = (cpi->this_frame_target * Adjustment) / 100;
    714 
    715                 if (Adjustment > (cpi->this_frame_target - min_frame_target))
    716                     Adjustment = (cpi->this_frame_target - min_frame_target);
    717 
    718                 if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1))
    719                     cpi->this_frame_target += ((cpi->current_gf_interval - 1) * Adjustment);
    720                 else
    721                     cpi->this_frame_target -= Adjustment;
    722             }
    723         }
    724     }
    725 
    726     /* Sanity check that the total sum of adjustments is not above the
    727      * maximum allowed That is that having allowed for KF and GF penalties
    728      * we have not pushed the current interframe target to low. If the
    729      * adjustment we apply here is not capable of recovering all the extra
    730      * bits we have spent in the KF or GF then the remainder will have to
    731      * be recovered over a longer time span via other buffer / rate control
    732      * mechanisms.
    733      */
    734     if (cpi->this_frame_target < min_frame_target)
    735         cpi->this_frame_target = min_frame_target;
    736 
    737     if (!cpi->common.refresh_alt_ref_frame)
    738         /* Note the baseline target data rate for this inter frame. */
    739         cpi->inter_frame_target = cpi->this_frame_target;
    740 
    741     /* One Pass specific code */
    742     if (cpi->pass == 0)
    743     {
    744         /* Adapt target frame size with respect to any buffering constraints: */
    745         if (cpi->buffered_mode)
    746         {
    747             int one_percent_bits = (int)
    748                 (1 + cpi->oxcf.optimal_buffer_level / 100);
    749 
    750             if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
    751                 (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
    752             {
    753                 int percent_low = 0;
    754 
    755                 /* Decide whether or not we need to adjust the frame data
    756                  * rate target.
    757                  *
    758                  * If we are are below the optimal buffer fullness level
    759                  * and adherence to buffering constraints is important to
    760                  * the end usage then adjust the per frame target.
    761                  */
    762                 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
    763                     (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
    764                 {
    765                     percent_low = (int)
    766                         ((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
    767                         one_percent_bits);
    768                 }
    769                 /* Are we overshooting the long term clip data rate... */
    770                 else if (cpi->bits_off_target < 0)
    771                 {
    772                     /* Adjust per frame data target downwards to compensate. */
    773                     percent_low = (int)(100 * -cpi->bits_off_target /
    774                                        (cpi->total_byte_count * 8));
    775                 }
    776 
    777                 if (percent_low > cpi->oxcf.under_shoot_pct)
    778                     percent_low = cpi->oxcf.under_shoot_pct;
    779                 else if (percent_low < 0)
    780                     percent_low = 0;
    781 
    782                 /* lower the target bandwidth for this frame. */
    783                 cpi->this_frame_target -=
    784                         (cpi->this_frame_target * percent_low) / 200;
    785 
    786                 /* Are we using allowing control of active_worst_allowed_q
    787                  * according to buffer level.
    788                  */
    789                 if (cpi->auto_worst_q && cpi->ni_frames > 150)
    790                 {
    791                     int64_t critical_buffer_level;
    792 
    793                     /* For streaming applications the most important factor is
    794                      * cpi->buffer_level as this takes into account the
    795                      * specified short term buffering constraints. However,
    796                      * hitting the long term clip data rate target is also
    797                      * important.
    798                      */
    799                     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
    800                     {
    801                         /* Take the smaller of cpi->buffer_level and
    802                          * cpi->bits_off_target
    803                          */
    804                         critical_buffer_level =
    805                             (cpi->buffer_level < cpi->bits_off_target)
    806                             ? cpi->buffer_level : cpi->bits_off_target;
    807                     }
    808                     /* For local file playback short term buffering constraints
    809                      * are less of an issue
    810                      */
    811                     else
    812                     {
    813                         /* Consider only how we are doing for the clip as a
    814                          * whole
    815                          */
    816                         critical_buffer_level = cpi->bits_off_target;
    817                     }
    818 
    819                     /* Set the active worst quality based upon the selected
    820                      * buffer fullness number.
    821                      */
    822                     if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
    823                     {
    824                         if ( critical_buffer_level >
    825                              (cpi->oxcf.optimal_buffer_level >> 2) )
    826                         {
    827                             int64_t qadjustment_range =
    828                                       cpi->worst_quality - cpi->ni_av_qi;
    829                             int64_t above_base =
    830                                       (critical_buffer_level -
    831                                        (cpi->oxcf.optimal_buffer_level >> 2));
    832 
    833                             /* Step active worst quality down from
    834                              * cpi->ni_av_qi when (critical_buffer_level ==
    835                              * cpi->optimal_buffer_level) to
    836                              * cpi->worst_quality when
    837                              * (critical_buffer_level ==
    838                              *     cpi->optimal_buffer_level >> 2)
    839                              */
    840                             cpi->active_worst_quality =
    841                                 cpi->worst_quality -
    842                                 (int)((qadjustment_range * above_base) /
    843                                  (cpi->oxcf.optimal_buffer_level*3>>2));
    844                         }
    845                         else
    846                         {
    847                             cpi->active_worst_quality = cpi->worst_quality;
    848                         }
    849                     }
    850                     else
    851                     {
    852                         cpi->active_worst_quality = cpi->ni_av_qi;
    853                     }
    854                 }
    855                 else
    856                 {
    857                     cpi->active_worst_quality = cpi->worst_quality;
    858                 }
    859             }
    860             else
    861             {
    862                 int percent_high = 0;
    863 
    864                 if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
    865                      && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
    866                 {
    867                     percent_high = (int)((cpi->buffer_level
    868                                     - cpi->oxcf.optimal_buffer_level)
    869                                    / one_percent_bits);
    870                 }
    871                 else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
    872                 {
    873                     percent_high = (int)((100 * cpi->bits_off_target)
    874                                          / (cpi->total_byte_count * 8));
    875                 }
    876 
    877                 if (percent_high > cpi->oxcf.over_shoot_pct)
    878                     percent_high = cpi->oxcf.over_shoot_pct;
    879                 else if (percent_high < 0)
    880                     percent_high = 0;
    881 
    882                 cpi->this_frame_target += (cpi->this_frame_target *
    883                                           percent_high) / 200;
    884 
    885                 /* Are we allowing control of active_worst_allowed_q according
    886                  * to buffer level.
    887                  */
    888                 if (cpi->auto_worst_q && cpi->ni_frames > 150)
    889                 {
    890                     /* When using the relaxed buffer model stick to the
    891                      * user specified value
    892                      */
    893                     cpi->active_worst_quality = cpi->ni_av_qi;
    894                 }
    895                 else
    896                 {
    897                     cpi->active_worst_quality = cpi->worst_quality;
    898                 }
    899             }
    900 
    901             /* Set active_best_quality to prevent quality rising too high */
    902             cpi->active_best_quality = cpi->best_quality;
    903 
    904             /* Worst quality obviously must not be better than best quality */
    905             if (cpi->active_worst_quality <= cpi->active_best_quality)
    906                 cpi->active_worst_quality = cpi->active_best_quality + 1;
    907 
    908             if(cpi->active_worst_quality > 127)
    909                 cpi->active_worst_quality = 127;
    910         }
    911         /* Unbuffered mode (eg. video conferencing) */
    912         else
    913         {
    914             /* Set the active worst quality */
    915             cpi->active_worst_quality = cpi->worst_quality;
    916         }
    917 
    918         /* Special trap for constrained quality mode
    919          * "active_worst_quality" may never drop below cq level
    920          * for any frame type.
    921          */
    922         if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
    923              cpi->active_worst_quality < cpi->cq_target_quality)
    924         {
    925             cpi->active_worst_quality = cpi->cq_target_quality;
    926         }
    927     }
    928 
    929     /* Test to see if we have to drop a frame
    930      * The auto-drop frame code is only used in buffered mode.
    931      * In unbufferd mode (eg vide conferencing) the descision to
    932      * code or drop a frame is made outside the codec in response to real
    933      * world comms or buffer considerations.
    934      */
    935     if (cpi->drop_frames_allowed &&
    936         (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
    937         ((cpi->common.frame_type != KEY_FRAME)))
    938     {
    939         /* Check for a buffer underun-crisis in which case we have to drop
    940          * a frame
    941          */
    942         if ((cpi->buffer_level < 0))
    943         {
    944 #if 0
    945             FILE *f = fopen("dec.stt", "a");
    946             fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
    947                     (int) cpi->common.current_video_frame,
    948                     cpi->decimation_factor, cpi->common.horiz_scale,
    949                     (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
    950             fclose(f);
    951 #endif
    952             cpi->drop_frame = 1;
    953 
    954             /* Update the buffer level variable. */
    955             cpi->bits_off_target += cpi->av_per_frame_bandwidth;
    956             if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
    957               cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
    958             cpi->buffer_level = cpi->bits_off_target;
    959         }
    960     }
    961 
    962     /* Adjust target frame size for Golden Frames: */
    963     if (cpi->oxcf.error_resilient_mode == 0 &&
    964         (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
    965     {
    966         int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
    967 
    968         int gf_frame_useage = 0;      /* Golden frame useage since last GF */
    969         int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
    970                       cpi->recent_ref_frame_usage[LAST_FRAME]   +
    971                       cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
    972                       cpi->recent_ref_frame_usage[ALTREF_FRAME];
    973 
    974         int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
    975 
    976         if (tot_mbs)
    977             gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
    978 
    979         if (pct_gf_active > gf_frame_useage)
    980             gf_frame_useage = pct_gf_active;
    981 
    982         /* Is a fixed manual GF frequency being used */
    983         if (cpi->auto_gold)
    984         {
    985             /* For one pass throw a GF if recent frame intra useage is
    986              * low or the GF useage is high
    987              */
    988             if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
    989                 cpi->common.refresh_golden_frame = 1;
    990 
    991             /* Two pass GF descision */
    992             else if (cpi->pass == 2)
    993                 cpi->common.refresh_golden_frame = 1;
    994         }
    995 
    996 #if 0
    997 
    998         /* Debug stats */
    999         if (0)
   1000         {
   1001             FILE *f;
   1002 
   1003             f = fopen("gf_useaget.stt", "a");
   1004             fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
   1005                     cpi->common.current_video_frame,  cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
   1006             fclose(f);
   1007         }
   1008 
   1009 #endif
   1010 
   1011         if (cpi->common.refresh_golden_frame == 1)
   1012         {
   1013 #if 0
   1014 
   1015             if (0)
   1016             {
   1017                 FILE *f;
   1018 
   1019                 f = fopen("GFexit.stt", "a");
   1020                 fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
   1021                 fclose(f);
   1022             }
   1023 
   1024 #endif
   1025 
   1026             if (cpi->auto_adjust_gold_quantizer)
   1027             {
   1028                 calc_gf_params(cpi);
   1029             }
   1030 
   1031             /* If we are using alternate ref instead of gf then do not apply the
   1032              * boost It will instead be applied to the altref update Jims
   1033              * modified boost
   1034              */
   1035             if (!cpi->source_alt_ref_active)
   1036             {
   1037                 if (cpi->oxcf.fixed_q < 0)
   1038                 {
   1039                     if (cpi->pass == 2)
   1040                     {
   1041                         /* The spend on the GF is defined in the two pass
   1042                          * code for two pass encodes
   1043                          */
   1044                         cpi->this_frame_target = cpi->per_frame_bandwidth;
   1045                     }
   1046                     else
   1047                     {
   1048                         int Boost = cpi->last_boost;
   1049                         int frames_in_section = cpi->frames_till_gf_update_due + 1;
   1050                         int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
   1051                         int bits_in_section = cpi->inter_frame_target * frames_in_section;
   1052 
   1053                         /* Normalize Altboost and allocations chunck down to
   1054                          * prevent overflow
   1055                          */
   1056                         while (Boost > 1000)
   1057                         {
   1058                             Boost /= 2;
   1059                             allocation_chunks /= 2;
   1060                         }
   1061 
   1062                         /* Avoid loss of precision but avoid overflow */
   1063                         if ((bits_in_section >> 7) > allocation_chunks)
   1064                             cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
   1065                         else
   1066                             cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
   1067                     }
   1068                 }
   1069                 else
   1070                     cpi->this_frame_target =
   1071                         (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0)
   1072                          * cpi->last_boost) / 100;
   1073 
   1074             }
   1075             /* If there is an active ARF at this location use the minimum
   1076              * bits on this frame even if it is a contructed arf.
   1077              * The active maximum quantizer insures that an appropriate
   1078              * number of bits will be spent if needed for contstructed ARFs.
   1079              */
   1080             else
   1081             {
   1082                 cpi->this_frame_target = 0;
   1083             }
   1084 
   1085             cpi->current_gf_interval = cpi->frames_till_gf_update_due;
   1086 
   1087         }
   1088     }
   1089 
   1090     cpi->per_frame_bandwidth = old_per_frame_bandwidth;
   1091 }
   1092 
   1093 
   1094 void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
   1095 {
   1096     int    Q = cpi->common.base_qindex;
   1097     int    correction_factor = 100;
   1098     double rate_correction_factor;
   1099     double adjustment_limit;
   1100 
   1101     int    projected_size_based_on_q = 0;
   1102 
   1103     /* Clear down mmx registers to allow floating point in what follows */
   1104     vp8_clear_system_state();
   1105 
   1106     if (cpi->common.frame_type == KEY_FRAME)
   1107     {
   1108         rate_correction_factor = cpi->key_frame_rate_correction_factor;
   1109     }
   1110     else
   1111     {
   1112         if (cpi->oxcf.number_of_layers == 1 &&
   1113            (cpi->common.refresh_alt_ref_frame ||
   1114             cpi->common.refresh_golden_frame))
   1115             rate_correction_factor = cpi->gf_rate_correction_factor;
   1116         else
   1117             rate_correction_factor = cpi->rate_correction_factor;
   1118     }
   1119 
   1120     /* Work out how big we would have expected the frame to be at this Q
   1121      * given the current correction factor. Stay in double to avoid int
   1122      * overflow when values are large
   1123      */
   1124     projected_size_based_on_q = (int)(((.5 + rate_correction_factor * vp8_bits_per_mb[cpi->common.frame_type][Q]) * cpi->common.MBs) / (1 << BPER_MB_NORMBITS));
   1125 
   1126     /* Make some allowance for cpi->zbin_over_quant */
   1127     if (cpi->mb.zbin_over_quant > 0)
   1128     {
   1129         int Z = cpi->mb.zbin_over_quant;
   1130         double Factor = 0.99;
   1131         double factor_adjustment = 0.01 / 256.0;
   1132 
   1133         while (Z > 0)
   1134         {
   1135             Z --;
   1136             projected_size_based_on_q =
   1137                 (int)(Factor * projected_size_based_on_q);
   1138             Factor += factor_adjustment;
   1139 
   1140             if (Factor  >= 0.999)
   1141                 Factor = 0.999;
   1142         }
   1143     }
   1144 
   1145     /* Work out a size correction factor. */
   1146     if (projected_size_based_on_q > 0)
   1147         correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
   1148 
   1149     /* More heavily damped adjustment used if we have been oscillating
   1150      * either side of target
   1151      */
   1152     switch (damp_var)
   1153     {
   1154     case 0:
   1155         adjustment_limit = 0.75;
   1156         break;
   1157     case 1:
   1158         adjustment_limit = 0.375;
   1159         break;
   1160     case 2:
   1161     default:
   1162         adjustment_limit = 0.25;
   1163         break;
   1164     }
   1165 
   1166     if (correction_factor > 102)
   1167     {
   1168         /* We are not already at the worst allowable quality */
   1169         correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
   1170         rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
   1171 
   1172         /* Keep rate_correction_factor within limits */
   1173         if (rate_correction_factor > MAX_BPB_FACTOR)
   1174             rate_correction_factor = MAX_BPB_FACTOR;
   1175     }
   1176     else if (correction_factor < 99)
   1177     {
   1178         /* We are not already at the best allowable quality */
   1179         correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
   1180         rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
   1181 
   1182         /* Keep rate_correction_factor within limits */
   1183         if (rate_correction_factor < MIN_BPB_FACTOR)
   1184             rate_correction_factor = MIN_BPB_FACTOR;
   1185     }
   1186 
   1187     if (cpi->common.frame_type == KEY_FRAME)
   1188         cpi->key_frame_rate_correction_factor = rate_correction_factor;
   1189     else
   1190     {
   1191         if (cpi->oxcf.number_of_layers == 1 &&
   1192            (cpi->common.refresh_alt_ref_frame ||
   1193             cpi->common.refresh_golden_frame))
   1194             cpi->gf_rate_correction_factor = rate_correction_factor;
   1195         else
   1196             cpi->rate_correction_factor = rate_correction_factor;
   1197     }
   1198 }
   1199 
   1200 
   1201 int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
   1202 {
   1203     int Q = cpi->active_worst_quality;
   1204 
   1205     /* Reset Zbin OQ value */
   1206     cpi->mb.zbin_over_quant = 0;
   1207 
   1208     if (cpi->oxcf.fixed_q >= 0)
   1209     {
   1210         Q = cpi->oxcf.fixed_q;
   1211 
   1212         if (cpi->common.frame_type == KEY_FRAME)
   1213         {
   1214             Q = cpi->oxcf.key_q;
   1215         }
   1216         else if (cpi->oxcf.number_of_layers == 1 &&
   1217             cpi->common.refresh_alt_ref_frame)
   1218         {
   1219             Q = cpi->oxcf.alt_q;
   1220         }
   1221         else if (cpi->oxcf.number_of_layers == 1  &&
   1222             cpi->common.refresh_golden_frame)
   1223         {
   1224             Q = cpi->oxcf.gold_q;
   1225         }
   1226 
   1227     }
   1228     else
   1229     {
   1230         int i;
   1231         int last_error = INT_MAX;
   1232         int target_bits_per_mb;
   1233         int bits_per_mb_at_this_q;
   1234         double correction_factor;
   1235 
   1236         /* Select the appropriate correction factor based upon type of frame. */
   1237         if (cpi->common.frame_type == KEY_FRAME)
   1238             correction_factor = cpi->key_frame_rate_correction_factor;
   1239         else
   1240         {
   1241             if (cpi->oxcf.number_of_layers == 1 &&
   1242                (cpi->common.refresh_alt_ref_frame ||
   1243                 cpi->common.refresh_golden_frame))
   1244                 correction_factor = cpi->gf_rate_correction_factor;
   1245             else
   1246                 correction_factor = cpi->rate_correction_factor;
   1247         }
   1248 
   1249         /* Calculate required scaling factor based on target frame size and
   1250          * size of frame produced using previous Q
   1251          */
   1252         if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
   1253             /* Case where we would overflow int */
   1254             target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;
   1255         else
   1256             target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
   1257 
   1258         i = cpi->active_best_quality;
   1259 
   1260         do
   1261         {
   1262             bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
   1263 
   1264             if (bits_per_mb_at_this_q <= target_bits_per_mb)
   1265             {
   1266                 if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
   1267                     Q = i;
   1268                 else
   1269                     Q = i - 1;
   1270 
   1271                 break;
   1272             }
   1273             else
   1274                 last_error = bits_per_mb_at_this_q - target_bits_per_mb;
   1275         }
   1276         while (++i <= cpi->active_worst_quality);
   1277 
   1278 
   1279         /* If we are at MAXQ then enable Q over-run which seeks to claw
   1280          * back additional bits through things like the RD multiplier
   1281          * and zero bin size.
   1282          */
   1283         if (Q >= MAXQ)
   1284         {
   1285             int zbin_oqmax;
   1286 
   1287             double Factor = 0.99;
   1288             double factor_adjustment = 0.01 / 256.0;
   1289 
   1290             if (cpi->common.frame_type == KEY_FRAME)
   1291                 zbin_oqmax = 0;
   1292             else if (cpi->oxcf.number_of_layers == 1 &&
   1293                 (cpi->common.refresh_alt_ref_frame ||
   1294                 (cpi->common.refresh_golden_frame &&
   1295                  !cpi->source_alt_ref_active)))
   1296                 zbin_oqmax = 16;
   1297             else
   1298                 zbin_oqmax = ZBIN_OQ_MAX;
   1299 
   1300             /*{
   1301                 double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
   1302                 double Oq;
   1303 
   1304                 Factor = Factor/1.2683;
   1305 
   1306                 Oq = pow( Factor, (1.0/-0.165) );
   1307 
   1308                 if ( Oq > zbin_oqmax )
   1309                     Oq = zbin_oqmax;
   1310 
   1311                 cpi->zbin_over_quant = (int)Oq;
   1312             }*/
   1313 
   1314             /* Each incrment in the zbin is assumed to have a fixed effect
   1315              * on bitrate. This is not of course true. The effect will be
   1316              * highly clip dependent and may well have sudden steps. The
   1317              * idea here is to acheive higher effective quantizers than the
   1318              * normal maximum by expanding the zero bin and hence
   1319              * decreasing the number of low magnitude non zero coefficients.
   1320              */
   1321             while (cpi->mb.zbin_over_quant < zbin_oqmax)
   1322             {
   1323                 cpi->mb.zbin_over_quant ++;
   1324 
   1325                 if (cpi->mb.zbin_over_quant > zbin_oqmax)
   1326                     cpi->mb.zbin_over_quant = zbin_oqmax;
   1327 
   1328                 /* Adjust bits_per_mb_at_this_q estimate */
   1329                 bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
   1330                 Factor += factor_adjustment;
   1331 
   1332                 if (Factor  >= 0.999)
   1333                     Factor = 0.999;
   1334 
   1335                 /* Break out if we get down to the target rate */
   1336                 if (bits_per_mb_at_this_q <= target_bits_per_mb)
   1337                     break;
   1338             }
   1339 
   1340         }
   1341     }
   1342 
   1343     return Q;
   1344 }
   1345 
   1346 
   1347 static int estimate_keyframe_frequency(VP8_COMP *cpi)
   1348 {
   1349     int i;
   1350 
   1351     /* Average key frame frequency */
   1352     int av_key_frame_frequency = 0;
   1353 
   1354     /* First key frame at start of sequence is a special case. We have no
   1355      * frequency data.
   1356      */
   1357     if (cpi->key_frame_count == 1)
   1358     {
   1359         /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
   1360          * whichever is smaller.
   1361          */
   1362         int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1;
   1363         av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
   1364 
   1365         if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
   1366             av_key_frame_frequency = key_freq;
   1367 
   1368         cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
   1369             = av_key_frame_frequency;
   1370     }
   1371     else
   1372     {
   1373         unsigned int total_weight = 0;
   1374         int last_kf_interval =
   1375                 (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
   1376 
   1377         /* reset keyframe context and calculate weighted average of last
   1378          * KEY_FRAME_CONTEXT keyframes
   1379          */
   1380         for (i = 0; i < KEY_FRAME_CONTEXT; i++)
   1381         {
   1382             if (i < KEY_FRAME_CONTEXT - 1)
   1383                 cpi->prior_key_frame_distance[i]
   1384                     = cpi->prior_key_frame_distance[i+1];
   1385             else
   1386                 cpi->prior_key_frame_distance[i] = last_kf_interval;
   1387 
   1388             av_key_frame_frequency += prior_key_frame_weight[i]
   1389                                       * cpi->prior_key_frame_distance[i];
   1390             total_weight += prior_key_frame_weight[i];
   1391         }
   1392 
   1393         av_key_frame_frequency  /= total_weight;
   1394 
   1395     }
   1396     // TODO (marpan): Given the checks above, |av_key_frame_frequency|
   1397     // should always be above 0. But for now we keep the sanity check in.
   1398     if (av_key_frame_frequency == 0)
   1399         av_key_frame_frequency = 1;
   1400     return av_key_frame_frequency;
   1401 }
   1402 
   1403 
   1404 void vp8_adjust_key_frame_context(VP8_COMP *cpi)
   1405 {
   1406     /* Clear down mmx registers to allow floating point in what follows */
   1407     vp8_clear_system_state();
   1408 
   1409     /* Do we have any key frame overspend to recover? */
   1410     /* Two-pass overspend handled elsewhere. */
   1411     if ((cpi->pass != 2)
   1412          && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
   1413     {
   1414         int overspend;
   1415 
   1416         /* Update the count of key frame overspend to be recovered in
   1417          * subsequent frames. A portion of the KF overspend is treated as gf
   1418          * overspend (and hence recovered more quickly) as the kf is also a
   1419          * gf. Otherwise the few frames following each kf tend to get more
   1420          * bits allocated than those following other gfs.
   1421          */
   1422         overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
   1423 
   1424         if (cpi->oxcf.number_of_layers > 1)
   1425             cpi->kf_overspend_bits += overspend;
   1426         else
   1427         {
   1428             cpi->kf_overspend_bits += overspend * 7 / 8;
   1429             cpi->gf_overspend_bits += overspend * 1 / 8;
   1430         }
   1431 
   1432         /* Work out how much to try and recover per frame. */
   1433         cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits
   1434                                      / estimate_keyframe_frequency(cpi);
   1435     }
   1436 
   1437     cpi->frames_since_key = 0;
   1438     cpi->key_frame_count++;
   1439 }
   1440 
   1441 
   1442 void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
   1443 {
   1444     /* Set-up bounds on acceptable frame size: */
   1445     if (cpi->oxcf.fixed_q >= 0)
   1446     {
   1447         /* Fixed Q scenario: frame size never outranges target
   1448          * (there is no target!)
   1449          */
   1450         *frame_under_shoot_limit = 0;
   1451         *frame_over_shoot_limit  = INT_MAX;
   1452     }
   1453     else
   1454     {
   1455         if (cpi->common.frame_type == KEY_FRAME)
   1456         {
   1457             *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
   1458             *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
   1459         }
   1460         else
   1461         {
   1462             if (cpi->oxcf.number_of_layers > 1 ||
   1463                 cpi->common.refresh_alt_ref_frame ||
   1464                 cpi->common.refresh_golden_frame)
   1465             {
   1466                 *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
   1467                 *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
   1468             }
   1469             else
   1470             {
   1471                 /* For CBR take buffer fullness into account */
   1472                 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
   1473                 {
   1474                     if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
   1475                     {
   1476                         /* Buffer is too full so relax overshoot and tighten
   1477                          * undershoot
   1478                          */
   1479                         *frame_over_shoot_limit  = cpi->this_frame_target * 12 / 8;
   1480                         *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
   1481                     }
   1482                     else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
   1483                     {
   1484                         /* Buffer is too low so relax undershoot and tighten
   1485                          * overshoot
   1486                          */
   1487                         *frame_over_shoot_limit  = cpi->this_frame_target * 10 / 8;
   1488                         *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
   1489                     }
   1490                     else
   1491                     {
   1492                         *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
   1493                         *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
   1494                     }
   1495                 }
   1496                 /* VBR and CQ mode */
   1497                 /* Note that tighter restrictions here can help quality
   1498                  * but hurt encode speed
   1499                  */
   1500                 else
   1501                 {
   1502                     /* Stron overshoot limit for constrained quality */
   1503                     if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
   1504                     {
   1505                         *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
   1506                         *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
   1507                     }
   1508                     else
   1509                     {
   1510                         *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
   1511                         *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
   1512                     }
   1513                 }
   1514             }
   1515         }
   1516 
   1517         /* For very small rate targets where the fractional adjustment
   1518          * (eg * 7/8) may be tiny make sure there is at least a minimum
   1519          * range.
   1520          */
   1521         *frame_over_shoot_limit += 200;
   1522         *frame_under_shoot_limit -= 200;
   1523         if ( *frame_under_shoot_limit < 0 )
   1524             *frame_under_shoot_limit = 0;
   1525 
   1526     }
   1527 }
   1528 
   1529 
   1530 /* return of 0 means drop frame */
   1531 int vp8_pick_frame_size(VP8_COMP *cpi)
   1532 {
   1533     VP8_COMMON *cm = &cpi->common;
   1534 
   1535     if (cm->frame_type == KEY_FRAME)
   1536         calc_iframe_target_size(cpi);
   1537     else
   1538     {
   1539         calc_pframe_target_size(cpi);
   1540 
   1541         /* Check if we're dropping the frame: */
   1542         if (cpi->drop_frame)
   1543         {
   1544             cpi->drop_frame = 0;
   1545             return 0;
   1546         }
   1547     }
   1548     return 1;
   1549 }
   1550