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 Huberextern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES];
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int y_modes[5];
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int uv_modes[4];
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int b_modes[10];
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_y_modes[10];
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_uv_modes[4];
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int inter_b_modes[10];
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// Bits Per MB at different Q (Multiplied by 512)
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define BPER_MB_NORMBITS    9
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4879f15823c34ae1e423108295e416213200bb280fAndreas Huber// Work in progress recalibration of baseline rate tables based on
4979f15823c34ae1e423108295e416213200bb280fAndreas Huber// the assumption that bits per mb is inversely proportional to the
5079f15823c34ae1e423108295e416213200bb280fAndreas Huber// quantizer value.
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst int vp8_bits_per_mb[2][QINDEX_RANGE] =
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
5379f15823c34ae1e423108295e416213200bb280fAndreas Huber    // 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    },
7279f15823c34ae1e423108295e416213200bb280fAndreas Huber    // 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
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber//#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
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// % adjustment to target kf size based on seperation from previous frame
17879f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int kf_boost_seperation_adjustment[16] =
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    30,   40,   50,   55,   60,   65,   70,   75,
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    80,   85,   90,   95,  100,  100,  100,  100,
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18579f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_adjust_table[101] =
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    100,
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20079f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_intra_usage_adjustment[20] =
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    125, 120, 115, 110, 105, 100,  95,  85,  80,  75,
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    70,  65,  60,  55,  50,  50,  50,  50,  50,  50,
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20679f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic const int gf_interval_table[101] =
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7,
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber};
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_save_coding_context(VP8_COMP *cpi)
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Stores a snapshot of key state variables which can subsequently be
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // restored with a call to vp8_restore_coding_context. These functions are
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // intended for use in a re-code loop in vp8_compress_frame where the
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // quantizer value is adjusted between loop iterations.
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_since_key          = cpi->frames_since_key;
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->filter_level             = cpi->common.filter_level;
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_till_gf_update_due   = cpi->frames_till_gf_update_due;
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->frames_since_golden       = cpi->common.frames_since_golden;
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->mvc,      cpi->common.fc.mvc);
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->mvcosts,  cpi->mb.mvcosts);
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->kf_ymode_prob,   cpi->common.kf_ymode_prob);
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->kf_uv_mode_prob,  cpi->common.kf_uv_mode_prob);
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->ymode_count, cpi->ymode_count);
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_mode_count, cpi->uv_mode_count);
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Stats
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->y_modes,       y_modes);
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->uv_modes,      uv_modes);
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->b_modes,       b_modes);
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_y_modes,  inter_y_modes);
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_uv_modes, inter_uv_modes);
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cc->inter_b_modes,  inter_b_modes);
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_restore_coding_context(VP8_COMP *cpi)
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    CODING_CONTEXT *const cc = & cpi->coding_context;
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Restore key state variables to the snapshot state stored in the
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // previous call to vp8_save_coding_context.
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key         =   cc->frames_since_key;
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level     =   cc->filter_level;
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_till_gf_update_due  =   cc->frames_till_gf_update_due;
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.frames_since_golden       =   cc->frames_since_golden;
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.mvc, cc->mvc);
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->mb.mvcosts, cc->mvcosts);
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.kf_ymode_prob,   cc->kf_ymode_prob);
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.ymode_prob,   cc->ymode_prob);
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.kf_uv_mode_prob,  cc->kf_uv_mode_prob);
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->common.fc.uv_mode_prob,  cc->uv_mode_prob);
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->ymode_count, cc->ymode_count);
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(cpi->uv_mode_count, cc->uv_mode_count);
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Stats
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef MODE_STATS
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(y_modes, cc->y_modes);
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(uv_modes, cc->uv_modes);
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(b_modes, cc->b_modes);
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_y_modes, cc->inter_y_modes);
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_uv_modes, cc->inter_uv_modes);
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_copy(inter_b_modes, cc->inter_b_modes);
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_setup_key_frame(VP8_COMP *cpi)
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Setup for Key frame:
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_default_coef_probs(& cpi->common);
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_kf_default_bmode_probs(cpi->common.kf_bmode_prob);
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int flag[2] = {1, 1};
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memset(cpi->common.fc.pre_mvc, 0, sizeof(cpi->common.fc.pre_mvc));  //initialize pre_mvc to all zero.
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //cpi->common.filter_level = 0;      // Reset every key frame.
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Provisional interval before next GF
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->auto_gold)
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->goldfreq;
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->common.refresh_golden_frame = TRUE;
32979f15823c34ae1e423108295e416213200bb280fAndreas Huber    cpi->common.refresh_alt_ref_frame = TRUE;
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_calc_auto_iframe_target_size(VP8_COMP *cpi)
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // boost defaults to half second
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int kf_boost;
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Clear down mmx registers to allow floating point in what follows
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_clear_system_state();  //__asm emms;
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        vp8_calc_iframe_target_size(cpi);
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return;
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 2)
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = cpi->per_frame_bandwidth;      // New Two pass RC
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Boost depends somewhat on frame rate
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        kf_boost = (int)(2 * cpi->output_frame_rate - 16);
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // adjustment up based on q
35679f15823c34ae1e423108295e416213200bb280fAndreas Huber        kf_boost = kf_boost * kf_boost_qadjustment[cpi->ni_av_qi] / 100;
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // frame separation adjustment ( down)
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->frames_since_key  < cpi->output_frame_rate / 2)
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            kf_boost = (int)(kf_boost * cpi->frames_since_key / (cpi->output_frame_rate / 2));
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (kf_boost < 16)
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            kf_boost = 16;
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Reset the active worst quality to the baseline value for key frames.
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->active_worst_quality = cpi->worst_quality;
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = ((16 + kf_boost)  * cpi->per_frame_bandwidth) >> 4;
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Should the next frame be an altref frame
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // For now Alt ref is not allowed except in 2 pass modes.
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->source_alt_ref_pending = FALSE;
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*if ( cpi->oxcf.fixed_q == -1)
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->oxcf.play_alternate && ( (cpi->last_boost/2) > (100+(AF_THRESH*cpi->frames_till_gf_update_due)) ) )
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = TRUE;
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = FALSE;
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (0)
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        FILE *f;
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        f = fopen("kf_boost.stt", "a");
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //fprintf(f, " %8d %10d %10d %10d %10d %10d %10d\n",
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //  cpi->common.current_video_frame,  cpi->target_bandwidth, cpi->frames_to_key, kf_boost_qadjustment[cpi->ni_av_qi], cpi->kf_boost, (cpi->this_frame_target *100 / cpi->per_frame_bandwidth), cpi->this_frame_target );
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, " %8u %10d %10d %10d\n",
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fclose(f);
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber//  Do the best we can to define the parameteres for the next GF based on what information we have available.
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void calc_gf_params(VP8_COMP *cpi)
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Boost = 0;
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int gf_frame_useage = 0;      // Golden frame useage since last GF
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[LAST_FRAME]   +
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                  cpi->recent_ref_frame_usage[ALTREF_FRAME];
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
414f71323e297a928af368937089d3ed71239786f86Andreas Huber    int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Reset the last boost indicator
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //cpi->last_boost = 100;
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (tot_mbs)
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (pct_gf_active > gf_frame_useage)
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        gf_frame_useage = pct_gf_active;
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Not two pass
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Single Pass lagged mode: TBD
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (FALSE)
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Single Pass compression: Has to use current and historical data
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Experimental code
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int index = cpi->one_pass_frame_index;
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // *************** Experimental code - incomplete
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double decay_val = 1.0;
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIAccumulator = 0.0;
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double last_iiaccumulator = 0.0;
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double IIRatio;
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            for ( i = 0; i < (frames_to_scan - 1); i++ )
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( index < 0 )
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    index = MAX_LAG_BUFFERS;
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                index --;
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( IIRatio > 30.0 )
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        IIRatio = 30.0;
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    IIRatio = 30.0;
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                IIAccumulator += IIRatio * decay_val;
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (    (i > MIN_GF_INTERVAL) &&
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_iiaccumulator = IIAccumulator;
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = IIAccumulator*100.0/16.0;
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->baseline_gf_interval = i;
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            */
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*************************************************************/
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // OLD code
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Adjust boost based upon ambient Q
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = GFQ_ADJUSTMENT;
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Adjust based upon most recently measure intra useage
49179f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Adjust gf boost based upon GF usage since last GF
49479f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // golden frame boost without recode loop often goes awry.  be safe by keeping numbers down.
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!cpi->sf.recode_loop)
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->compressor_speed == 2)
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Boost = Boost / 2;
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Apply an upper limit based on Q for 1 pass encodes
50679f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
50779f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = kf_gf_boost_qlimits[Q];
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Apply lower limits to boost.
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (Boost < 110)
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = 110;
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Note the boost used
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->last_boost = Boost;
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Estimate next interval
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // This is updated once the real frame size/boost is known.
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q == -1)
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)         // 2 Pass
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else                            // 1 Pass
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 750)
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1000)
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost > 1250)
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due++;
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->last_boost >= 1500)
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due ++;
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54279f15823c34ae1e423108295e416213200bb280fAndreas Huber            if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
54379f15823c34ae1e423108295e416213200bb280fAndreas Huber                cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->frames_till_gf_update_due = cpi->max_gf_interval;
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // ARF on or off
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // For now Alt ref is not allowed except in 2 pass modes.
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->source_alt_ref_pending = FALSE;
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*if ( cpi->oxcf.fixed_q == -1)
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = TRUE;
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = FALSE;
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* This is equvialent to estimate_bits_at_q without the rate_correction_factor. */
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int baseline_bits_at_q(int frame_kind, int Q, int MBs)
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Bpm = vp8_bits_per_mb[frame_kind][Q];
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Attempt to retain reasonable accuracy without overflow. The cutoff is
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * largest Bpm takes 20 bits.
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (MBs > (1 << 11))
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return (Bpm >> BPER_MB_NORMBITS) * MBs;
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return (Bpm * MBs) >> BPER_MB_NORMBITS;
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_calc_iframe_target_size(VP8_COMP *cpi)
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q;
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Boost = 100;
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    Q = (cpi->oxcf.fixed_q >= 0) ? cpi->oxcf.fixed_q : cpi->avg_frame_qindex;
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->auto_adjust_key_quantizer == 1)
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // If (auto_adjust_key_quantizer==1) then a lower Q is selected for key-frames.
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // The enhanced Q is calculated so as to boost the key frame size by a factor
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // specified in kf_boost_qadjustment. Also, can adjust based on distance
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // between key frames.
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Adjust boost based upon ambient Q
59779f15823c34ae1e423108295e416213200bb280fAndreas Huber        Boost = kf_boost_qadjustment[Q];
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Make the Key frame boost less if the seperation from the previous key frame is small
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->frames_since_key < 16)
60179f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * kf_boost_seperation_adjustment[cpi->frames_since_key] / 100;
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
60379f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = Boost * kf_boost_seperation_adjustment[15] / 100;
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Apply limits on boost
60679f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (Boost > kf_gf_boost_qlimits[Q])
60779f15823c34ae1e423108295e416213200bb280fAndreas Huber            Boost = kf_gf_boost_qlimits[Q];
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (Boost < 120)
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Boost = 120;
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Keep a record of the boost that was used
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->last_boost = Boost;
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Should the next frame be an altref frame
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass != 2)
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // For now Alt ref is not allowed except in 2 pass modes.
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->source_alt_ref_pending = FALSE;
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*if ( cpi->oxcf.fixed_q == -1)
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->oxcf.play_alternate && ( (cpi->last_boost/2) > (100+(AF_THRESH*cpi->frames_till_gf_update_due)) ) )
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = TRUE;
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->source_alt_ref_pending = FALSE;
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = (baseline_bits_at_q(0, Q, cpi->common.MBs) * Boost) / 100;
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int bits_per_mb_at_this_q ;
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->oxcf.error_resilient_mode == 1)
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = 2 * cpi->av_per_frame_bandwidth;
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return;
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Rate targetted scenario:
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Be careful of 32-bit OVERFLOW if restructuring the caluclation of cpi->this_frame_target
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        bits_per_mb_at_this_q = (int)(.5 +
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      cpi->key_frame_rate_correction_factor * vp8_bits_per_mb[0][Q]);
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = (((bits_per_mb_at_this_q * cpi->common.MBs) >> BPER_MB_NORMBITS) * Boost) / 100;
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Reset the active worst quality to the baseline value for key frames.
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass < 2)
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_worst_quality = cpi->worst_quality;
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_calc_pframe_target_size(VP8_COMP *cpi)
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int min_frame_target;
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Adjustment;
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Set the min frame bandwidth.
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //min_frame_target = estimate_min_frame_size( cpi );
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    min_frame_target = 0;
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 2)
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->min_frame_bandwidth;
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            min_frame_target = cpi->av_per_frame_bandwidth >> 5;
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (min_frame_target < cpi->per_frame_bandwidth / 4)
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        min_frame_target = cpi->per_frame_bandwidth / 4;
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Special alt reference frame case
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.refresh_alt_ref_frame)
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->per_frame_bandwidth = cpi->gf_bits;                       // Per frame bit target for the alt ref frame
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /* One Pass ??? TBD */
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*else
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int frames_in_section;
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int allocation_chunks;
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int alt_boost;
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int max_arf_rate;
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            alt_boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            alt_boost += (cpi->frames_till_gf_update_due * 50);
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // If alt ref is not currently active then we have a pottential double hit with GF and ARF so reduce the boost a bit.
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // A similar thing is done on GFs that preceed a arf update.
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( !cpi->source_alt_ref_active )
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                alt_boost = alt_boost * 3 / 4;
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            frames_in_section = cpi->frames_till_gf_update_due+1;                                   // Standard frames + GF
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            allocation_chunks = (frames_in_section * 100) + alt_boost;
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Normalize Altboost and allocations chunck down to prevent overflow
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            while ( alt_boost > 1000 )
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                alt_boost /= 2;
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                allocation_chunks /= 2;
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int bits_in_section;
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( cpi->kf_overspend_bits > 0 )
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( Adjustment > (cpi->per_frame_bandwidth - min_frame_target) )
72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->kf_overspend_bits -= Adjustment;
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // Calculate an inter frame bandwidth target for the next few frames designed to recover
73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // any extra bits spent on the key frame.
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->inter_frame_target = cpi->per_frame_bandwidth - Adjustment;
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if ( cpi->inter_frame_target < min_frame_target )
73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->inter_frame_target = min_frame_target;
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->inter_frame_target = cpi->per_frame_bandwidth;
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                bits_in_section = cpi->inter_frame_target * frames_in_section;
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Avoid loss of precision but avoid overflow
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( (bits_in_section>>7) > allocation_chunks )
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = alt_boost * (bits_in_section / allocation_chunks);
74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = (alt_boost * bits_in_section) / allocation_chunks;
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        */
74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Normal frames (gf,and inter)
75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // 2 pass
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->this_frame_target = cpi->per_frame_bandwidth;
75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // 1 pass
75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Make rate adjustment to recover bits spent in key frame
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Test to see if the key frame inter data rate correction should still be in force
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->kf_overspend_bits > 0)
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->kf_overspend_bits -= Adjustment;
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Calculate an inter frame bandwidth target for the next few frames designed to recover
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // any extra bits spent on the key frame.
77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->this_frame_target < min_frame_target)
77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = min_frame_target;
77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target = cpi->per_frame_bandwidth;
78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // If appropriate make an adjustment to recover bits spent on a recent GF
78390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
78890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->gf_overspend_bits -= Adjustment;
79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->this_frame_target -= Adjustment;
79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Apply small + and - boosts for non gf frames
79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
79690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
79890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // % Adjustment limited to the range 1% to 10%
79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->last_boost - 100) >> 5;
80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
80190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment < 1)
80290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 1;
80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (Adjustment > 10)
80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = 10;
80590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
80690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Convert to bits
80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Adjustment = (cpi->this_frame_target * Adjustment) / 100;
80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Adjustment > (cpi->this_frame_target - min_frame_target))
81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Adjustment = (cpi->this_frame_target - min_frame_target);
81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->common.frames_since_golden == (cpi->current_gf_interval >> 1))
81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target += ((cpi->current_gf_interval - 1) * Adjustment);
81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target -= Adjustment;
81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
81990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
82090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Set a reduced data rate target for our initial Q calculation.
82190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // This should help to save bits during earier sections.
82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((cpi->oxcf.under_shoot_pct > 0) && (cpi->oxcf.under_shoot_pct <= 100))
82390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = (cpi->this_frame_target * cpi->oxcf.under_shoot_pct) / 100;
82490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
82590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Sanity check that the total sum of adjustments is not above the maximum allowed
82690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // That is that having allowed for KF and GF penalties we have not pushed the
82790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // current interframe target to low. If the adjustment we apply here is not capable of recovering
82890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // all the extra bits we have spent in the KF or GF then the remainder will have to be recovered over
82990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // a longer time span via other buffer / rate control mechanisms.
83090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->this_frame_target < min_frame_target)
83190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->this_frame_target = min_frame_target;
83290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
83390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (!cpi->common.refresh_alt_ref_frame)
83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Note the baseline target data rate for this inter frame.
83590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->inter_frame_target = cpi->this_frame_target;
83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
83790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // One Pass specific code
83890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->pass == 0)
83990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
84090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Adapt target frame size with respect to any buffering constraints:
84190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->buffered_mode)
84290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
84390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int one_percent_bits = 1 + cpi->oxcf.optimal_buffer_level / 100;
84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
84579f15823c34ae1e423108295e416213200bb280fAndreas Huber            if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
84679f15823c34ae1e423108295e416213200bb280fAndreas Huber                (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int percent_low = 0;
84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Decide whether or not we need to adjust the frame data rate target.
85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                //
85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // If we are are below the optimal buffer fullness level and adherence
85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // to buffering contraints is important to the end useage then adjust
85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // the per frame target.
85579f15823c34ae1e423108295e416213200bb280fAndreas Huber                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
85679f15823c34ae1e423108295e416213200bb280fAndreas Huber                    (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
85879f15823c34ae1e423108295e416213200bb280fAndreas Huber                    percent_low =
85979f15823c34ae1e423108295e416213200bb280fAndreas Huber                        (cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
86079f15823c34ae1e423108295e416213200bb280fAndreas Huber                        one_percent_bits;
86190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (percent_low > 100)
86390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_low = 100;
86490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (percent_low < 0)
86590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_low = 0;
86690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
86790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Are we overshooting the long term clip data rate...
86890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else if (cpi->bits_off_target < 0)
86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // Adjust per frame data target downwards to compensate.
87179f15823c34ae1e423108295e416213200bb280fAndreas Huber                    percent_low = (int)(100 * -cpi->bits_off_target /
87279f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->total_byte_count * 8));
87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (percent_low > 100)
87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_low = 100;
87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (percent_low < 0)
87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_low = 0;
87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // lower the target bandwidth for this frame.
88179f15823c34ae1e423108295e416213200bb280fAndreas Huber                cpi->this_frame_target =
88279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    (cpi->this_frame_target * (100 - (percent_low / 2))) / 100;
88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
88479f15823c34ae1e423108295e416213200bb280fAndreas Huber                // Are we using allowing control of active_worst_allowed_q
88579f15823c34ae1e423108295e416213200bb280fAndreas Huber                // according to buffer level.
88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->auto_worst_q)
88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    int critical_buffer_level;
88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
89079f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // For streaming applications the most important factor is
89179f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // cpi->buffer_level as this takes into account the
89279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // specified short term buffering constraints. However,
89379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // hitting the long term clip data rate target is also
89479f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // important.
89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
89779f15823c34ae1e423108295e416213200bb280fAndreas Huber                        // Take the smaller of cpi->buffer_level and
89879f15823c34ae1e423108295e416213200bb280fAndreas Huber                        // cpi->bits_off_target
89979f15823c34ae1e423108295e416213200bb280fAndreas Huber                        critical_buffer_level =
90079f15823c34ae1e423108295e416213200bb280fAndreas Huber                            (cpi->buffer_level < cpi->bits_off_target)
90179f15823c34ae1e423108295e416213200bb280fAndreas Huber                            ? cpi->buffer_level : cpi->bits_off_target;
90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
90379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // For local file playback short term buffering contraints
90479f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // are less of an issue
90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
90690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
90779f15823c34ae1e423108295e416213200bb280fAndreas Huber                        // Consider only how we are doing for the clip as a
90879f15823c34ae1e423108295e416213200bb280fAndreas Huber                        // whole
90990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        critical_buffer_level = cpi->bits_off_target;
91090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
91190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
91279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // Set the active worst quality based upon the selected
91379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // buffer fullness number.
91490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
91679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        if ( critical_buffer_level >
91779f15823c34ae1e423108295e416213200bb280fAndreas Huber                             (cpi->oxcf.optimal_buffer_level >> 2) )
91890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
91979f15823c34ae1e423108295e416213200bb280fAndreas Huber                            INT64 qadjustment_range =
92079f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      cpi->worst_quality - cpi->ni_av_qi;
92179f15823c34ae1e423108295e416213200bb280fAndreas Huber                            INT64 above_base =
92279f15823c34ae1e423108295e416213200bb280fAndreas Huber                                      (critical_buffer_level -
92379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                       (cpi->oxcf.optimal_buffer_level >> 2));
92479f15823c34ae1e423108295e416213200bb280fAndreas Huber
92579f15823c34ae1e423108295e416213200bb280fAndreas Huber                            // Step active worst quality down from
92679f15823c34ae1e423108295e416213200bb280fAndreas Huber                            // cpi->ni_av_qi when (critical_buffer_level ==
92779f15823c34ae1e423108295e416213200bb280fAndreas Huber                            // cpi->optimal_buffer_level) to
92879f15823c34ae1e423108295e416213200bb280fAndreas Huber                            // cpi->worst_quality when
92979f15823c34ae1e423108295e416213200bb280fAndreas Huber                            // (critical_buffer_level ==
93079f15823c34ae1e423108295e416213200bb280fAndreas Huber                            //     cpi->optimal_buffer_level >> 2)
93179f15823c34ae1e423108295e416213200bb280fAndreas Huber                            cpi->active_worst_quality =
93279f15823c34ae1e423108295e416213200bb280fAndreas Huber                                cpi->worst_quality -
93379f15823c34ae1e423108295e416213200bb280fAndreas Huber                                ((qadjustment_range * above_base) /
93479f15823c34ae1e423108295e416213200bb280fAndreas Huber                                 (cpi->oxcf.optimal_buffer_level*3>>2));
93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
93790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->active_worst_quality = cpi->worst_quality;
93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
94090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->active_worst_quality = cpi->ni_av_qi;
94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
95190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
95290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int percent_high;
95490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
95590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
95690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
95790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    percent_high = (int)(100 * (cpi->bits_off_target - cpi->oxcf.optimal_buffer_level) / (cpi->total_byte_count * 8));
95890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
95990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (percent_high > 100)
96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_high = 100;
96190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (percent_high < 0)
96290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        percent_high = 0;
96390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = (cpi->this_frame_target * (100 + (percent_high / 2))) / 100;
96590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Are we allowing control of active_worst_allowed_q according to bufferl level.
96990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->auto_worst_q)
97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    // When using the relaxed buffer model stick to the user specified value
97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->ni_av_qi;
97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
97490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
97590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->active_worst_quality = cpi->worst_quality;
97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Set active_best_quality to prevent quality rising too high
98190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_best_quality = cpi->best_quality;
98290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Worst quality obviously must not be better than best quality
98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->active_worst_quality <= cpi->active_best_quality)
98590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->active_worst_quality = cpi->active_best_quality + 1;
98690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Unbuffered mode (eg. video conferencing)
98990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
99090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
99190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Set the active worst quality
99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->active_worst_quality = cpi->worst_quality;
99390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
99479f15823c34ae1e423108295e416213200bb280fAndreas Huber
99579f15823c34ae1e423108295e416213200bb280fAndreas Huber        // Special trap for constrained quality mode
99679f15823c34ae1e423108295e416213200bb280fAndreas Huber        // "active_worst_quality" may never drop below cq level
99779f15823c34ae1e423108295e416213200bb280fAndreas Huber        // for any frame type.
99879f15823c34ae1e423108295e416213200bb280fAndreas Huber        if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
99979f15823c34ae1e423108295e416213200bb280fAndreas Huber             cpi->active_worst_quality < cpi->cq_target_quality)
100079f15823c34ae1e423108295e416213200bb280fAndreas Huber        {
100179f15823c34ae1e423108295e416213200bb280fAndreas Huber            cpi->active_worst_quality = cpi->cq_target_quality;
100279f15823c34ae1e423108295e416213200bb280fAndreas Huber        }
100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
100590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Test to see if we have to drop a frame
100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // The auto-drop frame code is only used in buffered mode.
100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // In unbufferd mode (eg vide conferencing) the descision to
100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // code or drop a frame is made outside the codec in response to real
100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // world comms or buffer considerations.
101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->drop_frames_allowed && cpi->buffered_mode &&
101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ((cpi->common.frame_type != KEY_FRAME))) //|| !cpi->oxcf.allow_spatial_resampling) )
101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Check for a buffer underun-crisis in which case we have to drop a frame
101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ((cpi->buffer_level < 0))
101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
101890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f = fopen("dec.stt", "a");
101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (int) cpi->common.current_video_frame,
102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->decimation_factor, cpi->common.horiz_scale,
102290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //vpx_log("Decoder: Drop frame due to bandwidth: %d \n",cpi->buffer_level, cpi->av_per_frame_bandwidth);
102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->drop_frame = TRUE;
102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
103190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Check for other drop frame crtieria (Note 2 pass cbr uses decimation on whole KF sections)
103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if ((cpi->buffer_level < cpi->oxcf.drop_frames_water_mark * cpi->oxcf.optimal_buffer_level / 100) &&
103390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                 (cpi->drop_count < cpi->max_drop_count) && (cpi->pass == 0))
103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->drop_frame = TRUE;
103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
103890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
103990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
104090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->drop_frame)
104190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
104290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Update the buffer level variable.
104390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
104490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->buffer_level = cpi->bits_off_target;
104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->drop_count = 0;
104890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
105090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Adjust target frame size for Golden Frames:
105190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.error_resilient_mode == 0 &&
105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
105390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
105490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //int Boost = 0;
105590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int gf_frame_useage = 0;      // Golden frame useage since last GF
105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[LAST_FRAME]   +
106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
106190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                      cpi->recent_ref_frame_usage[ALTREF_FRAME];
106290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1063f71323e297a928af368937089d3ed71239786f86Andreas Huber        int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Reset the last boost indicator
106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //cpi->last_boost = 100;
106790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
106890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (tot_mbs)
106990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
107090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
107190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (pct_gf_active > gf_frame_useage)
107290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            gf_frame_useage = pct_gf_active;
107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
107490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Is a fixed manual GF frequency being used
107579f15823c34ae1e423108295e416213200bb280fAndreas Huber        if (cpi->auto_gold)
107690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
107790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // For one pass throw a GF if recent frame intra useage is low or the GF useage is high
107890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
107990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.refresh_golden_frame = TRUE;
108090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Two pass GF descision
108290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (cpi->pass == 2)
108390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->common.refresh_golden_frame = TRUE;
108490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
108590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Debug stats
108990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (0)
109090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            FILE *f;
109290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            f = fopen("gf_useaget.stt", "a");
109490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
109590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->common.current_video_frame,  cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
109690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fclose(f);
109790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.refresh_golden_frame == TRUE)
110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
110390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
110490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (0)   // p_gw
110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                FILE *f;
110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                f = fopen("GFexit.stt", "a");
111090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
111190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fclose(f);
111290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->initial_gf_use = 0;
111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
111790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->auto_adjust_gold_quantizer)
111890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
111990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                calc_gf_params(cpi);
112090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
112190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
112290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // If we are using alternate ref instead of gf then do not apply the boost
112390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // It will instead be applied to the altref update
112490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Jims modified boost
112590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (!cpi->source_alt_ref_active)
112690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
112790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.fixed_q < 0)
112890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
112990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->pass == 2)
113090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
113190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        cpi->this_frame_target = cpi->per_frame_bandwidth;          // The spend on the GF is defined in the two pass code for two pass encodes
113290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
113390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
113490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
113590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int Boost = cpi->last_boost;
113690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int frames_in_section = cpi->frames_till_gf_update_due + 1;
113790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
113890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        int bits_in_section = cpi->inter_frame_target * frames_in_section;
113990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
114090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Normalize Altboost and allocations chunck down to prevent overflow
114190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        while (Boost > 1000)
114290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        {
114390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            Boost /= 2;
114490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            allocation_chunks /= 2;
114590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        }
114690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
114790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Avoid loss of precision but avoid overflow
114890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        if ((bits_in_section >> 7) > allocation_chunks)
114990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
115090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        else
115190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                            cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
115290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
115390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
115490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
115590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->this_frame_target = (baseline_bits_at_q(1, Q, cpi->common.MBs) * cpi->last_boost) / 100;
115690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
115790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
1158f71323e297a928af368937089d3ed71239786f86Andreas Huber            // If there is an active ARF at this location use the minimum
1159f71323e297a928af368937089d3ed71239786f86Andreas Huber            // bits on this frame even if it is a contructed arf.
1160f71323e297a928af368937089d3ed71239786f86Andreas Huber            // The active maximum quantizer insures that an appropriate
1161f71323e297a928af368937089d3ed71239786f86Andreas Huber            // number of bits will be spent if needed for contstructed ARFs.
116290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
116390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
1164f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->this_frame_target = 0;
116590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
116690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
116790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
116890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
116990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
117090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
117190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
117290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
117390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
117490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
117590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
117690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    Q = cpi->common.base_qindex;
117790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    correction_factor = 100;
117890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double rate_correction_factor;
117990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double adjustment_limit;
118090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
118190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int    projected_size_based_on_q = 0;
118290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
118390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Clear down mmx registers to allow floating point in what follows
118490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_clear_system_state();  //__asm emms;
118590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
118690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
118790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
118890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = cpi->key_frame_rate_correction_factor;
118990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
119090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
119190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
119290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
119390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->gf_rate_correction_factor;
119490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
119590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = cpi->rate_correction_factor;
119690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
119790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
119890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Work out how big we would have expected the frame to be at this Q given the current correction factor.
119990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Stay in double to avoid int overflow when values are large
120090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //projected_size_based_on_q = ((int)(.5 + rate_correction_factor * vp8_bits_per_mb[cpi->common.frame_type][Q]) * cpi->common.MBs) >> BPER_MB_NORMBITS;
120190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas 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));
120290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
120390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Make some allowance for cpi->zbin_over_quant
120490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->zbin_over_quant > 0)
120590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
120690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int Z = cpi->zbin_over_quant;
120790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double Factor = 0.99;
120890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double factor_adjustment = 0.01 / 256.0; //(double)ZBIN_OQ_MAX;
120990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
121090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (Z > 0)
121190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
121290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Z --;
1213f71323e297a928af368937089d3ed71239786f86Andreas Huber            projected_size_based_on_q =
1214f71323e297a928af368937089d3ed71239786f86Andreas Huber                (int)(Factor * projected_size_based_on_q);
121590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Factor += factor_adjustment;
121690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
121790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (Factor  >= 0.999)
121890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = 0.999;
121990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
122090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
122190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
122290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Work out a size correction factor.
122390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //if ( cpi->this_frame_target > 0 )
122490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //  correction_factor = (100 * cpi->projected_frame_size) / cpi->this_frame_target;
122590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (projected_size_based_on_q > 0)
122690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
122790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
122890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // More heavily damped adjustment used if we have been oscillating either side of target
122990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    switch (damp_var)
123090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
123190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 0:
123290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.75;
123390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
123490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 1:
123590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.375;
123690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
123790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    case 2:
123890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    default:
123990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        adjustment_limit = 0.25;
124090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        break;
124190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
124290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
124390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //if ( (correction_factor > 102) && (Q < cpi->active_worst_quality) )
124490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (correction_factor > 102)
124590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
124690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // We are not already at the worst allowable quality
124790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
124890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
124990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
125090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Keep rate_correction_factor within limits
125190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor > MAX_BPB_FACTOR)
125290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MAX_BPB_FACTOR;
125390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
125490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    //else if ( (correction_factor < 99) && (Q > cpi->active_best_quality) )
125590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else if (correction_factor < 99)
125690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
125790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // We are not already at the best allowable quality
125890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
125990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
126090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
126190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Keep rate_correction_factor within limits
126290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (rate_correction_factor < MIN_BPB_FACTOR)
126390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            rate_correction_factor = MIN_BPB_FACTOR;
126490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
126590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
126690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.frame_type == KEY_FRAME)
126790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->key_frame_rate_correction_factor = rate_correction_factor;
126890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
126990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
127090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
127190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->gf_rate_correction_factor = rate_correction_factor;
127290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
127390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->rate_correction_factor = rate_correction_factor;
127490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
127590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
127690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
127790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int estimate_bits_at_q(VP8_COMP *cpi, int Q)
127890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
127990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Bpm = (int)(.5 + cpi->rate_correction_factor * vp8_bits_per_mb[INTER_FRAME][Q]);
128090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
128190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /* Attempt to retain reasonable accuracy without overflow. The cutoff is
128290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
128390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * largest Bpm takes 20 bits.
128490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
128590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.MBs > (1 << 11))
128690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return (Bpm >> BPER_MB_NORMBITS) * cpi->common.MBs;
128790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
128890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return (Bpm * cpi->common.MBs) >> BPER_MB_NORMBITS;
128990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
129190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
129490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
129590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int Q = cpi->active_worst_quality;
129690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
129790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Reset Zbin OQ value
129890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->zbin_over_quant = 0;
129990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
130090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
130190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
130290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        Q = cpi->oxcf.fixed_q;
130390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
130490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
130590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
130690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.key_q;
130790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
130890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (cpi->common.refresh_alt_ref_frame)
130990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
131090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.alt_q;
131190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
131290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else if (cpi->common.refresh_golden_frame)
131390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
131490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            Q = cpi->oxcf.gold_q;
131590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
131690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
131890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
131990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
132090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int i;
132190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int last_error = INT_MAX;
132290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int target_bits_per_mb;
132390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int bits_per_mb_at_this_q;
132490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        double correction_factor;
132590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
132690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Select the appropriate correction factor based upon type of frame.
132790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
132890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            correction_factor = cpi->key_frame_rate_correction_factor;
132990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
133090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
133190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
133290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->gf_rate_correction_factor;
133390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
133490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->rate_correction_factor;
133590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
133690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
133790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Calculate required scaling factor based on target frame size and size of frame produced using previous Q
133890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
133990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;       // Case where we would overflow int
134090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
134190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
134290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
134390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        i = cpi->active_best_quality;
134490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
134590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        do
134690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
134790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
134890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
134990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (bits_per_mb_at_this_q <= target_bits_per_mb)
135090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
135190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
135290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i;
135390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
135490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Q = i - 1;
135590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
135690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                break;
135790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
135890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
135990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                last_error = bits_per_mb_at_this_q - target_bits_per_mb;
136090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
136190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (++i <= cpi->active_worst_quality);
136290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
136390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
136490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // If we are at MAXQ then enable Q over-run which seeks to claw back additional bits through things like
136590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // the RD multiplier and zero bin size.
136690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (Q >= MAXQ)
136790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
136890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int zbin_oqmax;
136990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
137090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double Factor = 0.99;
137190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            double factor_adjustment = 0.01 / 256.0; //(double)ZBIN_OQ_MAX;
137290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
137390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.frame_type == KEY_FRAME)
137490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = 0; //ZBIN_OQ_MAX/16
137590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else if (cpi->common.refresh_alt_ref_frame || (cpi->common.refresh_golden_frame && !cpi->source_alt_ref_active))
137690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = 16;
137790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
137890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                zbin_oqmax = ZBIN_OQ_MAX;
137990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /*{
138190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
138290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double Oq;
138390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor = Factor/1.2683;
138590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Oq = pow( Factor, (1.0/-0.165) );
138790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
138890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if ( Oq > zbin_oqmax )
138990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Oq = zbin_oqmax;
139090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
139190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->zbin_over_quant = (int)Oq;
139290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }*/
139390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
139490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // Each incrment in the zbin is assumed to have a fixed effect on bitrate. This is not of course true.
139590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // The effect will be highly clip dependent and may well have sudden steps.
139690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // The idea here is to acheive higher effective quantizers than the normal maximum by expanding the zero
139790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            // bin and hence decreasing the number of low magnitude non zero coefficients.
139890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            while (cpi->zbin_over_quant < zbin_oqmax)
139990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
140090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->zbin_over_quant ++;
140190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
140290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->zbin_over_quant > zbin_oqmax)
140390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cpi->zbin_over_quant = zbin_oqmax;
140490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1405f71323e297a928af368937089d3ed71239786f86Andreas Huber                // Adjust bits_per_mb_at_this_q estimate
1406f71323e297a928af368937089d3ed71239786f86Andreas Huber                bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
140790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                Factor += factor_adjustment;
140890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
140990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Factor  >= 0.999)
141090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    Factor = 0.999;
141190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
141290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (bits_per_mb_at_this_q <= target_bits_per_mb)    // Break out if we get down to the target rate
141390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    break;
141490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
141590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
141690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
141790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
141890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
141990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return Q;
142090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
142190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
142290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic int estimate_min_frame_size(VP8_COMP *cpi)
142390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
142490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    double correction_factor;
142590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int bits_per_mb_at_max_q;
142690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
142790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // This funtion returns a default value for the first few frames untill the correction factor has had time to adapt.
142890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.current_video_frame < 10)
142990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
143090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
143190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return (cpi->min_frame_bandwidth);
143290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
143390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            return cpi->per_frame_bandwidth / 3;
143490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
143590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
143690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*  // Select the appropriate correction factor based upon type of frame.
143790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if ( cpi->common.frame_type == KEY_FRAME )
143890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            correction_factor = cpi->key_frame_rate_correction_factor;
143990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
144090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
144190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if ( cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame )
144290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->gf_rate_correction_factor;
144390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
144490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                correction_factor = cpi->rate_correction_factor;
144590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }*/
144690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
144790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // We estimate at half the value we get from vp8_bits_per_mb
144890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    correction_factor = cpi->rate_correction_factor / 2.0;
144990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
145090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    bits_per_mb_at_max_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][MAXQ]);
145190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
145290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    return (bits_per_mb_at_max_q * cpi->common.MBs) >> BPER_MB_NORMBITS;
145390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
145490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
145590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_adjust_key_frame_context(VP8_COMP *cpi)
145690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
145790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
145890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int av_key_frames_per_second;
145990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
146090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Average key frame frequency and size
146190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int total_weight = 0;
146290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int av_key_frame_frequency = 0;
146390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int av_key_frame_bits = 0;
146490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
146590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int output_frame_rate = (unsigned int)(100 * cpi->output_frame_rate);
146690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    unsigned int target_bandwidth = (unsigned int)(100 * cpi->target_bandwidth);
146790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
146890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Clear down mmx registers to allow floating point in what follows
146990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_clear_system_state();  //__asm emms;
147090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
147190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Update the count of total key frame bits
147290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->tot_key_frame_bits += cpi->projected_frame_size;
147390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
147490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // First key frame at start of sequence is a special case. We have no frequency data.
147590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->key_frame_count == 1)
147690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
147790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_frequency = (int)cpi->output_frame_rate * 2;            // Assume a default of 1 kf every 2 seconds
147890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_bits = cpi->projected_frame_size;
147990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frames_per_second  = output_frame_rate / av_key_frame_frequency;  // Note output_frame_rate not cpi->output_frame_rate
148090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
148190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
148290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
1483f71323e297a928af368937089d3ed71239786f86Andreas Huber        int last_kf_interval =
1484f71323e297a928af368937089d3ed71239786f86Andreas Huber                (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1485f71323e297a928af368937089d3ed71239786f86Andreas Huber
148690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // reset keyframe context and calculate weighted average of last KEY_FRAME_CONTEXT keyframes
148790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (i = 0; i < KEY_FRAME_CONTEXT; i++)
148890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
148990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (i < KEY_FRAME_CONTEXT - 1)
149090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
149190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->prior_key_frame_size[i]     = cpi->prior_key_frame_size[i+1];
149290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i+1];
149390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
149490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
149590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
1496f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->prior_key_frame_size[i]     = cpi->projected_frame_size;
1497f71323e297a928af368937089d3ed71239786f86Andreas Huber                cpi->prior_key_frame_distance[i] = last_kf_interval;
149890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
149990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
150090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            av_key_frame_bits      += prior_key_frame_weight[i] * cpi->prior_key_frame_size[i];
150190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            av_key_frame_frequency += prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i];
150290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            total_weight         += prior_key_frame_weight[i];
150390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
150490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
150590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_bits       /= total_weight;
150690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frame_frequency  /= total_weight;
150790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        av_key_frames_per_second  = output_frame_rate / av_key_frame_frequency;
150890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
150990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
151090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
151190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Do we have any key frame overspend to recover?
151290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if ((cpi->pass != 2) && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
151390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
151490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Update the count of key frame overspend to be recovered in subsequent frames
151590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // A portion of the KF overspend is treated as gf overspend (and hence recovered more quickly)
151690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // as the kf is also a gf. Otherwise the few frames following each kf tend to get more bits
151790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // allocated than those following other gfs.
151890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->kf_overspend_bits += (cpi->projected_frame_size - cpi->per_frame_bandwidth) * 7 / 8;
151990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->gf_overspend_bits += (cpi->projected_frame_size - cpi->per_frame_bandwidth) * 1 / 8;
1520538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if(!av_key_frame_frequency)
1521538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            av_key_frame_frequency = 60;
152290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
152390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Work out how much to try and recover per frame.
152490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // For one pass we estimate the number of frames to spread it over based upon past history.
152590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // For two pass we know how many frames there will be till the next kf.
152690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->pass == 2)
152790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
152890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->frames_to_key > 16)
152990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / (int)cpi->frames_to_key;
153090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
153190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / 16;
153290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
153390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
153490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits / (int)av_key_frame_frequency;
153590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
153690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
153790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->frames_since_key = 0;
153890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->last_key_frame_size = cpi->projected_frame_size;
153990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->key_frame_count++;
154090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
154190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
154290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
154390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
154490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Set-up bounds on acceptable frame size:
154590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->oxcf.fixed_q >= 0)
154690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
154790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // Fixed Q scenario: frame size never outranges target (there is no target!)
154890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_under_shoot_limit = 0;
154990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        *frame_over_shoot_limit  = INT_MAX;
155090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
155190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
155290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
155390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (cpi->common.frame_type == KEY_FRAME)
155490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
155590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
155690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
155790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
155890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
155990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
156090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (cpi->common.refresh_alt_ref_frame || cpi->common.refresh_golden_frame)
156190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
156290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
156390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
156490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
156590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
156690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
156790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // For CBR take buffer fullness into account
156890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
156990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
157090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
157190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
157290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Buffer is too full so relax overshoot and tighten undershoot
157390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 12 / 8;
157490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
157590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
157690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
157790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
157890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        // Buffer is too low so relax undershoot and tighten overshoot
157990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 10 / 8;
158090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
158190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
158290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    else
158390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    {
158490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
158590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
158690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    }
158790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
158879f15823c34ae1e423108295e416213200bb280fAndreas Huber                // VBR and CQ mode
158990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                // Note that tighter restrictions here can help quality but hurt encode speed
159090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                else
159190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
159279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    // Stron overshoot limit for constrained quality
159379f15823c34ae1e423108295e416213200bb280fAndreas Huber                    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
159479f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
159579f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
159679f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
159779f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
159879f15823c34ae1e423108295e416213200bb280fAndreas Huber                    else
159979f15823c34ae1e423108295e416213200bb280fAndreas Huber                    {
160079f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
160179f15823c34ae1e423108295e416213200bb280fAndreas Huber                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
160279f15823c34ae1e423108295e416213200bb280fAndreas Huber                    }
160390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
160490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
160590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
160690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
160790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
1608