1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdlib.h>
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h>
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <string.h>
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h>
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <assert.h>
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "math.h"
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/common.h"
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "ratectrl.h"
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropymode.h"
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h"
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/systemdependent.h"
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemv.h"
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MIN_BPB_FACTOR          0.01
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define MAX_BPB_FACTOR          50
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int y_modes[5];
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int uv_modes[4];
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int b_modes[10];
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int inter_y_modes[10];
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int inter_uv_modes[4];
41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int inter_b_modes[10];
42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
44ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Bits Per MB at different Q (Multiplied by 512) */
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define BPER_MB_NORMBITS    9
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
47ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Work in progress recalibration of baseline rate tables based on
48ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * the assumption that bits per mb is inversely proportional to the
49ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * quantizer value.
50ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgconst int vp8_bits_per_mb[2][QINDEX_RANGE] =
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Intra case 450000/Qintra */
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000,
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705,
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545,
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714,
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000,
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651,
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        102272, 100000, 97826,  97826,  95744,  93750,  91836,  90000,
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        88235,  86538,  84905,  83333,  81818,  80357,  78947,  77586,
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        67164,  66176,  65217,  64285,  63380,  62500,  61643,  60810,
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        60000,  59210,  59210,  58441,  57692,  56962,  56250,  55555,
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        54878,  54216,  53571,  52941,  52325,  51724,  51136,  50561,
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        49450,  48387,  47368,  46875,  45918,  45000,  44554,  44117,
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        43269,  42452,  41666,  40909,  40178,  39473,  38793,  38135,
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        36885,  36290,  35714,  35156,  34615,  34090,  33582,  33088,
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        32608,  32142,  31468,  31034,  30405,  29801,  29220,  28662,
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    },
72ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Inter case 285000/Qinter */
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090,
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000,
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555,
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        101785, 98275,  95000,  91935,  89062,  86363,  83823,  81428,
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        79166,  77027,  75000,  73076,  71250,  69512,  67857,  66279,
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        64772,  63333,  61956,  60638,  59375,  58163,  57000,  55882,
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        54807,  53773,  52777,  51818,  50892,  50000,  49137,  47500,
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        45967,  44531,  43181,  41911,  40714,  39583,  38513,  37500,
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        25909,  25446,  25000,  24568,  23949,  23360,  22800,  22265,
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        21755,  21268,  20802,  20357,  19930,  19520,  19127,  18750,
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        18387,  18037,  17701,  17378,  17065,  16764,  16473,  16101,
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        15745,  15405,  15079,  14766,  14467,  14179,  13902,  13636,
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        13380,  13133,  12895,  12666,  12445,  12179,  11924,  11632,
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        11445,  11220,  11003,  10795,  10594,  10401,  10215,  10035,
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int kf_boost_qadjustment[QINDEX_RANGE] =
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    128, 129, 130, 131, 132, 133, 134, 135,
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    136, 137, 138, 139, 140, 141, 142, 143,
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    144, 145, 146, 147, 148, 149, 150, 151,
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    152, 153, 154, 155, 156, 157, 158, 159,
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    160, 161, 162, 163, 164, 165, 166, 167,
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    168, 169, 170, 171, 172, 173, 174, 175,
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    176, 177, 178, 179, 180, 181, 182, 183,
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    184, 185, 186, 187, 188, 189, 190, 191,
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    192, 193, 194, 195, 196, 197, 198, 199,
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    200, 200, 201, 201, 202, 203, 203, 203,
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    204, 204, 205, 205, 206, 206, 207, 207,
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    208, 208, 209, 209, 210, 210, 211, 211,
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    212, 212, 213, 213, 214, 214, 215, 215,
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    216, 216, 217, 217, 218, 218, 219, 219,
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    220, 220, 220, 220, 220, 220, 220, 220,
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    220, 220, 220, 220, 220, 220, 220, 220,
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* #define GFQ_ADJUSTMENT (Q+100) */
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    80, 82, 84, 86, 88, 90, 92, 94,
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    96, 97, 98, 99, 100, 101, 102, 103,
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    104, 105, 106, 107, 108, 109, 110, 111,
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    112, 113, 114, 115, 116, 117, 118, 119,
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    120, 121, 122, 123, 124, 125, 126, 127,
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    128, 129, 130, 131, 132, 133, 134, 135,
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    136, 137, 138, 139, 140, 141, 142, 143,
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    144, 145, 146, 147, 148, 149, 150, 151,
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    152, 153, 154, 155, 156, 157, 158, 159,
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    160, 161, 162, 163, 164, 165, 166, 167,
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    168, 169, 170, 171, 172, 173, 174, 175,
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    176, 177, 178, 179, 180, 181, 182, 183,
129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    184, 184, 185, 185, 186, 186, 187, 187,
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    188, 188, 189, 189, 190, 190, 191, 191,
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    192, 192, 193, 193, 194, 194, 194, 194,
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    195, 195, 196, 196, 197, 197, 198, 198
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgconst int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    100,101,102,103,104,105,105,106,
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    106,107,107,108,109,109,110,111,
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    112,113,114,115,116,117,118,119,
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    120,121,122,123,124,125,126,127,
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    128,129,130,131,132,133,134,135,
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    136,137,138,139,140,141,142,143,
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    144,145,146,147,148,149,150,151,
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    152,153,154,155,156,157,158,159,
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    160,161,162,163,164,165,166,167,
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    168,169,170,170,171,171,172,172,
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    173,173,173,174,174,174,175,175,
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    175,176,176,176,177,177,177,177,
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    178,178,179,179,180,180,181,181,
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    182,182,183,183,184,184,185,185,
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    186,186,187,187,188,188,189,189,
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    190,190,191,191,192,192,193,193,
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*/
156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int kf_gf_boost_qlimits[QINDEX_RANGE] =
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    150, 155, 160, 165, 170, 175, 180, 185,
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    190, 195, 200, 205, 210, 215, 220, 225,
161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    230, 235, 240, 245, 250, 255, 260, 265,
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    270, 275, 280, 285, 290, 295, 300, 305,
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    310, 320, 330, 340, 350, 360, 370, 380,
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    390, 400, 410, 420, 430, 440, 450, 460,
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    470, 480, 490, 500, 510, 520, 530, 540,
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    550, 560, 570, 580, 590, 600, 600, 600,
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    600, 600, 600, 600, 600, 600, 600, 600,
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int gf_adjust_table[101] =
178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    100,
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int gf_intra_usage_adjustment[20] =
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    125, 120, 115, 110, 105, 100,  95,  85,  80,  75,
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    70,  65,  60,  55,  50,  50,  50,  50,  50,  50,
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int gf_interval_table[101] =
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    7,
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3, 4, 5 };
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_save_coding_context(VP8_COMP *cpi)
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CODING_CONTEXT *const cc = & cpi->coding_context;
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Stores a snapshot of key state variables which can subsequently be
221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * restored with a call to vp8_restore_coding_context. These functions are
222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * intended for use in a re-code loop in vp8_compress_frame where the
223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * quantizer value is adjusted between loop iterations.
224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cc->frames_since_key          = cpi->frames_since_key;
227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cc->filter_level             = cpi->common.filter_level;
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cc->frames_till_gf_update_due   = cpi->frames_till_gf_update_due;
22947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cc->frames_since_golden       = cpi->frames_since_golden;
230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->mvc,      cpi->common.fc.mvc);
232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_copy(cc->mvcosts,  cpi->rd_costs.mvcosts);
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->ymode_prob,   cpi->common.fc.ymode_prob);
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->uv_mode_prob,  cpi->common.fc.uv_mode_prob);
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
237d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
238d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Stats */
242474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->y_modes,       y_modes);
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->uv_modes,      uv_modes);
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->b_modes,       b_modes);
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->inter_y_modes,  inter_y_modes);
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->inter_uv_modes, inter_uv_modes);
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cc->inter_b_modes,  inter_b_modes);
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_restore_coding_context(VP8_COMP *cpi)
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    CODING_CONTEXT *const cc = & cpi->coding_context;
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Restore key state variables to the snapshot state stored in the
260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * previous call to vp8_save_coding_context.
261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frames_since_key         =   cc->frames_since_key;
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.filter_level     =   cc->filter_level;
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frames_till_gf_update_due  =   cc->frames_till_gf_update_due;
26647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    cpi->frames_since_golden       =   cc->frames_since_golden;
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cpi->common.fc.mvc, cc->mvc);
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cpi->common.fc.ymode_prob,   cc->ymode_prob);
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(cpi->common.fc.uv_mode_prob,  cc->uv_mode_prob);
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
275d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
276d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Stats */
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(y_modes, cc->y_modes);
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(uv_modes, cc->uv_modes);
282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(b_modes, cc->b_modes);
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(inter_y_modes, cc->inter_y_modes);
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(inter_uv_modes, cc->inter_uv_modes);
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_copy(inter_b_modes, cc->inter_b_modes);
286474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_setup_key_frame(VP8_COMP *cpi)
294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Setup for Key frame: */
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_default_coef_probs(& cpi->common);
298167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memcpy(cpi->common.fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int flag[2] = {1, 1};
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cpi->common.fc.mvc, flag);
303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
305ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Make sure we initialize separate contexts for altref,gold, and normal.
306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * TODO shouldn't need 3 different copies of structure to do this!
307ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
308167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vpx_memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
309167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vpx_memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
310167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    vpx_memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
311167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->common.filter_level = cpi->common.base_qindex * 3 / 8 ;
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Provisional interval before next GF */
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->auto_gold)
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
320167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->common.refresh_golden_frame = 1;
321167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->common.refresh_alt_ref_frame = 1;
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int estimate_bits_at_q(int frame_kind, int Q, int MBs,
326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                              double correction_factor)
327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* Attempt to retain reasonable accuracy without overflow. The cutoff is
331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     * largest Bpm takes 20 bits.
333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     */
334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (MBs > (1 << 11))
335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return (Bpm >> BPER_MB_NORMBITS) * MBs;
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        return (Bpm * MBs) >> BPER_MB_NORMBITS;
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void calc_iframe_target_size(VP8_COMP *cpi)
342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
343ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* boost defaults to half second */
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int kf_boost;
345ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    uint64_t target;
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers to allow floating point in what follows */
348ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_clear_system_state();
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q >= 0)
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int Q = cpi->oxcf.key_q;
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                    cpi->key_frame_rate_correction_factor);
356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->pass == 2)
358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
359ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* New Two pass RC */
360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        target = cpi->per_frame_bandwidth;
361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
362ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* First Frame is a special case */
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (cpi->common.current_video_frame == 0)
364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* 1 Pass there is no information on which to base size so use
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * bandwidth per second * fraction of the initial buffer
367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * level
368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         */
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        target = cpi->oxcf.starting_buffer_level / 2;
370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(target > cpi->oxcf.target_bandwidth * 3 / 2)
372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            target = cpi->oxcf.target_bandwidth * 3 / 2;
373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
376ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* if this keyframe was forced, use a more recent Q estimate */
377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY)
378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ? cpi->avg_frame_qindex : cpi->ni_av_qi;
379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
380ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
381ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Boost depends somewhat on frame rate: only used for 1 layer case. */
3825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if (cpi->oxcf.number_of_layers == 1) {
38347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org          kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
3845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
3855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        else {
386ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org          /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
3875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org          kf_boost = initial_boost;
3885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
390ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
393ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* frame separation adjustment ( down) */
39447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        if (cpi->frames_since_key  < cpi->output_framerate / 2)
395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            kf_boost = (int)(kf_boost
39647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                       * cpi->frames_since_key / (cpi->output_framerate / 2));
397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
398ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Minimal target size is |2* per_frame_bandwidth|. */
399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (kf_boost < 16)
400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            kf_boost = 16;
401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
402474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
403474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.rc_max_intra_bitrate_pct)
407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int max_rate = cpi->per_frame_bandwidth
409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (target > max_rate)
412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            target = max_rate;
413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->this_frame_target = (int)target;
416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
417ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* TODO: if we separate rate targeting from Q targetting, move this.
418ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * Reset the active worst quality to the baseline value for key frames.
419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass != 2)
421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->active_worst_quality = cpi->worst_quality;
422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        FILE *f;
426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        f = fopen("kf_boost.stt", "a");
428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fprintf(f, " %8u %10d %10d %10d\n",
429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fclose(f);
432474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
434474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
435474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
436474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Do the best we can to define the parameters for the next GF based on what
438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * information we have available.
439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void calc_gf_params(VP8_COMP *cpi)
441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Boost = 0;
444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    int gf_frame_useage = 0;      /* Golden frame useage since last GF */
446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                  cpi->recent_ref_frame_usage[LAST_FRAME]   +
448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                  cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                  cpi->recent_ref_frame_usage[ALTREF_FRAME];
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (tot_mbs)
454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (pct_gf_active > gf_frame_useage)
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        gf_frame_useage = pct_gf_active;
458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
459ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Not two pass */
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass != 2)
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
462ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Single Pass lagged mode: TBD */
463167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (0)
464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
467ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Single Pass compression: Has to use current and historical data */
468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
471ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Experimental code */
472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int index = cpi->one_pass_frame_index;
473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
475ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* ************** Experimental code - incomplete */
476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /*
477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double decay_val = 1.0;
478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double IIAccumulator = 0.0;
479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double last_iiaccumulator = 0.0;
480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double IIRatio;
481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for ( i = 0; i < (frames_to_scan - 1); i++ )
485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( index < 0 )
487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    index = MAX_LAG_BUFFERS;
488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                index --;
489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if ( IIRatio > 30.0 )
495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        IIRatio = 30.0;
496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    IIRatio = 30.0;
499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                IIAccumulator += IIRatio * decay_val;
501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (    (i > MIN_GF_INTERVAL) &&
505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    break;
508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                last_iiaccumulator = IIAccumulator;
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = IIAccumulator*100.0/16.0;
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->baseline_gf_interval = i;
514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            */
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /*************************************************************/
519ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* OLD code */
520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
521ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Adjust boost based upon ambient Q */
522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = GFQ_ADJUSTMENT;
523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Adjust based upon most recently measure intra useage */
525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = Boost * gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15) ? cpi->this_frame_percent_intra : 14] / 100;
526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
527ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Adjust gf boost based upon GF usage since last GF */
528474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
532ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* golden frame boost without recode loop often goes awry.  be
533ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * safe by keeping numbers down.
534ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (!cpi->sf.recode_loop)
536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->compressor_speed == 2)
538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Boost = Boost / 2;
539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Apply an upper limit based on Q for 1 pass encodes */
542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0))
543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = kf_gf_boost_qlimits[Q];
544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
545ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Apply lower limits to boost. */
546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (Boost < 110)
547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Boost = 110;
548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
549ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Note the boost used */
550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->last_boost = Boost;
551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Estimate next interval
555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * This is updated once the real frame size/boost is known.
556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q == -1)
558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
559ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        if (cpi->pass == 2)         /* 2 Pass */
560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
563ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        else                            /* 1 Pass */
564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->last_boost > 750)
568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due++;
569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->last_boost > 1000)
571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due++;
572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->last_boost > 1250)
574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due++;
575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->last_boost >= 1500)
577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due ++;
578474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
579474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due)
580474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->frames_till_gf_update_due > cpi->max_gf_interval)
583474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->frames_till_gf_update_due = cpi->max_gf_interval;
584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
586474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
589ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* ARF on or off */
590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass != 2)
591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
592ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* For now Alt ref is not allowed except in 2 pass modes. */
593167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->source_alt_ref_pending = 0;
594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /*if ( cpi->oxcf.fixed_q == -1)
596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
598167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->source_alt_ref_pending = 1;
599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
600167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->source_alt_ref_pending = 0;
601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }*/
602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
603474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
604474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
605474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
606474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void calc_pframe_target_size(VP8_COMP *cpi)
607474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
608474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int min_frame_target;
609167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
610167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
611167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if ( cpi->current_layer > 0)
612167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        cpi->per_frame_bandwidth =
613167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    min_frame_target = 0;
616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 2)
618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        min_frame_target = cpi->min_frame_bandwidth;
620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5))
622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            min_frame_target = cpi->av_per_frame_bandwidth >> 5;
623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (min_frame_target < cpi->per_frame_bandwidth / 4)
625474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        min_frame_target = cpi->per_frame_bandwidth / 4;
626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
628ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Special alt reference frame case */
629167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if((cpi->common.refresh_alt_ref_frame) && (cpi->oxcf.number_of_layers == 1))
630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->pass == 2)
632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
633ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Per frame bit target for the alt ref frame */
634ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->this_frame_target = cpi->per_frame_bandwidth;
636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* One Pass ??? TBD */
639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
641ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Normal frames (gf,and inter) */
642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* 2 pass */
645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->pass == 2)
646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->this_frame_target = cpi->per_frame_bandwidth;
648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* 1 pass */
650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
6521929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org            int Adjustment;
653ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Make rate adjustment to recover bits spent in key frame
654ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * Test to see if the key frame inter data rate correction
655ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * should still be in force
656ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->kf_overspend_bits > 0)
658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target))
662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
664474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->kf_overspend_bits -= Adjustment;
665474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Calculate an inter frame bandwidth target for the next
667ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * few frames designed to recover any extra bits spent on
668ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * the key frame.
669ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
670474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
671474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
672474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->this_frame_target < min_frame_target)
673474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->this_frame_target = min_frame_target;
674474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
675474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
676474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->this_frame_target = cpi->per_frame_bandwidth;
677474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
678ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If appropriate make an adjustment to recover bits spent on a
679ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * recent GF
680ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
681474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cpi->gf_overspend_bits > 0) && (cpi->this_frame_target > min_frame_target))
682474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
6831929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org                Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits) ? cpi->non_gf_bitrate_adjustment : cpi->gf_overspend_bits;
684474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
685474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (Adjustment > (cpi->this_frame_target - min_frame_target))
686474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = (cpi->this_frame_target - min_frame_target);
687474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
688474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->gf_overspend_bits -= Adjustment;
689474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->this_frame_target -= Adjustment;
690474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
691474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
692ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Apply small + and - boosts for non gf frames */
693474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
694474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1)))
695474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
696ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* % Adjustment limited to the range 1% to 10% */
697474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Adjustment = (cpi->last_boost - 100) >> 5;
698474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
699474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (Adjustment < 1)
700474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = 1;
701474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (Adjustment > 10)
702474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = 10;
703474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
704ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Convert to bits */
705474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Adjustment = (cpi->this_frame_target * Adjustment) / 100;
706474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
707474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (Adjustment > (cpi->this_frame_target - min_frame_target))
708474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Adjustment = (cpi->this_frame_target - min_frame_target);
709474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
71047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org                if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1))
711474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->this_frame_target += ((cpi->current_gf_interval - 1) * Adjustment);
712474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
713474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->this_frame_target -= Adjustment;
714474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
715474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
716474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
717474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
718ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Sanity check that the total sum of adjustments is not above the
719ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * maximum allowed That is that having allowed for KF and GF penalties
720ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * we have not pushed the current interframe target to low. If the
721ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * adjustment we apply here is not capable of recovering all the extra
722ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * bits we have spent in the KF or GF then the remainder will have to
723ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * be recovered over a longer time span via other buffer / rate control
724ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * mechanisms.
725ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->this_frame_target < min_frame_target)
727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->this_frame_target = min_frame_target;
728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!cpi->common.refresh_alt_ref_frame)
730ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Note the baseline target data rate for this inter frame. */
731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->inter_frame_target = cpi->this_frame_target;
732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
733ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* One Pass specific code */
734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->pass == 0)
735474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Adapt target frame size with respect to any buffering constraints: */
737474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->buffered_mode)
738474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
739ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            int one_percent_bits = (int)
740ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                (1 + cpi->oxcf.optimal_buffer_level / 100);
741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level))
744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int percent_low = 0;
746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
747ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Decide whether or not we need to adjust the frame data
748ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * rate target.
749ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 *
750ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * If we are are below the optimal buffer fullness level
751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * and adherence to buffering constraints is important to
752ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * the end usage then adjust the per frame target.
753ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
754474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
755474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    (cpi->buffer_level < cpi->oxcf.optimal_buffer_level))
756474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
757ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    percent_low = (int)
758ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        ((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
759ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        one_percent_bits);
760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
761ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Are we overshooting the long term clip data rate... */
762474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (cpi->bits_off_target < 0)
763474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
764ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Adjust per frame data target downwards to compensate. */
765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_low = (int)(100 * -cpi->bits_off_target /
766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                       (cpi->total_byte_count * 8));
767474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
768474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (percent_low > cpi->oxcf.under_shoot_pct)
770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_low = cpi->oxcf.under_shoot_pct;
771474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (percent_low < 0)
772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_low = 0;
773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
774ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* lower the target bandwidth for this frame. */
775167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->this_frame_target -=
776167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        (cpi->this_frame_target * percent_low) / 200;
777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
778ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Are we using allowing control of active_worst_allowed_q
779ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * according to buffer level.
780ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
781167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->auto_worst_q && cpi->ni_frames > 150)
782474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
783ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    int64_t critical_buffer_level;
784ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
785ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* For streaming applications the most important factor is
786ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * cpi->buffer_level as this takes into account the
787ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * specified short term buffering constraints. However,
788ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * hitting the long term clip data rate target is also
789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * important.
790ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
792474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
793ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Take the smaller of cpi->buffer_level and
794ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * cpi->bits_off_target
795ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
796474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        critical_buffer_level =
797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            (cpi->buffer_level < cpi->bits_off_target)
798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            ? cpi->buffer_level : cpi->bits_off_target;
799474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
800ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* For local file playback short term buffering constraints
801ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * are less of an issue
802ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
803474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
804474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
805ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Consider only how we are doing for the clip as a
806ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * whole
807ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
808474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        critical_buffer_level = cpi->bits_off_target;
809474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
810474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
811ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Set the active worst quality based upon the selected
812ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * buffer fullness number.
813ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (critical_buffer_level < cpi->oxcf.optimal_buffer_level)
815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        if ( critical_buffer_level >
817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                             (cpi->oxcf.optimal_buffer_level >> 2) )
818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        {
819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            int64_t qadjustment_range =
820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      cpi->worst_quality - cpi->ni_av_qi;
821474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            int64_t above_base =
822474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      (critical_buffer_level -
823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                       (cpi->oxcf.optimal_buffer_level >> 2));
824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
825ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                            /* Step active worst quality down from
826ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             * cpi->ni_av_qi when (critical_buffer_level ==
827ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             * cpi->optimal_buffer_level) to
828ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             * cpi->worst_quality when
829ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             * (critical_buffer_level ==
830ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             *     cpi->optimal_buffer_level >> 2)
831ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                             */
832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            cpi->active_worst_quality =
833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                cpi->worst_quality -
834ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                (int)((qadjustment_range * above_base) /
835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                 (cpi->oxcf.optimal_buffer_level*3>>2));
836474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        }
837474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        else
838474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        {
839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            cpi->active_worst_quality = cpi->worst_quality;
840474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        }
841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
844474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->active_worst_quality = cpi->ni_av_qi;
845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_worst_quality = cpi->worst_quality;
850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
853474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
854474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int percent_high = 0;
855474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
856474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                     && (cpi->buffer_level > cpi->oxcf.optimal_buffer_level))
858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
859ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    percent_high = (int)((cpi->buffer_level
860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                    - cpi->oxcf.optimal_buffer_level)
861ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                                   / one_percent_bits);
862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
863474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level)
864474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_high = (int)((100 * cpi->bits_off_target)
866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                         / (cpi->total_byte_count * 8));
867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
869474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (percent_high > cpi->oxcf.over_shoot_pct)
870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_high = cpi->oxcf.over_shoot_pct;
871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (percent_high < 0)
872474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    percent_high = 0;
873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
874474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->this_frame_target += (cpi->this_frame_target *
875167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                          percent_high) / 200;
876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
877ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Are we allowing control of active_worst_allowed_q according
878ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * to buffer level.
879ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
880167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                if (cpi->auto_worst_q && cpi->ni_frames > 150)
881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
882ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* When using the relaxed buffer model stick to the
883ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     * user specified value
884ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                     */
885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_worst_quality = cpi->ni_av_qi;
886474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
887474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
888474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
889474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->active_worst_quality = cpi->worst_quality;
890474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
891474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
892474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
893ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Set active_best_quality to prevent quality rising too high */
894474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_best_quality = cpi->best_quality;
895474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
896ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Worst quality obviously must not be better than best quality */
897474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->active_worst_quality <= cpi->active_best_quality)
898474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->active_worst_quality = cpi->active_best_quality + 1;
899474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
900167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if(cpi->active_worst_quality > 127)
901167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->active_worst_quality = 127;
902474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
903ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Unbuffered mode (eg. video conferencing) */
904474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
905474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
906ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Set the active worst quality */
907474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_worst_quality = cpi->worst_quality;
908474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
909474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
910ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Special trap for constrained quality mode
911ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * "active_worst_quality" may never drop below cq level
912ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * for any frame type.
913ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
914474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
915474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             cpi->active_worst_quality < cpi->cq_target_quality)
916474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
917474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->active_worst_quality = cpi->cq_target_quality;
918474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
921ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Test to see if we have to drop a frame
922ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * The auto-drop frame code is only used in buffered mode.
923ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * In unbufferd mode (eg vide conferencing) the descision to
924ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * code or drop a frame is made outside the codec in response to real
925ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * world comms or buffer considerations.
926ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
927ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->drop_frames_allowed &&
928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
929ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        ((cpi->common.frame_type != KEY_FRAME)))
930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
931ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Check for a buffer underun-crisis in which case we have to drop
932ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * a frame
933ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
934474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if ((cpi->buffer_level < 0))
935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
937474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f = fopen("dec.stt", "a");
938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    (int) cpi->common.current_video_frame,
940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->decimation_factor, cpi->common.horiz_scale,
941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
943474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
944167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->drop_frame = 1;
945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
946ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Update the buffer level variable. */
947474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->bits_off_target += cpi->av_per_frame_bandwidth;
948167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
949ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org              cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
950474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->buffer_level = cpi->bits_off_target;
951d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
952d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org            if (cpi->oxcf.number_of_layers > 1) {
953d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org              unsigned int i;
954d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
955d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org              // Propagate bits saved by dropping the frame to higher layers.
956d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org              for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers;
957d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                  i++) {
958d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                LAYER_CONTEXT *lc = &cpi->layer_context[i];
959d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                lc->bits_off_target += (int)(lc->target_bandwidth /
960d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                                             lc->framerate);
961d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                if (lc->bits_off_target > lc->maximum_buffer_size)
962d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                  lc->bits_off_target = lc->maximum_buffer_size;
963d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org                lc->buffer_level = lc->bits_off_target;
964d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org              }
965d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org            }
966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
969ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Adjust target frame size for Golden Frames: */
970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.error_resilient_mode == 0 &&
971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame)
972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
975ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        int gf_frame_useage = 0;      /* Golden frame useage since last GF */
976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME]  +
977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                      cpi->recent_ref_frame_usage[LAST_FRAME]   +
978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                      cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
979474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                      cpi->recent_ref_frame_usage[ALTREF_FRAME];
980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int pct_gf_active = (100 * cpi->gf_active_count) / (cpi->common.mb_rows * cpi->common.mb_cols);
982474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (tot_mbs)
984474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] + cpi->recent_ref_frame_usage[ALTREF_FRAME]) * 100 / tot_mbs;
985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
986474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (pct_gf_active > gf_frame_useage)
987474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            gf_frame_useage = pct_gf_active;
988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
989ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Is a fixed manual GF frequency being used */
990474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->auto_gold)
991474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
992ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* For one pass throw a GF if recent frame intra useage is
993ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * low or the GF useage is high
994ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((cpi->pass == 0) && (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5))
996167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->common.refresh_golden_frame = 1;
997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
998ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Two pass GF descision */
999474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else if (cpi->pass == 2)
1000167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->common.refresh_golden_frame = 1;
1001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1002474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
1004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1005ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Debug stats */
1006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (0)
1007474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1008474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            FILE *f;
1009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            f = fopen("gf_useaget.stt", "a");
1011474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
1012474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->common.current_video_frame,  cpi->gfu_boost, GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
1013474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fclose(f);
1014474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1017474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1018167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->common.refresh_golden_frame == 1)
1019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
1021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1022ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            if (0)
1023474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1024474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                FILE *f;
1025474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1026474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                f = fopen("GFexit.stt", "a");
1027474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
1028474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                fclose(f);
1029474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1031474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->auto_adjust_gold_quantizer)
1034474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                calc_gf_params(cpi);
1036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1038ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If we are using alternate ref instead of gf then do not apply the
1039ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * boost It will instead be applied to the altref update Jims
1040ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * modified boost
1041ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (!cpi->source_alt_ref_active)
1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->oxcf.fixed_q < 0)
1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
1046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->pass == 2)
1047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1048ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* The spend on the GF is defined in the two pass
1049ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * code for two pass encodes
1050ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
1051ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        cpi->this_frame_target = cpi->per_frame_bandwidth;
1052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        int Boost = cpi->last_boost;
1056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        int frames_in_section = cpi->frames_till_gf_update_due + 1;
1057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
1058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        int bits_in_section = cpi->inter_frame_target * frames_in_section;
1059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1060ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Normalize Altboost and allocations chunck down to
1061ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * prevent overflow
1062ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
1063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        while (Boost > 1000)
1064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        {
1065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            Boost /= 2;
1066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            allocation_chunks /= 2;
1067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        }
1068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1069ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Avoid loss of precision but avoid overflow */
1070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        if ((bits_in_section >> 7) > allocation_chunks)
1071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            cpi->this_frame_target = Boost * (bits_in_section / allocation_chunks);
1072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        else
1073474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            cpi->this_frame_target = (Boost * bits_in_section) / allocation_chunks;
1074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
1076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
1077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->this_frame_target =
1078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0)
1079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                         * cpi->last_boost) / 100;
1080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1081474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1082ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* If there is an active ARF at this location use the minimum
1083ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * bits on this frame even if it is a contructed arf.
1084ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * The active maximum quantizer insures that an appropriate
1085ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * number of bits will be spent if needed for contstructed ARFs.
1086ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->this_frame_target = 0;
1090474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1095474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1096167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1097167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    cpi->per_frame_bandwidth = old_per_frame_bandwidth;
1098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var)
1102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int    Q = cpi->common.base_qindex;
1104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int    correction_factor = 100;
1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double rate_correction_factor;
1106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    double adjustment_limit;
1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int    projected_size_based_on_q = 0;
1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers to allow floating point in what follows */
1111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_clear_system_state();
1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.frame_type == KEY_FRAME)
1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        rate_correction_factor = cpi->key_frame_rate_correction_factor;
1116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1119d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        if (cpi->oxcf.number_of_layers == 1 &&
1120d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org           (cpi->common.refresh_alt_ref_frame ||
1121d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->common.refresh_golden_frame))
1122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            rate_correction_factor = cpi->gf_rate_correction_factor;
1123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            rate_correction_factor = cpi->rate_correction_factor;
1125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Work out how big we would have expected the frame to be at this Q
1128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * given the current correction factor. Stay in double to avoid int
1129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * overflow when values are large
1130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    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));
1132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Make some allowance for cpi->zbin_over_quant */
1134d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    if (cpi->mb.zbin_over_quant > 0)
1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1136d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        int Z = cpi->mb.zbin_over_quant;
1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double Factor = 0.99;
1138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        double factor_adjustment = 0.01 / 256.0;
1139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        while (Z > 0)
1141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Z --;
1143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            projected_size_based_on_q =
1144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                (int)(Factor * projected_size_based_on_q);
1145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Factor += factor_adjustment;
1146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (Factor  >= 0.999)
1148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Factor = 0.999;
1149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Work out a size correction factor. */
1153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (projected_size_based_on_q > 0)
1154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        correction_factor = (100 * cpi->projected_frame_size) / projected_size_based_on_q;
1155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* More heavily damped adjustment used if we have been oscillating
1157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * either side of target
1158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    switch (damp_var)
1160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 0:
1162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        adjustment_limit = 0.75;
1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 1:
1165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        adjustment_limit = 0.375;
1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    case 2:
1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    default:
1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        adjustment_limit = 0.25;
1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        break;
1171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (correction_factor > 102)
1174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* We are not already at the worst allowable quality */
1176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        correction_factor = (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
1177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
1178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1179ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Keep rate_correction_factor within limits */
1180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (rate_correction_factor > MAX_BPB_FACTOR)
1181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            rate_correction_factor = MAX_BPB_FACTOR;
1182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else if (correction_factor < 99)
1184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* We are not already at the best allowable quality */
1186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        correction_factor = (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
1187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        rate_correction_factor = ((rate_correction_factor * correction_factor) / 100);
1188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Keep rate_correction_factor within limits */
1190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (rate_correction_factor < MIN_BPB_FACTOR)
1191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            rate_correction_factor = MIN_BPB_FACTOR;
1192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->common.frame_type == KEY_FRAME)
1195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->key_frame_rate_correction_factor = rate_correction_factor;
1196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1198d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        if (cpi->oxcf.number_of_layers == 1 &&
1199d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org           (cpi->common.refresh_alt_ref_frame ||
1200d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->common.refresh_golden_frame))
1201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->gf_rate_correction_factor = rate_correction_factor;
1202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->rate_correction_factor = rate_correction_factor;
1204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame)
1209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int Q = cpi->active_worst_quality;
1211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Reset Zbin OQ value */
1213d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.zbin_over_quant = 0;
1214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q >= 0)
1216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        Q = cpi->oxcf.fixed_q;
1218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.frame_type == KEY_FRAME)
1220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Q = cpi->oxcf.key_q;
1222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1223d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        else if (cpi->oxcf.number_of_layers == 1 &&
1224d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->common.refresh_alt_ref_frame)
1225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Q = cpi->oxcf.alt_q;
1227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1228d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        else if (cpi->oxcf.number_of_layers == 1  &&
1229d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->common.refresh_golden_frame)
1230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            Q = cpi->oxcf.gold_q;
1232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i;
1237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int last_error = INT_MAX;
1238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int target_bits_per_mb;
1239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int bits_per_mb_at_this_q;
1240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        double correction_factor;
1241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Select the appropriate correction factor based upon type of frame. */
1243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.frame_type == KEY_FRAME)
1244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            correction_factor = cpi->key_frame_rate_correction_factor;
1245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1247d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            if (cpi->oxcf.number_of_layers == 1 &&
1248d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org               (cpi->common.refresh_alt_ref_frame ||
1249d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->common.refresh_golden_frame))
1250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                correction_factor = cpi->gf_rate_correction_factor;
1251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                correction_factor = cpi->rate_correction_factor;
1253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Calculate required scaling factor based on target frame size and
1256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * size of frame produced using previous Q
1257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
1259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Case where we would overflow int */
1260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs) << BPER_MB_NORMBITS;
1261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
1263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        i = cpi->active_best_quality;
1265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        do
1267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            bits_per_mb_at_this_q = (int)(.5 + correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (bits_per_mb_at_this_q <= target_bits_per_mb)
1271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
1273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = i;
1274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
1275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Q = i - 1;
1276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                break;
1278474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                last_error = bits_per_mb_at_this_q - target_bits_per_mb;
1281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1282474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        while (++i <= cpi->active_worst_quality);
1283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If we are at MAXQ then enable Q over-run which seeks to claw
1286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * back additional bits through things like the RD multiplier
1287ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * and zero bin size.
1288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (Q >= MAXQ)
1290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int zbin_oqmax;
1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            double Factor = 0.99;
1294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            double factor_adjustment = 0.01 / 256.0;
1295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->common.frame_type == KEY_FRAME)
1297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                zbin_oqmax = 0;
1298d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            else if (cpi->oxcf.number_of_layers == 1 &&
1299d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                (cpi->common.refresh_alt_ref_frame ||
1300d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                (cpi->common.refresh_golden_frame &&
1301d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                 !cpi->source_alt_ref_active)))
1302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                zbin_oqmax = 16;
1303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                zbin_oqmax = ZBIN_OQ_MAX;
1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /*{
1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                double Oq;
1309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Factor = Factor/1.2683;
1311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Oq = pow( Factor, (1.0/-0.165) );
1313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( Oq > zbin_oqmax )
1315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Oq = zbin_oqmax;
1316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->zbin_over_quant = (int)Oq;
1318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }*/
1319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1320ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Each incrment in the zbin is assumed to have a fixed effect
1321ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * on bitrate. This is not of course true. The effect will be
1322ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * highly clip dependent and may well have sudden steps. The
1323ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * idea here is to acheive higher effective quantizers than the
1324ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * normal maximum by expanding the zero bin and hence
1325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * decreasing the number of low magnitude non zero coefficients.
1326ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
1327d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            while (cpi->mb.zbin_over_quant < zbin_oqmax)
1328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1329d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.zbin_over_quant ++;
1330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1331d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                if (cpi->mb.zbin_over_quant > zbin_oqmax)
1332d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.zbin_over_quant = zbin_oqmax;
1333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1334ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Adjust bits_per_mb_at_this_q estimate */
1335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
1336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                Factor += factor_adjustment;
1337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (Factor  >= 0.999)
1339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    Factor = 0.999;
1340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1341ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Break out if we get down to the target rate */
1342ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                if (bits_per_mb_at_this_q <= target_bits_per_mb)
1343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    break;
1344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return Q;
1350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic int estimate_keyframe_frequency(VP8_COMP *cpi)
1354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
1356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1357ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Average key frame frequency */
1358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int av_key_frame_frequency = 0;
1359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* First key frame at start of sequence is a special case. We have no
1361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     * frequency data.
1362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     */
1363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->key_frame_count == 1)
1364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
1366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * whichever is smaller.
1367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         */
1368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int key_freq = cpi->oxcf.key_freq>0 ? cpi->oxcf.key_freq : 1;
136947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org        av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
1370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
1372fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org            av_key_frame_frequency = key_freq;
1373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
1375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            = av_key_frame_frequency;
1376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1379474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int total_weight = 0;
1380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int last_kf_interval =
1381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* reset keyframe context and calculate weighted average of last
1384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * KEY_FRAME_CONTEXT keyframes
1385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         */
1386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (i = 0; i < KEY_FRAME_CONTEXT; i++)
1387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (i < KEY_FRAME_CONTEXT - 1)
1389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->prior_key_frame_distance[i]
1390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    = cpi->prior_key_frame_distance[i+1];
1391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->prior_key_frame_distance[i] = last_kf_interval;
1393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            av_key_frame_frequency += prior_key_frame_weight[i]
1395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      * cpi->prior_key_frame_distance[i];
1396474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            total_weight += prior_key_frame_weight[i];
1397474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1398474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        av_key_frame_frequency  /= total_weight;
1400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1402fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    // TODO (marpan): Given the checks above, |av_key_frame_frequency|
1403fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    // should always be above 0. But for now we keep the sanity check in.
1404fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    if (av_key_frame_frequency == 0)
1405fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org        av_key_frame_frequency = 1;
1406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return av_key_frame_frequency;
1407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_adjust_key_frame_context(VP8_COMP *cpi)
1411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1412ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Clear down mmx registers to allow floating point in what follows */
1413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_clear_system_state();
1414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Do we have any key frame overspend to recover? */
1416ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Two-pass overspend handled elsewhere. */
1417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cpi->pass != 2)
1418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         && (cpi->projected_frame_size > cpi->per_frame_bandwidth))
1419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int overspend;
1421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Update the count of key frame overspend to be recovered in
1423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * subsequent frames. A portion of the KF overspend is treated as gf
1424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * overspend (and hence recovered more quickly) as the kf is also a
1425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * gf. Otherwise the few frames following each kf tend to get more
1426474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         * bits allocated than those following other gfs.
1427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org         */
1428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
1429167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1430167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->oxcf.number_of_layers > 1)
1431167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->kf_overspend_bits += overspend;
1432167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        else
1433167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        {
1434167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->kf_overspend_bits += overspend * 7 / 8;
1435167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->gf_overspend_bits += overspend * 1 / 8;
1436167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        }
1437474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1438474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Work out how much to try and recover per frame. */
1439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->kf_bitrate_adjustment = cpi->kf_overspend_bits
1440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                     / estimate_keyframe_frequency(cpi);
1441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frames_since_key = 0;
1444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->key_frame_count++;
1445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit)
1449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1450ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set-up bounds on acceptable frame size: */
1451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->oxcf.fixed_q >= 0)
1452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1453ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Fixed Q scenario: frame size never outranges target
1454ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * (there is no target!)
1455ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *frame_under_shoot_limit = 0;
1457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        *frame_over_shoot_limit  = INT_MAX;
1458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.frame_type == KEY_FRAME)
1462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
1464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
1465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1468167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if (cpi->oxcf.number_of_layers > 1 ||
1469167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->common.refresh_alt_ref_frame ||
1470167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                cpi->common.refresh_golden_frame)
1471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
1473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
1474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
1476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1477ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* For CBR take buffer fullness into account */
1478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
1479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
1480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level + cpi->oxcf.maximum_buffer_size) >> 1))
1481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1482ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Buffer is too full so relax overshoot and tighten
1483ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * undershoot
1484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
1485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_over_shoot_limit  = cpi->this_frame_target * 12 / 8;
1486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_under_shoot_limit = cpi->this_frame_target * 6 / 8;
1487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else if (cpi->buffer_level <= (cpi->oxcf.optimal_buffer_level >> 1))
1489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1490ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                        /* Buffer is too low so relax undershoot and tighten
1491ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         * overshoot
1492ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                         */
1493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_over_shoot_limit  = cpi->this_frame_target * 10 / 8;
1494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_under_shoot_limit = cpi->this_frame_target * 4 / 8;
1495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
1497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
1499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
1500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
1502ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* VBR and CQ mode */
1503ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* Note that tighter restrictions here can help quality
1504ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * but hurt encode speed
1505ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
1506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
1507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
1508ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Stron overshoot limit for constrained quality */
1509474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY)
1510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
1512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
1513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
1515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
1516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
1517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
1518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
1519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
1520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
15225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1523ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* For very small rate targets where the fractional adjustment
1524ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * (eg * 7/8) may be tiny make sure there is at least a minimum
1525ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * range.
1526ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
15275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        *frame_over_shoot_limit += 200;
15285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        *frame_under_shoot_limit -= 200;
15295c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if ( *frame_under_shoot_limit < 0 )
15305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            *frame_under_shoot_limit = 0;
15315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1533474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1536ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* return of 0 means drop frame */
1537474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_pick_frame_size(VP8_COMP *cpi)
1538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *cm = &cpi->common;
1540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
1542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        calc_iframe_target_size(cpi);
1543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        calc_pframe_target_size(cpi);
1546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1547ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Check if we're dropping the frame: */
1548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->drop_frame)
1549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1550167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            cpi->drop_frame = 0;
1551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            return 0;
1552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return 1;
1555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1556