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
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdlib.h>
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h>
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h>
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <limits.h>
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <assert.h>
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "math.h"
1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/common.h"
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "ratectrl.h"
2179f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/entropymode.h"
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
2379f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/systemdependent.h"
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "encodemv.h"
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define MIN_BPB_FACTOR          0.01
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define MAX_BPB_FACTOR          50
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int y_modes[5];
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int uv_modes[4];
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int b_modes[10];
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_y_modes[10];
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_uv_modes[4];
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_b_modes[10];
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
441b362b15af34006e6a11974088a46d42b903418eJohann/* Bits Per MB at different Q (Multiplied by 512) */
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define BPER_MB_NORMBITS    9
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
471b362b15af34006e6a11974088a46d42b903418eJohann/* Work in progress recalibration of baseline rate tables based on
481b362b15af34006e6a11974088a46d42b903418eJohann * the assumption that bits per mb is inversely proportional to the
491b362b15af34006e6a11974088a46d42b903418eJohann * quantizer value.
501b362b15af34006e6a11974088a46d42b903418eJohann */
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_bits_per_mb[2][QINDEX_RANGE] =
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
531b362b15af34006e6a11974088a46d42b903418eJohann    /* Intra case 450000/Qintra */
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5579f15823c34ae1e423108295e416213200bb280fAndreas Huber        1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000,
5679f15823c34ae1e423108295e416213200bb280fAndreas Huber        409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705,
5779f15823c34ae1e423108295e416213200bb280fAndreas Huber        250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545,
5879f15823c34ae1e423108295e416213200bb280fAndreas Huber        195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714,
5979f15823c34ae1e423108295e416213200bb280fAndreas Huber        155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000,
6079f15823c34ae1e423108295e416213200bb280fAndreas Huber        121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651,
6179f15823c34ae1e423108295e416213200bb280fAndreas Huber        102272, 100000, 97826,  97826,  95744,  93750,  91836,  90000,
6279f15823c34ae1e423108295e416213200bb280fAndreas Huber        88235,  86538,  84905,  83333,  81818,  80357,  78947,  77586,
6379f15823c34ae1e423108295e416213200bb280fAndreas Huber        76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
6479f15823c34ae1e423108295e416213200bb280fAndreas Huber        67164,  66176,  65217,  64285,  63380,  62500,  61643,  60810,
6579f15823c34ae1e423108295e416213200bb280fAndreas Huber        60000,  59210,  59210,  58441,  57692,  56962,  56250,  55555,
6679f15823c34ae1e423108295e416213200bb280fAndreas Huber        54878,  54216,  53571,  52941,  52325,  51724,  51136,  50561,
6779f15823c34ae1e423108295e416213200bb280fAndreas Huber        49450,  48387,  47368,  46875,  45918,  45000,  44554,  44117,
6879f15823c34ae1e423108295e416213200bb280fAndreas Huber        43269,  42452,  41666,  40909,  40178,  39473,  38793,  38135,
6979f15823c34ae1e423108295e416213200bb280fAndreas Huber        36885,  36290,  35714,  35156,  34615,  34090,  33582,  33088,
7079f15823c34ae1e423108295e416213200bb280fAndreas Huber        32608,  32142,  31468,  31034,  30405,  29801,  29220,  28662,
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    },
721b362b15af34006e6a11974088a46d42b903418eJohann    /* Inter case 285000/Qinter */
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
7479f15823c34ae1e423108295e416213200bb280fAndreas Huber        712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090,
7579f15823c34ae1e423108295e416213200bb280fAndreas Huber        237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000,
7679f15823c34ae1e423108295e416213200bb280fAndreas Huber        142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555,
7779f15823c34ae1e423108295e416213200bb280fAndreas Huber        101785, 98275,  95000,  91935,  89062,  86363,  83823,  81428,
7879f15823c34ae1e423108295e416213200bb280fAndreas Huber        79166,  77027,  75000,  73076,  71250,  69512,  67857,  66279,
7979f15823c34ae1e423108295e416213200bb280fAndreas Huber        64772,  63333,  61956,  60638,  59375,  58163,  57000,  55882,
8079f15823c34ae1e423108295e416213200bb280fAndreas Huber        54807,  53773,  52777,  51818,  50892,  50000,  49137,  47500,
8179f15823c34ae1e423108295e416213200bb280fAndreas Huber        45967,  44531,  43181,  41911,  40714,  39583,  38513,  37500,
8279f15823c34ae1e423108295e416213200bb280fAndreas Huber        36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
8379f15823c34ae1e423108295e416213200bb280fAndreas Huber        30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,
8479f15823c34ae1e423108295e416213200bb280fAndreas Huber        25909,  25446,  25000,  24568,  23949,  23360,  22800,  22265,
8579f15823c34ae1e423108295e416213200bb280fAndreas Huber        21755,  21268,  20802,  20357,  19930,  19520,  19127,  18750,
8679f15823c34ae1e423108295e416213200bb280fAndreas Huber        18387,  18037,  17701,  17378,  17065,  16764,  16473,  16101,
8779f15823c34ae1e423108295e416213200bb280fAndreas Huber        15745,  15405,  15079,  14766,  14467,  14179,  13902,  13636,
8879f15823c34ae1e423108295e416213200bb280fAndreas Huber        13380,  13133,  12895,  12666,  12445,  12179,  11924,  11632,
8979f15823c34ae1e423108295e416213200bb280fAndreas Huber        11445,  11220,  11003,  10795,  10594,  10401,  10215,  10035,
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9379f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int kf_boost_qadjustment[QINDEX_RANGE] =
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    128, 129, 130, 131, 132, 133, 134, 135,
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    136, 137, 138, 139, 140, 141, 142, 143,
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    144, 145, 146, 147, 148, 149, 150, 151,
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    152, 153, 154, 155, 156, 157, 158, 159,
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    160, 161, 162, 163, 164, 165, 166, 167,
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    168, 169, 170, 171, 172, 173, 174, 175,
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    176, 177, 178, 179, 180, 181, 182, 183,
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    184, 185, 186, 187, 188, 189, 190, 191,
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    192, 193, 194, 195, 196, 197, 198, 199,
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    200, 200, 201, 201, 202, 203, 203, 203,
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    204, 204, 205, 205, 206, 206, 207, 207,
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    208, 208, 209, 209, 210, 210, 211, 211,
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    212, 212, 213, 213, 214, 214, 215, 215,
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    216, 216, 217, 217, 218, 218, 219, 219,
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    220, 220, 220, 220, 220, 220, 220, 220,
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    220, 220, 220, 220, 220, 220, 220, 220,
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1131b362b15af34006e6a11974088a46d42b903418eJohann/* #define GFQ_ADJUSTMENT (Q+100) */
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    80, 82, 84, 86, 88, 90, 92, 94,
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    96, 97, 98, 99, 100, 101, 102, 103,
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    104, 105, 106, 107, 108, 109, 110, 111,
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    112, 113, 114, 115, 116, 117, 118, 119,
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    120, 121, 122, 123, 124, 125, 126, 127,
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    128, 129, 130, 131, 132, 133, 134, 135,
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    136, 137, 138, 139, 140, 141, 142, 143,
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    144, 145, 146, 147, 148, 149, 150, 151,
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    152, 153, 154, 155, 156, 157, 158, 159,
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    160, 161, 162, 163, 164, 165, 166, 167,
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    168, 169, 170, 171, 172, 173, 174, 175,
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    176, 177, 178, 179, 180, 181, 182, 183,
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    184, 184, 185, 185, 186, 186, 187, 187,
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    188, 188, 189, 189, 190, 190, 191, 191,
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    192, 192, 193, 193, 194, 194, 194, 194,
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    195, 195, 196, 196, 197, 197, 198, 198
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    100,101,102,103,104,105,105,106,
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    106,107,107,108,109,109,110,111,
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    112,113,114,115,116,117,118,119,
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    120,121,122,123,124,125,126,127,
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    128,129,130,131,132,133,134,135,
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    136,137,138,139,140,141,142,143,
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    144,145,146,147,148,149,150,151,
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    152,153,154,155,156,157,158,159,
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    160,161,162,163,164,165,166,167,
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    168,169,170,170,171,171,172,172,
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    173,173,173,174,174,174,175,175,
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    175,176,176,176,177,177,177,177,
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    178,178,179,179,180,180,181,181,
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    182,182,183,183,184,184,185,185,
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    186,186,187,187,188,188,189,189,
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    190,190,191,191,192,192,193,193,
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*/
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15779f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int kf_gf_boost_qlimits[QINDEX_RANGE] =
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    150, 155, 160, 165, 170, 175, 180, 185,
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    190, 195, 200, 205, 210, 215, 220, 225,
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    230, 235, 240, 245, 250, 255, 260, 265,
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    270, 275, 280, 285, 290, 295, 300, 305,
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    310, 320, 330, 340, 350, 360, 370, 380,
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    390, 400, 410, 420, 430, 440, 450, 460,
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    470, 480, 490, 500, 510, 520, 530, 540,
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    550, 560, 570, 580, 590, 600, 600, 600,
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    600, 600, 600, 600, 600, 600, 600, 600,
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1771b362b15af34006e6a11974088a46d42b903418eJohann/* % adjustment to target kf size based on seperation from previous frame */
17879f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int kf_boost_seperation_adjustment[16] =
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    30,   40,   50,   55,   60,   65,   70,   75,
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    80,   85,   90,   95,  100,  100,  100,  100,
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18579f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_adjust_table[101] =
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    100,
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_intra_usage_adjustment[20] =
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    125, 120, 115, 110, 105, 100,  95,  85,  80,  75,
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    70,  65,  60,  55,  50,  50,  50,  50,  50,  50,
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20679f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_interval_table[101] =
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7,
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_save_coding_context(VP8_COMP *cpi)
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2281b362b15af34006e6a11974088a46d42b903418eJohann    /* Stores a snapshot of key state variables which can subsequently be
2291b362b15af34006e6a11974088a46d42b903418eJohann     * restored with a call to vp8_restore_coding_context. These functions are
2301b362b15af34006e6a11974088a46d42b903418eJohann     * intended for use in a re-code loop in vp8_compress_frame where the
2311b362b15af34006e6a11974088a46d42b903418eJohann     * quantizer value is adjusted between loop iterations.
2321b362b15af34006e6a11974088a46d42b903418eJohann     */
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_since_key          = cpi->frames_since_key;
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->filter_level             = cpi->common.filter_level;
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_till_gf_update_due   = cpi->frames_till_gf_update_due;
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_since_golden       = cpi->common.frames_since_golden;
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->mvc,      cpi->common.fc.mvc);
2401b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->mvcosts,  cpi->rd_costs.mvcosts);
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2451b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
2461b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2491b362b15af34006e6a11974088a46d42b903418eJohann    /* Stats */
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->y_modes,       y_modes);
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_modes,      uv_modes);
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->b_modes,       b_modes);
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_y_modes,  inter_y_modes);
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_uv_modes, inter_uv_modes);
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_b_modes,  inter_b_modes);
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_restore_coding_context(VP8_COMP *cpi)
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2671b362b15af34006e6a11974088a46d42b903418eJohann    /* Restore key state variables to the snapshot state stored in the
2681b362b15af34006e6a11974088a46d42b903418eJohann     * previous call to vp8_save_coding_context.
2691b362b15af34006e6a11974088a46d42b903418eJohann     */
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key         =   cc->frames_since_key;
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level     =   cc->filter_level;
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_till_gf_update_due  =   cc->frames_till_gf_update_due;
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.frames_since_golden       =   cc->frames_since_golden;
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.mvc, cc->mvc);
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2781b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.ymode_prob,   cc->ymode_prob);
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.uv_mode_prob,  cc->uv_mode_prob);
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2831b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
2841b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2861b362b15af34006e6a11974088a46d42b903418eJohann    /* Stats */
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(y_modes, cc->y_modes);
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(uv_modes, cc->uv_modes);
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(b_modes, cc->b_modes);
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_y_modes, cc->inter_y_modes);
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_uv_modes, cc->inter_uv_modes);
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_b_modes, cc->inter_b_modes);
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_setup_key_frame(VP8_COMP *cpi)
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3031b362b15af34006e6a11974088a46d42b903418eJohann    /* Setup for Key frame: */
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_default_coef_probs(& cpi->common);
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int flag[2] = {1, 1};
3101b362b15af34006e6a11974088a46d42b903418eJohann        vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3131b362b15af34006e6a11974088a46d42b903418eJohann    /* Make sure we initialize separate contexts for altref,gold, and normal.
3141b362b15af34006e6a11974088a46d42b903418eJohann     * TODO shouldn't need 3 different copies of structure to do this!
3151b362b15af34006e6a11974088a46d42b903418eJohann     */
3161b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
3171b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
3181b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3221b362b15af34006e6a11974088a46d42b903418eJohann    /* Provisional interval before next GF */
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->auto_gold)
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
3261b362b15af34006e6a11974088a46d42b903418eJohann        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
3271b362b15af34006e6a11974088a46d42b903418eJohann
3281b362b15af34006e6a11974088a46d42b903418eJohann    cpi->common.refresh_golden_frame = 1;
3291b362b15af34006e6a11974088a46d42b903418eJohann    cpi->common.refresh_alt_ref_frame = 1;
3301b362b15af34006e6a11974088a46d42b903418eJohann}
3311b362b15af34006e6a11974088a46d42b903418eJohann
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3331b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_bits_at_q(int frame_kind, int Q, int MBs,
3341b362b15af34006e6a11974088a46d42b903418eJohann                              double correction_factor)
3351b362b15af34006e6a11974088a46d42b903418eJohann{
3361b362b15af34006e6a11974088a46d42b903418eJohann    int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
3371b362b15af34006e6a11974088a46d42b903418eJohann
3381b362b15af34006e6a11974088a46d42b903418eJohann    /* Attempt to retain reasonable accuracy without overflow. The cutoff is
3391b362b15af34006e6a11974088a46d42b903418eJohann     * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
3401b362b15af34006e6a11974088a46d42b903418eJohann     * largest Bpm takes 20 bits.
3411b362b15af34006e6a11974088a46d42b903418eJohann     */
3421b362b15af34006e6a11974088a46d42b903418eJohann    if (MBs > (1 << 11))
3431b362b15af34006e6a11974088a46d42b903418eJohann        return (Bpm >> BPER_MB_NORMBITS) * MBs;
3441b362b15af34006e6a11974088a46d42b903418eJohann    else
3451b362b15af34006e6a11974088a46d42b903418eJohann        return (Bpm * MBs) >> BPER_MB_NORMBITS;
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3481b362b15af34006e6a11974088a46d42b903418eJohann
3491b362b15af34006e6a11974088a46d42b903418eJohannstatic void calc_iframe_target_size(VP8_COMP *cpi)
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3511b362b15af34006e6a11974088a46d42b903418eJohann    /* boost defaults to half second */
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int kf_boost;
3531b362b15af34006e6a11974088a46d42b903418eJohann    uint64_t target;
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3551b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
3561b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3601b362b15af34006e6a11974088a46d42b903418eJohann        int Q = cpi->oxcf.key_q;
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3621b362b15af34006e6a11974088a46d42b903418eJohann        target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
3631b362b15af34006e6a11974088a46d42b903418eJohann                                    cpi->key_frame_rate_correction_factor);
3641b362b15af34006e6a11974088a46d42b903418eJohann    }
3651b362b15af34006e6a11974088a46d42b903418eJohann    else if (cpi->pass == 2)
3661b362b15af34006e6a11974088a46d42b903418eJohann    {
3671b362b15af34006e6a11974088a46d42b903418eJohann        /* New Two pass RC */
3681b362b15af34006e6a11974088a46d42b903418eJohann        target = cpi->per_frame_bandwidth;
3691b362b15af34006e6a11974088a46d42b903418eJohann    }
3701b362b15af34006e6a11974088a46d42b903418eJohann    /* First Frame is a special case */
3711b362b15af34006e6a11974088a46d42b903418eJohann    else if (cpi->common.current_video_frame == 0)
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3731b362b15af34006e6a11974088a46d42b903418eJohann        /* 1 Pass there is no information on which to base size so use
3741b362b15af34006e6a11974088a46d42b903418eJohann         * bandwidth per second * fraction of the initial buffer
3751b362b15af34006e6a11974088a46d42b903418eJohann         * level
3761b362b15af34006e6a11974088a46d42b903418eJohann         */
3771b362b15af34006e6a11974088a46d42b903418eJohann        target = cpi->oxcf.starting_buffer_level / 2;
3781b362b15af34006e6a11974088a46d42b903418eJohann
3791b362b15af34006e6a11974088a46d42b903418eJohann        if(target > cpi->oxcf.target_bandwidth * 3 / 2)
3801b362b15af34006e6a11974088a46d42b903418eJohann            target = cpi->oxcf.target_bandwidth * 3 / 2;
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3841b362b15af34006e6a11974088a46d42b903418eJohann        /* if this keyframe was forced, use a more recent Q estimate */
3851b362b15af34006e6a11974088a46d42b903418eJohann        int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY)
3861b362b15af34006e6a11974088a46d42b903418eJohann                ? cpi->avg_frame_qindex : cpi->ni_av_qi;
3871b362b15af34006e6a11974088a46d42b903418eJohann
3881b362b15af34006e6a11974088a46d42b903418eJohann        int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
3891b362b15af34006e6a11974088a46d42b903418eJohann        /* Boost depends somewhat on frame rate: only used for 1 layer case. */
3901b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.number_of_layers == 1) {
3911b362b15af34006e6a11974088a46d42b903418eJohann          kf_boost = MAX(initial_boost, (int)(2 * cpi->output_frame_rate - 16));
3921b362b15af34006e6a11974088a46d42b903418eJohann        }
3931b362b15af34006e6a11974088a46d42b903418eJohann        else {
3941b362b15af34006e6a11974088a46d42b903418eJohann          /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
3951b362b15af34006e6a11974088a46d42b903418eJohann          kf_boost = initial_boost;
3961b362b15af34006e6a11974088a46d42b903418eJohann        }
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3981b362b15af34006e6a11974088a46d42b903418eJohann        /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
3991b362b15af34006e6a11974088a46d42b903418eJohann        kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4011b362b15af34006e6a11974088a46d42b903418eJohann        /* frame separation adjustment ( down) */
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->frames_since_key  < cpi->output_frame_rate / 2)
4031b362b15af34006e6a11974088a46d42b903418eJohann            kf_boost = (int)(kf_boost
4041b362b15af34006e6a11974088a46d42b903418eJohann                       * cpi->frames_since_key / (cpi->output_frame_rate / 2));
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4061b362b15af34006e6a11974088a46d42b903418eJohann        /* Minimal target size is |2* per_frame_bandwidth|. */
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (kf_boost < 16)
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            kf_boost = 16;
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4101b362b15af34006e6a11974088a46d42b903418eJohann        target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4141b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->oxcf.rc_max_intra_bitrate_pct)
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4161b362b15af34006e6a11974088a46d42b903418eJohann        unsigned int max_rate = cpi->per_frame_bandwidth
4171b362b15af34006e6a11974088a46d42b903418eJohann                                * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4191b362b15af34006e6a11974088a46d42b903418eJohann        if (target > max_rate)
4201b362b15af34006e6a11974088a46d42b903418eJohann            target = max_rate;
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4231b362b15af34006e6a11974088a46d42b903418eJohann    cpi->this_frame_target = (int)target;
4241b362b15af34006e6a11974088a46d42b903418eJohann
4251b362b15af34006e6a11974088a46d42b903418eJohann    /* TODO: if we separate rate targeting from Q targetting, move this.
4261b362b15af34006e6a11974088a46d42b903418eJohann     * Reset the active worst quality to the baseline value for key frames.
4271b362b15af34006e6a11974088a46d42b903418eJohann     */
4281b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->pass != 2)
4291b362b15af34006e6a11974088a46d42b903418eJohann        cpi->active_worst_quality = cpi->worst_quality;
4301b362b15af34006e6a11974088a46d42b903418eJohann
4311b362b15af34006e6a11974088a46d42b903418eJohann#if 0
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f;
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        f = fopen("kf_boost.stt", "a");
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, " %8u %10d %10d %10d\n",
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
4411b362b15af34006e6a11974088a46d42b903418eJohann#endif
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4441b362b15af34006e6a11974088a46d42b903418eJohann
4451b362b15af34006e6a11974088a46d42b903418eJohann/* Do the best we can to define the parameters for the next GF based on what
4461b362b15af34006e6a11974088a46d42b903418eJohann * information we have available.
4471b362b15af34006e6a11974088a46d42b903418eJohann */
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void calc_gf_params(VP8_COMP *cpi)
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Boost = 0;
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4531b362b15af34006e6a11974088a46d42b903418eJohann    int gf_frame_useage = 0;      /* Golden frame useage since last GF */
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[LAST_FRAME]   +
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[ALTREF_FRAME];
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
459f71323e297a928af368937089d3ed71239786f86Andreas Huber    int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (tot_mbs)
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (pct_gf_active > gf_frame_useage)
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = pct_gf_active;
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4671b362b15af34006e6a11974088a46d42b903418eJohann    /* Not two pass */
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4701b362b15af34006e6a11974088a46d42b903418eJohann        /* Single Pass lagged mode: TBD */
4711b362b15af34006e6a11974088a46d42b903418eJohann        if (0)
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4751b362b15af34006e6a11974088a46d42b903418eJohann        /* Single Pass compression: Has to use current and historical data */
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
4791b362b15af34006e6a11974088a46d42b903418eJohann            /* Experimental code */
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int index = cpi->one_pass_frame_index;
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4831b362b15af34006e6a11974088a46d42b903418eJohann            /* ************** Experimental code - incomplete */
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double decay_val = 1.0;
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIAccumulator = 0.0;
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double last_iiaccumulator = 0.0;
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIRatio;
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for ( i = 0; i < (frames_to_scan - 1); i++ )
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( index < 0 )
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    index = MAX_LAG_BUFFERS;
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                index --;
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( IIRatio > 30.0 )
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        IIRatio = 30.0;
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = 30.0;
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                IIAccumulator += IIRatio * decay_val;
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (    (i > MIN_GF_INTERVAL) &&
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_iiaccumulator = IIAccumulator;
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = IIAccumulator*100.0/16.0;
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->baseline_gf_interval = i;
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            */
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*************************************************************/
5271b362b15af34006e6a11974088a46d42b903418eJohann            /* OLD code */
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5291b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust boost based upon ambient Q */
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = GFQ_ADJUSTMENT;
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5321b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust based upon most recently measure intra useage */
53379f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5351b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust gf boost based upon GF usage since last GF */
53679f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5401b362b15af34006e6a11974088a46d42b903418eJohann        /* golden frame boost without recode loop often goes awry.  be
5411b362b15af34006e6a11974088a46d42b903418eJohann         * safe by keeping numbers down.
5421b362b15af34006e6a11974088a46d42b903418eJohann         */
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!cpi->sf.recode_loop)
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->compressor_speed == 2)
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Boost = Boost / 2;
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5491b362b15af34006e6a11974088a46d42b903418eJohann        /* Apply an upper limit based on Q for 1 pass encodes */
55079f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
55179f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = kf_gf_boost_qlimits[Q];
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5531b362b15af34006e6a11974088a46d42b903418eJohann        /* Apply lower limits to boost. */
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (Boost < 110)
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = 110;
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5571b362b15af34006e6a11974088a46d42b903418eJohann        /* Note the boost used */
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->last_boost = Boost;
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5621b362b15af34006e6a11974088a46d42b903418eJohann    /* Estimate next interval
5631b362b15af34006e6a11974088a46d42b903418eJohann     * This is updated once the real frame size/boost is known.
5641b362b15af34006e6a11974088a46d42b903418eJohann     */
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q == -1)
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5671b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->pass == 2)         /* 2 Pass */
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
5711b362b15af34006e6a11974088a46d42b903418eJohann        else                            /* 1 Pass */
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 750)
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1000)
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1250)
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost >= 1500)
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due ++;
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58779f15823c34ae1e423108295e416213200bb280fAndreas Huber            if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
58879f15823c34ae1e423108295e416213200bb280fAndreas Huber                cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due = cpi->max_gf_interval;
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5971b362b15af34006e6a11974088a46d42b903418eJohann    /* ARF on or off */
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
6001b362b15af34006e6a11974088a46d42b903418eJohann        /* For now Alt ref is not allowed except in 2 pass modes. */
6011b362b15af34006e6a11974088a46d42b903418eJohann        cpi->source_alt_ref_pending = 0;
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*if ( cpi->oxcf.fixed_q == -1)
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
6061b362b15af34006e6a11974088a46d42b903418eJohann                cpi->source_alt_ref_pending = 1;
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
6081b362b15af34006e6a11974088a46d42b903418eJohann                cpi->source_alt_ref_pending = 0;
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6141b362b15af34006e6a11974088a46d42b903418eJohannstatic void calc_pframe_target_size(VP8_COMP *cpi)
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int min_frame_target;
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Adjustment;
6181b362b15af34006e6a11974088a46d42b903418eJohann    int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
6191b362b15af34006e6a11974088a46d42b903418eJohann
6201b362b15af34006e6a11974088a46d42b903418eJohann    if ( cpi->current_layer > 0)
6211b362b15af34006e6a11974088a46d42b903418eJohann        cpi->per_frame_bandwidth =
6221b362b15af34006e6a11974088a46d42b903418eJohann            cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    min_frame_target = 0;
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 2)
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->min_frame_bandwidth;
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            min_frame_target = cpi->av_per_frame_bandwidth >> 5;
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (min_frame_target < cpi->per_frame_bandwidth / 4)
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->per_frame_bandwidth / 4;
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6371b362b15af34006e6a11974088a46d42b903418eJohann    /* Special alt reference frame case */
6381b362b15af34006e6a11974088a46d42b903418eJohann    if((cpi->common.refresh_alt_ref_frame) && (cpi->oxcf.number_of_layers == 1))
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
6421b362b15af34006e6a11974088a46d42b903418eJohann            /* Per frame bit target for the alt ref frame */
6431b362b15af34006e6a11974088a46d42b903418eJohann            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* One Pass ??? TBD */
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6501b362b15af34006e6a11974088a46d42b903418eJohann    /* Normal frames (gf,and inter) */
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
6531b362b15af34006e6a11974088a46d42b903418eJohann        /* 2 pass */
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
6581b362b15af34006e6a11974088a46d42b903418eJohann        /* 1 pass */
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
6611b362b15af34006e6a11974088a46d42b903418eJohann            /* Make rate adjustment to recover bits spent in key frame
6621b362b15af34006e6a11974088a46d42b903418eJohann             * Test to see if the key frame inter data rate correction
6631b362b15af34006e6a11974088a46d42b903418eJohann             * should still be in force
6641b362b15af34006e6a11974088a46d42b903418eJohann             */
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->kf_overspend_bits > 0)
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->kf_overspend_bits -= Adjustment;
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6741b362b15af34006e6a11974088a46d42b903418eJohann                /* Calculate an inter frame bandwidth target for the next
6751b362b15af34006e6a11974088a46d42b903418eJohann                 * few frames designed to recover any extra bits spent on
6761b362b15af34006e6a11974088a46d42b903418eJohann                 * the key frame.
6771b362b15af34006e6a11974088a46d42b903418eJohann                 */
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->this_frame_target < min_frame_target)
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = min_frame_target;
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth;
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6861b362b15af34006e6a11974088a46d42b903418eJohann            /* If appropriate make an adjustment to recover bits spent on a
6871b362b15af34006e6a11974088a46d42b903418eJohann             * recent GF
6881b362b15af34006e6a11974088a46d42b903418eJohann             */
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->gf_overspend_bits -= Adjustment;
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target -= Adjustment;
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7001b362b15af34006e6a11974088a46d42b903418eJohann            /* Apply small + and - boosts for non gf frames */
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
7041b362b15af34006e6a11974088a46d42b903418eJohann                /* % Adjustment limited to the range 1% to 10% */
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->last_boost - 100) >> 5;
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment < 1)
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 1;
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (Adjustment > 10)
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 10;
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7121b362b15af34006e6a11974088a46d42b903418eJohann                /* Convert to bits */
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->this_frame_target * Adjustment) / 100;
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->common.frames_since_golden == (cpi->current_gf_interval >> 1))
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target += ((cpi->current_gf_interval - 1) * Adjustment);
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target -= Adjustment;
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7261b362b15af34006e6a11974088a46d42b903418eJohann    /* Sanity check that the total sum of adjustments is not above the
7271b362b15af34006e6a11974088a46d42b903418eJohann     * maximum allowed That is that having allowed for KF and GF penalties
7281b362b15af34006e6a11974088a46d42b903418eJohann     * we have not pushed the current interframe target to low. If the
7291b362b15af34006e6a11974088a46d42b903418eJohann     * adjustment we apply here is not capable of recovering all the extra
7301b362b15af34006e6a11974088a46d42b903418eJohann     * bits we have spent in the KF or GF then the remainder will have to
7311b362b15af34006e6a11974088a46d42b903418eJohann     * be recovered over a longer time span via other buffer / rate control
7321b362b15af34006e6a11974088a46d42b903418eJohann     * mechanisms.
7331b362b15af34006e6a11974088a46d42b903418eJohann     */
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->this_frame_target < min_frame_target)
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = min_frame_target;
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!cpi->common.refresh_alt_ref_frame)
7381b362b15af34006e6a11974088a46d42b903418eJohann        /* Note the baseline target data rate for this inter frame. */
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->inter_frame_target = cpi->this_frame_target;
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7411b362b15af34006e6a11974088a46d42b903418eJohann    /* One Pass specific code */
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 0)
74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
7441b362b15af34006e6a11974088a46d42b903418eJohann        /* Adapt target frame size with respect to any buffering constraints: */
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->buffered_mode)
74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
7471b362b15af34006e6a11974088a46d42b903418eJohann            int one_percent_bits = (int)
7481b362b15af34006e6a11974088a46d42b903418eJohann                (1 + cpi->oxcf.optimal_buffer_level / 100);
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75079f15823c34ae1e423108295e416213200bb280fAndreas Huber            if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
75179f15823c34ae1e423108295e416213200bb280fAndreas Huber                (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int percent_low = 0;
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7551b362b15af34006e6a11974088a46d42b903418eJohann                /* Decide whether or not we need to adjust the frame data
7561b362b15af34006e6a11974088a46d42b903418eJohann                 * rate target.
7571b362b15af34006e6a11974088a46d42b903418eJohann                 *
7581b362b15af34006e6a11974088a46d42b903418eJohann                 * If we are are below the optimal buffer fullness level
7591b362b15af34006e6a11974088a46d42b903418eJohann                 * and adherence to buffering constraints is important to
7601b362b15af34006e6a11974088a46d42b903418eJohann                 * the end usage then adjust the per frame target.
7611b362b15af34006e6a11974088a46d42b903418eJohann                 */
76279f15823c34ae1e423108295e416213200bb280fAndreas Huber                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
76379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
7651b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = (int)
7661b362b15af34006e6a11974088a46d42b903418eJohann                        ((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
7671b362b15af34006e6a11974088a46d42b903418eJohann                        one_percent_bits);
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
7691b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we overshooting the long term clip data rate... */
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (cpi->bits_off_target < 0)
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
7721b362b15af34006e6a11974088a46d42b903418eJohann                    /* Adjust per frame data target downwards to compensate. */
77379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    percent_low = (int)(100 * -cpi->bits_off_target /
77479f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->total_byte_count * 8));
77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7771b362b15af34006e6a11974088a46d42b903418eJohann                if (percent_low > cpi->oxcf.under_shoot_pct)
7781b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = cpi->oxcf.under_shoot_pct;
7791b362b15af34006e6a11974088a46d42b903418eJohann                else if (percent_low < 0)
7801b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = 0;
78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7821b362b15af34006e6a11974088a46d42b903418eJohann                /* lower the target bandwidth for this frame. */
7831b362b15af34006e6a11974088a46d42b903418eJohann                cpi->this_frame_target -=
7841b362b15af34006e6a11974088a46d42b903418eJohann                        (cpi->this_frame_target * percent_low) / 200;
78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7861b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we using allowing control of active_worst_allowed_q
7871b362b15af34006e6a11974088a46d42b903418eJohann                 * according to buffer level.
7881b362b15af34006e6a11974088a46d42b903418eJohann                 */
7891b362b15af34006e6a11974088a46d42b903418eJohann                if (cpi->auto_worst_q && cpi->ni_frames > 150)
7901b362b15af34006e6a11974088a46d42b903418eJohann                {
7911b362b15af34006e6a11974088a46d42b903418eJohann                    int64_t critical_buffer_level;
7921b362b15af34006e6a11974088a46d42b903418eJohann
7931b362b15af34006e6a11974088a46d42b903418eJohann                    /* For streaming applications the most important factor is
7941b362b15af34006e6a11974088a46d42b903418eJohann                     * cpi->buffer_level as this takes into account the
7951b362b15af34006e6a11974088a46d42b903418eJohann                     * specified short term buffering constraints. However,
7961b362b15af34006e6a11974088a46d42b903418eJohann                     * hitting the long term clip data rate target is also
7971b362b15af34006e6a11974088a46d42b903418eJohann                     * important.
7981b362b15af34006e6a11974088a46d42b903418eJohann                     */
79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
8011b362b15af34006e6a11974088a46d42b903418eJohann                        /* Take the smaller of cpi->buffer_level and
8021b362b15af34006e6a11974088a46d42b903418eJohann                         * cpi->bits_off_target
8031b362b15af34006e6a11974088a46d42b903418eJohann                         */
80479f15823c34ae1e423108295e416213200bb280fAndreas Huber                        critical_buffer_level =
80579f15823c34ae1e423108295e416213200bb280fAndreas Huber                            (cpi->buffer_level < cpi->bits_off_target)
80679f15823c34ae1e423108295e416213200bb280fAndreas Huber                            ? cpi->buffer_level : cpi->bits_off_target;
80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
8081b362b15af34006e6a11974088a46d42b903418eJohann                    /* For local file playback short term buffering constraints
8091b362b15af34006e6a11974088a46d42b903418eJohann                     * are less of an issue
8101b362b15af34006e6a11974088a46d42b903418eJohann                     */
81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
8131b362b15af34006e6a11974088a46d42b903418eJohann                        /* Consider only how we are doing for the clip as a
8141b362b15af34006e6a11974088a46d42b903418eJohann                         * whole
8151b362b15af34006e6a11974088a46d42b903418eJohann                         */
81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        critical_buffer_level = cpi->bits_off_target;
81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8191b362b15af34006e6a11974088a46d42b903418eJohann                    /* Set the active worst quality based upon the selected
8201b362b15af34006e6a11974088a46d42b903418eJohann                     * buffer fullness number.
8211b362b15af34006e6a11974088a46d42b903418eJohann                     */
82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
82390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
82479f15823c34ae1e423108295e416213200bb280fAndreas Huber                        if ( critical_buffer_level >
82579f15823c34ae1e423108295e416213200bb280fAndreas Huber                             (cpi->oxcf.optimal_buffer_level >> 2) )
82690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
8271b362b15af34006e6a11974088a46d42b903418eJohann                            int64_t qadjustment_range =
82879f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      cpi->worst_quality - cpi->ni_av_qi;
8291b362b15af34006e6a11974088a46d42b903418eJohann                            int64_t above_base =
83079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      (critical_buffer_level -
83179f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->oxcf.optimal_buffer_level >> 2));
83279f15823c34ae1e423108295e416213200bb280fAndreas Huber
8331b362b15af34006e6a11974088a46d42b903418eJohann                            /* Step active worst quality down from
8341b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->ni_av_qi when (critical_buffer_level ==
8351b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->optimal_buffer_level) to
8361b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->worst_quality when
8371b362b15af34006e6a11974088a46d42b903418eJohann                             * (critical_buffer_level ==
8381b362b15af34006e6a11974088a46d42b903418eJohann                             *     cpi->optimal_buffer_level >> 2)
8391b362b15af34006e6a11974088a46d42b903418eJohann                             */
84079f15823c34ae1e423108295e416213200bb280fAndreas Huber                            cpi->active_worst_quality =
84179f15823c34ae1e423108295e416213200bb280fAndreas Huber                                cpi->worst_quality -
8421b362b15af34006e6a11974088a46d42b903418eJohann                                (int)((qadjustment_range * above_base) /
84379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                 (cpi->oxcf.optimal_buffer_level*3>>2));
84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
84590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
84690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->active_worst_quality = cpi->worst_quality;
84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->active_worst_quality = cpi->ni_av_qi;
85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
85990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
86090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
86190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
8621b362b15af34006e6a11974088a46d42b903418eJohann                int percent_high = 0;
86390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8641b362b15af34006e6a11974088a46d42b903418eJohann                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
8651b362b15af34006e6a11974088a46d42b903418eJohann                     && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
86690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
8671b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = (int)((cpi->buffer_level
8681b362b15af34006e6a11974088a46d42b903418eJohann                                    - cpi->oxcf.optimal_buffer_level)
8691b362b15af34006e6a11974088a46d42b903418eJohann                                   / one_percent_bits);
8701b362b15af34006e6a11974088a46d42b903418eJohann                }
8711b362b15af34006e6a11974088a46d42b903418eJohann                else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
8721b362b15af34006e6a11974088a46d42b903418eJohann                {
8731b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = (int)((100 * cpi->bits_off_target)
8741b362b15af34006e6a11974088a46d42b903418eJohann                                         / (cpi->total_byte_count * 8));
8751b362b15af34006e6a11974088a46d42b903418eJohann                }
87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8771b362b15af34006e6a11974088a46d42b903418eJohann                if (percent_high > cpi->oxcf.over_shoot_pct)
8781b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = cpi->oxcf.over_shoot_pct;
8791b362b15af34006e6a11974088a46d42b903418eJohann                else if (percent_high < 0)
8801b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = 0;
88190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8821b362b15af34006e6a11974088a46d42b903418eJohann                cpi->this_frame_target += (cpi->this_frame_target *
8831b362b15af34006e6a11974088a46d42b903418eJohann                                          percent_high) / 200;
88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8851b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we allowing control of active_worst_allowed_q according
8861b362b15af34006e6a11974088a46d42b903418eJohann                 * to buffer level.
8871b362b15af34006e6a11974088a46d42b903418eJohann                 */
8881b362b15af34006e6a11974088a46d42b903418eJohann                if (cpi->auto_worst_q && cpi->ni_frames > 150)
88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
8901b362b15af34006e6a11974088a46d42b903418eJohann                    /* When using the relaxed buffer model stick to the
8911b362b15af34006e6a11974088a46d42b903418eJohann                     * user specified value
8921b362b15af34006e6a11974088a46d42b903418eJohann                     */
89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->ni_av_qi;
89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
89890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
90090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9011b362b15af34006e6a11974088a46d42b903418eJohann            /* Set active_best_quality to prevent quality rising too high */
90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_best_quality = cpi->best_quality;
90390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9041b362b15af34006e6a11974088a46d42b903418eJohann            /* Worst quality obviously must not be better than best quality */
90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->active_worst_quality <= cpi->active_best_quality)
90690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->active_worst_quality = cpi->active_best_quality + 1;
90790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9081b362b15af34006e6a11974088a46d42b903418eJohann            if(cpi->active_worst_quality > 127)
9091b362b15af34006e6a11974088a46d42b903418eJohann                cpi->active_worst_quality = 127;
91090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
9111b362b15af34006e6a11974088a46d42b903418eJohann        /* Unbuffered mode (eg. video conferencing) */
91290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
91390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
9141b362b15af34006e6a11974088a46d42b903418eJohann            /* Set the active worst quality */
91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_worst_quality = cpi->worst_quality;
91690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
91779f15823c34ae1e423108295e416213200bb280fAndreas Huber
9181b362b15af34006e6a11974088a46d42b903418eJohann        /* Special trap for constrained quality mode
9191b362b15af34006e6a11974088a46d42b903418eJohann         * "active_worst_quality" may never drop below cq level
9201b362b15af34006e6a11974088a46d42b903418eJohann         * for any frame type.
9211b362b15af34006e6a11974088a46d42b903418eJohann         */
92279f15823c34ae1e423108295e416213200bb280fAndreas Huber        if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
92379f15823c34ae1e423108295e416213200bb280fAndreas Huber             cpi->active_worst_quality < cpi->cq_target_quality)
92479f15823c34ae1e423108295e416213200bb280fAndreas Huber        {
92579f15823c34ae1e423108295e416213200bb280fAndreas Huber            cpi->active_worst_quality = cpi->cq_target_quality;
92679f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
92890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9291b362b15af34006e6a11974088a46d42b903418eJohann    /* Test to see if we have to drop a frame
9301b362b15af34006e6a11974088a46d42b903418eJohann     * The auto-drop frame code is only used in buffered mode.
9311b362b15af34006e6a11974088a46d42b903418eJohann     * In unbufferd mode (eg vide conferencing) the descision to
9321b362b15af34006e6a11974088a46d42b903418eJohann     * code or drop a frame is made outside the codec in response to real
9331b362b15af34006e6a11974088a46d42b903418eJohann     * world comms or buffer considerations.
9341b362b15af34006e6a11974088a46d42b903418eJohann     */
9351b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->drop_frames_allowed &&
93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
9371b362b15af34006e6a11974088a46d42b903418eJohann        ((cpi->common.frame_type != KEY_FRAME)))
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
9391b362b15af34006e6a11974088a46d42b903418eJohann        /* Check for a buffer underun-crisis in which case we have to drop
9401b362b15af34006e6a11974088a46d42b903418eJohann         * a frame
9411b362b15af34006e6a11974088a46d42b903418eJohann         */
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((cpi->buffer_level < 0))
94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f = fopen("dec.stt", "a");
94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (int) cpi->common.current_video_frame,
94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->decimation_factor, cpi->common.horiz_scale,
94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
95190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9521b362b15af34006e6a11974088a46d42b903418eJohann            cpi->drop_frame = 1;
95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9541b362b15af34006e6a11974088a46d42b903418eJohann            /* Update the buffer level variable. */
95590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
9561b362b15af34006e6a11974088a46d42b903418eJohann            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
9571b362b15af34006e6a11974088a46d42b903418eJohann              cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
95890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->buffer_level = cpi->bits_off_target;
95990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
96190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9621b362b15af34006e6a11974088a46d42b903418eJohann    /* Adjust target frame size for Golden Frames: */
96390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.error_resilient_mode == 0 &&
96490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
96590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9681b362b15af34006e6a11974088a46d42b903418eJohann        int gf_frame_useage = 0;      /* Golden frame useage since last GF */
96990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[LAST_FRAME]   +
97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[ALTREF_FRAME];
97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
974f71323e297a928af368937089d3ed71239786f86Andreas Huber        int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
97590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (tot_mbs)
97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (pct_gf_active > gf_frame_useage)
98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = pct_gf_active;
98190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9821b362b15af34006e6a11974088a46d42b903418eJohann        /* Is a fixed manual GF frequency being used */
98379f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (cpi->auto_gold)
98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
9851b362b15af34006e6a11974088a46d42b903418eJohann            /* For one pass throw a GF if recent frame intra useage is
9861b362b15af34006e6a11974088a46d42b903418eJohann             * low or the GF useage is high
9871b362b15af34006e6a11974088a46d42b903418eJohann             */
98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
9891b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame = 1;
99090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9911b362b15af34006e6a11974088a46d42b903418eJohann            /* Two pass GF descision */
99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (cpi->pass == 2)
9931b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame = 1;
99490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
99590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
99690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
99790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9981b362b15af34006e6a11974088a46d42b903418eJohann        /* Debug stats */
99990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (0)
100090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f;
100290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            f = fopen("gf_useaget.stt", "a");
100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
100590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->common.current_video_frame,  cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10111b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->common.refresh_golden_frame == 1)
101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10151b362b15af34006e6a11974088a46d42b903418eJohann            if (0)
101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FILE *f;
101890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                f = fopen("GFexit.stt", "a");
102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fclose(f);
102290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->auto_adjust_gold_quantizer)
102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                calc_gf_params(cpi);
102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10311b362b15af34006e6a11974088a46d42b903418eJohann            /* If we are using alternate ref instead of gf then do not apply the
10321b362b15af34006e6a11974088a46d42b903418eJohann             * boost It will instead be applied to the altref update Jims
10331b362b15af34006e6a11974088a46d42b903418eJohann             * modified boost
10341b362b15af34006e6a11974088a46d42b903418eJohann             */
103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!cpi->source_alt_ref_active)
103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.fixed_q < 0)
103890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
103990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->pass == 2)
104090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
10411b362b15af34006e6a11974088a46d42b903418eJohann                        /* The spend on the GF is defined in the two pass
10421b362b15af34006e6a11974088a46d42b903418eJohann                         * code for two pass encodes
10431b362b15af34006e6a11974088a46d42b903418eJohann                         */
10441b362b15af34006e6a11974088a46d42b903418eJohann                        cpi->this_frame_target = cpi->per_frame_bandwidth;
104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
104890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int Boost = cpi->last_boost;
104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int frames_in_section = cpi->frames_till_gf_update_due + 1;
105090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
105190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int bits_in_section = cpi->inter_frame_target * frames_in_section;
105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10531b362b15af34006e6a11974088a46d42b903418eJohann                        /* Normalize Altboost and allocations chunck down to
10541b362b15af34006e6a11974088a46d42b903418eJohann                         * prevent overflow
10551b362b15af34006e6a11974088a46d42b903418eJohann                         */
105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        while (Boost > 1000)
105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            Boost /= 2;
105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            allocation_chunks /= 2;
106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
106190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10621b362b15af34006e6a11974088a46d42b903418eJohann                        /* Avoid loss of precision but avoid overflow */
106390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        if ((bits_in_section >> 7) > allocation_chunks)
106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
106790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
106890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
106990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
10701b362b15af34006e6a11974088a46d42b903418eJohann                    cpi->this_frame_target =
10711b362b15af34006e6a11974088a46d42b903418eJohann                        (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0)
10721b362b15af34006e6a11974088a46d42b903418eJohann                         * cpi->last_boost) / 100;
107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
107490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
10751b362b15af34006e6a11974088a46d42b903418eJohann            /* If there is an active ARF at this location use the minimum
10761b362b15af34006e6a11974088a46d42b903418eJohann             * bits on this frame even if it is a contructed arf.
10771b362b15af34006e6a11974088a46d42b903418eJohann             * The active maximum quantizer insures that an appropriate
10781b362b15af34006e6a11974088a46d42b903418eJohann             * number of bits will be spent if needed for contstructed ARFs.
10791b362b15af34006e6a11974088a46d42b903418eJohann             */
108090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
1082f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->this_frame_target = 0;
108390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
108490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
108690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10891b362b15af34006e6a11974088a46d42b903418eJohann
10901b362b15af34006e6a11974088a46d42b903418eJohann    cpi->per_frame_bandwidth = old_per_frame_bandwidth;
109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
109290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
109590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
109690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    Q = cpi->common.base_qindex;
109790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    correction_factor = 100;
109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double rate_correction_factor;
109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double adjustment_limit;
110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    projected_size_based_on_q = 0;
110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11031b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
11041b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = cpi->key_frame_rate_correction_factor;
110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
111090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
111190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
111290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->gf_rate_correction_factor;
111490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->rate_correction_factor;
111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
111790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11181b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out how big we would have expected the frame to be at this Q
11191b362b15af34006e6a11974088a46d42b903418eJohann     * given the current correction factor. Stay in double to avoid int
11201b362b15af34006e6a11974088a46d42b903418eJohann     * overflow when values are large
11211b362b15af34006e6a11974088a46d42b903418eJohann     */
112290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    projected_size_based_on_q = (int)(((.5 + rate_correction_factor * vp8_bits_per_mb[cpi->common.frame_type][Q]) * cpi->common.MBs) / (1 << BPER_MB_NORMBITS));
112390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11241b362b15af34006e6a11974088a46d42b903418eJohann    /* Make some allowance for cpi->zbin_over_quant */
112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->zbin_over_quant > 0)
112690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
112790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int Z = cpi->zbin_over_quant;
112890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double Factor = 0.99;
11291b362b15af34006e6a11974088a46d42b903418eJohann        double factor_adjustment = 0.01 / 256.0;
113090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (Z > 0)
113290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
113390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Z --;
1134f71323e297a928af368937089d3ed71239786f86Andreas Huber            projected_size_based_on_q =
1135f71323e297a928af368937089d3ed71239786f86Andreas Huber                (int)(Factor * projected_size_based_on_q);
113690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Factor += factor_adjustment;
113790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
113890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Factor  >= 0.999)
113990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = 0.999;
114090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
114190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
114290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11431b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out a size correction factor. */
114490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (projected_size_based_on_q > 0)
114590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
114690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11471b362b15af34006e6a11974088a46d42b903418eJohann    /* More heavily damped adjustment used if we have been oscillating
11481b362b15af34006e6a11974088a46d42b903418eJohann     * either side of target
11491b362b15af34006e6a11974088a46d42b903418eJohann     */
115090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    switch (damp_var)
115190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
115290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 0:
115390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.75;
115490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
115590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 1:
115690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.375;
115790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
115890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 2:
115990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    default:
116090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.25;
116190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
116290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
116390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
116490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (correction_factor > 102)
116590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11661b362b15af34006e6a11974088a46d42b903418eJohann        /* We are not already at the worst allowable quality */
116790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
116890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
116990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11701b362b15af34006e6a11974088a46d42b903418eJohann        /* Keep rate_correction_factor within limits */
117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor > MAX_BPB_FACTOR)
117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MAX_BPB_FACTOR;
117390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
117490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (correction_factor < 99)
117590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11761b362b15af34006e6a11974088a46d42b903418eJohann        /* We are not already at the best allowable quality */
117790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
117890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
117990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11801b362b15af34006e6a11974088a46d42b903418eJohann        /* Keep rate_correction_factor within limits */
118190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor < MIN_BPB_FACTOR)
118290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MIN_BPB_FACTOR;
118390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
118590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->key_frame_rate_correction_factor = rate_correction_factor;
118790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
118890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
118990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
119090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->gf_rate_correction_factor = rate_correction_factor;
119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
119290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->rate_correction_factor = rate_correction_factor;
119390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
119490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
119590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
119690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
119890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
119990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = cpi->active_worst_quality;
120090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12011b362b15af34006e6a11974088a46d42b903418eJohann    /* Reset Zbin OQ value */
120290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->zbin_over_quant = 0;
120390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
120490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
120590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
120690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        Q = cpi->oxcf.fixed_q;
120790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
120890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
120990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
121090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.key_q;
121190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
121290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (cpi->common.refresh_alt_ref_frame)
121390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
121490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.alt_q;
121590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
121690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (cpi->common.refresh_golden_frame)
121790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
121890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.gold_q;
121990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
122090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
122190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
122290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
122390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
122490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
122590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int last_error = INT_MAX;
122690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int target_bits_per_mb;
122790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int bits_per_mb_at_this_q;
122890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double correction_factor;
122990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12301b362b15af34006e6a11974088a46d42b903418eJohann        /* Select the appropriate correction factor based upon type of frame. */
123190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
123290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            correction_factor = cpi->key_frame_rate_correction_factor;
123390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
123490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
123590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
123690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->gf_rate_correction_factor;
123790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
123890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->rate_correction_factor;
123990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
124090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12411b362b15af34006e6a11974088a46d42b903418eJohann        /* Calculate required scaling factor based on target frame size and
12421b362b15af34006e6a11974088a46d42b903418eJohann         * size of frame produced using previous Q
12431b362b15af34006e6a11974088a46d42b903418eJohann         */
124490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
12451b362b15af34006e6a11974088a46d42b903418eJohann            /* Case where we would overflow int */
12461b362b15af34006e6a11974088a46d42b903418eJohann            target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;
124790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
124890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
124990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
125090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        i = cpi->active_best_quality;
125190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
125290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        do
125390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
125490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
125590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
125690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (bits_per_mb_at_this_q <= target_bits_per_mb)
125790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
125890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
125990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i;
126090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i - 1;
126290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
126390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
126490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
126690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_error = bits_per_mb_at_this_q - target_bits_per_mb;
126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
126890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (++i <= cpi->active_worst_quality);
126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12711b362b15af34006e6a11974088a46d42b903418eJohann        /* If we are at MAXQ then enable Q over-run which seeks to claw
12721b362b15af34006e6a11974088a46d42b903418eJohann         * back additional bits through things like the RD multiplier
12731b362b15af34006e6a11974088a46d42b903418eJohann         * and zero bin size.
12741b362b15af34006e6a11974088a46d42b903418eJohann         */
127590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (Q >= MAXQ)
127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
127790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int zbin_oqmax;
127890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
127990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double Factor = 0.99;
12801b362b15af34006e6a11974088a46d42b903418eJohann            double factor_adjustment = 0.01 / 256.0;
128190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
128290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.frame_type == KEY_FRAME)
12831b362b15af34006e6a11974088a46d42b903418eJohann                zbin_oqmax = 0;
128490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (cpi->common.refresh_alt_ref_frame || (cpi->common.refresh_golden_frame && !cpi->source_alt_ref_active))
128590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = 16;
128690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
128790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = ZBIN_OQ_MAX;
128890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*{
129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
129190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Oq;
129290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = Factor/1.2683;
129490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Oq = pow( Factor, (1.0/-0.165) );
129690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( Oq > zbin_oqmax )
129890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Oq = zbin_oqmax;
129990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
130090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->zbin_over_quant = (int)Oq;
130190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }*/
130290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13031b362b15af34006e6a11974088a46d42b903418eJohann            /* Each incrment in the zbin is assumed to have a fixed effect
13041b362b15af34006e6a11974088a46d42b903418eJohann             * on bitrate. This is not of course true. The effect will be
13051b362b15af34006e6a11974088a46d42b903418eJohann             * highly clip dependent and may well have sudden steps. The
13061b362b15af34006e6a11974088a46d42b903418eJohann             * idea here is to acheive higher effective quantizers than the
13071b362b15af34006e6a11974088a46d42b903418eJohann             * normal maximum by expanding the zero bin and hence
13081b362b15af34006e6a11974088a46d42b903418eJohann             * decreasing the number of low magnitude non zero coefficients.
13091b362b15af34006e6a11974088a46d42b903418eJohann             */
131090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            while (cpi->zbin_over_quant < zbin_oqmax)
131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
131290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->zbin_over_quant ++;
131390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->zbin_over_quant > zbin_oqmax)
131590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->zbin_over_quant = zbin_oqmax;
131690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13171b362b15af34006e6a11974088a46d42b903418eJohann                /* Adjust bits_per_mb_at_this_q estimate */
1318f71323e297a928af368937089d3ed71239786f86Andreas Huber                bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
131990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor += factor_adjustment;
132090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
132190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Factor  >= 0.999)
132290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Factor = 0.999;
132390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13241b362b15af34006e6a11974088a46d42b903418eJohann                /* Break out if we get down to the target rate */
13251b362b15af34006e6a11974088a46d42b903418eJohann                if (bits_per_mb_at_this_q <= target_bits_per_mb)
132690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
132790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
132890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
132990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
133090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
133190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
133290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return Q;
133390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
133490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
133590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13361b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_keyframe_frequency(VP8_COMP *cpi)
133790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
133890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
133990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13401b362b15af34006e6a11974088a46d42b903418eJohann    /* Average key frame frequency */
13411b362b15af34006e6a11974088a46d42b903418eJohann    int av_key_frame_frequency = 0;
134290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13431b362b15af34006e6a11974088a46d42b903418eJohann    /* First key frame at start of sequence is a special case. We have no
13441b362b15af34006e6a11974088a46d42b903418eJohann     * frequency data.
13451b362b15af34006e6a11974088a46d42b903418eJohann     */
134690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->key_frame_count == 1)
134790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13481b362b15af34006e6a11974088a46d42b903418eJohann        /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
13491b362b15af34006e6a11974088a46d42b903418eJohann         * whichever is smaller.
13501b362b15af34006e6a11974088a46d42b903418eJohann         */
13511b362b15af34006e6a11974088a46d42b903418eJohann        int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1;
13521b362b15af34006e6a11974088a46d42b903418eJohann        av_key_frame_frequency = (int)cpi->output_frame_rate * 2;
13531b362b15af34006e6a11974088a46d42b903418eJohann
13541b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
13551b362b15af34006e6a11974088a46d42b903418eJohann            av_key_frame_frequency = cpi->oxcf.key_freq;
13561b362b15af34006e6a11974088a46d42b903418eJohann
13571b362b15af34006e6a11974088a46d42b903418eJohann        cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
13581b362b15af34006e6a11974088a46d42b903418eJohann            = av_key_frame_frequency;
135990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
136090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
136190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13621b362b15af34006e6a11974088a46d42b903418eJohann        unsigned int total_weight = 0;
1363f71323e297a928af368937089d3ed71239786f86Andreas Huber        int last_kf_interval =
1364f71323e297a928af368937089d3ed71239786f86Andreas Huber                (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1365f71323e297a928af368937089d3ed71239786f86Andreas Huber
13661b362b15af34006e6a11974088a46d42b903418eJohann        /* reset keyframe context and calculate weighted average of last
13671b362b15af34006e6a11974088a46d42b903418eJohann         * KEY_FRAME_CONTEXT keyframes
13681b362b15af34006e6a11974088a46d42b903418eJohann         */
136990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < KEY_FRAME_CONTEXT; i++)
137090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
137190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (i < KEY_FRAME_CONTEXT - 1)
13721b362b15af34006e6a11974088a46d42b903418eJohann                cpi->prior_key_frame_distance[i]
13731b362b15af34006e6a11974088a46d42b903418eJohann                    = cpi->prior_key_frame_distance[i+1];
137490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
1375f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->prior_key_frame_distance[i] = last_kf_interval;
137690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13771b362b15af34006e6a11974088a46d42b903418eJohann            av_key_frame_frequency += prior_key_frame_weight[i]
13781b362b15af34006e6a11974088a46d42b903418eJohann                                      * cpi->prior_key_frame_distance[i];
13791b362b15af34006e6a11974088a46d42b903418eJohann            total_weight += prior_key_frame_weight[i];
138090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
138190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_frequency  /= total_weight;
138390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13851b362b15af34006e6a11974088a46d42b903418eJohann    return av_key_frame_frequency;
13861b362b15af34006e6a11974088a46d42b903418eJohann}
13871b362b15af34006e6a11974088a46d42b903418eJohann
138890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13891b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_adjust_key_frame_context(VP8_COMP *cpi)
13901b362b15af34006e6a11974088a46d42b903418eJohann{
13911b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
13921b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
13931b362b15af34006e6a11974088a46d42b903418eJohann
13941b362b15af34006e6a11974088a46d42b903418eJohann    /* Do we have any key frame overspend to recover? */
13951b362b15af34006e6a11974088a46d42b903418eJohann    /* Two-pass overspend handled elsewhere. */
13961b362b15af34006e6a11974088a46d42b903418eJohann    if ((cpi->pass != 2)
13971b362b15af34006e6a11974088a46d42b903418eJohann         && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
139890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13991b362b15af34006e6a11974088a46d42b903418eJohann        int overspend;
14001b362b15af34006e6a11974088a46d42b903418eJohann
14011b362b15af34006e6a11974088a46d42b903418eJohann        /* Update the count of key frame overspend to be recovered in
14021b362b15af34006e6a11974088a46d42b903418eJohann         * subsequent frames. A portion of the KF overspend is treated as gf
14031b362b15af34006e6a11974088a46d42b903418eJohann         * overspend (and hence recovered more quickly) as the kf is also a
14041b362b15af34006e6a11974088a46d42b903418eJohann         * gf. Otherwise the few frames following each kf tend to get more
14051b362b15af34006e6a11974088a46d42b903418eJohann         * bits allocated than those following other gfs.
14061b362b15af34006e6a11974088a46d42b903418eJohann         */
14071b362b15af34006e6a11974088a46d42b903418eJohann        overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
14081b362b15af34006e6a11974088a46d42b903418eJohann
14091b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.number_of_layers > 1)
14101b362b15af34006e6a11974088a46d42b903418eJohann            cpi->kf_overspend_bits += overspend;
14111b362b15af34006e6a11974088a46d42b903418eJohann        else
141290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
14131b362b15af34006e6a11974088a46d42b903418eJohann            cpi->kf_overspend_bits += overspend * 7 / 8;
14141b362b15af34006e6a11974088a46d42b903418eJohann            cpi->gf_overspend_bits += overspend * 1 / 8;
141590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
14161b362b15af34006e6a11974088a46d42b903418eJohann
14171b362b15af34006e6a11974088a46d42b903418eJohann        /* Work out how much to try and recover per frame. */
14181b362b15af34006e6a11974088a46d42b903418eJohann        cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits
14191b362b15af34006e6a11974088a46d42b903418eJohann                                     / estimate_keyframe_frequency(cpi);
142090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
142190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
142290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key = 0;
142390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->key_frame_count++;
142490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
142590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14261b362b15af34006e6a11974088a46d42b903418eJohann
142790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
142890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14291b362b15af34006e6a11974088a46d42b903418eJohann    /* Set-up bounds on acceptable frame size: */
143090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
143190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
14321b362b15af34006e6a11974088a46d42b903418eJohann        /* Fixed Q scenario: frame size never outranges target
14331b362b15af34006e6a11974088a46d42b903418eJohann         * (there is no target!)
14341b362b15af34006e6a11974088a46d42b903418eJohann         */
143590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_under_shoot_limit = 0;
143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_over_shoot_limit  = INT_MAX;
143790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
143890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
143990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
144090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
144190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
144290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
144390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
144490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
144590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
144690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
14471b362b15af34006e6a11974088a46d42b903418eJohann            if (cpi->oxcf.number_of_layers > 1 ||
14481b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_alt_ref_frame ||
14491b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame)
145090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
145190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
145290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
145390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
145490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
145590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
14561b362b15af34006e6a11974088a46d42b903418eJohann                /* For CBR take buffer fullness into account */
145790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
145890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
145990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
146090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
14611b362b15af34006e6a11974088a46d42b903418eJohann                        /* Buffer is too full so relax overshoot and tighten
14621b362b15af34006e6a11974088a46d42b903418eJohann                         * undershoot
14631b362b15af34006e6a11974088a46d42b903418eJohann                         */
146490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 12 / 8;
146590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
146690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
146790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
146890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
14691b362b15af34006e6a11974088a46d42b903418eJohann                        /* Buffer is too low so relax undershoot and tighten
14701b362b15af34006e6a11974088a46d42b903418eJohann                         * overshoot
14711b362b15af34006e6a11974088a46d42b903418eJohann                         */
147290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 10 / 8;
147390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
147490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
147590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
147690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
147790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
147890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
147990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
148090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
14811b362b15af34006e6a11974088a46d42b903418eJohann                /* VBR and CQ mode */
14821b362b15af34006e6a11974088a46d42b903418eJohann                /* Note that tighter restrictions here can help quality
14831b362b15af34006e6a11974088a46d42b903418eJohann                 * but hurt encode speed
14841b362b15af34006e6a11974088a46d42b903418eJohann                 */
148590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
148690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
14871b362b15af34006e6a11974088a46d42b903418eJohann                    /* Stron overshoot limit for constrained quality */
148879f15823c34ae1e423108295e416213200bb280fAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
148979f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
149079f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
149179f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
149279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
149379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    else
149479f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
149579f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
149679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
149779f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
149890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
149990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
150090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
15011b362b15af34006e6a11974088a46d42b903418eJohann
15021b362b15af34006e6a11974088a46d42b903418eJohann        /* For very small rate targets where the fractional adjustment
15031b362b15af34006e6a11974088a46d42b903418eJohann         * (eg * 7/8) may be tiny make sure there is at least a minimum
15041b362b15af34006e6a11974088a46d42b903418eJohann         * range.
15051b362b15af34006e6a11974088a46d42b903418eJohann         */
15061b362b15af34006e6a11974088a46d42b903418eJohann        *frame_over_shoot_limit += 200;
15071b362b15af34006e6a11974088a46d42b903418eJohann        *frame_under_shoot_limit -= 200;
15081b362b15af34006e6a11974088a46d42b903418eJohann        if ( *frame_under_shoot_limit < 0 )
15091b362b15af34006e6a11974088a46d42b903418eJohann            *frame_under_shoot_limit = 0;
15101b362b15af34006e6a11974088a46d42b903418eJohann
15111b362b15af34006e6a11974088a46d42b903418eJohann    }
15121b362b15af34006e6a11974088a46d42b903418eJohann}
15131b362b15af34006e6a11974088a46d42b903418eJohann
15141b362b15af34006e6a11974088a46d42b903418eJohann
15151b362b15af34006e6a11974088a46d42b903418eJohann/* return of 0 means drop frame */
15161b362b15af34006e6a11974088a46d42b903418eJohannint vp8_pick_frame_size(VP8_COMP *cpi)
15171b362b15af34006e6a11974088a46d42b903418eJohann{
15181b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMMON *cm = &cpi->common;
15191b362b15af34006e6a11974088a46d42b903418eJohann
15201b362b15af34006e6a11974088a46d42b903418eJohann    if (cm->frame_type == KEY_FRAME)
15211b362b15af34006e6a11974088a46d42b903418eJohann        calc_iframe_target_size(cpi);
15221b362b15af34006e6a11974088a46d42b903418eJohann    else
15231b362b15af34006e6a11974088a46d42b903418eJohann    {
15241b362b15af34006e6a11974088a46d42b903418eJohann        calc_pframe_target_size(cpi);
15251b362b15af34006e6a11974088a46d42b903418eJohann
15261b362b15af34006e6a11974088a46d42b903418eJohann        /* Check if we're dropping the frame: */
15271b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->drop_frame)
15281b362b15af34006e6a11974088a46d42b903418eJohann        {
15291b362b15af34006e6a11974088a46d42b903418eJohann            cpi->drop_frame = 0;
15301b362b15af34006e6a11974088a46d42b903418eJohann            return 0;
15311b362b15af34006e6a11974088a46d42b903418eJohann        }
153290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15331b362b15af34006e6a11974088a46d42b903418eJohann    return 1;
153490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1535