190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h>
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h>
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h>
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <limits.h>
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <assert.h>
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "math.h"
1879f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/common.h"
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "ratectrl.h"
2079f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/entropymode.h"
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
2279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/systemdependent.h"
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "encodemv.h"
242263fc984bdc858ee931d3e35c87c404de923950Johann#include "vpx_dsp/vpx_dsp_common.h"
257bc9febe8749e98a3812a0dc4380ceae75c29450Johann#include "vpx_ports/system_state.h"
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
277bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define MIN_BPB_FACTOR 0.01
287bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define MAX_BPB_FACTOR 50
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int y_modes[5];
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int uv_modes[4];
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int b_modes[10];
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_y_modes[10];
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_uv_modes[4];
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_b_modes[10];
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
421b362b15af34006e6a11974088a46d42b903418eJohann/* Bits Per MB at different Q (Multiplied by 512) */
437bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define BPER_MB_NORMBITS 9
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
451b362b15af34006e6a11974088a46d42b903418eJohann/* Work in progress recalibration of baseline rate tables based on
461b362b15af34006e6a11974088a46d42b903418eJohann * the assumption that bits per mb is inversely proportional to the
471b362b15af34006e6a11974088a46d42b903418eJohann * quantizer value.
481b362b15af34006e6a11974088a46d42b903418eJohann */
497bc9febe8749e98a3812a0dc4380ceae75c29450Johannconst int vp8_bits_per_mb[2][QINDEX_RANGE] = {
507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Intra case 450000/Qintra */
517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      1125000, 900000, 750000, 642857, 562500, 500000, 450000, 450000, 409090,
537bc9febe8749e98a3812a0dc4380ceae75c29450Johann      375000,  346153, 321428, 300000, 281250, 264705, 264705, 250000, 236842,
547bc9febe8749e98a3812a0dc4380ceae75c29450Johann      225000,  225000, 214285, 214285, 204545, 204545, 195652, 195652, 187500,
557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      180000,  180000, 173076, 166666, 160714, 155172, 150000, 145161, 140625,
567bc9febe8749e98a3812a0dc4380ceae75c29450Johann      136363,  132352, 128571, 125000, 121621, 121621, 118421, 115384, 112500,
577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      109756,  107142, 104651, 102272, 100000, 97826,  97826,  95744,  93750,
587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      91836,   90000,  88235,  86538,  84905,  83333,  81818,  80357,  78947,
597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      77586,   76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      67164,   66176,  65217,  64285,  63380,  62500,  61643,  60810,  60000,
617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      59210,   59210,  58441,  57692,  56962,  56250,  55555,  54878,  54216,
627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      53571,   52941,  52325,  51724,  51136,  50561,  49450,  48387,  47368,
637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      46875,   45918,  45000,  44554,  44117,  43269,  42452,  41666,  40909,
647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      40178,   39473,  38793,  38135,  36885,  36290,  35714,  35156,  34615,
657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      34090,   33582,  33088,  32608,  32142,  31468,  31034,  30405,  29801,
667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      29220,   28662,
677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  },
687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Inter case 285000/Qinter */
697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090, 237500,
717bc9febe8749e98a3812a0dc4380ceae75c29450Johann      219230, 203571, 190000, 178125, 167647, 158333, 150000, 142500, 135714,
727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      129545, 123913, 118750, 114000, 109615, 105555, 101785, 98275,  95000,
737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      91935,  89062,  86363,  83823,  81428,  79166,  77027,  75000,  73076,
747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      71250,  69512,  67857,  66279,  64772,  63333,  61956,  60638,  59375,
757bc9febe8749e98a3812a0dc4380ceae75c29450Johann      58163,  57000,  55882,  54807,  53773,  52777,  51818,  50892,  50000,
767bc9febe8749e98a3812a0dc4380ceae75c29450Johann      49137,  47500,  45967,  44531,  43181,  41911,  40714,  39583,  38513,
777bc9febe8749e98a3812a0dc4380ceae75c29450Johann      37500,  36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
787bc9febe8749e98a3812a0dc4380ceae75c29450Johann      30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,  25909,
797bc9febe8749e98a3812a0dc4380ceae75c29450Johann      25446,  25000,  24568,  23949,  23360,  22800,  22265,  21755,  21268,
807bc9febe8749e98a3812a0dc4380ceae75c29450Johann      20802,  20357,  19930,  19520,  19127,  18750,  18387,  18037,  17701,
817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      17378,  17065,  16764,  16473,  16101,  15745,  15405,  15079,  14766,
827bc9febe8749e98a3812a0dc4380ceae75c29450Johann      14467,  14179,  13902,  13636,  13380,  13133,  12895,  12666,  12445,
837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      12179,  11924,  11632,  11445,  11220,  11003,  10795,  10594,  10401,
847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      10215,  10035,
857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int kf_boost_qadjustment[QINDEX_RANGE] = {
897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201,
947bc9febe8749e98a3812a0dc4380ceae75c29450Johann  201, 202, 203, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208,
957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  216, 217, 217, 218, 218, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220,
977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  220, 220, 220, 220, 220, 220, 220, 220,
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1001b362b15af34006e6a11974088a46d42b903418eJohann/* #define GFQ_ADJUSTMENT (Q+100) */
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
1027bc9febe8749e98a3812a0dc4380ceae75c29450Johannconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] = {
1037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  80,  82,  84,  86,  88,  90,  92,  94,  96,  97,  98,  99,  100, 101, 102,
1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann  133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
1087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
1097bc9febe8749e98a3812a0dc4380ceae75c29450Johann  178, 179, 180, 181, 182, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188,
1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 194, 194,
1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  195, 195, 196, 196, 197, 197, 198, 198
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    100,101,102,103,104,105,105,106,
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    106,107,107,108,109,109,110,111,
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    112,113,114,115,116,117,118,119,
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    120,121,122,123,124,125,126,127,
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    128,129,130,131,132,133,134,135,
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    136,137,138,139,140,141,142,143,
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    144,145,146,147,148,149,150,151,
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    152,153,154,155,156,157,158,159,
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    160,161,162,163,164,165,166,167,
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    168,169,170,170,171,171,172,172,
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    173,173,173,174,174,174,175,175,
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    175,176,176,176,177,177,177,177,
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    178,178,179,179,180,180,181,181,
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    182,182,183,183,184,184,185,185,
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    186,186,187,187,188,188,189,189,
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    190,190,191,191,192,192,193,193,
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*/
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int kf_gf_boost_qlimits[QINDEX_RANGE] = {
1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220,
1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295,
1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  300, 305, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430,
1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580,
1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann  590, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
1427bc9febe8749e98a3812a0dc4380ceae75c29450Johann  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
1447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
1457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  600, 600, 600, 600, 600, 600, 600, 600,
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1487bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_adjust_table[101] = {
1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  100, 115, 130, 145, 160, 175, 190, 200, 210, 220, 230, 240, 260, 270, 280,
1507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 400, 400, 400,
1517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
1537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1587bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_intra_usage_adjustment[20] = {
1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  125, 120, 115, 110, 105, 100, 95, 85, 80, 75,
1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  70,  65,  60,  55,  50,  50,  50, 50, 50, 50,
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1637bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int gf_interval_table[101] = {
1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,
1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1727bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3,
1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                                        4, 5 };
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1757bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_save_coding_context(VP8_COMP *cpi) {
1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CODING_CONTEXT *const cc = &cpi->coding_context;
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Stores a snapshot of key state variables which can subsequently be
1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * restored with a call to vp8_restore_coding_context. These functions are
1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * intended for use in a re-code loop in vp8_compress_frame where the
1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * quantizer value is adjusted between loop iterations.
1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cc->frames_since_key = cpi->frames_since_key;
1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cc->filter_level = cpi->common.filter_level;
1867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due;
1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cc->frames_since_golden = cpi->frames_since_golden;
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->mvc, cpi->common.fc.mvc);
1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts);
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
1937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
1967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1987bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* Stats */
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->y_modes, y_modes);
2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->uv_modes, uv_modes);
2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->b_modes, b_modes);
2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->inter_y_modes, inter_y_modes);
2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->inter_uv_modes, inter_uv_modes);
2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cc->inter_b_modes, inter_b_modes);
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2117bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_restore_coding_context(VP8_COMP *cpi) {
2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  CODING_CONTEXT *const cc = &cpi->coding_context;
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Restore key state variables to the snapshot state stored in the
2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * previous call to vp8_save_coding_context.
2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_since_key = cc->frames_since_key;
2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.filter_level = cc->filter_level;
2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due;
2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_since_golden = cc->frames_since_golden;
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->common.fc.mvc, cc->mvc);
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob);
2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob);
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
2317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2337bc9febe8749e98a3812a0dc4380ceae75c29450Johann/* Stats */
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
2357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(y_modes, cc->y_modes);
2367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(uv_modes, cc->uv_modes);
2377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(b_modes, cc->b_modes);
2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(inter_y_modes, cc->inter_y_modes);
2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(inter_uv_modes, cc->inter_uv_modes);
2407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_copy(inter_b_modes, cc->inter_b_modes);
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2467bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_setup_key_frame(VP8_COMP *cpi) {
2477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Setup for Key frame: */
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vp8_default_coef_probs(&cpi->common);
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(cpi->common.fc.mvc, vp8_default_mv_context,
2527bc9febe8749e98a3812a0dc4380ceae75c29450Johann         sizeof(vp8_default_mv_context));
2537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  {
2547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int flag[2] = { 1, 1 };
2557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    vp8_build_component_cost_table(
2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flag);
2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Make sure we initialize separate contexts for altref,gold, and normal.
2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * TODO shouldn't need 3 different copies of structure to do this!
2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.filter_level = cpi->common.base_qindex * 3 / 8;
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Provisional interval before next GF */
2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->auto_gold) {
2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
2727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
2737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
2741b362b15af34006e6a11974088a46d42b903418eJohann
2757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_golden_frame = 1;
2767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->common.refresh_alt_ref_frame = 1;
2771b362b15af34006e6a11974088a46d42b903418eJohann}
2781b362b15af34006e6a11974088a46d42b903418eJohann
2791b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_bits_at_q(int frame_kind, int Q, int MBs,
2807bc9febe8749e98a3812a0dc4380ceae75c29450Johann                              double correction_factor) {
2817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
2827bc9febe8749e98a3812a0dc4380ceae75c29450Johann
2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Attempt to retain reasonable accuracy without overflow. The cutoff is
2847bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * largest Bpm takes 20 bits.
2867bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (MBs > (1 << 11)) {
2887bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return (Bpm >> BPER_MB_NORMBITS) * MBs;
2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return (Bpm * MBs) >> BPER_MB_NORMBITS;
2917bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2947bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_iframe_target_size(VP8_COMP *cpi) {
2957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* boost defaults to half second */
2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int kf_boost;
2977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  uint64_t target;
2981b362b15af34006e6a11974088a46d42b903418eJohann
2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers to allow floating point in what follows */
3007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3027bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q >= 0) {
3037bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int Q = cpi->oxcf.key_q;
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                cpi->key_frame_rate_correction_factor);
3077bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (cpi->pass == 2) {
3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* New Two pass RC */
3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    target = cpi->per_frame_bandwidth;
3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* First Frame is a special case */
3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else if (cpi->common.current_video_frame == 0) {
3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 1 Pass there is no information on which to base size so use
3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * bandwidth per second * fraction of the initial buffer
3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * level
3167bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
3177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    target = cpi->oxcf.starting_buffer_level / 2;
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (target > cpi->oxcf.target_bandwidth * 3 / 2) {
3207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      target = cpi->oxcf.target_bandwidth * 3 / 2;
3211b362b15af34006e6a11974088a46d42b903418eJohann    }
3227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* if this keyframe was forced, use a more recent Q estimate */
3247bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ? cpi->avg_frame_qindex
3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                       : cpi->ni_av_qi;
3267bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Boost depends somewhat on frame rate: only used for 1 layer case. */
3297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.number_of_layers == 1) {
3307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      kf_boost = VPXMAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
3317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
3327bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
3337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      kf_boost = initial_boost;
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3367bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
3377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* frame separation adjustment ( down) */
3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->frames_since_key < cpi->output_framerate / 2) {
3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann      kf_boost =
3427bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)(kf_boost * cpi->frames_since_key / (cpi->output_framerate / 2));
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Minimal target size is |2* per_frame_bandwidth|. */
3467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (kf_boost < 16) kf_boost = 16;
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.rc_max_intra_bitrate_pct) {
3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int max_rate =
3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->per_frame_bandwidth * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (target > max_rate) target = max_rate;
3567bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
3571b362b15af34006e6a11974088a46d42b903418eJohann
3587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->this_frame_target = (int)target;
3597bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* TODO: if we separate rate targeting from Q targetting, move this.
3617bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * Reset the active worst quality to the baseline value for key frames.
3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass != 2) cpi->active_worst_quality = cpi->worst_quality;
3641b362b15af34006e6a11974088a46d42b903418eJohann
3651b362b15af34006e6a11974088a46d42b903418eJohann#if 0
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f;
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        f = fopen("kf_boost.stt", "a");
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, " %8u %10d %10d %10d\n",
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
3751b362b15af34006e6a11974088a46d42b903418eJohann#endif
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3781b362b15af34006e6a11974088a46d42b903418eJohann/* Do the best we can to define the parameters for the next GF based on what
3791b362b15af34006e6a11974088a46d42b903418eJohann * information we have available.
3801b362b15af34006e6a11974088a46d42b903418eJohann */
3817bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_gf_params(VP8_COMP *cpi) {
3827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Q =
3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Boost = 0;
3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int gf_frame_useage = 0; /* Golden frame useage since last GF */
3877bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann                cpi->recent_ref_frame_usage[LAST_FRAME] +
3897bc9febe8749e98a3812a0dc4380ceae75c29450Johann                cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
3907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                cpi->recent_ref_frame_usage[ALTREF_FRAME];
3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int pct_gf_active = (100 * cpi->gf_active_count) /
3937bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      (cpi->common.mb_rows * cpi->common.mb_cols);
3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann
3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (tot_mbs) {
3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann                       cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
3987bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      100 / tot_mbs;
3997bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4017bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active;
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Not two pass */
4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass != 2) {
4057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Single Pass lagged mode: TBD */
4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (0) {
4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Single Pass compression: Has to use current and historical data */
4107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else {
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
4121b362b15af34006e6a11974088a46d42b903418eJohann            /* Experimental code */
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int index = cpi->one_pass_frame_index;
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4161b362b15af34006e6a11974088a46d42b903418eJohann            /* ************** Experimental code - incomplete */
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double decay_val = 1.0;
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIAccumulator = 0.0;
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double last_iiaccumulator = 0.0;
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIRatio;
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for ( i = 0; i < (frames_to_scan - 1); i++ )
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( index < 0 )
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    index = MAX_LAG_BUFFERS;
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                index --;
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( IIRatio > 30.0 )
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        IIRatio = 30.0;
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = 30.0;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                IIAccumulator += IIRatio * decay_val;
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (    (i > MIN_GF_INTERVAL) &&
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_iiaccumulator = IIAccumulator;
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = IIAccumulator*100.0/16.0;
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->baseline_gf_interval = i;
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            */
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4597bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /*************************************************************/
4607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* OLD code */
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Adjust boost based upon ambient Q */
4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Boost = GFQ_ADJUSTMENT;
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Adjust based upon most recently measure intra useage */
4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Boost = Boost *
4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann              gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15)
4687bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            ? cpi->this_frame_percent_intra
4697bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                            : 14] /
4707bc9febe8749e98a3812a0dc4380ceae75c29450Johann              100;
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Adjust gf boost based upon GF usage since last GF */
4737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* golden frame boost without recode loop often goes awry.  be
4787bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * safe by keeping numbers down.
4797bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->sf.recode_loop) {
4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->compressor_speed == 2) Boost = Boost / 2;
4827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Apply an upper limit based on Q for 1 pass encodes */
4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0)) {
4867bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Boost = kf_gf_boost_qlimits[Q];
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Apply lower limits to boost. */
4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (Boost < 110) {
4907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Boost = 110;
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Note the boost used */
4947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->last_boost = Boost;
4957bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
4967bc9febe8749e98a3812a0dc4380ceae75c29450Johann
4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Estimate next interval
4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * This is updated once the real frame size/boost is known.
4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
5007bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q == -1) {
501df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if (cpi->pass == 2) { /* 2 Pass */
5027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
503df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    } else { /* 1 Pass */
5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5067bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->last_boost > 750) cpi->frames_till_gf_update_due++;
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->last_boost > 1000) cpi->frames_till_gf_update_due++;
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->last_boost > 1250) cpi->frames_till_gf_update_due++;
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->last_boost >= 1500) cpi->frames_till_gf_update_due++;
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due) {
5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->frames_till_gf_update_due > cpi->max_gf_interval) {
5197bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->frames_till_gf_update_due = cpi->max_gf_interval;
5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* ARF on or off */
5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass != 2) {
5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* For now Alt ref is not allowed except in 2 pass modes. */
5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->source_alt_ref_pending = 0;
5307bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /*if ( cpi->oxcf.fixed_q == -1)
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5337bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 +
5347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->source_alt_ref_pending = 1;
5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann        else
5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->source_alt_ref_pending = 0;
5387bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }*/
5397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5427bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void calc_pframe_target_size(VP8_COMP *cpi) {
5437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int min_frame_target;
5447bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5467bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->current_layer > 0) {
5477bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->per_frame_bandwidth =
5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  min_frame_target = 0;
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 2) {
5547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    min_frame_target = cpi->min_frame_bandwidth;
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) {
5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann      min_frame_target = cpi->av_per_frame_bandwidth >> 5;
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
5597bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (min_frame_target < cpi->per_frame_bandwidth / 4) {
5607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    min_frame_target = cpi->per_frame_bandwidth / 4;
5617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5637bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Special alt reference frame case */
5647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->common.refresh_alt_ref_frame) &&
5657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.number_of_layers == 1)) {
5667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 2) {
5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Per frame bit target for the alt ref frame */
5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
5697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->this_frame_target = cpi->per_frame_bandwidth;
5707bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5727bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* One Pass ??? TBD */
5737bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Normal frames (gf,and inter) */
5767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  else {
5777bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 2 pass */
5787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->pass == 2) {
5797bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->this_frame_target = cpi->per_frame_bandwidth;
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
5817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* 1 pass */
5827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else {
5837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int Adjustment;
5847bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Make rate adjustment to recover bits spent in key frame
5857bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * Test to see if the key frame inter data rate correction
5867bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * should still be in force
5877bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
5887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->kf_overspend_bits > 0) {
5897bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits)
5907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         ? cpi->kf_bitrate_adjustment
5917bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         : cpi->kf_overspend_bits;
5927bc9febe8749e98a3812a0dc4380ceae75c29450Johann
5937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target)) {
5947bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->kf_overspend_bits -= Adjustment;
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Calculate an inter frame bandwidth target for the next
6007bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * few frames designed to recover any extra bits spent on
6017bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * the key frame.
6027bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->this_frame_target < min_frame_target) {
6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->this_frame_target = min_frame_target;
6077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
6087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
6097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target = cpi->per_frame_bandwidth;
6107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
6117bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* If appropriate make an adjustment to recover bits spent on a
6137bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * recent GF
6147bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
6157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->gf_overspend_bits > 0) &&
6167bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->this_frame_target > min_frame_target)) {
6177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits)
6187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         ? cpi->non_gf_bitrate_adjustment
6197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                         : cpi->gf_overspend_bits;
6207bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
6227bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = (cpi->this_frame_target - min_frame_target);
6237bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6257bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->gf_overspend_bits -= Adjustment;
6267bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target -= Adjustment;
6277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Apply small + and - boosts for non gf frames */
6307bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
6317bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1))) {
6327bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* % Adjustment limited to the range 1% to 10% */
6337bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Adjustment = (cpi->last_boost - 100) >> 5;
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6357bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Adjustment < 1) {
6367bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = 1;
6377bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (Adjustment > 10) {
6387bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = 10;
6397bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6417bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Convert to bits */
6427bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Adjustment = (cpi->this_frame_target * Adjustment) / 100;
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6447bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
6457bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = (cpi->this_frame_target - min_frame_target);
6467bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6487bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1)) {
6497bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Adjustment = (cpi->current_gf_interval - 1) * Adjustment;
6507bc9febe8749e98a3812a0dc4380ceae75c29450Johann          // Limit adjustment to 10% of current target.
6517bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (Adjustment > (10 * cpi->this_frame_target) / 100) {
6527bc9febe8749e98a3812a0dc4380ceae75c29450Johann            Adjustment = (10 * cpi->this_frame_target) / 100;
6537bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
6547bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->this_frame_target += Adjustment;
6557bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
6567bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->this_frame_target -= Adjustment;
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
6587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
6607bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Sanity check that the total sum of adjustments is not above the
6637bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * maximum allowed That is that having allowed for KF and GF penalties
6647bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * we have not pushed the current interframe target to low. If the
6657bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * adjustment we apply here is not capable of recovering all the extra
6667bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * bits we have spent in the KF or GF then the remainder will have to
6677bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * be recovered over a longer time span via other buffer / rate control
6687bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * mechanisms.
6697bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
6707bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->this_frame_target < min_frame_target) {
6717bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->this_frame_target = min_frame_target;
6727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (!cpi->common.refresh_alt_ref_frame) {
6757bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Note the baseline target data rate for this inter frame. */
6767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->inter_frame_target = cpi->this_frame_target;
6777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6797bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* One Pass specific code */
6807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->pass == 0) {
6817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Adapt target frame size with respect to any buffering constraints: */
6827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->buffered_mode) {
6837bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100);
6847bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
6867bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level)) {
6877bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int percent_low = 0;
6887bc9febe8749e98a3812a0dc4380ceae75c29450Johann
6897bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Decide whether or not we need to adjust the frame data
6907bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * rate target.
6917bc9febe8749e98a3812a0dc4380ceae75c29450Johann         *
6927bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * If we are are below the optimal buffer fullness level
6937bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * and adherence to buffering constraints is important to
6947bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * the end usage then adjust the per frame target.
6957bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
6967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
6977bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) {
6987bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_low =
6997bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (int)((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
7007bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    one_percent_bits);
7017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
7027bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Are we overshooting the long term clip data rate... */
7037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        else if (cpi->bits_off_target < 0) {
7047bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Adjust per frame data target downwards to compensate. */
7057bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_low =
7067bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (int)(100 * -cpi->bits_off_target / (cpi->total_byte_count * 8));
7077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (percent_low > cpi->oxcf.under_shoot_pct) {
7107bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_low = cpi->oxcf.under_shoot_pct;
7117bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (percent_low < 0) {
7127bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_low = 0;
7137bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7157bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* lower the target bandwidth for this frame. */
7167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target -= (cpi->this_frame_target * percent_low) / 200;
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7187bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Are we using allowing control of active_worst_allowed_q
7197bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * according to buffer level.
7207bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
7217bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
7227bc9febe8749e98a3812a0dc4380ceae75c29450Johann          int64_t critical_buffer_level;
7237bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7247bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* For streaming applications the most important factor is
7257bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * cpi->buffer_level as this takes into account the
7267bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * specified short term buffering constraints. However,
7277bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * hitting the long term clip data rate target is also
7287bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * important.
7297bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
7307bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
7317bc9febe8749e98a3812a0dc4380ceae75c29450Johann            /* Take the smaller of cpi->buffer_level and
7327bc9febe8749e98a3812a0dc4380ceae75c29450Johann             * cpi->bits_off_target
7337bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
7347bc9febe8749e98a3812a0dc4380ceae75c29450Johann            critical_buffer_level = (cpi->buffer_level < cpi->bits_off_target)
7357bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        ? cpi->buffer_level
7367bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                        : cpi->bits_off_target;
7377bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
7387bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* For local file playback short term buffering constraints
7397bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * are less of an issue
7407bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
7417bc9febe8749e98a3812a0dc4380ceae75c29450Johann          else {
7427bc9febe8749e98a3812a0dc4380ceae75c29450Johann            /* Consider only how we are doing for the clip as a
7437bc9febe8749e98a3812a0dc4380ceae75c29450Johann             * whole
7447bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
7457bc9febe8749e98a3812a0dc4380ceae75c29450Johann            critical_buffer_level = cpi->bits_off_target;
7467bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
7477bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7487bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Set the active worst quality based upon the selected
7497bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * buffer fullness number.
7507bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
7517bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) {
7527bc9febe8749e98a3812a0dc4380ceae75c29450Johann            if (critical_buffer_level > (cpi->oxcf.optimal_buffer_level >> 2)) {
7537bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int64_t qadjustment_range = cpi->worst_quality - cpi->ni_av_qi;
7547bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int64_t above_base = (critical_buffer_level -
7557bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    (cpi->oxcf.optimal_buffer_level >> 2));
7567bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7577bc9febe8749e98a3812a0dc4380ceae75c29450Johann              /* Step active worst quality down from
7587bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * cpi->ni_av_qi when (critical_buffer_level ==
7597bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * cpi->optimal_buffer_level) to
7607bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * cpi->worst_quality when
7617bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * (critical_buffer_level ==
7627bc9febe8749e98a3812a0dc4380ceae75c29450Johann               *     cpi->optimal_buffer_level >> 2)
7637bc9febe8749e98a3812a0dc4380ceae75c29450Johann               */
7647bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->active_worst_quality =
7657bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  cpi->worst_quality -
7667bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  (int)((qadjustment_range * above_base) /
7677bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        (cpi->oxcf.optimal_buffer_level * 3 >> 2));
7687bc9febe8749e98a3812a0dc4380ceae75c29450Johann            } else {
7697bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->active_worst_quality = cpi->worst_quality;
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
7717bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
7727bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->active_worst_quality = cpi->ni_av_qi;
7737bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
7747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
7757bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_worst_quality = cpi->worst_quality;
7767bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
7777bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
7787bc9febe8749e98a3812a0dc4380ceae75c29450Johann        int percent_high = 0;
7797bc9febe8749e98a3812a0dc4380ceae75c29450Johann
7807bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
7817bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) {
7827bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_high =
7837bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
7847bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    one_percent_bits);
7857bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) {
7867bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_high =
7877bc9febe8749e98a3812a0dc4380ceae75c29450Johann              (int)((100 * cpi->bits_off_target) / (cpi->total_byte_count * 8));
7887bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7907bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (percent_high > cpi->oxcf.over_shoot_pct) {
7917bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_high = cpi->oxcf.over_shoot_pct;
7927bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (percent_high < 0) {
7937bc9febe8749e98a3812a0dc4380ceae75c29450Johann          percent_high = 0;
7947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target += (cpi->this_frame_target * percent_high) / 200;
79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7987bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Are we allowing control of active_worst_allowed_q according
7997bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * to buffer level.
8007bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
8017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
8027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* When using the relaxed buffer model stick to the
8037bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * user specified value
8047bc9febe8749e98a3812a0dc4380ceae75c29450Johann           */
8057bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_worst_quality = cpi->ni_av_qi;
8067bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
8077bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->active_worst_quality = cpi->worst_quality;
8087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
8097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Set active_best_quality to prevent quality rising too high */
8127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_best_quality = cpi->best_quality;
81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Worst quality obviously must not be better than best quality */
8157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->active_worst_quality <= cpi->active_best_quality) {
8167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_worst_quality = cpi->active_best_quality + 1;
8177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->active_worst_quality > 127) cpi->active_worst_quality = 127;
8207bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
8217bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Unbuffered mode (eg. video conferencing) */
8227bc9febe8749e98a3812a0dc4380ceae75c29450Johann    else {
8237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Set the active worst quality */
8247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_worst_quality = cpi->worst_quality;
8257bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
82679f15823c34ae1e423108295e416213200bb280fAndreas Huber
8277bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Special trap for constrained quality mode
8287bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * "active_worst_quality" may never drop below cq level
8297bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * for any frame type.
8307bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->active_worst_quality < cpi->cq_target_quality) {
8337bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->active_worst_quality = cpi->cq_target_quality;
83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Test to see if we have to drop a frame
8387bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * The auto-drop frame code is only used in buffered mode.
8397bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * In unbufferd mode (eg vide conferencing) the descision to
8407bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * code or drop a frame is made outside the codec in response to real
8417bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * world comms or buffer considerations.
8427bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
8437bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->drop_frames_allowed &&
8447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
8457bc9febe8749e98a3812a0dc4380ceae75c29450Johann      ((cpi->common.frame_type != KEY_FRAME))) {
8467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Check for a buffer underun-crisis in which case we have to drop
8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * a frame
8481b362b15af34006e6a11974088a46d42b903418eJohann     */
8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if ((cpi->buffer_level < 0)) {
85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f = fopen("dec.stt", "a");
85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (int) cpi->common.current_video_frame,
85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->decimation_factor, cpi->common.horiz_scale,
85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
8587bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->drop_frame = 1;
8597bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8607bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Update the buffer level variable. */
8617bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->bits_off_target += cpi->av_per_frame_bandwidth;
8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
8637bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
8647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
8657bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->buffer_level = cpi->bits_off_target;
8667bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.number_of_layers > 1) {
8687bc9febe8749e98a3812a0dc4380ceae75c29450Johann        unsigned int i;
8697bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8707bc9febe8749e98a3812a0dc4380ceae75c29450Johann        // Propagate bits saved by dropping the frame to higher layers.
8717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
8727bc9febe8749e98a3812a0dc4380ceae75c29450Johann          LAYER_CONTEXT *lc = &cpi->layer_context[i];
8737bc9febe8749e98a3812a0dc4380ceae75c29450Johann          lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
8747bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (lc->bits_off_target > lc->maximum_buffer_size) {
8757bc9febe8749e98a3812a0dc4380ceae75c29450Johann            lc->bits_off_target = lc->maximum_buffer_size;
8767bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
8777bc9febe8749e98a3812a0dc4380ceae75c29450Johann          lc->buffer_level = lc->bits_off_target;
87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
8797bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8817bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8837bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Adjust target frame size for Golden Frames: */
8847bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.error_resilient_mode == 0 &&
8857bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame) {
8867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (!cpi->gf_update_onepass_cbr) {
8877bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
8887bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                      : cpi->oxcf.fixed_q;
8897bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8907bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int gf_frame_useage = 0; /* Golden frame useage since last GF */
8917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
8927bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    cpi->recent_ref_frame_usage[LAST_FRAME] +
8937bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
8947bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    cpi->recent_ref_frame_usage[ALTREF_FRAME];
8957bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8967bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int pct_gf_active = (100 * cpi->gf_active_count) /
8977bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          (cpi->common.mb_rows * cpi->common.mb_cols);
8987bc9febe8749e98a3812a0dc4380ceae75c29450Johann
8997bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (tot_mbs) {
9007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
9017bc9febe8749e98a3812a0dc4380ceae75c29450Johann                           cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
9027bc9febe8749e98a3812a0dc4380ceae75c29450Johann                          100 / tot_mbs;
9037bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
9047bc9febe8749e98a3812a0dc4380ceae75c29450Johann
9057bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active;
9067bc9febe8749e98a3812a0dc4380ceae75c29450Johann
9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Is a fixed manual GF frequency being used */
9087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->auto_gold) {
9097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* For one pass throw a GF if recent frame intra useage is
9107bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * low or the GF useage is high
9117bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
9127bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ((cpi->pass == 0) &&
9137bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5)) {
9147bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->common.refresh_golden_frame = 1;
91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9167bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Two pass GF descision */
9177bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else if (cpi->pass == 2) {
9187bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->common.refresh_golden_frame = 1;
91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
9207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
92190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
92290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
92390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9247bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Debug stats */
9257bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (0) {
9267bc9febe8749e98a3812a0dc4380ceae75c29450Johann              FILE *f;
92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9287bc9febe8749e98a3812a0dc4380ceae75c29450Johann              f = fopen("gf_useaget.stt", "a");
9297bc9febe8749e98a3812a0dc4380ceae75c29450Johann              fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
9307bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      cpi->common.current_video_frame,  cpi->gfu_boost,
9317bc9febe8749e98a3812a0dc4380ceae75c29450Johann                      GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
9327bc9febe8749e98a3812a0dc4380ceae75c29450Johann              fclose(f);
9337bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9377bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->common.refresh_golden_frame == 1) {
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9407bc9febe8749e98a3812a0dc4380ceae75c29450Johann            if (0) {
94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FILE *f;
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                f = fopen("GFexit.stt", "a");
94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fclose(f);
94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9507bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->auto_adjust_gold_quantizer) {
9517bc9febe8749e98a3812a0dc4380ceae75c29450Johann          calc_gf_params(cpi);
9527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9547bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* If we are using alternate ref instead of gf then do not apply the
9557bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * boost It will instead be applied to the altref update Jims
9567bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * modified boost
9577bc9febe8749e98a3812a0dc4380ceae75c29450Johann         */
9587bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (!cpi->source_alt_ref_active) {
9597bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->oxcf.fixed_q < 0) {
9607bc9febe8749e98a3812a0dc4380ceae75c29450Johann            if (cpi->pass == 2) {
9617bc9febe8749e98a3812a0dc4380ceae75c29450Johann              /* The spend on the GF is defined in the two pass
9627bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * code for two pass encodes
9637bc9febe8749e98a3812a0dc4380ceae75c29450Johann               */
9647bc9febe8749e98a3812a0dc4380ceae75c29450Johann              cpi->this_frame_target = cpi->per_frame_bandwidth;
9657bc9febe8749e98a3812a0dc4380ceae75c29450Johann            } else {
9667bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int Boost = cpi->last_boost;
9677bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int frames_in_section = cpi->frames_till_gf_update_due + 1;
9687bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
9697bc9febe8749e98a3812a0dc4380ceae75c29450Johann              int bits_in_section = cpi->inter_frame_target * frames_in_section;
9707bc9febe8749e98a3812a0dc4380ceae75c29450Johann
9717bc9febe8749e98a3812a0dc4380ceae75c29450Johann              /* Normalize Altboost and allocations chunck down to
9727bc9febe8749e98a3812a0dc4380ceae75c29450Johann               * prevent overflow
9737bc9febe8749e98a3812a0dc4380ceae75c29450Johann               */
9747bc9febe8749e98a3812a0dc4380ceae75c29450Johann              while (Boost > 1000) {
9757bc9febe8749e98a3812a0dc4380ceae75c29450Johann                Boost /= 2;
9767bc9febe8749e98a3812a0dc4380ceae75c29450Johann                allocation_chunks /= 2;
9777bc9febe8749e98a3812a0dc4380ceae75c29450Johann              }
97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9797bc9febe8749e98a3812a0dc4380ceae75c29450Johann              /* Avoid loss of precision but avoid overflow */
9807bc9febe8749e98a3812a0dc4380ceae75c29450Johann              if ((bits_in_section >> 7) > allocation_chunks) {
9817bc9febe8749e98a3812a0dc4380ceae75c29450Johann                cpi->this_frame_target =
9827bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    Boost * (bits_in_section / allocation_chunks);
9837bc9febe8749e98a3812a0dc4380ceae75c29450Johann              } else {
9847bc9febe8749e98a3812a0dc4380ceae75c29450Johann                cpi->this_frame_target =
9857bc9febe8749e98a3812a0dc4380ceae75c29450Johann                    (Boost * bits_in_section) / allocation_chunks;
9867bc9febe8749e98a3812a0dc4380ceae75c29450Johann              }
98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
9887bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
9897bc9febe8749e98a3812a0dc4380ceae75c29450Johann            cpi->this_frame_target =
9907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) *
9917bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 cpi->last_boost) /
9927bc9febe8749e98a3812a0dc4380ceae75c29450Johann                100;
9937bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
9947bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
9957bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* If there is an active ARF at this location use the minimum
9967bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * bits on this frame even if it is a contructed arf.
9977bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * The active maximum quantizer insures that an appropriate
9987bc9febe8749e98a3812a0dc4380ceae75c29450Johann           * number of bits will be spent if needed for contstructed ARFs.
9997bc9febe8749e98a3812a0dc4380ceae75c29450Johann          */
10007bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->this_frame_target = 0;
100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
10027bc9febe8749e98a3812a0dc4380ceae75c29450Johann
10037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->current_gf_interval = cpi->frames_till_gf_update_due;
10047bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
10057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
10067bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // Special case for 1 pass CBR: fixed gf period.
10077bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // TODO(marpan): Adjust this boost/interval logic.
10087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // If gf_cbr_boost_pct is small (below threshold) set the flag
10097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // gf_noboost_onepass_cbr = 1, which forces the gf to use the same
10107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // rate correction factor as last.
10117bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->gf_noboost_onepass_cbr = (cpi->oxcf.gf_cbr_boost_pct <= 100);
10127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
10137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      // Skip this update if the zero_mvcount is low.
10147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->zeromv_count > (cpi->common.MBs >> 1)) {
10157bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->common.refresh_golden_frame = 1;
10167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->this_frame_target =
10177bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (cpi->this_frame_target * (100 + cpi->oxcf.gf_cbr_boost_pct)) / 100;
10187bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
10197bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
10207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->current_gf_interval = cpi->frames_till_gf_update_due;
102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
10231b362b15af34006e6a11974088a46d42b903418eJohann
10247bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->per_frame_bandwidth = old_per_frame_bandwidth;
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10277bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) {
10287bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Q = cpi->common.base_qindex;
10297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int correction_factor = 100;
10307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  double rate_correction_factor;
10317bc9febe8749e98a3812a0dc4380ceae75c29450Johann  double adjustment_limit;
103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10337bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int projected_size_based_on_q = 0;
103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers to allow floating point in what follows */
10367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.frame_type == KEY_FRAME) {
10397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    rate_correction_factor = cpi->key_frame_rate_correction_factor;
10407bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
10417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
10427bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->common.refresh_alt_ref_frame ||
10437bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cpi->common.refresh_golden_frame)) {
10447bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rate_correction_factor = cpi->gf_rate_correction_factor;
10457bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
10467bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rate_correction_factor = cpi->rate_correction_factor;
104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10487bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10507bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Work out how big we would have expected the frame to be at this Q
10517bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * given the current correction factor. Stay in double to avoid int
10527bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * overflow when values are large
10537bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
10547bc9febe8749e98a3812a0dc4380ceae75c29450Johann  projected_size_based_on_q =
10557bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (int)(((.5 +
10567bc9febe8749e98a3812a0dc4380ceae75c29450Johann              rate_correction_factor *
10577bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  vp8_bits_per_mb[cpi->common.frame_type][Q]) *
10587bc9febe8749e98a3812a0dc4380ceae75c29450Johann             cpi->common.MBs) /
10597bc9febe8749e98a3812a0dc4380ceae75c29450Johann            (1 << BPER_MB_NORMBITS));
10607bc9febe8749e98a3812a0dc4380ceae75c29450Johann
10617bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Make some allowance for cpi->zbin_over_quant */
10627bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->mb.zbin_over_quant > 0) {
10637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int Z = cpi->mb.zbin_over_quant;
10647bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double Factor = 0.99;
10657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double factor_adjustment = 0.01 / 256.0;
10667bc9febe8749e98a3812a0dc4380ceae75c29450Johann
10677bc9febe8749e98a3812a0dc4380ceae75c29450Johann    while (Z > 0) {
10687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Z--;
10697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      projected_size_based_on_q = (int)(Factor * projected_size_based_on_q);
10707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Factor += factor_adjustment;
10717bc9febe8749e98a3812a0dc4380ceae75c29450Johann
10727bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (Factor >= 0.999) Factor = 0.999;
107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
107590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10767bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Work out a size correction factor. */
10777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (projected_size_based_on_q > 0) {
10787bc9febe8749e98a3812a0dc4380ceae75c29450Johann    correction_factor =
10797bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (100 * cpi->projected_frame_size) / projected_size_based_on_q;
10807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10827bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* More heavily damped adjustment used if we have been oscillating
10837bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * either side of target
10847bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
10857bc9febe8749e98a3812a0dc4380ceae75c29450Johann  switch (damp_var) {
10867bc9febe8749e98a3812a0dc4380ceae75c29450Johann    case 0: adjustment_limit = 0.75; break;
10877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    case 1: adjustment_limit = 0.375; break;
108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 2:
10897bc9febe8749e98a3812a0dc4380ceae75c29450Johann    default: adjustment_limit = 0.25; break;
10907bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10927bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (correction_factor > 102) {
10937bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* We are not already at the worst allowable quality */
10947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    correction_factor =
10957bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
10967bc9febe8749e98a3812a0dc4380ceae75c29450Johann    rate_correction_factor =
10977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ((rate_correction_factor * correction_factor) / 100);
109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10997bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Keep rate_correction_factor within limits */
11007bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (rate_correction_factor > MAX_BPB_FACTOR) {
11017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rate_correction_factor = MAX_BPB_FACTOR;
110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
11037bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else if (correction_factor < 99) {
11047bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* We are not already at the best allowable quality */
11057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    correction_factor =
11067bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
11077bc9febe8749e98a3812a0dc4380ceae75c29450Johann    rate_correction_factor =
11087bc9febe8749e98a3812a0dc4380ceae75c29450Johann        ((rate_correction_factor * correction_factor) / 100);
11097bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11107bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Keep rate_correction_factor within limits */
11117bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (rate_correction_factor < MIN_BPB_FACTOR) {
11127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      rate_correction_factor = MIN_BPB_FACTOR;
111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
11147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->common.frame_type == KEY_FRAME) {
11177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->key_frame_rate_correction_factor = rate_correction_factor;
11187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
11197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
11207bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->common.refresh_alt_ref_frame ||
11217bc9febe8749e98a3812a0dc4380ceae75c29450Johann         cpi->common.refresh_golden_frame)) {
11227bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->gf_rate_correction_factor = rate_correction_factor;
11237bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
11247bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->rate_correction_factor = rate_correction_factor;
112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
11267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
112790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
112890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11297bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) {
11307bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int Q = cpi->active_worst_quality;
113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11327bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->force_maxqp == 1) {
11337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->active_worst_quality = cpi->worst_quality;
11347bc9febe8749e98a3812a0dc4380ceae75c29450Johann    return cpi->worst_quality;
11357bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
11367bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Reset Zbin OQ value */
11377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->mb.zbin_over_quant = 0;
11387bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11397bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q >= 0) {
11407bc9febe8749e98a3812a0dc4380ceae75c29450Johann    Q = cpi->oxcf.fixed_q;
11417bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11427bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.frame_type == KEY_FRAME) {
11437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Q = cpi->oxcf.key_q;
11447bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->oxcf.number_of_layers == 1 &&
11457bc9febe8749e98a3812a0dc4380ceae75c29450Johann               cpi->common.refresh_alt_ref_frame &&
11467bc9febe8749e98a3812a0dc4380ceae75c29450Johann               !cpi->gf_noboost_onepass_cbr) {
11477bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Q = cpi->oxcf.alt_q;
11487bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else if (cpi->oxcf.number_of_layers == 1 &&
11497bc9febe8749e98a3812a0dc4380ceae75c29450Johann               cpi->common.refresh_golden_frame &&
11507bc9febe8749e98a3812a0dc4380ceae75c29450Johann               !cpi->gf_noboost_onepass_cbr) {
11517bc9febe8749e98a3812a0dc4380ceae75c29450Johann      Q = cpi->oxcf.gold_q;
1152da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    }
11537bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
11547bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int i;
11557bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int last_error = INT_MAX;
11567bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int target_bits_per_mb;
11577bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int bits_per_mb_at_this_q;
11587bc9febe8749e98a3812a0dc4380ceae75c29450Johann    double correction_factor;
11597bc9febe8749e98a3812a0dc4380ceae75c29450Johann
11607bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Select the appropriate correction factor based upon type of frame. */
11617bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.frame_type == KEY_FRAME) {
11627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      correction_factor = cpi->key_frame_rate_correction_factor;
11637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
11647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
11657bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (cpi->common.refresh_alt_ref_frame ||
11667bc9febe8749e98a3812a0dc4380ceae75c29450Johann           cpi->common.refresh_golden_frame)) {
11677bc9febe8749e98a3812a0dc4380ceae75c29450Johann        correction_factor = cpi->gf_rate_correction_factor;
11687bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
11697bc9febe8749e98a3812a0dc4380ceae75c29450Johann        correction_factor = cpi->rate_correction_factor;
11707bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11737bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Calculate required scaling factor based on target frame size and
11747bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * size of frame produced using previous Q
11757bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
11767bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS)) {
11777bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Case where we would overflow int */
11787bc9febe8749e98a3812a0dc4380ceae75c29450Johann      target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs)
11797bc9febe8749e98a3812a0dc4380ceae75c29450Johann                           << BPER_MB_NORMBITS;
11807bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
11817bc9febe8749e98a3812a0dc4380ceae75c29450Johann      target_bits_per_mb =
11827bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
11837bc9febe8749e98a3812a0dc4380ceae75c29450Johann    }
118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    i = cpi->active_best_quality;
118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    do {
11887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      bits_per_mb_at_this_q =
11897bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (int)(.5 +
11907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11927bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (bits_per_mb_at_this_q <= target_bits_per_mb) {
11937bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) {
11947bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = i;
11957bc9febe8749e98a3812a0dc4380ceae75c29450Johann        } else {
11967bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Q = i - 1;
119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
119890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11997bc9febe8749e98a3812a0dc4380ceae75c29450Johann        break;
12007bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
12017bc9febe8749e98a3812a0dc4380ceae75c29450Johann        last_error = bits_per_mb_at_this_q - target_bits_per_mb;
12027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
12037bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } while (++i <= cpi->active_worst_quality);
12047bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12057bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* If we are at MAXQ then enable Q over-run which seeks to claw
12067bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * back additional bits through things like the RD multiplier
12077bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * and zero bin size.
12087bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
12097bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (Q >= MAXQ) {
12107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      int zbin_oqmax;
12117bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double Factor = 0.99;
12137bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double factor_adjustment = 0.01 / 256.0;
12147bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12157bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->common.frame_type == KEY_FRAME) {
12167bc9febe8749e98a3812a0dc4380ceae75c29450Johann        zbin_oqmax = 0;
12177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else if (cpi->oxcf.number_of_layers == 1 &&
12187bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 !cpi->gf_noboost_onepass_cbr &&
12197bc9febe8749e98a3812a0dc4380ceae75c29450Johann                 (cpi->common.refresh_alt_ref_frame ||
12207bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  (cpi->common.refresh_golden_frame &&
12217bc9febe8749e98a3812a0dc4380ceae75c29450Johann                   !cpi->source_alt_ref_active))) {
12227bc9febe8749e98a3812a0dc4380ceae75c29450Johann        zbin_oqmax = 16;
12237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
12247bc9febe8749e98a3812a0dc4380ceae75c29450Johann        zbin_oqmax = ZBIN_OQ_MAX;
12257bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
12267bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12277bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /*{
12287bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double Factor =
12297bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
12307bc9febe8749e98a3812a0dc4380ceae75c29450Johann          double Oq;
12317bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12327bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Factor = Factor/1.2683;
12337bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12347bc9febe8749e98a3812a0dc4380ceae75c29450Johann          Oq = pow( Factor, (1.0/-0.165) );
12357bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12367bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if ( Oq > zbin_oqmax )
12377bc9febe8749e98a3812a0dc4380ceae75c29450Johann              Oq = zbin_oqmax;
12387bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12397bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->zbin_over_quant = (int)Oq;
12407bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }*/
12417bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12427bc9febe8749e98a3812a0dc4380ceae75c29450Johann      /* Each incrment in the zbin is assumed to have a fixed effect
12437bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * on bitrate. This is not of course true. The effect will be
12447bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * highly clip dependent and may well have sudden steps. The
12457bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * idea here is to acheive higher effective quantizers than the
12467bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * normal maximum by expanding the zero bin and hence
12477bc9febe8749e98a3812a0dc4380ceae75c29450Johann       * decreasing the number of low magnitude non zero coefficients.
12487bc9febe8749e98a3812a0dc4380ceae75c29450Johann       */
12497bc9febe8749e98a3812a0dc4380ceae75c29450Johann      while (cpi->mb.zbin_over_quant < zbin_oqmax) {
12507bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->mb.zbin_over_quant++;
12517bc9febe8749e98a3812a0dc4380ceae75c29450Johann
12527bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->mb.zbin_over_quant > zbin_oqmax) {
12537bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->mb.zbin_over_quant = zbin_oqmax;
12547bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
125590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12567bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Adjust bits_per_mb_at_this_q estimate */
12577bc9febe8749e98a3812a0dc4380ceae75c29450Johann        bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
12587bc9febe8749e98a3812a0dc4380ceae75c29450Johann        Factor += factor_adjustment;
125990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12607bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (Factor >= 0.999) Factor = 0.999;
126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12627bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Break out if we get down to the target rate */
12637bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (bits_per_mb_at_this_q <= target_bits_per_mb) break;
12647bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
12667bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12687bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return Q;
126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12717bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int estimate_keyframe_frequency(VP8_COMP *cpi) {
12727bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int i;
127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12747bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Average key frame frequency */
12757bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int av_key_frame_frequency = 0;
127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12777bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* First key frame at start of sequence is a special case. We have no
12787bc9febe8749e98a3812a0dc4380ceae75c29450Johann   * frequency data.
12797bc9febe8749e98a3812a0dc4380ceae75c29450Johann   */
12807bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->key_frame_count == 1) {
12817bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
12827bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * whichever is smaller.
12831b362b15af34006e6a11974088a46d42b903418eJohann     */
12847bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
12857bc9febe8749e98a3812a0dc4380ceae75c29450Johann    av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
12861b362b15af34006e6a11974088a46d42b903418eJohann
12877bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) {
12887bc9febe8749e98a3812a0dc4380ceae75c29450Johann      av_key_frame_frequency = key_freq;
128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12917bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] =
12927bc9febe8749e98a3812a0dc4380ceae75c29450Johann        av_key_frame_frequency;
12937bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
12947bc9febe8749e98a3812a0dc4380ceae75c29450Johann    unsigned int total_weight = 0;
12957bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int last_kf_interval =
12967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
129790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12987bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* reset keyframe context and calculate weighted average of last
12997bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * KEY_FRAME_CONTEXT keyframes
13007bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
13017bc9febe8749e98a3812a0dc4380ceae75c29450Johann    for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
13027bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (i < KEY_FRAME_CONTEXT - 1) {
13037bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i + 1];
13047bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
13057bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->prior_key_frame_distance[i] = last_kf_interval;
13067bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
13077bc9febe8749e98a3812a0dc4380ceae75c29450Johann
13087bc9febe8749e98a3812a0dc4380ceae75c29450Johann      av_key_frame_frequency +=
13097bc9febe8749e98a3812a0dc4380ceae75c29450Johann          prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i];
13107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      total_weight += prior_key_frame_weight[i];
131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13121b362b15af34006e6a11974088a46d42b903418eJohann
13137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    av_key_frame_frequency /= total_weight;
13147bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
13157bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // TODO (marpan): Given the checks above, |av_key_frame_frequency|
13167bc9febe8749e98a3812a0dc4380ceae75c29450Johann  // should always be above 0. But for now we keep the sanity check in.
13177bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (av_key_frame_frequency == 0) av_key_frame_frequency = 1;
13187bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return av_key_frame_frequency;
13197bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
13201b362b15af34006e6a11974088a46d42b903418eJohann
13217bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_adjust_key_frame_context(VP8_COMP *cpi) {
13227bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Clear down mmx registers to allow floating point in what follows */
13237bc9febe8749e98a3812a0dc4380ceae75c29450Johann  vpx_clear_system_state();
13247bc9febe8749e98a3812a0dc4380ceae75c29450Johann
13257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Do we have any key frame overspend to recover? */
13267bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Two-pass overspend handled elsewhere. */
13277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if ((cpi->pass != 2) &&
13287bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->projected_frame_size > cpi->per_frame_bandwidth)) {
13297bc9febe8749e98a3812a0dc4380ceae75c29450Johann    int overspend;
13307bc9febe8749e98a3812a0dc4380ceae75c29450Johann
13317bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Update the count of key frame overspend to be recovered in
13327bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * subsequent frames. A portion of the KF overspend is treated as gf
13337bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * overspend (and hence recovered more quickly) as the kf is also a
13347bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * gf. Otherwise the few frames following each kf tend to get more
13357bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * bits allocated than those following other gfs.
13367bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
13377bc9febe8749e98a3812a0dc4380ceae75c29450Johann    overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
13381b362b15af34006e6a11974088a46d42b903418eJohann
13397bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->oxcf.number_of_layers > 1) {
13407bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->kf_overspend_bits += overspend;
13417bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
13427bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->kf_overspend_bits += overspend * 7 / 8;
13437bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->gf_overspend_bits += overspend * 1 / 8;
134490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
134590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13467bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Work out how much to try and recover per frame. */
13477bc9febe8749e98a3812a0dc4380ceae75c29450Johann    cpi->kf_bitrate_adjustment =
13487bc9febe8749e98a3812a0dc4380ceae75c29450Johann        cpi->kf_overspend_bits / estimate_keyframe_frequency(cpi);
13497bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
135090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13517bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->frames_since_key = 0;
13527bc9febe8749e98a3812a0dc4380ceae75c29450Johann  cpi->key_frame_count++;
13537bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
13541b362b15af34006e6a11974088a46d42b903418eJohann
13557bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
13567bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                   int *frame_over_shoot_limit) {
13577bc9febe8749e98a3812a0dc4380ceae75c29450Johann  /* Set-up bounds on acceptable frame size: */
13587bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cpi->oxcf.fixed_q >= 0) {
13597bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Fixed Q scenario: frame size never outranges target
13607bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * (there is no target!)
13617bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
13627bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_under_shoot_limit = 0;
13637bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_over_shoot_limit = INT_MAX;
13647bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
13657bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->common.frame_type == KEY_FRAME) {
13667bc9febe8749e98a3812a0dc4380ceae75c29450Johann      *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8;
13677bc9febe8749e98a3812a0dc4380ceae75c29450Johann      *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
13687bc9febe8749e98a3812a0dc4380ceae75c29450Johann    } else {
13697bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->oxcf.number_of_layers > 1 || cpi->common.refresh_alt_ref_frame ||
13707bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->common.refresh_golden_frame) {
13717bc9febe8749e98a3812a0dc4380ceae75c29450Johann        *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8;
13727bc9febe8749e98a3812a0dc4380ceae75c29450Johann        *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
13737bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
13747bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* For CBR take buffer fullness into account */
13757bc9febe8749e98a3812a0dc4380ceae75c29450Johann        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
13767bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level +
13777bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                     cpi->oxcf.maximum_buffer_size) >>
13787bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                    1)) {
13797bc9febe8749e98a3812a0dc4380ceae75c29450Johann            /* Buffer is too full so relax overshoot and tighten
13807bc9febe8749e98a3812a0dc4380ceae75c29450Johann             * undershoot
13817bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
13827bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_over_shoot_limit = cpi->this_frame_target * 12 / 8;
13837bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
13847bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else if (cpi->buffer_level <=
13857bc9febe8749e98a3812a0dc4380ceae75c29450Johann                     (cpi->oxcf.optimal_buffer_level >> 1)) {
13867bc9febe8749e98a3812a0dc4380ceae75c29450Johann            /* Buffer is too low so relax undershoot and tighten
13877bc9febe8749e98a3812a0dc4380ceae75c29450Johann             * overshoot
13887bc9febe8749e98a3812a0dc4380ceae75c29450Johann             */
13897bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_over_shoot_limit = cpi->this_frame_target * 10 / 8;
13907bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
13917bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
13927bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
13937bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
13947bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
139590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
13967bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* VBR and CQ mode */
13977bc9febe8749e98a3812a0dc4380ceae75c29450Johann        /* Note that tighter restrictions here can help quality
13987bc9febe8749e98a3812a0dc4380ceae75c29450Johann         * but hurt encode speed
13991b362b15af34006e6a11974088a46d42b903418eJohann         */
14007bc9febe8749e98a3812a0dc4380ceae75c29450Johann        else {
14017bc9febe8749e98a3812a0dc4380ceae75c29450Johann          /* Stron overshoot limit for constrained quality */
14027bc9febe8749e98a3812a0dc4380ceae75c29450Johann          if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
14037bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
14047bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
14057bc9febe8749e98a3812a0dc4380ceae75c29450Johann          } else {
14067bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8;
14077bc9febe8749e98a3812a0dc4380ceae75c29450Johann            *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
14087bc9febe8749e98a3812a0dc4380ceae75c29450Johann          }
14097bc9febe8749e98a3812a0dc4380ceae75c29450Johann        }
14107bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
14111b362b15af34006e6a11974088a46d42b903418eJohann    }
14121b362b15af34006e6a11974088a46d42b903418eJohann
14137bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* For very small rate targets where the fractional adjustment
14147bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * (eg * 7/8) may be tiny make sure there is at least a minimum
14157bc9febe8749e98a3812a0dc4380ceae75c29450Johann     * range.
14167bc9febe8749e98a3812a0dc4380ceae75c29450Johann     */
14177bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_over_shoot_limit += 200;
14187bc9febe8749e98a3812a0dc4380ceae75c29450Johann    *frame_under_shoot_limit -= 200;
14197bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (*frame_under_shoot_limit < 0) *frame_under_shoot_limit = 0;
14207bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
14217bc9febe8749e98a3812a0dc4380ceae75c29450Johann}
14221b362b15af34006e6a11974088a46d42b903418eJohann
14231b362b15af34006e6a11974088a46d42b903418eJohann/* return of 0 means drop frame */
14247bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_pick_frame_size(VP8_COMP *cpi) {
14257bc9febe8749e98a3812a0dc4380ceae75c29450Johann  VP8_COMMON *cm = &cpi->common;
14261b362b15af34006e6a11974088a46d42b903418eJohann
14277bc9febe8749e98a3812a0dc4380ceae75c29450Johann  if (cm->frame_type == KEY_FRAME) {
14287bc9febe8749e98a3812a0dc4380ceae75c29450Johann    calc_iframe_target_size(cpi);
14297bc9febe8749e98a3812a0dc4380ceae75c29450Johann  } else {
14307bc9febe8749e98a3812a0dc4380ceae75c29450Johann    calc_pframe_target_size(cpi);
14311b362b15af34006e6a11974088a46d42b903418eJohann
14327bc9febe8749e98a3812a0dc4380ceae75c29450Johann    /* Check if we're dropping the frame: */
14337bc9febe8749e98a3812a0dc4380ceae75c29450Johann    if (cpi->drop_frame) {
14347bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->drop_frame = 0;
14357bc9febe8749e98a3812a0dc4380ceae75c29450Johann      return 0;
143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
14377bc9febe8749e98a3812a0dc4380ceae75c29450Johann  }
14387bc9febe8749e98a3812a0dc4380ceae75c29450Johann  return 1;
143990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1440da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// If this just encoded frame (mcomp/transform/quant, but before loopfilter and
1441da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// pack_bitstream) has large overshoot, and was not being encoded close to the
1442da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// max QP, then drop this frame and force next frame to be encoded at max QP.
1443df37111358d02836cb29bbcb9c6e4c95dff90a16Johann// Allow this for screen_content_mode = 2, or if drop frames is allowed.
1444da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// TODO(marpan): Should do this exit condition during the encode_frame
1445da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian// (i.e., halfway during the encoding of the frame) to save cycles.
1446da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanianint vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) {
1447df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  int force_drop_overshoot = 0;
1448df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING
1449df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // Only check for dropping due to overshoot on the lowest stream.
1450df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // If the lowest stream of the multi-res encoding was dropped due to
1451df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // overshoot, then force dropping on all upper layer streams
1452df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  // (mr_encoder_id > 0).
1453df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  LOWER_RES_FRAME_INFO *low_res_frame_info =
1454df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
1455df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (cpi->oxcf.mr_total_resolutions > 1 && cpi->oxcf.mr_encoder_id > 0) {
1456df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    force_drop_overshoot = low_res_frame_info->is_frame_dropped_overshoot_maxqp;
1457df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if (!force_drop_overshoot) {
1458df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->force_maxqp = 0;
1459df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->frames_since_last_drop_overshoot++;
1460df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      return 0;
1461df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    }
1462df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  }
1463df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
1464df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (cpi->common.frame_type != KEY_FRAME &&
1465df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      (cpi->oxcf.screen_content_mode == 2 ||
1466df37111358d02836cb29bbcb9c6e4c95dff90a16Johann       (cpi->drop_frames_allowed &&
1467df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        (force_drop_overshoot ||
1468df37111358d02836cb29bbcb9c6e4c95dff90a16Johann         (cpi->rate_correction_factor < (4.0f * MIN_BPB_FACTOR) &&
1469df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          cpi->frames_since_last_drop_overshoot > (int)cpi->framerate))))) {
1470da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // Note: the "projected_frame_size" from encode_frame() only gives estimate
1471da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // of mode/motion vector rate (in non-rd mode): so below we only require
1472da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // that projected_frame_size is somewhat greater than per-frame-bandwidth,
1473da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // but add additional condition with high threshold on prediction residual.
1474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian
1475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // QP threshold: only allow dropping if we are not close to qp_max.
1476da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    int thresh_qp = 3 * cpi->worst_quality >> 2;
1477da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // Rate threshold, in bytes.
1478da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3);
1479da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    // Threshold for the average (over all macroblocks) of the pixel-sum
1480df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    // residual error over 16x16 block.
1481df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    int thresh_pred_err_mb = (200 << 4);
1482da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs);
1483df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    // Reduce/ignore thresh_rate if pred_err_mb much larger than its threshold,
1484df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    // give more weight to pred_err metric for overshoot detection.
1485df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if (cpi->drop_frames_allowed && pred_err_mb > (thresh_pred_err_mb << 4))
1486df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      thresh_rate = thresh_rate >> 3;
1487df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if ((Q < thresh_qp && cpi->projected_frame_size > thresh_rate &&
1488df37111358d02836cb29bbcb9c6e4c95dff90a16Johann         pred_err_mb > thresh_pred_err_mb) ||
1489df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        force_drop_overshoot) {
1490df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      unsigned int i;
14917bc9febe8749e98a3812a0dc4380ceae75c29450Johann      double new_correction_factor;
14922263fc984bdc858ee931d3e35c87c404de923950Johann      int target_bits_per_mb;
1493df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      const int target_size = cpi->av_per_frame_bandwidth;
1494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      // Flag to indicate we will force next frame to be encoded at max QP.
1495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      cpi->force_maxqp = 1;
14962263fc984bdc858ee931d3e35c87c404de923950Johann      // Reset the buffer levels.
14972263fc984bdc858ee931d3e35c87c404de923950Johann      cpi->buffer_level = cpi->oxcf.optimal_buffer_level;
14982263fc984bdc858ee931d3e35c87c404de923950Johann      cpi->bits_off_target = cpi->oxcf.optimal_buffer_level;
14992263fc984bdc858ee931d3e35c87c404de923950Johann      // Compute a new rate correction factor, corresponding to the current
15002263fc984bdc858ee931d3e35c87c404de923950Johann      // target frame size and max_QP, and adjust the rate correction factor
15012263fc984bdc858ee931d3e35c87c404de923950Johann      // upwards, if needed.
15022263fc984bdc858ee931d3e35c87c404de923950Johann      // This is to prevent a bad state where the re-encoded frame at max_QP
15032263fc984bdc858ee931d3e35c87c404de923950Johann      // undershoots significantly, and then we end up dropping every other
15042263fc984bdc858ee931d3e35c87c404de923950Johann      // frame because the QP/rate_correction_factor may have been too low
15052263fc984bdc858ee931d3e35c87c404de923950Johann      // before the drop and then takes too long to come up.
15067bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (target_size >= (INT_MAX >> BPER_MB_NORMBITS)) {
15077bc9febe8749e98a3812a0dc4380ceae75c29450Johann        target_bits_per_mb = (target_size / cpi->common.MBs)
15087bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             << BPER_MB_NORMBITS;
15097bc9febe8749e98a3812a0dc4380ceae75c29450Johann      } else {
15102263fc984bdc858ee931d3e35c87c404de923950Johann        target_bits_per_mb =
15112263fc984bdc858ee931d3e35c87c404de923950Johann            (target_size << BPER_MB_NORMBITS) / cpi->common.MBs;
15127bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
15132263fc984bdc858ee931d3e35c87c404de923950Johann      // Rate correction factor based on target_size_per_mb and max_QP.
15147bc9febe8749e98a3812a0dc4380ceae75c29450Johann      new_correction_factor =
15157bc9febe8749e98a3812a0dc4380ceae75c29450Johann          (double)target_bits_per_mb /
15162263fc984bdc858ee931d3e35c87c404de923950Johann          (double)vp8_bits_per_mb[INTER_FRAME][cpi->worst_quality];
15177bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (new_correction_factor > cpi->rate_correction_factor) {
15182263fc984bdc858ee931d3e35c87c404de923950Johann        cpi->rate_correction_factor =
15192263fc984bdc858ee931d3e35c87c404de923950Johann            VPXMIN(2.0 * cpi->rate_correction_factor, new_correction_factor);
15207bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
15217bc9febe8749e98a3812a0dc4380ceae75c29450Johann      if (cpi->rate_correction_factor > MAX_BPB_FACTOR) {
15222263fc984bdc858ee931d3e35c87c404de923950Johann        cpi->rate_correction_factor = MAX_BPB_FACTOR;
15237bc9febe8749e98a3812a0dc4380ceae75c29450Johann      }
1524df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      // Drop this frame: update frame counters.
1525df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->common.current_video_frame++;
1526df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->frames_since_key++;
1527df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->temporal_pattern_counter++;
1528df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      cpi->frames_since_last_drop_overshoot = 0;
1529df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      if (cpi->oxcf.number_of_layers > 1) {
1530df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        // Set max_qp and rate correction for all temporal layers if overshoot
1531df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        // is detected.
1532df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1533df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          LAYER_CONTEXT *lc = &cpi->layer_context[i];
1534df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          lc->force_maxqp = 1;
1535df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          lc->frames_since_last_drop_overshoot = 0;
1536df37111358d02836cb29bbcb9c6e4c95dff90a16Johann          lc->rate_correction_factor = cpi->rate_correction_factor;
1537df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        }
1538df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      }
1539df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING
1540df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      if (cpi->oxcf.mr_total_resolutions > 1)
1541df37111358d02836cb29bbcb9c6e4c95dff90a16Johann        low_res_frame_info->is_frame_dropped_overshoot_maxqp = 1;
1542df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
1543da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian      return 1;
1544da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    }
1545da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    cpi->force_maxqp = 0;
1546df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    cpi->frames_since_last_drop_overshoot++;
1547df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING
1548df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    if (cpi->oxcf.mr_total_resolutions > 1)
1549df37111358d02836cb29bbcb9c6e4c95dff90a16Johann      low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1550df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
1551da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian    return 0;
1552da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  }
1553da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  cpi->force_maxqp = 0;
1554df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  cpi->frames_since_last_drop_overshoot++;
1555df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#if CONFIG_MULTI_RES_ENCODING
1556df37111358d02836cb29bbcb9c6e4c95dff90a16Johann  if (cpi->oxcf.mr_total_resolutions > 1)
1557df37111358d02836cb29bbcb9c6e4c95dff90a16Johann    low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1558df37111358d02836cb29bbcb9c6e4c95dff90a16Johann#endif
1559da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian  return 0;
1560da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian}
1561