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
17779f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_adjust_table[101] =
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    100,
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19279f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_intra_usage_adjustment[20] =
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    125, 120, 115, 110, 105, 100,  95,  85,  80,  75,
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    70,  65,  60,  55,  50,  50,  50,  50,  50,  50,
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19879f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_interval_table[101] =
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7,
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_save_coding_context(VP8_COMP *cpi)
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2201b362b15af34006e6a11974088a46d42b903418eJohann    /* Stores a snapshot of key state variables which can subsequently be
2211b362b15af34006e6a11974088a46d42b903418eJohann     * restored with a call to vp8_restore_coding_context. These functions are
2221b362b15af34006e6a11974088a46d42b903418eJohann     * intended for use in a re-code loop in vp8_compress_frame where the
2231b362b15af34006e6a11974088a46d42b903418eJohann     * quantizer value is adjusted between loop iterations.
2241b362b15af34006e6a11974088a46d42b903418eJohann     */
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_since_key          = cpi->frames_since_key;
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->filter_level             = cpi->common.filter_level;
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_till_gf_update_due   = cpi->frames_till_gf_update_due;
22991037db265ecdd914a26e056cf69207b4f50924ehkuang    cc->frames_since_golden       = cpi->frames_since_golden;
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->mvc,      cpi->common.fc.mvc);
2321b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->mvcosts,  cpi->rd_costs.mvcosts);
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2371b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
2381b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2411b362b15af34006e6a11974088a46d42b903418eJohann    /* Stats */
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->y_modes,       y_modes);
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_modes,      uv_modes);
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->b_modes,       b_modes);
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_y_modes,  inter_y_modes);
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_uv_modes, inter_uv_modes);
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_b_modes,  inter_b_modes);
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_restore_coding_context(VP8_COMP *cpi)
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2591b362b15af34006e6a11974088a46d42b903418eJohann    /* Restore key state variables to the snapshot state stored in the
2601b362b15af34006e6a11974088a46d42b903418eJohann     * previous call to vp8_save_coding_context.
2611b362b15af34006e6a11974088a46d42b903418eJohann     */
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key         =   cc->frames_since_key;
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level     =   cc->filter_level;
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_till_gf_update_due  =   cc->frames_till_gf_update_due;
26691037db265ecdd914a26e056cf69207b4f50924ehkuang    cpi->frames_since_golden       =   cc->frames_since_golden;
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.mvc, cc->mvc);
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2701b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.ymode_prob,   cc->ymode_prob);
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.uv_mode_prob,  cc->uv_mode_prob);
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2751b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
2761b362b15af34006e6a11974088a46d42b903418eJohann    vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2781b362b15af34006e6a11974088a46d42b903418eJohann    /* Stats */
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(y_modes, cc->y_modes);
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(uv_modes, cc->uv_modes);
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(b_modes, cc->b_modes);
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_y_modes, cc->inter_y_modes);
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_uv_modes, cc->inter_uv_modes);
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_b_modes, cc->inter_b_modes);
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_setup_key_frame(VP8_COMP *cpi)
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2951b362b15af34006e6a11974088a46d42b903418eJohann    /* Setup for Key frame: */
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_default_coef_probs(& cpi->common);
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int flag[2] = {1, 1};
3021b362b15af34006e6a11974088a46d42b903418eJohann        vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3051b362b15af34006e6a11974088a46d42b903418eJohann    /* Make sure we initialize separate contexts for altref,gold, and normal.
3061b362b15af34006e6a11974088a46d42b903418eJohann     * TODO shouldn't need 3 different copies of structure to do this!
3071b362b15af34006e6a11974088a46d42b903418eJohann     */
3081b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
3091b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
3101b362b15af34006e6a11974088a46d42b903418eJohann    vpx_memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3141b362b15af34006e6a11974088a46d42b903418eJohann    /* Provisional interval before next GF */
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->auto_gold)
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
3181b362b15af34006e6a11974088a46d42b903418eJohann        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
3191b362b15af34006e6a11974088a46d42b903418eJohann
3201b362b15af34006e6a11974088a46d42b903418eJohann    cpi->common.refresh_golden_frame = 1;
3211b362b15af34006e6a11974088a46d42b903418eJohann    cpi->common.refresh_alt_ref_frame = 1;
3221b362b15af34006e6a11974088a46d42b903418eJohann}
3231b362b15af34006e6a11974088a46d42b903418eJohann
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3251b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_bits_at_q(int frame_kind, int Q, int MBs,
3261b362b15af34006e6a11974088a46d42b903418eJohann                              double correction_factor)
3271b362b15af34006e6a11974088a46d42b903418eJohann{
3281b362b15af34006e6a11974088a46d42b903418eJohann    int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
3291b362b15af34006e6a11974088a46d42b903418eJohann
3301b362b15af34006e6a11974088a46d42b903418eJohann    /* Attempt to retain reasonable accuracy without overflow. The cutoff is
3311b362b15af34006e6a11974088a46d42b903418eJohann     * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
3321b362b15af34006e6a11974088a46d42b903418eJohann     * largest Bpm takes 20 bits.
3331b362b15af34006e6a11974088a46d42b903418eJohann     */
3341b362b15af34006e6a11974088a46d42b903418eJohann    if (MBs > (1 << 11))
3351b362b15af34006e6a11974088a46d42b903418eJohann        return (Bpm >> BPER_MB_NORMBITS) * MBs;
3361b362b15af34006e6a11974088a46d42b903418eJohann    else
3371b362b15af34006e6a11974088a46d42b903418eJohann        return (Bpm * MBs) >> BPER_MB_NORMBITS;
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3401b362b15af34006e6a11974088a46d42b903418eJohann
3411b362b15af34006e6a11974088a46d42b903418eJohannstatic void calc_iframe_target_size(VP8_COMP *cpi)
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3431b362b15af34006e6a11974088a46d42b903418eJohann    /* boost defaults to half second */
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int kf_boost;
3451b362b15af34006e6a11974088a46d42b903418eJohann    uint64_t target;
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3471b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
3481b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3521b362b15af34006e6a11974088a46d42b903418eJohann        int Q = cpi->oxcf.key_q;
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3541b362b15af34006e6a11974088a46d42b903418eJohann        target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
3551b362b15af34006e6a11974088a46d42b903418eJohann                                    cpi->key_frame_rate_correction_factor);
3561b362b15af34006e6a11974088a46d42b903418eJohann    }
3571b362b15af34006e6a11974088a46d42b903418eJohann    else if (cpi->pass == 2)
3581b362b15af34006e6a11974088a46d42b903418eJohann    {
3591b362b15af34006e6a11974088a46d42b903418eJohann        /* New Two pass RC */
3601b362b15af34006e6a11974088a46d42b903418eJohann        target = cpi->per_frame_bandwidth;
3611b362b15af34006e6a11974088a46d42b903418eJohann    }
3621b362b15af34006e6a11974088a46d42b903418eJohann    /* First Frame is a special case */
3631b362b15af34006e6a11974088a46d42b903418eJohann    else if (cpi->common.current_video_frame == 0)
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3651b362b15af34006e6a11974088a46d42b903418eJohann        /* 1 Pass there is no information on which to base size so use
3661b362b15af34006e6a11974088a46d42b903418eJohann         * bandwidth per second * fraction of the initial buffer
3671b362b15af34006e6a11974088a46d42b903418eJohann         * level
3681b362b15af34006e6a11974088a46d42b903418eJohann         */
3691b362b15af34006e6a11974088a46d42b903418eJohann        target = cpi->oxcf.starting_buffer_level / 2;
3701b362b15af34006e6a11974088a46d42b903418eJohann
3711b362b15af34006e6a11974088a46d42b903418eJohann        if(target > cpi->oxcf.target_bandwidth * 3 / 2)
3721b362b15af34006e6a11974088a46d42b903418eJohann            target = cpi->oxcf.target_bandwidth * 3 / 2;
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3761b362b15af34006e6a11974088a46d42b903418eJohann        /* if this keyframe was forced, use a more recent Q estimate */
3771b362b15af34006e6a11974088a46d42b903418eJohann        int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY)
3781b362b15af34006e6a11974088a46d42b903418eJohann                ? cpi->avg_frame_qindex : cpi->ni_av_qi;
3791b362b15af34006e6a11974088a46d42b903418eJohann
3801b362b15af34006e6a11974088a46d42b903418eJohann        int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
3811b362b15af34006e6a11974088a46d42b903418eJohann        /* Boost depends somewhat on frame rate: only used for 1 layer case. */
3821b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.number_of_layers == 1) {
38391037db265ecdd914a26e056cf69207b4f50924ehkuang          kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
3841b362b15af34006e6a11974088a46d42b903418eJohann        }
3851b362b15af34006e6a11974088a46d42b903418eJohann        else {
3861b362b15af34006e6a11974088a46d42b903418eJohann          /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
3871b362b15af34006e6a11974088a46d42b903418eJohann          kf_boost = initial_boost;
3881b362b15af34006e6a11974088a46d42b903418eJohann        }
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3901b362b15af34006e6a11974088a46d42b903418eJohann        /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
3911b362b15af34006e6a11974088a46d42b903418eJohann        kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3931b362b15af34006e6a11974088a46d42b903418eJohann        /* frame separation adjustment ( down) */
39491037db265ecdd914a26e056cf69207b4f50924ehkuang        if (cpi->frames_since_key  < cpi->output_framerate / 2)
3951b362b15af34006e6a11974088a46d42b903418eJohann            kf_boost = (int)(kf_boost
39691037db265ecdd914a26e056cf69207b4f50924ehkuang                       * cpi->frames_since_key / (cpi->output_framerate / 2));
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3981b362b15af34006e6a11974088a46d42b903418eJohann        /* Minimal target size is |2* per_frame_bandwidth|. */
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (kf_boost < 16)
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            kf_boost = 16;
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4021b362b15af34006e6a11974088a46d42b903418eJohann        target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4061b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->oxcf.rc_max_intra_bitrate_pct)
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4081b362b15af34006e6a11974088a46d42b903418eJohann        unsigned int max_rate = cpi->per_frame_bandwidth
4091b362b15af34006e6a11974088a46d42b903418eJohann                                * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4111b362b15af34006e6a11974088a46d42b903418eJohann        if (target > max_rate)
4121b362b15af34006e6a11974088a46d42b903418eJohann            target = max_rate;
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4151b362b15af34006e6a11974088a46d42b903418eJohann    cpi->this_frame_target = (int)target;
4161b362b15af34006e6a11974088a46d42b903418eJohann
4171b362b15af34006e6a11974088a46d42b903418eJohann    /* TODO: if we separate rate targeting from Q targetting, move this.
4181b362b15af34006e6a11974088a46d42b903418eJohann     * Reset the active worst quality to the baseline value for key frames.
4191b362b15af34006e6a11974088a46d42b903418eJohann     */
4201b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->pass != 2)
4211b362b15af34006e6a11974088a46d42b903418eJohann        cpi->active_worst_quality = cpi->worst_quality;
4221b362b15af34006e6a11974088a46d42b903418eJohann
4231b362b15af34006e6a11974088a46d42b903418eJohann#if 0
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f;
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        f = fopen("kf_boost.stt", "a");
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, " %8u %10d %10d %10d\n",
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
4331b362b15af34006e6a11974088a46d42b903418eJohann#endif
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4361b362b15af34006e6a11974088a46d42b903418eJohann
4371b362b15af34006e6a11974088a46d42b903418eJohann/* Do the best we can to define the parameters for the next GF based on what
4381b362b15af34006e6a11974088a46d42b903418eJohann * information we have available.
4391b362b15af34006e6a11974088a46d42b903418eJohann */
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void calc_gf_params(VP8_COMP *cpi)
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Boost = 0;
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4451b362b15af34006e6a11974088a46d42b903418eJohann    int gf_frame_useage = 0;      /* Golden frame useage since last GF */
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[LAST_FRAME]   +
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[ALTREF_FRAME];
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
451f71323e297a928af368937089d3ed71239786f86Andreas Huber    int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (tot_mbs)
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (pct_gf_active > gf_frame_useage)
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = pct_gf_active;
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4591b362b15af34006e6a11974088a46d42b903418eJohann    /* Not two pass */
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4621b362b15af34006e6a11974088a46d42b903418eJohann        /* Single Pass lagged mode: TBD */
4631b362b15af34006e6a11974088a46d42b903418eJohann        if (0)
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4671b362b15af34006e6a11974088a46d42b903418eJohann        /* Single Pass compression: Has to use current and historical data */
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
4711b362b15af34006e6a11974088a46d42b903418eJohann            /* Experimental code */
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int index = cpi->one_pass_frame_index;
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4751b362b15af34006e6a11974088a46d42b903418eJohann            /* ************** Experimental code - incomplete */
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double decay_val = 1.0;
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIAccumulator = 0.0;
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double last_iiaccumulator = 0.0;
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIRatio;
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for ( i = 0; i < (frames_to_scan - 1); i++ )
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( index < 0 )
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    index = MAX_LAG_BUFFERS;
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                index --;
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( IIRatio > 30.0 )
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        IIRatio = 30.0;
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = 30.0;
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                IIAccumulator += IIRatio * decay_val;
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (    (i > MIN_GF_INTERVAL) &&
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_iiaccumulator = IIAccumulator;
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = IIAccumulator*100.0/16.0;
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->baseline_gf_interval = i;
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            */
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*************************************************************/
5191b362b15af34006e6a11974088a46d42b903418eJohann            /* OLD code */
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5211b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust boost based upon ambient Q */
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = GFQ_ADJUSTMENT;
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5241b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust based upon most recently measure intra useage */
52579f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5271b362b15af34006e6a11974088a46d42b903418eJohann            /* Adjust gf boost based upon GF usage since last GF */
52879f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5321b362b15af34006e6a11974088a46d42b903418eJohann        /* golden frame boost without recode loop often goes awry.  be
5331b362b15af34006e6a11974088a46d42b903418eJohann         * safe by keeping numbers down.
5341b362b15af34006e6a11974088a46d42b903418eJohann         */
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!cpi->sf.recode_loop)
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->compressor_speed == 2)
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Boost = Boost / 2;
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5411b362b15af34006e6a11974088a46d42b903418eJohann        /* Apply an upper limit based on Q for 1 pass encodes */
54279f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
54379f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = kf_gf_boost_qlimits[Q];
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5451b362b15af34006e6a11974088a46d42b903418eJohann        /* Apply lower limits to boost. */
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (Boost < 110)
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = 110;
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5491b362b15af34006e6a11974088a46d42b903418eJohann        /* Note the boost used */
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->last_boost = Boost;
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5541b362b15af34006e6a11974088a46d42b903418eJohann    /* Estimate next interval
5551b362b15af34006e6a11974088a46d42b903418eJohann     * This is updated once the real frame size/boost is known.
5561b362b15af34006e6a11974088a46d42b903418eJohann     */
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q == -1)
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5591b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->pass == 2)         /* 2 Pass */
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
5631b362b15af34006e6a11974088a46d42b903418eJohann        else                            /* 1 Pass */
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 750)
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1000)
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1250)
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost >= 1500)
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due ++;
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57979f15823c34ae1e423108295e416213200bb280fAndreas Huber            if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
58079f15823c34ae1e423108295e416213200bb280fAndreas Huber                cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due = cpi->max_gf_interval;
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5891b362b15af34006e6a11974088a46d42b903418eJohann    /* ARF on or off */
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5921b362b15af34006e6a11974088a46d42b903418eJohann        /* For now Alt ref is not allowed except in 2 pass modes. */
5931b362b15af34006e6a11974088a46d42b903418eJohann        cpi->source_alt_ref_pending = 0;
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*if ( cpi->oxcf.fixed_q == -1)
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
5981b362b15af34006e6a11974088a46d42b903418eJohann                cpi->source_alt_ref_pending = 1;
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
6001b362b15af34006e6a11974088a46d42b903418eJohann                cpi->source_alt_ref_pending = 0;
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6061b362b15af34006e6a11974088a46d42b903418eJohannstatic void calc_pframe_target_size(VP8_COMP *cpi)
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int min_frame_target;
6091b362b15af34006e6a11974088a46d42b903418eJohann    int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
6101b362b15af34006e6a11974088a46d42b903418eJohann
6111b362b15af34006e6a11974088a46d42b903418eJohann    if ( cpi->current_layer > 0)
6121b362b15af34006e6a11974088a46d42b903418eJohann        cpi->per_frame_bandwidth =
6131b362b15af34006e6a11974088a46d42b903418eJohann            cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    min_frame_target = 0;
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 2)
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->min_frame_bandwidth;
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            min_frame_target = cpi->av_per_frame_bandwidth >> 5;
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (min_frame_target < cpi->per_frame_bandwidth / 4)
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->per_frame_bandwidth / 4;
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6281b362b15af34006e6a11974088a46d42b903418eJohann    /* Special alt reference frame case */
6291b362b15af34006e6a11974088a46d42b903418eJohann    if((cpi->common.refresh_alt_ref_frame) && (cpi->oxcf.number_of_layers == 1))
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
6331b362b15af34006e6a11974088a46d42b903418eJohann            /* Per frame bit target for the alt ref frame */
6341b362b15af34006e6a11974088a46d42b903418eJohann            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* One Pass ??? TBD */
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6411b362b15af34006e6a11974088a46d42b903418eJohann    /* Normal frames (gf,and inter) */
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
6441b362b15af34006e6a11974088a46d42b903418eJohann        /* 2 pass */
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
6491b362b15af34006e6a11974088a46d42b903418eJohann        /* 1 pass */
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
652ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            int Adjustment;
6531b362b15af34006e6a11974088a46d42b903418eJohann            /* Make rate adjustment to recover bits spent in key frame
6541b362b15af34006e6a11974088a46d42b903418eJohann             * Test to see if the key frame inter data rate correction
6551b362b15af34006e6a11974088a46d42b903418eJohann             * should still be in force
6561b362b15af34006e6a11974088a46d42b903418eJohann             */
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->kf_overspend_bits > 0)
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->kf_overspend_bits -= Adjustment;
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6661b362b15af34006e6a11974088a46d42b903418eJohann                /* Calculate an inter frame bandwidth target for the next
6671b362b15af34006e6a11974088a46d42b903418eJohann                 * few frames designed to recover any extra bits spent on
6681b362b15af34006e6a11974088a46d42b903418eJohann                 * the key frame.
6691b362b15af34006e6a11974088a46d42b903418eJohann                 */
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->this_frame_target < min_frame_target)
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = min_frame_target;
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth;
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6781b362b15af34006e6a11974088a46d42b903418eJohann            /* If appropriate make an adjustment to recover bits spent on a
6791b362b15af34006e6a11974088a46d42b903418eJohann             * recent GF
6801b362b15af34006e6a11974088a46d42b903418eJohann             */
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
683ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->gf_overspend_bits -= Adjustment;
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target -= Adjustment;
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6921b362b15af34006e6a11974088a46d42b903418eJohann            /* Apply small + and - boosts for non gf frames */
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
6961b362b15af34006e6a11974088a46d42b903418eJohann                /* % Adjustment limited to the range 1% to 10% */
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->last_boost - 100) >> 5;
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment < 1)
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 1;
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (Adjustment > 10)
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 10;
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7041b362b15af34006e6a11974088a46d42b903418eJohann                /* Convert to bits */
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->this_frame_target * Adjustment) / 100;
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71091037db265ecdd914a26e056cf69207b4f50924ehkuang                if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1))
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target += ((cpi->current_gf_interval - 1) * Adjustment);
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target -= Adjustment;
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7181b362b15af34006e6a11974088a46d42b903418eJohann    /* Sanity check that the total sum of adjustments is not above the
7191b362b15af34006e6a11974088a46d42b903418eJohann     * maximum allowed That is that having allowed for KF and GF penalties
7201b362b15af34006e6a11974088a46d42b903418eJohann     * we have not pushed the current interframe target to low. If the
7211b362b15af34006e6a11974088a46d42b903418eJohann     * adjustment we apply here is not capable of recovering all the extra
7221b362b15af34006e6a11974088a46d42b903418eJohann     * bits we have spent in the KF or GF then the remainder will have to
7231b362b15af34006e6a11974088a46d42b903418eJohann     * be recovered over a longer time span via other buffer / rate control
7241b362b15af34006e6a11974088a46d42b903418eJohann     * mechanisms.
7251b362b15af34006e6a11974088a46d42b903418eJohann     */
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->this_frame_target < min_frame_target)
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = min_frame_target;
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!cpi->common.refresh_alt_ref_frame)
7301b362b15af34006e6a11974088a46d42b903418eJohann        /* Note the baseline target data rate for this inter frame. */
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->inter_frame_target = cpi->this_frame_target;
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7331b362b15af34006e6a11974088a46d42b903418eJohann    /* One Pass specific code */
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 0)
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
7361b362b15af34006e6a11974088a46d42b903418eJohann        /* Adapt target frame size with respect to any buffering constraints: */
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->buffered_mode)
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
7391b362b15af34006e6a11974088a46d42b903418eJohann            int one_percent_bits = (int)
7401b362b15af34006e6a11974088a46d42b903418eJohann                (1 + cpi->oxcf.optimal_buffer_level / 100);
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74279f15823c34ae1e423108295e416213200bb280fAndreas Huber            if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
74379f15823c34ae1e423108295e416213200bb280fAndreas Huber                (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int percent_low = 0;
74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7471b362b15af34006e6a11974088a46d42b903418eJohann                /* Decide whether or not we need to adjust the frame data
7481b362b15af34006e6a11974088a46d42b903418eJohann                 * rate target.
7491b362b15af34006e6a11974088a46d42b903418eJohann                 *
7501b362b15af34006e6a11974088a46d42b903418eJohann                 * If we are are below the optimal buffer fullness level
7511b362b15af34006e6a11974088a46d42b903418eJohann                 * and adherence to buffering constraints is important to
7521b362b15af34006e6a11974088a46d42b903418eJohann                 * the end usage then adjust the per frame target.
7531b362b15af34006e6a11974088a46d42b903418eJohann                 */
75479f15823c34ae1e423108295e416213200bb280fAndreas Huber                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
75579f15823c34ae1e423108295e416213200bb280fAndreas Huber                    (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
7571b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = (int)
7581b362b15af34006e6a11974088a46d42b903418eJohann                        ((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
7591b362b15af34006e6a11974088a46d42b903418eJohann                        one_percent_bits);
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
7611b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we overshooting the long term clip data rate... */
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (cpi->bits_off_target < 0)
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
7641b362b15af34006e6a11974088a46d42b903418eJohann                    /* Adjust per frame data target downwards to compensate. */
76579f15823c34ae1e423108295e416213200bb280fAndreas Huber                    percent_low = (int)(100 * -cpi->bits_off_target /
76679f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->total_byte_count * 8));
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7691b362b15af34006e6a11974088a46d42b903418eJohann                if (percent_low > cpi->oxcf.under_shoot_pct)
7701b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = cpi->oxcf.under_shoot_pct;
7711b362b15af34006e6a11974088a46d42b903418eJohann                else if (percent_low < 0)
7721b362b15af34006e6a11974088a46d42b903418eJohann                    percent_low = 0;
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7741b362b15af34006e6a11974088a46d42b903418eJohann                /* lower the target bandwidth for this frame. */
7751b362b15af34006e6a11974088a46d42b903418eJohann                cpi->this_frame_target -=
7761b362b15af34006e6a11974088a46d42b903418eJohann                        (cpi->this_frame_target * percent_low) / 200;
77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7781b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we using allowing control of active_worst_allowed_q
7791b362b15af34006e6a11974088a46d42b903418eJohann                 * according to buffer level.
7801b362b15af34006e6a11974088a46d42b903418eJohann                 */
7811b362b15af34006e6a11974088a46d42b903418eJohann                if (cpi->auto_worst_q && cpi->ni_frames > 150)
7821b362b15af34006e6a11974088a46d42b903418eJohann                {
7831b362b15af34006e6a11974088a46d42b903418eJohann                    int64_t critical_buffer_level;
7841b362b15af34006e6a11974088a46d42b903418eJohann
7851b362b15af34006e6a11974088a46d42b903418eJohann                    /* For streaming applications the most important factor is
7861b362b15af34006e6a11974088a46d42b903418eJohann                     * cpi->buffer_level as this takes into account the
7871b362b15af34006e6a11974088a46d42b903418eJohann                     * specified short term buffering constraints. However,
7881b362b15af34006e6a11974088a46d42b903418eJohann                     * hitting the long term clip data rate target is also
7891b362b15af34006e6a11974088a46d42b903418eJohann                     * important.
7901b362b15af34006e6a11974088a46d42b903418eJohann                     */
79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
7931b362b15af34006e6a11974088a46d42b903418eJohann                        /* Take the smaller of cpi->buffer_level and
7941b362b15af34006e6a11974088a46d42b903418eJohann                         * cpi->bits_off_target
7951b362b15af34006e6a11974088a46d42b903418eJohann                         */
79679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        critical_buffer_level =
79779f15823c34ae1e423108295e416213200bb280fAndreas Huber                            (cpi->buffer_level < cpi->bits_off_target)
79879f15823c34ae1e423108295e416213200bb280fAndreas Huber                            ? cpi->buffer_level : cpi->bits_off_target;
79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
8001b362b15af34006e6a11974088a46d42b903418eJohann                    /* For local file playback short term buffering constraints
8011b362b15af34006e6a11974088a46d42b903418eJohann                     * are less of an issue
8021b362b15af34006e6a11974088a46d42b903418eJohann                     */
80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
8051b362b15af34006e6a11974088a46d42b903418eJohann                        /* Consider only how we are doing for the clip as a
8061b362b15af34006e6a11974088a46d42b903418eJohann                         * whole
8071b362b15af34006e6a11974088a46d42b903418eJohann                         */
80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        critical_buffer_level = cpi->bits_off_target;
80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8111b362b15af34006e6a11974088a46d42b903418eJohann                    /* Set the active worst quality based upon the selected
8121b362b15af34006e6a11974088a46d42b903418eJohann                     * buffer fullness number.
8131b362b15af34006e6a11974088a46d42b903418eJohann                     */
81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
81679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        if ( critical_buffer_level >
81779f15823c34ae1e423108295e416213200bb280fAndreas Huber                             (cpi->oxcf.optimal_buffer_level >> 2) )
81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
8191b362b15af34006e6a11974088a46d42b903418eJohann                            int64_t qadjustment_range =
82079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      cpi->worst_quality - cpi->ni_av_qi;
8211b362b15af34006e6a11974088a46d42b903418eJohann                            int64_t above_base =
82279f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      (critical_buffer_level -
82379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->oxcf.optimal_buffer_level >> 2));
82479f15823c34ae1e423108295e416213200bb280fAndreas Huber
8251b362b15af34006e6a11974088a46d42b903418eJohann                            /* Step active worst quality down from
8261b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->ni_av_qi when (critical_buffer_level ==
8271b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->optimal_buffer_level) to
8281b362b15af34006e6a11974088a46d42b903418eJohann                             * cpi->worst_quality when
8291b362b15af34006e6a11974088a46d42b903418eJohann                             * (critical_buffer_level ==
8301b362b15af34006e6a11974088a46d42b903418eJohann                             *     cpi->optimal_buffer_level >> 2)
8311b362b15af34006e6a11974088a46d42b903418eJohann                             */
83279f15823c34ae1e423108295e416213200bb280fAndreas Huber                            cpi->active_worst_quality =
83379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                cpi->worst_quality -
8341b362b15af34006e6a11974088a46d42b903418eJohann                                (int)((qadjustment_range * above_base) /
83579f15823c34ae1e423108295e416213200bb280fAndreas Huber                                 (cpi->oxcf.optimal_buffer_level*3>>2));
83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
83790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
83890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
83990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->active_worst_quality = cpi->worst_quality;
84090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
84190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
84290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
84390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->active_worst_quality = cpi->ni_av_qi;
84590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
84690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
8541b362b15af34006e6a11974088a46d42b903418eJohann                int percent_high = 0;
85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8561b362b15af34006e6a11974088a46d42b903418eJohann                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
8571b362b15af34006e6a11974088a46d42b903418eJohann                     && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
8591b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = (int)((cpi->buffer_level
8601b362b15af34006e6a11974088a46d42b903418eJohann                                    - cpi->oxcf.optimal_buffer_level)
8611b362b15af34006e6a11974088a46d42b903418eJohann                                   / one_percent_bits);
8621b362b15af34006e6a11974088a46d42b903418eJohann                }
8631b362b15af34006e6a11974088a46d42b903418eJohann                else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
8641b362b15af34006e6a11974088a46d42b903418eJohann                {
8651b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = (int)((100 * cpi->bits_off_target)
8661b362b15af34006e6a11974088a46d42b903418eJohann                                         / (cpi->total_byte_count * 8));
8671b362b15af34006e6a11974088a46d42b903418eJohann                }
86890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8691b362b15af34006e6a11974088a46d42b903418eJohann                if (percent_high > cpi->oxcf.over_shoot_pct)
8701b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = cpi->oxcf.over_shoot_pct;
8711b362b15af34006e6a11974088a46d42b903418eJohann                else if (percent_high < 0)
8721b362b15af34006e6a11974088a46d42b903418eJohann                    percent_high = 0;
87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8741b362b15af34006e6a11974088a46d42b903418eJohann                cpi->this_frame_target += (cpi->this_frame_target *
8751b362b15af34006e6a11974088a46d42b903418eJohann                                          percent_high) / 200;
87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8771b362b15af34006e6a11974088a46d42b903418eJohann                /* Are we allowing control of active_worst_allowed_q according
8781b362b15af34006e6a11974088a46d42b903418eJohann                 * to buffer level.
8791b362b15af34006e6a11974088a46d42b903418eJohann                 */
8801b362b15af34006e6a11974088a46d42b903418eJohann                if (cpi->auto_worst_q && cpi->ni_frames > 150)
88190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
8821b362b15af34006e6a11974088a46d42b903418eJohann                    /* When using the relaxed buffer model stick to the
8831b362b15af34006e6a11974088a46d42b903418eJohann                     * user specified value
8841b362b15af34006e6a11974088a46d42b903418eJohann                     */
88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->ni_av_qi;
88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8931b362b15af34006e6a11974088a46d42b903418eJohann            /* Set active_best_quality to prevent quality rising too high */
89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_best_quality = cpi->best_quality;
89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8961b362b15af34006e6a11974088a46d42b903418eJohann            /* Worst quality obviously must not be better than best quality */
89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->active_worst_quality <= cpi->active_best_quality)
89890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->active_worst_quality = cpi->active_best_quality + 1;
89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9001b362b15af34006e6a11974088a46d42b903418eJohann            if(cpi->active_worst_quality > 127)
9011b362b15af34006e6a11974088a46d42b903418eJohann                cpi->active_worst_quality = 127;
90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
9031b362b15af34006e6a11974088a46d42b903418eJohann        /* Unbuffered mode (eg. video conferencing) */
90490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
9061b362b15af34006e6a11974088a46d42b903418eJohann            /* Set the active worst quality */
90790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_worst_quality = cpi->worst_quality;
90890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
90979f15823c34ae1e423108295e416213200bb280fAndreas Huber
9101b362b15af34006e6a11974088a46d42b903418eJohann        /* Special trap for constrained quality mode
9111b362b15af34006e6a11974088a46d42b903418eJohann         * "active_worst_quality" may never drop below cq level
9121b362b15af34006e6a11974088a46d42b903418eJohann         * for any frame type.
9131b362b15af34006e6a11974088a46d42b903418eJohann         */
91479f15823c34ae1e423108295e416213200bb280fAndreas Huber        if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
91579f15823c34ae1e423108295e416213200bb280fAndreas Huber             cpi->active_worst_quality < cpi->cq_target_quality)
91679f15823c34ae1e423108295e416213200bb280fAndreas Huber        {
91779f15823c34ae1e423108295e416213200bb280fAndreas Huber            cpi->active_worst_quality = cpi->cq_target_quality;
91879f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
92090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9211b362b15af34006e6a11974088a46d42b903418eJohann    /* Test to see if we have to drop a frame
9221b362b15af34006e6a11974088a46d42b903418eJohann     * The auto-drop frame code is only used in buffered mode.
9231b362b15af34006e6a11974088a46d42b903418eJohann     * In unbufferd mode (eg vide conferencing) the descision to
9241b362b15af34006e6a11974088a46d42b903418eJohann     * code or drop a frame is made outside the codec in response to real
9251b362b15af34006e6a11974088a46d42b903418eJohann     * world comms or buffer considerations.
9261b362b15af34006e6a11974088a46d42b903418eJohann     */
9271b362b15af34006e6a11974088a46d42b903418eJohann    if (cpi->drop_frames_allowed &&
92890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
9291b362b15af34006e6a11974088a46d42b903418eJohann        ((cpi->common.frame_type != KEY_FRAME)))
93090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
9311b362b15af34006e6a11974088a46d42b903418eJohann        /* Check for a buffer underun-crisis in which case we have to drop
9321b362b15af34006e6a11974088a46d42b903418eJohann         * a frame
9331b362b15af34006e6a11974088a46d42b903418eJohann         */
93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((cpi->buffer_level < 0))
93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
93790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f = fopen("dec.stt", "a");
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (int) cpi->common.current_video_frame,
94090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->decimation_factor, cpi->common.horiz_scale,
94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
9441b362b15af34006e6a11974088a46d42b903418eJohann            cpi->drop_frame = 1;
94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9461b362b15af34006e6a11974088a46d42b903418eJohann            /* Update the buffer level variable. */
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
9481b362b15af34006e6a11974088a46d42b903418eJohann            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
9491b362b15af34006e6a11974088a46d42b903418eJohann              cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->buffer_level = cpi->bits_off_target;
9515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            if (cpi->oxcf.number_of_layers > 1) {
9535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              unsigned int i;
9545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              // Propagate bits saved by dropping the frame to higher layers.
9565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers;
9575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  i++) {
9585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                LAYER_CONTEXT *lc = &cpi->layer_context[i];
9595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                lc->bits_off_target += (int)(lc->target_bandwidth /
9605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             lc->framerate);
9615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                if (lc->bits_off_target > lc->maximum_buffer_size)
9625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  lc->bits_off_target = lc->maximum_buffer_size;
9635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                lc->buffer_level = lc->bits_off_target;
9645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              }
9655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            }
96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9691b362b15af34006e6a11974088a46d42b903418eJohann    /* Adjust target frame size for Golden Frames: */
97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.error_resilient_mode == 0 &&
97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
97490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9751b362b15af34006e6a11974088a46d42b903418eJohann        int gf_frame_useage = 0;      /* Golden frame useage since last GF */
97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[LAST_FRAME]   +
97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[ALTREF_FRAME];
98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
981f71323e297a928af368937089d3ed71239786f86Andreas Huber        int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
98290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (tot_mbs)
98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
98590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (pct_gf_active > gf_frame_useage)
98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = pct_gf_active;
98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9891b362b15af34006e6a11974088a46d42b903418eJohann        /* Is a fixed manual GF frequency being used */
99079f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (cpi->auto_gold)
99190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
9921b362b15af34006e6a11974088a46d42b903418eJohann            /* For one pass throw a GF if recent frame intra useage is
9931b362b15af34006e6a11974088a46d42b903418eJohann             * low or the GF useage is high
9941b362b15af34006e6a11974088a46d42b903418eJohann             */
99590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
9961b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame = 1;
99790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9981b362b15af34006e6a11974088a46d42b903418eJohann            /* Two pass GF descision */
99990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (cpi->pass == 2)
10001b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame = 1;
100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
100290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10051b362b15af34006e6a11974088a46d42b903418eJohann        /* Debug stats */
100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (0)
100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f;
100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            f = fopen("gf_useaget.stt", "a");
101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->common.current_video_frame,  cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10181b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->common.refresh_golden_frame == 1)
101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10221b362b15af34006e6a11974088a46d42b903418eJohann            if (0)
102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FILE *f;
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                f = fopen("GFexit.stt", "a");
102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fclose(f);
102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->auto_adjust_gold_quantizer)
103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                calc_gf_params(cpi);
103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10381b362b15af34006e6a11974088a46d42b903418eJohann            /* If we are using alternate ref instead of gf then do not apply the
10391b362b15af34006e6a11974088a46d42b903418eJohann             * boost It will instead be applied to the altref update Jims
10401b362b15af34006e6a11974088a46d42b903418eJohann             * modified boost
10411b362b15af34006e6a11974088a46d42b903418eJohann             */
104290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!cpi->source_alt_ref_active)
104390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
104490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.fixed_q < 0)
104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->pass == 2)
104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
10481b362b15af34006e6a11974088a46d42b903418eJohann                        /* The spend on the GF is defined in the two pass
10491b362b15af34006e6a11974088a46d42b903418eJohann                         * code for two pass encodes
10501b362b15af34006e6a11974088a46d42b903418eJohann                         */
10511b362b15af34006e6a11974088a46d42b903418eJohann                        cpi->this_frame_target = cpi->per_frame_bandwidth;
105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
105390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
105490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
105590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int Boost = cpi->last_boost;
105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int frames_in_section = cpi->frames_till_gf_update_due + 1;
105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int bits_in_section = cpi->inter_frame_target * frames_in_section;
105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10601b362b15af34006e6a11974088a46d42b903418eJohann                        /* Normalize Altboost and allocations chunck down to
10611b362b15af34006e6a11974088a46d42b903418eJohann                         * prevent overflow
10621b362b15af34006e6a11974088a46d42b903418eJohann                         */
106390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        while (Boost > 1000)
106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            Boost /= 2;
106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            allocation_chunks /= 2;
106790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
106890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10691b362b15af34006e6a11974088a46d42b903418eJohann                        /* Avoid loss of precision but avoid overflow */
107090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        if ((bits_in_section >> 7) > allocation_chunks)
107190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
107290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
107490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
107590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
107690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
10771b362b15af34006e6a11974088a46d42b903418eJohann                    cpi->this_frame_target =
10781b362b15af34006e6a11974088a46d42b903418eJohann                        (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0)
10791b362b15af34006e6a11974088a46d42b903418eJohann                         * cpi->last_boost) / 100;
108090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
10821b362b15af34006e6a11974088a46d42b903418eJohann            /* If there is an active ARF at this location use the minimum
10831b362b15af34006e6a11974088a46d42b903418eJohann             * bits on this frame even if it is a contructed arf.
10841b362b15af34006e6a11974088a46d42b903418eJohann             * The active maximum quantizer insures that an appropriate
10851b362b15af34006e6a11974088a46d42b903418eJohann             * number of bits will be spent if needed for contstructed ARFs.
10861b362b15af34006e6a11974088a46d42b903418eJohann             */
108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
1089f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->this_frame_target = 0;
109090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
109390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
109590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
10961b362b15af34006e6a11974088a46d42b903418eJohann
10971b362b15af34006e6a11974088a46d42b903418eJohann    cpi->per_frame_bandwidth = old_per_frame_bandwidth;
109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
110390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    Q = cpi->common.base_qindex;
110490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    correction_factor = 100;
110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double rate_correction_factor;
110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double adjustment_limit;
110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    projected_size_based_on_q = 0;
110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11101b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
11111b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
111290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
111490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = cpi->key_frame_rate_correction_factor;
111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
111790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
111890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
1119ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        if (cpi->oxcf.number_of_layers == 1 &&
1120ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           (cpi->common.refresh_alt_ref_frame ||
1121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            cpi->common.refresh_golden_frame))
112290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->gf_rate_correction_factor;
112390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
112490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->rate_correction_factor;
112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
112690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11271b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out how big we would have expected the frame to be at this Q
11281b362b15af34006e6a11974088a46d42b903418eJohann     * given the current correction factor. Stay in double to avoid int
11291b362b15af34006e6a11974088a46d42b903418eJohann     * overflow when values are large
11301b362b15af34006e6a11974088a46d42b903418eJohann     */
113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas 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));
113290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11331b362b15af34006e6a11974088a46d42b903418eJohann    /* Make some allowance for cpi->zbin_over_quant */
1134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (cpi->mb.zbin_over_quant > 0)
113590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
1136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        int Z = cpi->mb.zbin_over_quant;
113790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double Factor = 0.99;
11381b362b15af34006e6a11974088a46d42b903418eJohann        double factor_adjustment = 0.01 / 256.0;
113990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
114090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (Z > 0)
114190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
114290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Z --;
1143f71323e297a928af368937089d3ed71239786f86Andreas Huber            projected_size_based_on_q =
1144f71323e297a928af368937089d3ed71239786f86Andreas Huber                (int)(Factor * projected_size_based_on_q);
114590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Factor += factor_adjustment;
114690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
114790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Factor  >= 0.999)
114890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = 0.999;
114990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
115090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
115190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11521b362b15af34006e6a11974088a46d42b903418eJohann    /* Work out a size correction factor. */
115390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (projected_size_based_on_q > 0)
115490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
115590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11561b362b15af34006e6a11974088a46d42b903418eJohann    /* More heavily damped adjustment used if we have been oscillating
11571b362b15af34006e6a11974088a46d42b903418eJohann     * either side of target
11581b362b15af34006e6a11974088a46d42b903418eJohann     */
115990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    switch (damp_var)
116090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
116190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 0:
116290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.75;
116390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
116490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 1:
116590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.375;
116690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
116790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 2:
116890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    default:
116990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.25;
117090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
117390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (correction_factor > 102)
117490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11751b362b15af34006e6a11974088a46d42b903418eJohann        /* We are not already at the worst allowable quality */
117690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
117790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
117890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11791b362b15af34006e6a11974088a46d42b903418eJohann        /* Keep rate_correction_factor within limits */
118090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor > MAX_BPB_FACTOR)
118190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MAX_BPB_FACTOR;
118290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
118390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (correction_factor < 99)
118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11851b362b15af34006e6a11974088a46d42b903418eJohann        /* We are not already at the best allowable quality */
118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
118790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
118890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11891b362b15af34006e6a11974088a46d42b903418eJohann        /* Keep rate_correction_factor within limits */
119090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor < MIN_BPB_FACTOR)
119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MIN_BPB_FACTOR;
119290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
119390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
119490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
119590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->key_frame_rate_correction_factor = rate_correction_factor;
119690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
1198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        if (cpi->oxcf.number_of_layers == 1 &&
1199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang           (cpi->common.refresh_alt_ref_frame ||
1200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            cpi->common.refresh_golden_frame))
120190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->gf_rate_correction_factor = rate_correction_factor;
120290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
120390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->rate_correction_factor = rate_correction_factor;
120490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
120590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
120690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
120790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
120890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
120990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
121090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = cpi->active_worst_quality;
121190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12121b362b15af34006e6a11974088a46d42b903418eJohann    /* Reset Zbin OQ value */
1213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    cpi->mb.zbin_over_quant = 0;
121490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
121590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
121690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
121790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        Q = cpi->oxcf.fixed_q;
121890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
121990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
122090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
122190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.key_q;
122290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
1223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        else if (cpi->oxcf.number_of_layers == 1 &&
1224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            cpi->common.refresh_alt_ref_frame)
122590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
122690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.alt_q;
122790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
1228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        else if (cpi->oxcf.number_of_layers == 1  &&
1229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            cpi->common.refresh_golden_frame)
123090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
123190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.gold_q;
123290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
123390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
123490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
123590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
123690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
123790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int last_error = INT_MAX;
123890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int target_bits_per_mb;
123990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int bits_per_mb_at_this_q;
124090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double correction_factor;
124190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12421b362b15af34006e6a11974088a46d42b903418eJohann        /* Select the appropriate correction factor based upon type of frame. */
124390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
124490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            correction_factor = cpi->key_frame_rate_correction_factor;
124590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
124690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
1247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            if (cpi->oxcf.number_of_layers == 1 &&
1248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang               (cpi->common.refresh_alt_ref_frame ||
1249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                cpi->common.refresh_golden_frame))
125090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->gf_rate_correction_factor;
125190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
125290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->rate_correction_factor;
125390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
125490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12551b362b15af34006e6a11974088a46d42b903418eJohann        /* Calculate required scaling factor based on target frame size and
12561b362b15af34006e6a11974088a46d42b903418eJohann         * size of frame produced using previous Q
12571b362b15af34006e6a11974088a46d42b903418eJohann         */
125890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
12591b362b15af34006e6a11974088a46d42b903418eJohann            /* Case where we would overflow int */
12601b362b15af34006e6a11974088a46d42b903418eJohann            target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;
126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
126290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
126390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
126490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        i = cpi->active_best_quality;
126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
126690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        do
126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
126890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (bits_per_mb_at_this_q <= target_bits_per_mb)
127190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
127290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i;
127490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
127590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i - 1;
127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
127790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
127890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
127990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
128090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_error = bits_per_mb_at_this_q - target_bits_per_mb;
128190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
128290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (++i <= cpi->active_worst_quality);
128390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
128490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12851b362b15af34006e6a11974088a46d42b903418eJohann        /* If we are at MAXQ then enable Q over-run which seeks to claw
12861b362b15af34006e6a11974088a46d42b903418eJohann         * back additional bits through things like the RD multiplier
12871b362b15af34006e6a11974088a46d42b903418eJohann         * and zero bin size.
12881b362b15af34006e6a11974088a46d42b903418eJohann         */
128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (Q >= MAXQ)
129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
129190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int zbin_oqmax;
129290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double Factor = 0.99;
12941b362b15af34006e6a11974088a46d42b903418eJohann            double factor_adjustment = 0.01 / 256.0;
129590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.frame_type == KEY_FRAME)
12971b362b15af34006e6a11974088a46d42b903418eJohann                zbin_oqmax = 0;
1298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            else if (cpi->oxcf.number_of_layers == 1 &&
1299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                (cpi->common.refresh_alt_ref_frame ||
1300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                (cpi->common.refresh_golden_frame &&
1301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                 !cpi->source_alt_ref_active)))
130290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = 16;
130390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
130490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = ZBIN_OQ_MAX;
130590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
130690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*{
130790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
130890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Oq;
130990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = Factor/1.2683;
131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Oq = pow( Factor, (1.0/-0.165) );
131390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( Oq > zbin_oqmax )
131590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Oq = zbin_oqmax;
131690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->zbin_over_quant = (int)Oq;
131890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }*/
131990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13201b362b15af34006e6a11974088a46d42b903418eJohann            /* Each incrment in the zbin is assumed to have a fixed effect
13211b362b15af34006e6a11974088a46d42b903418eJohann             * on bitrate. This is not of course true. The effect will be
13221b362b15af34006e6a11974088a46d42b903418eJohann             * highly clip dependent and may well have sudden steps. The
13231b362b15af34006e6a11974088a46d42b903418eJohann             * idea here is to acheive higher effective quantizers than the
13241b362b15af34006e6a11974088a46d42b903418eJohann             * normal maximum by expanding the zero bin and hence
13251b362b15af34006e6a11974088a46d42b903418eJohann             * decreasing the number of low magnitude non zero coefficients.
13261b362b15af34006e6a11974088a46d42b903418eJohann             */
1327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            while (cpi->mb.zbin_over_quant < zbin_oqmax)
132890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
1329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                cpi->mb.zbin_over_quant ++;
133090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                if (cpi->mb.zbin_over_quant > zbin_oqmax)
1332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang                    cpi->mb.zbin_over_quant = zbin_oqmax;
133390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13341b362b15af34006e6a11974088a46d42b903418eJohann                /* Adjust bits_per_mb_at_this_q estimate */
1335f71323e297a928af368937089d3ed71239786f86Andreas Huber                bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
133690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor += factor_adjustment;
133790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
133890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Factor  >= 0.999)
133990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Factor = 0.999;
134090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13411b362b15af34006e6a11974088a46d42b903418eJohann                /* Break out if we get down to the target rate */
13421b362b15af34006e6a11974088a46d42b903418eJohann                if (bits_per_mb_at_this_q <= target_bits_per_mb)
134390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
134490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
134590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
134690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
134790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
134890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
134990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return Q;
135090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
135190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
135290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13531b362b15af34006e6a11974088a46d42b903418eJohannstatic int estimate_keyframe_frequency(VP8_COMP *cpi)
135490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
135590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
135690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13571b362b15af34006e6a11974088a46d42b903418eJohann    /* Average key frame frequency */
13581b362b15af34006e6a11974088a46d42b903418eJohann    int av_key_frame_frequency = 0;
135990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13601b362b15af34006e6a11974088a46d42b903418eJohann    /* First key frame at start of sequence is a special case. We have no
13611b362b15af34006e6a11974088a46d42b903418eJohann     * frequency data.
13621b362b15af34006e6a11974088a46d42b903418eJohann     */
136390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->key_frame_count == 1)
136490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13651b362b15af34006e6a11974088a46d42b903418eJohann        /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
13661b362b15af34006e6a11974088a46d42b903418eJohann         * whichever is smaller.
13671b362b15af34006e6a11974088a46d42b903418eJohann         */
13681b362b15af34006e6a11974088a46d42b903418eJohann        int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1;
136991037db265ecdd914a26e056cf69207b4f50924ehkuang        av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
13701b362b15af34006e6a11974088a46d42b903418eJohann
13711b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
1372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang            av_key_frame_frequency = key_freq;
13731b362b15af34006e6a11974088a46d42b903418eJohann
13741b362b15af34006e6a11974088a46d42b903418eJohann        cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
13751b362b15af34006e6a11974088a46d42b903418eJohann            = av_key_frame_frequency;
137690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
137790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
137890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
13791b362b15af34006e6a11974088a46d42b903418eJohann        unsigned int total_weight = 0;
1380f71323e297a928af368937089d3ed71239786f86Andreas Huber        int last_kf_interval =
1381f71323e297a928af368937089d3ed71239786f86Andreas Huber                (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1382f71323e297a928af368937089d3ed71239786f86Andreas Huber
13831b362b15af34006e6a11974088a46d42b903418eJohann        /* reset keyframe context and calculate weighted average of last
13841b362b15af34006e6a11974088a46d42b903418eJohann         * KEY_FRAME_CONTEXT keyframes
13851b362b15af34006e6a11974088a46d42b903418eJohann         */
138690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < KEY_FRAME_CONTEXT; i++)
138790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
138890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (i < KEY_FRAME_CONTEXT - 1)
13891b362b15af34006e6a11974088a46d42b903418eJohann                cpi->prior_key_frame_distance[i]
13901b362b15af34006e6a11974088a46d42b903418eJohann                    = cpi->prior_key_frame_distance[i+1];
139190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
1392f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->prior_key_frame_distance[i] = last_kf_interval;
139390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13941b362b15af34006e6a11974088a46d42b903418eJohann            av_key_frame_frequency += prior_key_frame_weight[i]
13951b362b15af34006e6a11974088a46d42b903418eJohann                                      * cpi->prior_key_frame_distance[i];
13961b362b15af34006e6a11974088a46d42b903418eJohann            total_weight += prior_key_frame_weight[i];
139790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
139890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
139990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_frequency  /= total_weight;
140090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
140190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
1402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // TODO (marpan): Given the checks above, |av_key_frame_frequency|
1403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    // should always be above 0. But for now we keep the sanity check in.
1404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    if (av_key_frame_frequency == 0)
1405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang        av_key_frame_frequency = 1;
14061b362b15af34006e6a11974088a46d42b903418eJohann    return av_key_frame_frequency;
14071b362b15af34006e6a11974088a46d42b903418eJohann}
14081b362b15af34006e6a11974088a46d42b903418eJohann
140990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14101b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_adjust_key_frame_context(VP8_COMP *cpi)
14111b362b15af34006e6a11974088a46d42b903418eJohann{
14121b362b15af34006e6a11974088a46d42b903418eJohann    /* Clear down mmx registers to allow floating point in what follows */
14131b362b15af34006e6a11974088a46d42b903418eJohann    vp8_clear_system_state();
14141b362b15af34006e6a11974088a46d42b903418eJohann
14151b362b15af34006e6a11974088a46d42b903418eJohann    /* Do we have any key frame overspend to recover? */
14161b362b15af34006e6a11974088a46d42b903418eJohann    /* Two-pass overspend handled elsewhere. */
14171b362b15af34006e6a11974088a46d42b903418eJohann    if ((cpi->pass != 2)
14181b362b15af34006e6a11974088a46d42b903418eJohann         && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
141990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
14201b362b15af34006e6a11974088a46d42b903418eJohann        int overspend;
14211b362b15af34006e6a11974088a46d42b903418eJohann
14221b362b15af34006e6a11974088a46d42b903418eJohann        /* Update the count of key frame overspend to be recovered in
14231b362b15af34006e6a11974088a46d42b903418eJohann         * subsequent frames. A portion of the KF overspend is treated as gf
14241b362b15af34006e6a11974088a46d42b903418eJohann         * overspend (and hence recovered more quickly) as the kf is also a
14251b362b15af34006e6a11974088a46d42b903418eJohann         * gf. Otherwise the few frames following each kf tend to get more
14261b362b15af34006e6a11974088a46d42b903418eJohann         * bits allocated than those following other gfs.
14271b362b15af34006e6a11974088a46d42b903418eJohann         */
14281b362b15af34006e6a11974088a46d42b903418eJohann        overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
14291b362b15af34006e6a11974088a46d42b903418eJohann
14301b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->oxcf.number_of_layers > 1)
14311b362b15af34006e6a11974088a46d42b903418eJohann            cpi->kf_overspend_bits += overspend;
14321b362b15af34006e6a11974088a46d42b903418eJohann        else
143390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
14341b362b15af34006e6a11974088a46d42b903418eJohann            cpi->kf_overspend_bits += overspend * 7 / 8;
14351b362b15af34006e6a11974088a46d42b903418eJohann            cpi->gf_overspend_bits += overspend * 1 / 8;
143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
14371b362b15af34006e6a11974088a46d42b903418eJohann
14381b362b15af34006e6a11974088a46d42b903418eJohann        /* Work out how much to try and recover per frame. */
14391b362b15af34006e6a11974088a46d42b903418eJohann        cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits
14401b362b15af34006e6a11974088a46d42b903418eJohann                                     / estimate_keyframe_frequency(cpi);
144190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
144290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
144390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key = 0;
144490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->key_frame_count++;
144590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
144690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14471b362b15af34006e6a11974088a46d42b903418eJohann
144890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
144990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
14501b362b15af34006e6a11974088a46d42b903418eJohann    /* Set-up bounds on acceptable frame size: */
145190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
145290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
14531b362b15af34006e6a11974088a46d42b903418eJohann        /* Fixed Q scenario: frame size never outranges target
14541b362b15af34006e6a11974088a46d42b903418eJohann         * (there is no target!)
14551b362b15af34006e6a11974088a46d42b903418eJohann         */
145690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_under_shoot_limit = 0;
145790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_over_shoot_limit  = INT_MAX;
145890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
145990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
146090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
146190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
146290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
146390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
146490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
146590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
146690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
146790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
14681b362b15af34006e6a11974088a46d42b903418eJohann            if (cpi->oxcf.number_of_layers > 1 ||
14691b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_alt_ref_frame ||
14701b362b15af34006e6a11974088a46d42b903418eJohann                cpi->common.refresh_golden_frame)
147190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
147290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
147390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
147490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
147590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
147690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
14771b362b15af34006e6a11974088a46d42b903418eJohann                /* For CBR take buffer fullness into account */
147890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
147990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
148090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
148190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
14821b362b15af34006e6a11974088a46d42b903418eJohann                        /* Buffer is too full so relax overshoot and tighten
14831b362b15af34006e6a11974088a46d42b903418eJohann                         * undershoot
14841b362b15af34006e6a11974088a46d42b903418eJohann                         */
148590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 12 / 8;
148690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
148790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
148890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
148990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
14901b362b15af34006e6a11974088a46d42b903418eJohann                        /* Buffer is too low so relax undershoot and tighten
14911b362b15af34006e6a11974088a46d42b903418eJohann                         * overshoot
14921b362b15af34006e6a11974088a46d42b903418eJohann                         */
149390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 10 / 8;
149490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
149590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
149690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
149790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
149890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
149990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
150090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
150190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
15021b362b15af34006e6a11974088a46d42b903418eJohann                /* VBR and CQ mode */
15031b362b15af34006e6a11974088a46d42b903418eJohann                /* Note that tighter restrictions here can help quality
15041b362b15af34006e6a11974088a46d42b903418eJohann                 * but hurt encode speed
15051b362b15af34006e6a11974088a46d42b903418eJohann                 */
150690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
150790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
15081b362b15af34006e6a11974088a46d42b903418eJohann                    /* Stron overshoot limit for constrained quality */
150979f15823c34ae1e423108295e416213200bb280fAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
151079f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
151179f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
151279f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
151379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
151479f15823c34ae1e423108295e416213200bb280fAndreas Huber                    else
151579f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
151679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
151779f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
151879f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
151990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
152090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
152190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
15221b362b15af34006e6a11974088a46d42b903418eJohann
15231b362b15af34006e6a11974088a46d42b903418eJohann        /* For very small rate targets where the fractional adjustment
15241b362b15af34006e6a11974088a46d42b903418eJohann         * (eg * 7/8) may be tiny make sure there is at least a minimum
15251b362b15af34006e6a11974088a46d42b903418eJohann         * range.
15261b362b15af34006e6a11974088a46d42b903418eJohann         */
15271b362b15af34006e6a11974088a46d42b903418eJohann        *frame_over_shoot_limit += 200;
15281b362b15af34006e6a11974088a46d42b903418eJohann        *frame_under_shoot_limit -= 200;
15291b362b15af34006e6a11974088a46d42b903418eJohann        if ( *frame_under_shoot_limit < 0 )
15301b362b15af34006e6a11974088a46d42b903418eJohann            *frame_under_shoot_limit = 0;
15311b362b15af34006e6a11974088a46d42b903418eJohann
15321b362b15af34006e6a11974088a46d42b903418eJohann    }
15331b362b15af34006e6a11974088a46d42b903418eJohann}
15341b362b15af34006e6a11974088a46d42b903418eJohann
15351b362b15af34006e6a11974088a46d42b903418eJohann
15361b362b15af34006e6a11974088a46d42b903418eJohann/* return of 0 means drop frame */
15371b362b15af34006e6a11974088a46d42b903418eJohannint vp8_pick_frame_size(VP8_COMP *cpi)
15381b362b15af34006e6a11974088a46d42b903418eJohann{
15391b362b15af34006e6a11974088a46d42b903418eJohann    VP8_COMMON *cm = &cpi->common;
15401b362b15af34006e6a11974088a46d42b903418eJohann
15411b362b15af34006e6a11974088a46d42b903418eJohann    if (cm->frame_type == KEY_FRAME)
15421b362b15af34006e6a11974088a46d42b903418eJohann        calc_iframe_target_size(cpi);
15431b362b15af34006e6a11974088a46d42b903418eJohann    else
15441b362b15af34006e6a11974088a46d42b903418eJohann    {
15451b362b15af34006e6a11974088a46d42b903418eJohann        calc_pframe_target_size(cpi);
15461b362b15af34006e6a11974088a46d42b903418eJohann
15471b362b15af34006e6a11974088a46d42b903418eJohann        /* Check if we're dropping the frame: */
15481b362b15af34006e6a11974088a46d42b903418eJohann        if (cpi->drop_frame)
15491b362b15af34006e6a11974088a46d42b903418eJohann        {
15501b362b15af34006e6a11974088a46d42b903418eJohann            cpi->drop_frame = 0;
15511b362b15af34006e6a11974088a46d42b903418eJohann            return 0;
15521b362b15af34006e6a11974088a46d42b903418eJohann        }
155390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
15541b362b15af34006e6a11974088a46d42b903418eJohann    return 1;
155590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1556