Coverage Report

Created: 2024-09-06 07:53

/src/libvpx/vp8/encoder/ratectrl.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
 *  that can be found in the LICENSE file in the root of the source
6
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
9
 */
10
11
#include <stdlib.h>
12
#include <stdio.h>
13
#include <string.h>
14
#include <limits.h>
15
#include <assert.h>
16
17
#include "math.h"
18
#include "vp8/common/common.h"
19
#include "ratectrl.h"
20
#include "vp8/common/entropymode.h"
21
#include "vpx_mem/vpx_mem.h"
22
#include "vp8/common/systemdependent.h"
23
#include "encodemv.h"
24
#include "vpx_dsp/vpx_dsp_common.h"
25
#include "vpx_ports/system_state.h"
26
27
34.6k
#define MIN_BPB_FACTOR 0.01
28
42.8k
#define MAX_BPB_FACTOR 50
29
30
extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
31
32
#ifdef MODE_STATS
33
extern int y_modes[5];
34
extern int uv_modes[4];
35
extern int b_modes[10];
36
37
extern int inter_y_modes[10];
38
extern int inter_uv_modes[4];
39
extern int inter_b_modes[10];
40
#endif
41
42
/* Bits Per MB at different Q (Multiplied by 512) */
43
265k
#define BPER_MB_NORMBITS 9
44
45
/* Work in progress recalibration of baseline rate tables based on
46
 * the assumption that bits per mb is inversely proportional to the
47
 * quantizer value.
48
 */
49
const int vp8_bits_per_mb[2][QINDEX_RANGE] = {
50
  /* Intra case 450000/Qintra */
51
  {
52
      1125000, 900000, 750000, 642857, 562500, 500000, 450000, 450000, 409090,
53
      375000,  346153, 321428, 300000, 281250, 264705, 264705, 250000, 236842,
54
      225000,  225000, 214285, 214285, 204545, 204545, 195652, 195652, 187500,
55
      180000,  180000, 173076, 166666, 160714, 155172, 150000, 145161, 140625,
56
      136363,  132352, 128571, 125000, 121621, 121621, 118421, 115384, 112500,
57
      109756,  107142, 104651, 102272, 100000, 97826,  97826,  95744,  93750,
58
      91836,   90000,  88235,  86538,  84905,  83333,  81818,  80357,  78947,
59
      77586,   76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
60
      67164,   66176,  65217,  64285,  63380,  62500,  61643,  60810,  60000,
61
      59210,   59210,  58441,  57692,  56962,  56250,  55555,  54878,  54216,
62
      53571,   52941,  52325,  51724,  51136,  50561,  49450,  48387,  47368,
63
      46875,   45918,  45000,  44554,  44117,  43269,  42452,  41666,  40909,
64
      40178,   39473,  38793,  38135,  36885,  36290,  35714,  35156,  34615,
65
      34090,   33582,  33088,  32608,  32142,  31468,  31034,  30405,  29801,
66
      29220,   28662,
67
  },
68
  /* Inter case 285000/Qinter */
69
  {
70
      712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090, 237500,
71
      219230, 203571, 190000, 178125, 167647, 158333, 150000, 142500, 135714,
72
      129545, 123913, 118750, 114000, 109615, 105555, 101785, 98275,  95000,
73
      91935,  89062,  86363,  83823,  81428,  79166,  77027,  75000,  73076,
74
      71250,  69512,  67857,  66279,  64772,  63333,  61956,  60638,  59375,
75
      58163,  57000,  55882,  54807,  53773,  52777,  51818,  50892,  50000,
76
      49137,  47500,  45967,  44531,  43181,  41911,  40714,  39583,  38513,
77
      37500,  36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
78
      30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,  25909,
79
      25446,  25000,  24568,  23949,  23360,  22800,  22265,  21755,  21268,
80
      20802,  20357,  19930,  19520,  19127,  18750,  18387,  18037,  17701,
81
      17378,  17065,  16764,  16473,  16101,  15745,  15405,  15079,  14766,
82
      14467,  14179,  13902,  13636,  13380,  13133,  12895,  12666,  12445,
83
      12179,  11924,  11632,  11445,  11220,  11003,  10795,  10594,  10401,
84
      10215,  10035,
85
  }
86
};
87
88
static const int kf_boost_qadjustment[QINDEX_RANGE] = {
89
  128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
90
  143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
91
  158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
92
  173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
93
  188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201,
94
  201, 202, 203, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208,
95
  209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
96
  216, 217, 217, 218, 218, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220,
97
  220, 220, 220, 220, 220, 220, 220, 220,
98
};
99
100
/* #define GFQ_ADJUSTMENT (Q+100) */
101
5.39k
#define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
102
const int vp8_gf_boost_qadjustment[QINDEX_RANGE] = {
103
  80,  82,  84,  86,  88,  90,  92,  94,  96,  97,  98,  99,  100, 101, 102,
104
  103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
105
  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
106
  133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
107
  148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
108
  163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
109
  178, 179, 180, 181, 182, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188,
110
  188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 194, 194,
111
  195, 195, 196, 196, 197, 197, 198, 198
112
};
113
114
/*
115
const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
116
{
117
    100,101,102,103,104,105,105,106,
118
    106,107,107,108,109,109,110,111,
119
    112,113,114,115,116,117,118,119,
120
    120,121,122,123,124,125,126,127,
121
    128,129,130,131,132,133,134,135,
122
    136,137,138,139,140,141,142,143,
123
    144,145,146,147,148,149,150,151,
124
    152,153,154,155,156,157,158,159,
125
    160,161,162,163,164,165,166,167,
126
    168,169,170,170,171,171,172,172,
127
    173,173,173,174,174,174,175,175,
128
    175,176,176,176,177,177,177,177,
129
    178,178,179,179,180,180,181,181,
130
    182,182,183,183,184,184,185,185,
131
    186,186,187,187,188,188,189,189,
132
    190,190,191,191,192,192,193,193,
133
};
134
*/
135
136
static const int kf_gf_boost_qlimits[QINDEX_RANGE] = {
137
  150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220,
138
  225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295,
139
  300, 305, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430,
140
  440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580,
141
  590, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
142
  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
143
  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
144
  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
145
  600, 600, 600, 600, 600, 600, 600, 600,
146
};
147
148
static const int gf_adjust_table[101] = {
149
  100, 115, 130, 145, 160, 175, 190, 200, 210, 220, 230, 240, 260, 270, 280,
150
  290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 400, 400, 400,
151
  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
152
  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
153
  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
154
  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
155
  400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
156
};
157
158
static const int gf_intra_usage_adjustment[20] = {
159
  125, 120, 115, 110, 105, 100, 95, 85, 80, 75,
160
  70,  65,  60,  55,  50,  50,  50, 50, 50, 50,
161
};
162
163
static const int gf_interval_table[101] = {
164
  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
165
  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,
166
  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
167
  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
168
  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
169
  10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
170
};
171
172
static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3,
173
                                                                        4, 5 };
174
175
70.0k
void vp8_save_coding_context(VP8_COMP *cpi) {
176
70.0k
  CODING_CONTEXT *const cc = &cpi->coding_context;
177
178
  /* Stores a snapshot of key state variables which can subsequently be
179
   * restored with a call to vp8_restore_coding_context. These functions are
180
   * intended for use in a re-code loop in vp8_compress_frame where the
181
   * quantizer value is adjusted between loop iterations.
182
   */
183
184
70.0k
  cc->frames_since_key = cpi->frames_since_key;
185
70.0k
  cc->filter_level = cpi->common.filter_level;
186
70.0k
  cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due;
187
70.0k
  cc->frames_since_golden = cpi->frames_since_golden;
188
189
70.0k
  vp8_copy(cc->mvc, cpi->common.fc.mvc);
190
70.0k
  vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts);
191
192
70.0k
  vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
193
70.0k
  vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
194
195
70.0k
  vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
196
70.0k
  vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
197
198
/* Stats */
199
#ifdef MODE_STATS
200
  vp8_copy(cc->y_modes, y_modes);
201
  vp8_copy(cc->uv_modes, uv_modes);
202
  vp8_copy(cc->b_modes, b_modes);
203
  vp8_copy(cc->inter_y_modes, inter_y_modes);
204
  vp8_copy(cc->inter_uv_modes, inter_uv_modes);
205
  vp8_copy(cc->inter_b_modes, inter_b_modes);
206
#endif
207
208
70.0k
  cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
209
70.0k
}
210
211
18.0k
void vp8_restore_coding_context(VP8_COMP *cpi) {
212
18.0k
  CODING_CONTEXT *const cc = &cpi->coding_context;
213
214
  /* Restore key state variables to the snapshot state stored in the
215
   * previous call to vp8_save_coding_context.
216
   */
217
218
18.0k
  cpi->frames_since_key = cc->frames_since_key;
219
18.0k
  cpi->common.filter_level = cc->filter_level;
220
18.0k
  cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due;
221
18.0k
  cpi->frames_since_golden = cc->frames_since_golden;
222
223
18.0k
  vp8_copy(cpi->common.fc.mvc, cc->mvc);
224
225
18.0k
  vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
226
227
18.0k
  vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob);
228
18.0k
  vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob);
229
230
18.0k
  vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
231
18.0k
  vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
232
233
/* Stats */
234
#ifdef MODE_STATS
235
  vp8_copy(y_modes, cc->y_modes);
236
  vp8_copy(uv_modes, cc->uv_modes);
237
  vp8_copy(b_modes, cc->b_modes);
238
  vp8_copy(inter_y_modes, cc->inter_y_modes);
239
  vp8_copy(inter_uv_modes, cc->inter_uv_modes);
240
  vp8_copy(inter_b_modes, cc->inter_b_modes);
241
#endif
242
243
18.0k
  cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
244
18.0k
}
245
246
18.6k
void vp8_setup_key_frame(VP8_COMP *cpi) {
247
  /* Setup for Key frame: */
248
249
18.6k
  vp8_default_coef_probs(&cpi->common);
250
251
18.6k
  memcpy(cpi->common.fc.mvc, vp8_default_mv_context,
252
18.6k
         sizeof(vp8_default_mv_context));
253
18.6k
  {
254
18.6k
    int flag[2] = { 1, 1 };
255
18.6k
    vp8_build_component_cost_table(
256
18.6k
        cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flag);
257
18.6k
  }
258
259
  /* Make sure we initialize separate contexts for altref,gold, and normal.
260
   * TODO shouldn't need 3 different copies of structure to do this!
261
   */
262
18.6k
  memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
263
18.6k
  memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
264
18.6k
  memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
265
266
18.6k
  cpi->common.filter_level = cpi->common.base_qindex * 3 / 8;
267
268
  /* Provisional interval before next GF */
269
18.6k
  if (cpi->auto_gold) {
270
18.6k
    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
271
18.6k
  } else {
272
0
    cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
273
0
  }
274
275
18.6k
  cpi->common.refresh_golden_frame = 1;
276
18.6k
  cpi->common.refresh_alt_ref_frame = 1;
277
18.6k
}
278
279
static int estimate_bits_at_q(int frame_kind, int Q, int MBs,
280
0
                              double correction_factor) {
281
0
  int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
282
283
  /* Attempt to retain reasonable accuracy without overflow. The cutoff is
284
   * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
285
   * largest Bpm takes 20 bits.
286
   */
287
0
  if (MBs > (1 << 11)) {
288
0
    return (Bpm >> BPER_MB_NORMBITS) * MBs;
289
0
  } else {
290
0
    return (Bpm * MBs) >> BPER_MB_NORMBITS;
291
0
  }
292
0
}
293
294
12.1k
static void calc_iframe_target_size(VP8_COMP *cpi) {
295
  /* boost defaults to half second */
296
12.1k
  int kf_boost;
297
12.1k
  uint64_t target;
298
299
  /* Clear down mmx registers to allow floating point in what follows */
300
12.1k
  vpx_clear_system_state();
301
302
12.1k
  if (cpi->oxcf.fixed_q >= 0) {
303
0
    int Q = cpi->oxcf.key_q;
304
305
0
    target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
306
0
                                cpi->key_frame_rate_correction_factor);
307
12.1k
  } else if (cpi->pass == 2) {
308
    /* New Two pass RC */
309
0
    target = cpi->per_frame_bandwidth;
310
0
  }
311
  /* First Frame is a special case */
312
12.1k
  else if (cpi->common.current_video_frame == 0) {
313
    /* 1 Pass there is no information on which to base size so use
314
     * bandwidth per second * fraction of the initial buffer
315
     * level
316
     */
317
4.69k
    target = (uint64_t)cpi->oxcf.starting_buffer_level / 2;
318
319
4.69k
    if (target > cpi->oxcf.target_bandwidth * 3 / 2) {
320
4.53k
      target = cpi->oxcf.target_bandwidth * 3 / 2;
321
4.53k
    }
322
7.49k
  } else {
323
    /* if this keyframe was forced, use a more recent Q estimate */
324
7.49k
    int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ? cpi->avg_frame_qindex
325
7.49k
                                                       : cpi->ni_av_qi;
326
327
7.49k
    int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
328
    /* Boost depends somewhat on frame rate: only used for 1 layer case. */
329
7.49k
    if (cpi->oxcf.number_of_layers == 1) {
330
7.49k
      kf_boost =
331
7.49k
          VPXMAX(initial_boost, (int)round(2 * cpi->output_framerate - 16));
332
      // cpi->output_framerate may be as large as 10M. Keep kf_boost small
333
      // enough to allow for integer math when multiplying by values in
334
      // kf_boost_qadjustment[].
335
7.49k
      const int kMaxKfBoost = 2000;
336
7.49k
      if (kf_boost > kMaxKfBoost) kf_boost = kMaxKfBoost;
337
7.49k
    } else {
338
      /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
339
0
      kf_boost = initial_boost;
340
0
    }
341
342
    /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
343
7.49k
    kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
344
345
    /* frame separation adjustment ( down) */
346
7.49k
    if (cpi->frames_since_key < cpi->output_framerate / 2) {
347
5.65k
      kf_boost =
348
5.65k
          (int)(kf_boost * cpi->frames_since_key / (cpi->output_framerate / 2));
349
5.65k
    }
350
351
    /* Minimal target size is |2* per_frame_bandwidth|. */
352
7.49k
    if (kf_boost < 16) kf_boost = 16;
353
354
7.49k
    target = ((uint64_t)(16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
355
7.49k
    target = VPXMIN(INT_MAX, target);
356
7.49k
  }
357
358
12.1k
  if (cpi->oxcf.rc_max_intra_bitrate_pct) {
359
0
    unsigned int max_rate;
360
    // This product may overflow unsigned int
361
0
    uint64_t product = cpi->per_frame_bandwidth;
362
0
    product *= cpi->oxcf.rc_max_intra_bitrate_pct;
363
0
    product /= 100;
364
0
    max_rate = (unsigned int)VPXMIN(INT_MAX, product);
365
366
0
    if (target > max_rate) target = max_rate;
367
0
  }
368
369
12.1k
  cpi->this_frame_target = (int)target;
370
371
  /* TODO: if we separate rate targeting from Q targeting, move this.
372
   * Reset the active worst quality to the baseline value for key frames.
373
   */
374
12.1k
  if (cpi->pass != 2) cpi->active_worst_quality = cpi->worst_quality;
375
376
#if 0
377
    {
378
        FILE *f;
379
380
        f = fopen("kf_boost.stt", "a");
381
        fprintf(f, " %8u %10d %10d %10d\n",
382
                cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
383
384
        fclose(f);
385
    }
386
#endif
387
12.1k
}
388
389
/* Do the best we can to define the parameters for the next GF based on what
390
 * information we have available.
391
 */
392
5.39k
static void calc_gf_params(VP8_COMP *cpi) {
393
5.39k
  int Q =
394
5.39k
      (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
395
5.39k
  int Boost = 0;
396
397
5.39k
  int gf_frame_usage = 0; /* Golden frame usage since last GF */
398
5.39k
  int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
399
5.39k
                cpi->recent_ref_frame_usage[LAST_FRAME] +
400
5.39k
                cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
401
5.39k
                cpi->recent_ref_frame_usage[ALTREF_FRAME];
402
403
5.39k
  int pct_gf_active = (100 * cpi->gf_active_count) /
404
5.39k
                      (cpi->common.mb_rows * cpi->common.mb_cols);
405
406
5.39k
  if (tot_mbs) {
407
5.39k
    gf_frame_usage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
408
5.39k
                      cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
409
5.39k
                     100 / tot_mbs;
410
5.39k
  }
411
412
5.39k
  if (pct_gf_active > gf_frame_usage) gf_frame_usage = pct_gf_active;
413
414
  /* Not two pass */
415
5.39k
  if (cpi->pass != 2) {
416
    /* Single Pass lagged mode: TBD */
417
5.39k
    if (0) {
418
0
    }
419
420
    /* Single Pass compression: Has to use current and historical data */
421
5.39k
    else {
422
#if 0
423
            /* Experimental code */
424
            int index = cpi->one_pass_frame_index;
425
            int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
426
427
            /* ************** Experimental code - incomplete */
428
            /*
429
            double decay_val = 1.0;
430
            double IIAccumulator = 0.0;
431
            double last_iiaccumulator = 0.0;
432
            double IIRatio;
433
434
            cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
435
436
            for ( i = 0; i < (frames_to_scan - 1); i++ )
437
            {
438
                if ( index < 0 )
439
                    index = MAX_LAG_BUFFERS;
440
                index --;
441
442
                if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
443
                {
444
                    IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
445
446
                    if ( IIRatio > 30.0 )
447
                        IIRatio = 30.0;
448
                }
449
                else
450
                    IIRatio = 30.0;
451
452
                IIAccumulator += IIRatio * decay_val;
453
454
                decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
455
456
                if (    (i > MIN_GF_INTERVAL) &&
457
                        ((IIAccumulator - last_iiaccumulator) < 2.0) )
458
                {
459
                    break;
460
                }
461
                last_iiaccumulator = IIAccumulator;
462
            }
463
464
            Boost = IIAccumulator*100.0/16.0;
465
            cpi->baseline_gf_interval = i;
466
467
            */
468
#else
469
470
      /*************************************************************/
471
      /* OLD code */
472
473
      /* Adjust boost based upon ambient Q */
474
5.39k
      Boost = GFQ_ADJUSTMENT;
475
476
      /* Adjust based upon most recently measure intra usage */
477
5.39k
      Boost = Boost *
478
5.39k
              gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15)
479
5.39k
                                            ? cpi->this_frame_percent_intra
480
5.39k
                                            : 14] /
481
5.39k
              100;
482
483
      /* Adjust gf boost based upon GF usage since last GF */
484
5.39k
      Boost = Boost * gf_adjust_table[gf_frame_usage] / 100;
485
5.39k
#endif
486
5.39k
    }
487
488
    /* golden frame boost without recode loop often goes awry.  be
489
     * safe by keeping numbers down.
490
     */
491
5.39k
    if (!cpi->sf.recode_loop) {
492
2.94k
      if (cpi->compressor_speed == 2) Boost = Boost / 2;
493
2.94k
    }
494
495
    /* Apply an upper limit based on Q for 1 pass encodes */
496
5.39k
    if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0)) {
497
1.99k
      Boost = kf_gf_boost_qlimits[Q];
498
499
      /* Apply lower limits to boost. */
500
3.39k
    } else if (Boost < 110) {
501
1.17k
      Boost = 110;
502
1.17k
    }
503
504
    /* Note the boost used */
505
5.39k
    cpi->last_boost = Boost;
506
5.39k
  }
507
508
  /* Estimate next interval
509
   * This is updated once the real frame size/boost is known.
510
   */
511
5.39k
  if (cpi->oxcf.fixed_q == -1) {
512
5.39k
    if (cpi->pass == 2) { /* 2 Pass */
513
0
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
514
5.39k
    } else { /* 1 Pass */
515
5.39k
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
516
517
5.39k
      if (cpi->last_boost > 750) cpi->frames_till_gf_update_due++;
518
519
5.39k
      if (cpi->last_boost > 1000) cpi->frames_till_gf_update_due++;
520
521
5.39k
      if (cpi->last_boost > 1250) cpi->frames_till_gf_update_due++;
522
523
5.39k
      if (cpi->last_boost >= 1500) cpi->frames_till_gf_update_due++;
524
525
5.39k
      if (gf_interval_table[gf_frame_usage] > cpi->frames_till_gf_update_due) {
526
2.50k
        cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_usage];
527
2.50k
      }
528
529
5.39k
      if (cpi->frames_till_gf_update_due > cpi->max_gf_interval) {
530
34
        cpi->frames_till_gf_update_due = cpi->max_gf_interval;
531
34
      }
532
5.39k
    }
533
5.39k
  } else {
534
0
    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
535
0
  }
536
537
  /* ARF on or off */
538
5.39k
  if (cpi->pass != 2) {
539
    /* For now Alt ref is not allowed except in 2 pass modes. */
540
5.39k
    cpi->source_alt_ref_pending = 0;
541
542
    /*if ( cpi->oxcf.fixed_q == -1)
543
    {
544
        if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 +
545
    (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
546
            cpi->source_alt_ref_pending = 1;
547
        else
548
            cpi->source_alt_ref_pending = 0;
549
    }*/
550
5.39k
  }
551
5.39k
}
552
553
60.9k
static void calc_pframe_target_size(VP8_COMP *cpi) {
554
60.9k
  int min_frame_target;
555
60.9k
  int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
556
557
60.9k
  if (cpi->current_layer > 0) {
558
0
    cpi->per_frame_bandwidth =
559
0
        cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
560
0
  }
561
562
60.9k
  min_frame_target = 0;
563
564
60.9k
  if (cpi->pass == 2) {
565
0
    min_frame_target = cpi->min_frame_bandwidth;
566
567
0
    if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) {
568
0
      min_frame_target = cpi->av_per_frame_bandwidth >> 5;
569
0
    }
570
60.9k
  } else if (min_frame_target < cpi->per_frame_bandwidth / 4) {
571
56.2k
    min_frame_target = cpi->per_frame_bandwidth / 4;
572
56.2k
  }
573
574
  /* Special alt reference frame case */
575
60.9k
  if ((cpi->common.refresh_alt_ref_frame) &&
576
60.9k
      (cpi->oxcf.number_of_layers == 1)) {
577
0
    if (cpi->pass == 2) {
578
      /* Per frame bit target for the alt ref frame */
579
0
      cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
580
0
      cpi->this_frame_target = cpi->per_frame_bandwidth;
581
0
    }
582
583
    /* One Pass ??? TBD */
584
0
  }
585
586
  /* Normal frames (gf,and inter) */
587
60.9k
  else {
588
    /* 2 pass */
589
60.9k
    if (cpi->pass == 2) {
590
0
      cpi->this_frame_target = cpi->per_frame_bandwidth;
591
0
    }
592
    /* 1 pass */
593
60.9k
    else {
594
60.9k
      int Adjustment;
595
      /* Make rate adjustment to recover bits spent in key frame
596
       * Test to see if the key frame inter data rate correction
597
       * should still be in force
598
       */
599
60.9k
      if (cpi->kf_overspend_bits > 0) {
600
32.3k
        Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits)
601
32.3k
                         ? cpi->kf_bitrate_adjustment
602
32.3k
                         : cpi->kf_overspend_bits;
603
604
32.3k
        if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target)) {
605
7.97k
          Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
606
7.97k
        }
607
608
32.3k
        cpi->kf_overspend_bits -= Adjustment;
609
610
        /* Calculate an inter frame bandwidth target for the next
611
         * few frames designed to recover any extra bits spent on
612
         * the key frame.
613
         */
614
32.3k
        cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
615
616
32.3k
        if (cpi->this_frame_target < min_frame_target) {
617
0
          cpi->this_frame_target = min_frame_target;
618
0
        }
619
32.3k
      } else {
620
28.5k
        cpi->this_frame_target = cpi->per_frame_bandwidth;
621
28.5k
      }
622
623
      /* If appropriate make an adjustment to recover bits spent on a
624
       * recent GF
625
       */
626
60.9k
      if ((cpi->gf_overspend_bits > 0) &&
627
60.9k
          (cpi->this_frame_target > min_frame_target)) {
628
24.9k
        Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits)
629
24.9k
                         ? cpi->non_gf_bitrate_adjustment
630
24.9k
                         : cpi->gf_overspend_bits;
631
632
24.9k
        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
633
2.90k
          Adjustment = (cpi->this_frame_target - min_frame_target);
634
2.90k
        }
635
636
24.9k
        cpi->gf_overspend_bits -= Adjustment;
637
24.9k
        cpi->this_frame_target -= Adjustment;
638
24.9k
      }
639
640
      /* Apply small + and - boosts for non gf frames */
641
60.9k
      if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
642
60.9k
          (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1))) {
643
        /* % Adjustment limited to the range 1% to 10% */
644
16.3k
        Adjustment = (cpi->last_boost - 100) >> 5;
645
646
16.3k
        if (Adjustment < 1) {
647
0
          Adjustment = 1;
648
16.3k
        } else if (Adjustment > 10) {
649
5.09k
          Adjustment = 10;
650
5.09k
        }
651
652
        /* Convert to bits */
653
16.3k
        Adjustment = (cpi->this_frame_target * Adjustment) / 100;
654
655
16.3k
        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
656
708
          Adjustment = (cpi->this_frame_target - min_frame_target);
657
708
        }
658
659
16.3k
        if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1)) {
660
1.82k
          Adjustment = (cpi->current_gf_interval - 1) * Adjustment;
661
          // Limit adjustment to 10% of current target.
662
1.82k
          if (Adjustment > (10 * cpi->this_frame_target) / 100) {
663
1.47k
            Adjustment = (10 * cpi->this_frame_target) / 100;
664
1.47k
          }
665
1.82k
          cpi->this_frame_target += Adjustment;
666
14.5k
        } else {
667
14.5k
          cpi->this_frame_target -= Adjustment;
668
14.5k
        }
669
16.3k
      }
670
60.9k
    }
671
60.9k
  }
672
673
  /* Sanity check that the total sum of adjustments is not above the
674
   * maximum allowed That is that having allowed for KF and GF penalties
675
   * we have not pushed the current interframe target to low. If the
676
   * adjustment we apply here is not capable of recovering all the extra
677
   * bits we have spent in the KF or GF then the remainder will have to
678
   * be recovered over a longer time span via other buffer / rate control
679
   * mechanisms.
680
   */
681
60.9k
  if (cpi->this_frame_target < min_frame_target) {
682
0
    cpi->this_frame_target = min_frame_target;
683
0
  }
684
685
60.9k
  if (!cpi->common.refresh_alt_ref_frame) {
686
    /* Note the baseline target data rate for this inter frame. */
687
60.9k
    cpi->inter_frame_target = cpi->this_frame_target;
688
60.9k
  }
689
690
  /* One Pass specific code */
691
60.9k
  if (cpi->pass == 0) {
692
    /* Adapt target frame size with respect to any buffering constraints: */
693
60.9k
    if (cpi->buffered_mode) {
694
56.3k
      int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100);
695
696
56.3k
      if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
697
56.3k
          (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level)) {
698
34.4k
        int percent_low = 0;
699
700
        /* Decide whether or not we need to adjust the frame data
701
         * rate target.
702
         *
703
         * If we are are below the optimal buffer fullness level
704
         * and adherence to buffering constraints is important to
705
         * the end usage then adjust the per frame target.
706
         */
707
34.4k
        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
708
34.4k
            (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) {
709
0
          percent_low =
710
0
              (int)((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
711
0
                    one_percent_bits);
712
0
        }
713
        /* Are we overshooting the long term clip data rate... */
714
34.4k
        else if (cpi->bits_off_target < 0) {
715
          /* Adjust per frame data target downwards to compensate. */
716
2.77k
          percent_low =
717
2.77k
              (int)(100 * -cpi->bits_off_target / (cpi->total_byte_count * 8));
718
2.77k
        }
719
720
34.4k
        if (percent_low > cpi->oxcf.under_shoot_pct) {
721
0
          percent_low = cpi->oxcf.under_shoot_pct;
722
34.4k
        } else if (percent_low < 0) {
723
0
          percent_low = 0;
724
0
        }
725
726
        /* lower the target bandwidth for this frame. */
727
34.4k
        cpi->this_frame_target -=
728
34.4k
            (int)(((int64_t)cpi->this_frame_target * percent_low) / 200);
729
730
        /* Are we using allowing control of active_worst_allowed_q
731
         * according to buffer level.
732
         */
733
34.4k
        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
734
1.17k
          int64_t critical_buffer_level;
735
736
          /* For streaming applications the most important factor is
737
           * cpi->buffer_level as this takes into account the
738
           * specified short term buffering constraints. However,
739
           * hitting the long term clip data rate target is also
740
           * important.
741
           */
742
1.17k
          if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
743
            /* Take the smaller of cpi->buffer_level and
744
             * cpi->bits_off_target
745
             */
746
0
            critical_buffer_level = (cpi->buffer_level < cpi->bits_off_target)
747
0
                                        ? cpi->buffer_level
748
0
                                        : cpi->bits_off_target;
749
0
          }
750
          /* For local file playback short term buffering constraints
751
           * are less of an issue
752
           */
753
1.17k
          else {
754
            /* Consider only how we are doing for the clip as a
755
             * whole
756
             */
757
1.17k
            critical_buffer_level = cpi->bits_off_target;
758
1.17k
          }
759
760
          /* Set the active worst quality based upon the selected
761
           * buffer fullness number.
762
           */
763
1.17k
          if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) {
764
1.17k
            if (critical_buffer_level > (cpi->oxcf.optimal_buffer_level >> 2)) {
765
721
              int64_t qadjustment_range = cpi->worst_quality - cpi->ni_av_qi;
766
721
              int64_t above_base = (critical_buffer_level -
767
721
                                    (cpi->oxcf.optimal_buffer_level >> 2));
768
769
              /* Step active worst quality down from
770
               * cpi->ni_av_qi when (critical_buffer_level ==
771
               * cpi->optimal_buffer_level) to
772
               * cpi->worst_quality when
773
               * (critical_buffer_level ==
774
               *     cpi->optimal_buffer_level >> 2)
775
               */
776
721
              cpi->active_worst_quality =
777
721
                  cpi->worst_quality -
778
721
                  (int)((qadjustment_range * above_base) /
779
721
                        (cpi->oxcf.optimal_buffer_level * 3 >> 2));
780
721
            } else {
781
458
              cpi->active_worst_quality = cpi->worst_quality;
782
458
            }
783
1.17k
          } else {
784
0
            cpi->active_worst_quality = cpi->ni_av_qi;
785
0
          }
786
33.3k
        } else {
787
33.3k
          cpi->active_worst_quality = cpi->worst_quality;
788
33.3k
        }
789
34.4k
      } else {
790
21.8k
        int percent_high = 0;
791
21.8k
        int64_t target = cpi->this_frame_target;
792
793
21.8k
        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
794
21.8k
            (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) {
795
0
          percent_high =
796
0
              (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
797
0
                    one_percent_bits);
798
21.8k
        } else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) {
799
21.3k
          if (cpi->total_byte_count > 0) {
800
21.3k
            percent_high = (int)((100 * cpi->bits_off_target) /
801
21.3k
                                 (cpi->total_byte_count * 8));
802
21.3k
          } else {
803
0
            percent_high = cpi->oxcf.over_shoot_pct;
804
0
          }
805
21.3k
        }
806
807
21.8k
        if (percent_high > cpi->oxcf.over_shoot_pct) {
808
20.8k
          percent_high = cpi->oxcf.over_shoot_pct;
809
20.8k
        } else if (percent_high < 0) {
810
0
          percent_high = 0;
811
0
        }
812
813
21.8k
        target += (target * percent_high) / 200;
814
21.8k
        target = VPXMIN(target, INT_MAX);
815
21.8k
        cpi->this_frame_target = (int)target;
816
817
        /* Are we allowing control of active_worst_allowed_q according
818
         * to buffer level.
819
         */
820
21.8k
        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
821
          /* When using the relaxed buffer model stick to the
822
           * user specified value
823
           */
824
718
          cpi->active_worst_quality = cpi->ni_av_qi;
825
21.1k
        } else {
826
21.1k
          cpi->active_worst_quality = cpi->worst_quality;
827
21.1k
        }
828
21.8k
      }
829
830
      /* Set active_best_quality to prevent quality rising too high */
831
56.3k
      cpi->active_best_quality = cpi->best_quality;
832
833
      /* Worst quality obviously must not be better than best quality */
834
56.3k
      if (cpi->active_worst_quality <= cpi->active_best_quality) {
835
353
        cpi->active_worst_quality = cpi->active_best_quality + 1;
836
353
      }
837
838
56.3k
      if (cpi->active_worst_quality > 127) cpi->active_worst_quality = 127;
839
56.3k
    }
840
    /* Unbuffered mode (eg. video conferencing) */
841
4.58k
    else {
842
      /* Set the active worst quality */
843
4.58k
      cpi->active_worst_quality = cpi->worst_quality;
844
4.58k
    }
845
846
    /* Special trap for constrained quality mode
847
     * "active_worst_quality" may never drop below cq level
848
     * for any frame type.
849
     */
850
60.9k
    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
851
60.9k
        cpi->active_worst_quality < cpi->cq_target_quality) {
852
0
      cpi->active_worst_quality = cpi->cq_target_quality;
853
0
    }
854
60.9k
  }
855
856
  /* Test to see if we have to drop a frame
857
   * The auto-drop frame code is only used in buffered mode.
858
   * In unbufferd mode (eg vide conferencing) the descision to
859
   * code or drop a frame is made outside the codec in response to real
860
   * world comms or buffer considerations.
861
   */
862
60.9k
  if (cpi->drop_frames_allowed &&
863
60.9k
      (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
864
60.9k
      ((cpi->common.frame_type != KEY_FRAME))) {
865
    /* Check for a buffer underun-crisis in which case we have to drop
866
     * a frame
867
     */
868
0
    if ((cpi->buffer_level < 0)) {
869
#if 0
870
            FILE *f = fopen("dec.stt", "a");
871
            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
872
                    (int) cpi->common.current_video_frame,
873
                    cpi->decimation_factor, cpi->common.horiz_scale,
874
                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
875
            fclose(f);
876
#endif
877
0
      cpi->drop_frame = 1;
878
879
      /* Update the buffer level variable. */
880
0
      cpi->bits_off_target += cpi->av_per_frame_bandwidth;
881
0
      if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
882
0
        cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
883
0
      }
884
0
      cpi->buffer_level = cpi->bits_off_target;
885
886
0
      if (cpi->oxcf.number_of_layers > 1) {
887
0
        unsigned int i;
888
889
        // Propagate bits saved by dropping the frame to higher layers.
890
0
        for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
891
0
          LAYER_CONTEXT *lc = &cpi->layer_context[i];
892
0
          lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
893
0
          if (lc->bits_off_target > lc->maximum_buffer_size) {
894
0
            lc->bits_off_target = lc->maximum_buffer_size;
895
0
          }
896
0
          lc->buffer_level = lc->bits_off_target;
897
0
        }
898
0
      }
899
0
    }
900
0
  }
901
902
  /* Adjust target frame size for Golden Frames: */
903
60.9k
  if (cpi->oxcf.error_resilient_mode == 0 &&
904
60.9k
      (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame) {
905
6.47k
    if (!cpi->gf_update_onepass_cbr) {
906
6.47k
      int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
907
6.47k
                                      : cpi->oxcf.fixed_q;
908
909
6.47k
      int gf_frame_usage = 0; /* Golden frame usage since last GF */
910
6.47k
      int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
911
6.47k
                    cpi->recent_ref_frame_usage[LAST_FRAME] +
912
6.47k
                    cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
913
6.47k
                    cpi->recent_ref_frame_usage[ALTREF_FRAME];
914
915
6.47k
      int pct_gf_active = (100 * cpi->gf_active_count) /
916
6.47k
                          (cpi->common.mb_rows * cpi->common.mb_cols);
917
918
6.47k
      if (tot_mbs) {
919
6.47k
        gf_frame_usage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
920
6.47k
                          cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
921
6.47k
                         100 / tot_mbs;
922
6.47k
      }
923
924
6.47k
      if (pct_gf_active > gf_frame_usage) gf_frame_usage = pct_gf_active;
925
926
      /* Is a fixed manual GF frequency being used */
927
6.47k
      if (cpi->auto_gold) {
928
        /* For one pass throw a GF if recent frame intra usage is
929
         * low or the GF usage is high
930
         */
931
6.47k
        if ((cpi->pass == 0) &&
932
6.47k
            (cpi->this_frame_percent_intra < 15 || gf_frame_usage >= 5)) {
933
5.39k
          cpi->common.refresh_golden_frame = 1;
934
935
          /* Two pass GF descision */
936
5.39k
        } else if (cpi->pass == 2) {
937
0
          cpi->common.refresh_golden_frame = 1;
938
0
        }
939
6.47k
      }
940
941
#if 0
942
943
          /* Debug stats */
944
          if (0) {
945
              FILE *f;
946
947
              f = fopen("gf_usaget.stt", "a");
948
              fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
949
                      cpi->common.current_video_frame,  cpi->gfu_boost,
950
                      GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_usage);
951
              fclose(f);
952
          }
953
954
#endif
955
956
6.47k
      if (cpi->common.refresh_golden_frame == 1) {
957
#if 0
958
959
            if (0) {
960
                FILE *f;
961
962
                f = fopen("GFexit.stt", "a");
963
                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
964
                fclose(f);
965
            }
966
967
#endif
968
969
5.39k
        if (cpi->auto_adjust_gold_quantizer) {
970
5.39k
          calc_gf_params(cpi);
971
5.39k
        }
972
973
        /* If we are using alternate ref instead of gf then do not apply the
974
         * boost It will instead be applied to the altref update Jims
975
         * modified boost
976
         */
977
5.39k
        if (!cpi->source_alt_ref_active) {
978
5.39k
          if (cpi->oxcf.fixed_q < 0) {
979
5.39k
            if (cpi->pass == 2) {
980
              /* The spend on the GF is defined in the two pass
981
               * code for two pass encodes
982
               */
983
0
              cpi->this_frame_target = cpi->per_frame_bandwidth;
984
5.39k
            } else {
985
5.39k
              int Boost = cpi->last_boost;
986
5.39k
              int frames_in_section = cpi->frames_till_gf_update_due + 1;
987
5.39k
              int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
988
5.39k
              int bits_in_section = cpi->inter_frame_target * frames_in_section;
989
990
              /* Normalize Altboost and allocations chunck down to
991
               * prevent overflow
992
               */
993
5.39k
              while (Boost > 1000) {
994
0
                Boost /= 2;
995
0
                allocation_chunks /= 2;
996
0
              }
997
998
              /* Avoid loss of precision but avoid overflow */
999
5.39k
              if ((bits_in_section >> 7) > allocation_chunks) {
1000
1.36k
                cpi->this_frame_target =
1001
1.36k
                    Boost * (bits_in_section / allocation_chunks);
1002
4.02k
              } else {
1003
4.02k
                cpi->this_frame_target =
1004
4.02k
                    (Boost * bits_in_section) / allocation_chunks;
1005
4.02k
              }
1006
5.39k
            }
1007
5.39k
          } else {
1008
0
            cpi->this_frame_target =
1009
0
                (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) *
1010
0
                 cpi->last_boost) /
1011
0
                100;
1012
0
          }
1013
5.39k
        } else {
1014
          /* If there is an active ARF at this location use the minimum
1015
           * bits on this frame even if it is a contructed arf.
1016
           * The active maximum quantizer insures that an appropriate
1017
           * number of bits will be spent if needed for contstructed ARFs.
1018
           */
1019
0
          cpi->this_frame_target = 0;
1020
0
        }
1021
1022
5.39k
        cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1023
5.39k
      }
1024
6.47k
    } else {
1025
      // Special case for 1 pass CBR: fixed gf period.
1026
      // TODO(marpan): Adjust this boost/interval logic.
1027
      // If gf_cbr_boost_pct is small (below threshold) set the flag
1028
      // gf_noboost_onepass_cbr = 1, which forces the gf to use the same
1029
      // rate correction factor as last.
1030
0
      cpi->gf_noboost_onepass_cbr = (cpi->oxcf.gf_cbr_boost_pct <= 100);
1031
0
      cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1032
      // Skip this update if the zero_mvcount is low.
1033
0
      if (cpi->zeromv_count > (cpi->common.MBs >> 1)) {
1034
0
        cpi->common.refresh_golden_frame = 1;
1035
0
        cpi->this_frame_target =
1036
0
            (cpi->this_frame_target * (100 + cpi->oxcf.gf_cbr_boost_pct)) / 100;
1037
0
      }
1038
0
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
1039
0
      cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1040
0
    }
1041
6.47k
  }
1042
1043
60.9k
  cpi->per_frame_bandwidth = old_per_frame_bandwidth;
1044
60.9k
}
1045
1046
86.1k
void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) {
1047
86.1k
  int Q = cpi->common.base_qindex;
1048
86.1k
  int correction_factor = 100;
1049
86.1k
  double rate_correction_factor;
1050
86.1k
  double adjustment_limit;
1051
1052
86.1k
  int projected_size_based_on_q = 0;
1053
1054
  /* Clear down mmx registers to allow floating point in what follows */
1055
86.1k
  vpx_clear_system_state();
1056
1057
86.1k
  if (cpi->common.frame_type == KEY_FRAME) {
1058
18.9k
    rate_correction_factor = cpi->key_frame_rate_correction_factor;
1059
67.1k
  } else {
1060
67.1k
    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1061
67.1k
        (cpi->common.refresh_alt_ref_frame ||
1062
67.1k
         cpi->common.refresh_golden_frame)) {
1063
6.83k
      rate_correction_factor = cpi->gf_rate_correction_factor;
1064
60.3k
    } else {
1065
60.3k
      rate_correction_factor = cpi->rate_correction_factor;
1066
60.3k
    }
1067
67.1k
  }
1068
1069
  /* Work out how big we would have expected the frame to be at this Q
1070
   * given the current correction factor. Stay in double to avoid int
1071
   * overflow when values are large
1072
   */
1073
86.1k
  projected_size_based_on_q =
1074
86.1k
      (int)(((.5 + rate_correction_factor *
1075
86.1k
                       vp8_bits_per_mb[cpi->common.frame_type][Q]) *
1076
86.1k
             cpi->common.MBs) /
1077
86.1k
            (1 << BPER_MB_NORMBITS));
1078
1079
  /* Make some allowance for cpi->zbin_over_quant */
1080
86.1k
  if (cpi->mb.zbin_over_quant > 0) {
1081
21.1k
    int Z = cpi->mb.zbin_over_quant;
1082
21.1k
    double Factor = 0.99;
1083
21.1k
    double factor_adjustment = 0.01 / 256.0;
1084
1085
2.79M
    while (Z > 0) {
1086
2.77M
      Z--;
1087
2.77M
      projected_size_based_on_q = (int)(Factor * projected_size_based_on_q);
1088
2.77M
      Factor += factor_adjustment;
1089
1090
2.77M
      if (Factor >= 0.999) Factor = 0.999;
1091
2.77M
    }
1092
21.1k
  }
1093
1094
  /* Work out a size correction factor. */
1095
86.1k
  if (projected_size_based_on_q > 0) {
1096
80.5k
    correction_factor = (int)((100 * (int64_t)cpi->projected_frame_size) /
1097
80.5k
                              projected_size_based_on_q);
1098
80.5k
  }
1099
1100
  /* More heavily damped adjustment used if we have been oscillating
1101
   * either side of target
1102
   */
1103
86.1k
  switch (damp_var) {
1104
15.1k
    case 0: adjustment_limit = 0.75; break;
1105
1.22k
    case 1: adjustment_limit = 0.375; break;
1106
69.7k
    case 2:
1107
69.7k
    default: adjustment_limit = 0.25; break;
1108
86.1k
  }
1109
1110
86.1k
  if (correction_factor > 102) {
1111
    /* We are not already at the worst allowable quality */
1112
41.5k
    correction_factor =
1113
41.5k
        (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
1114
41.5k
    rate_correction_factor =
1115
41.5k
        ((rate_correction_factor * correction_factor) / 100);
1116
1117
    /* Keep rate_correction_factor within limits */
1118
41.5k
    if (rate_correction_factor > MAX_BPB_FACTOR) {
1119
1.24k
      rate_correction_factor = MAX_BPB_FACTOR;
1120
1.24k
    }
1121
44.6k
  } else if (correction_factor < 99) {
1122
    /* We are not already at the best allowable quality */
1123
34.4k
    correction_factor =
1124
34.4k
        (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
1125
34.4k
    rate_correction_factor =
1126
34.4k
        ((rate_correction_factor * correction_factor) / 100);
1127
1128
    /* Keep rate_correction_factor within limits */
1129
34.4k
    if (rate_correction_factor < MIN_BPB_FACTOR) {
1130
258
      rate_correction_factor = MIN_BPB_FACTOR;
1131
258
    }
1132
34.4k
  }
1133
1134
86.1k
  if (cpi->common.frame_type == KEY_FRAME) {
1135
18.9k
    cpi->key_frame_rate_correction_factor = rate_correction_factor;
1136
67.1k
  } else {
1137
67.1k
    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1138
67.1k
        (cpi->common.refresh_alt_ref_frame ||
1139
67.1k
         cpi->common.refresh_golden_frame)) {
1140
6.83k
      cpi->gf_rate_correction_factor = rate_correction_factor;
1141
60.3k
    } else {
1142
60.3k
      cpi->rate_correction_factor = rate_correction_factor;
1143
60.3k
    }
1144
67.1k
  }
1145
86.1k
}
1146
1147
0
static int limit_q_cbr_inter(int last_q, int current_q) {
1148
0
  int limit_down = 12;
1149
0
  if (last_q - current_q > limit_down)
1150
0
    return (last_q - limit_down);
1151
0
  else
1152
0
    return current_q;
1153
0
}
1154
1155
88.4k
int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) {
1156
88.4k
  int Q = cpi->active_worst_quality;
1157
1158
88.4k
  if (cpi->force_maxqp == 1) {
1159
0
    cpi->active_worst_quality = cpi->worst_quality;
1160
0
    return cpi->worst_quality;
1161
0
  }
1162
  /* Reset Zbin OQ value */
1163
88.4k
  cpi->mb.zbin_over_quant = 0;
1164
1165
88.4k
  if (cpi->oxcf.fixed_q >= 0) {
1166
0
    Q = cpi->oxcf.fixed_q;
1167
1168
0
    if (cpi->common.frame_type == KEY_FRAME) {
1169
0
      Q = cpi->oxcf.key_q;
1170
0
    } else if (cpi->oxcf.number_of_layers == 1 &&
1171
0
               cpi->common.refresh_alt_ref_frame &&
1172
0
               !cpi->gf_noboost_onepass_cbr) {
1173
0
      Q = cpi->oxcf.alt_q;
1174
0
    } else if (cpi->oxcf.number_of_layers == 1 &&
1175
0
               cpi->common.refresh_golden_frame &&
1176
0
               !cpi->gf_noboost_onepass_cbr) {
1177
0
      Q = cpi->oxcf.gold_q;
1178
0
    }
1179
88.4k
  } else {
1180
88.4k
    int i;
1181
88.4k
    int last_error = INT_MAX;
1182
88.4k
    int target_bits_per_mb;
1183
88.4k
    int bits_per_mb_at_this_q;
1184
88.4k
    double correction_factor;
1185
1186
    /* Select the appropriate correction factor based upon type of frame. */
1187
88.4k
    if (cpi->common.frame_type == KEY_FRAME) {
1188
18.2k
      correction_factor = cpi->key_frame_rate_correction_factor;
1189
70.2k
    } else {
1190
70.2k
      if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1191
70.2k
          (cpi->common.refresh_alt_ref_frame ||
1192
70.2k
           cpi->common.refresh_golden_frame)) {
1193
7.06k
        correction_factor = cpi->gf_rate_correction_factor;
1194
63.1k
      } else {
1195
63.1k
        correction_factor = cpi->rate_correction_factor;
1196
63.1k
      }
1197
70.2k
    }
1198
1199
    /* Calculate required scaling factor based on target frame size and
1200
     * size of frame produced using previous Q
1201
     */
1202
88.4k
    if (target_bits_per_frame > (INT_MAX >> BPER_MB_NORMBITS)) {
1203
3.60k
      int temp = target_bits_per_frame / cpi->common.MBs;
1204
3.60k
      if (temp > (INT_MAX >> BPER_MB_NORMBITS)) {
1205
977
        target_bits_per_mb = INT_MAX;
1206
2.62k
      } else {
1207
2.62k
        target_bits_per_mb = temp << BPER_MB_NORMBITS;
1208
2.62k
      }
1209
84.8k
    } else {
1210
84.8k
      target_bits_per_mb =
1211
84.8k
          (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
1212
84.8k
    }
1213
1214
88.4k
    i = cpi->active_best_quality;
1215
1216
4.10M
    do {
1217
4.10M
      bits_per_mb_at_this_q =
1218
4.10M
          (int)(.5 +
1219
4.10M
                correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
1220
1221
4.10M
      if (bits_per_mb_at_this_q <= target_bits_per_mb) {
1222
64.0k
        if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) {
1223
50.8k
          Q = i;
1224
50.8k
        } else {
1225
13.1k
          Q = i - 1;
1226
13.1k
        }
1227
1228
64.0k
        break;
1229
4.04M
      } else {
1230
4.04M
        last_error = bits_per_mb_at_this_q - target_bits_per_mb;
1231
4.04M
      }
1232
4.10M
    } while (++i <= cpi->active_worst_quality);
1233
1234
    /* If we are at MAXQ then enable Q over-run which seeks to claw
1235
     * back additional bits through things like the RD multiplier
1236
     * and zero bin size.
1237
     */
1238
88.4k
    if (Q >= MAXQ) {
1239
24.0k
      int zbin_oqmax;
1240
1241
24.0k
      double Factor = 0.99;
1242
24.0k
      double factor_adjustment = 0.01 / 256.0;
1243
1244
24.0k
      if (cpi->common.frame_type == KEY_FRAME) {
1245
1.53k
        zbin_oqmax = 0;
1246
22.4k
      } else if (cpi->oxcf.number_of_layers == 1 &&
1247
22.4k
                 !cpi->gf_noboost_onepass_cbr &&
1248
22.4k
                 (cpi->common.refresh_alt_ref_frame ||
1249
22.4k
                  (cpi->common.refresh_golden_frame &&
1250
22.4k
                   !cpi->source_alt_ref_active))) {
1251
938
        zbin_oqmax = 16;
1252
21.5k
      } else {
1253
21.5k
        zbin_oqmax = ZBIN_OQ_MAX;
1254
21.5k
      }
1255
1256
      /*{
1257
          double Factor =
1258
      (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
1259
          double Oq;
1260
1261
          Factor = Factor/1.2683;
1262
1263
          Oq = pow( Factor, (1.0/-0.165) );
1264
1265
          if ( Oq > zbin_oqmax )
1266
              Oq = zbin_oqmax;
1267
1268
          cpi->zbin_over_quant = (int)Oq;
1269
      }*/
1270
1271
      /* Each incrment in the zbin is assumed to have a fixed effect
1272
       * on bitrate. This is not of course true. The effect will be
1273
       * highly clip dependent and may well have sudden steps. The
1274
       * idea here is to acheive higher effective quantizers than the
1275
       * normal maximum by expanding the zero bin and hence
1276
       * decreasing the number of low magnitude non zero coefficients.
1277
       */
1278
2.95M
      while (cpi->mb.zbin_over_quant < zbin_oqmax) {
1279
2.94M
        cpi->mb.zbin_over_quant++;
1280
1281
2.94M
        if (cpi->mb.zbin_over_quant > zbin_oqmax) {
1282
0
          cpi->mb.zbin_over_quant = zbin_oqmax;
1283
0
        }
1284
1285
        /* Adjust bits_per_mb_at_this_q estimate */
1286
2.94M
        bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
1287
2.94M
        Factor += factor_adjustment;
1288
1289
2.94M
        if (Factor >= 0.999) Factor = 0.999;
1290
1291
        /* Break out if we get down to the target rate */
1292
2.94M
        if (bits_per_mb_at_this_q <= target_bits_per_mb) break;
1293
2.94M
      }
1294
24.0k
    }
1295
88.4k
  }
1296
1297
  // Limit decrease in Q for 1 pass CBR screen content mode.
1298
88.4k
  if (cpi->common.frame_type != KEY_FRAME && cpi->pass == 0 &&
1299
88.4k
      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1300
88.4k
      cpi->oxcf.screen_content_mode)
1301
0
    Q = limit_q_cbr_inter(cpi->last_q[1], Q);
1302
1303
88.4k
  return Q;
1304
88.4k
}
1305
1306
7.97k
static int estimate_keyframe_frequency(VP8_COMP *cpi) {
1307
7.97k
  int i;
1308
1309
  /* Average key frame frequency */
1310
7.97k
  int av_key_frame_frequency = 0;
1311
1312
  /* First key frame at start of sequence is a special case. We have no
1313
   * frequency data.
1314
   */
1315
7.97k
  if (cpi->key_frame_count == 1) {
1316
    /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
1317
     * whichever is smaller.
1318
     */
1319
2.10k
    int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
1320
2.10k
    av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
1321
1322
2.10k
    if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) {
1323
176
      av_key_frame_frequency = key_freq;
1324
176
    }
1325
1326
2.10k
    cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] =
1327
2.10k
        av_key_frame_frequency;
1328
5.87k
  } else {
1329
5.87k
    unsigned int total_weight = 0;
1330
5.87k
    int last_kf_interval =
1331
5.87k
        (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1332
1333
    /* reset keyframe context and calculate weighted average of last
1334
     * KEY_FRAME_CONTEXT keyframes
1335
     */
1336
35.2k
    for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
1337
29.3k
      if (i < KEY_FRAME_CONTEXT - 1) {
1338
23.4k
        cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i + 1];
1339
23.4k
      } else {
1340
5.87k
        cpi->prior_key_frame_distance[i] = last_kf_interval;
1341
5.87k
      }
1342
1343
29.3k
      av_key_frame_frequency +=
1344
29.3k
          prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i];
1345
29.3k
      total_weight += prior_key_frame_weight[i];
1346
29.3k
    }
1347
1348
5.87k
    av_key_frame_frequency /= total_weight;
1349
5.87k
  }
1350
  // TODO (marpan): Given the checks above, |av_key_frame_frequency|
1351
  // should always be above 0. But for now we keep the sanity check in.
1352
7.97k
  if (av_key_frame_frequency == 0) av_key_frame_frequency = 1;
1353
7.97k
  return av_key_frame_frequency;
1354
7.97k
}
1355
1356
12.1k
void vp8_adjust_key_frame_context(VP8_COMP *cpi) {
1357
  /* Clear down mmx registers to allow floating point in what follows */
1358
12.1k
  vpx_clear_system_state();
1359
1360
  /* Do we have any key frame overspend to recover? */
1361
  /* Two-pass overspend handled elsewhere. */
1362
12.1k
  if ((cpi->pass != 2) &&
1363
12.1k
      (cpi->projected_frame_size > cpi->per_frame_bandwidth)) {
1364
7.97k
    int overspend;
1365
1366
    /* Update the count of key frame overspend to be recovered in
1367
     * subsequent frames. A portion of the KF overspend is treated as gf
1368
     * overspend (and hence recovered more quickly) as the kf is also a
1369
     * gf. Otherwise the few frames following each kf tend to get more
1370
     * bits allocated than those following other gfs.
1371
     */
1372
7.97k
    overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
1373
1374
7.97k
    if (cpi->oxcf.number_of_layers > 1) {
1375
0
      cpi->kf_overspend_bits += overspend;
1376
7.97k
    } else {
1377
7.97k
      cpi->kf_overspend_bits += overspend * 7 / 8;
1378
7.97k
      cpi->gf_overspend_bits += overspend * 1 / 8;
1379
7.97k
    }
1380
1381
    /* Work out how much to try and recover per frame. */
1382
7.97k
    cpi->kf_bitrate_adjustment =
1383
7.97k
        cpi->kf_overspend_bits / estimate_keyframe_frequency(cpi);
1384
7.97k
  }
1385
1386
12.1k
  cpi->frames_since_key = 0;
1387
12.1k
  cpi->key_frame_count++;
1388
12.1k
}
1389
1390
void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
1391
73.1k
                                   int *frame_over_shoot_limit) {
1392
  /* Set-up bounds on acceptable frame size: */
1393
73.1k
  if (cpi->oxcf.fixed_q >= 0) {
1394
    /* Fixed Q scenario: frame size never outranges target
1395
     * (there is no target!)
1396
     */
1397
0
    *frame_under_shoot_limit = 0;
1398
0
    *frame_over_shoot_limit = INT_MAX;
1399
73.1k
  } else {
1400
73.1k
    const int64_t this_frame_target = cpi->this_frame_target;
1401
73.1k
    int64_t over_shoot_limit, under_shoot_limit;
1402
1403
73.1k
    if (cpi->common.frame_type == KEY_FRAME) {
1404
12.1k
      over_shoot_limit = this_frame_target * 9 / 8;
1405
12.1k
      under_shoot_limit = this_frame_target * 7 / 8;
1406
60.9k
    } else {
1407
60.9k
      if (cpi->oxcf.number_of_layers > 1 || cpi->common.refresh_alt_ref_frame ||
1408
60.9k
          cpi->common.refresh_golden_frame) {
1409
5.39k
        over_shoot_limit = this_frame_target * 9 / 8;
1410
5.39k
        under_shoot_limit = this_frame_target * 7 / 8;
1411
55.5k
      } else {
1412
        /* For CBR take buffer fullness into account */
1413
55.5k
        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1414
0
          if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level +
1415
0
                                     cpi->oxcf.maximum_buffer_size) >>
1416
0
                                    1)) {
1417
            /* Buffer is too full so relax overshoot and tighten
1418
             * undershoot
1419
             */
1420
0
            over_shoot_limit = this_frame_target * 12 / 8;
1421
0
            under_shoot_limit = this_frame_target * 6 / 8;
1422
0
          } else if (cpi->buffer_level <=
1423
0
                     (cpi->oxcf.optimal_buffer_level >> 1)) {
1424
            /* Buffer is too low so relax undershoot and tighten
1425
             * overshoot
1426
             */
1427
0
            over_shoot_limit = this_frame_target * 10 / 8;
1428
0
            under_shoot_limit = this_frame_target * 4 / 8;
1429
0
          } else {
1430
0
            over_shoot_limit = this_frame_target * 11 / 8;
1431
0
            under_shoot_limit = this_frame_target * 5 / 8;
1432
0
          }
1433
0
        }
1434
        /* VBR and CQ mode */
1435
        /* Note that tighter restrictions here can help quality
1436
         * but hurt encode speed
1437
         */
1438
55.5k
        else {
1439
          /* Stron overshoot limit for constrained quality */
1440
55.5k
          if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
1441
7.54k
            over_shoot_limit = this_frame_target * 11 / 8;
1442
7.54k
            under_shoot_limit = this_frame_target * 2 / 8;
1443
47.9k
          } else {
1444
47.9k
            over_shoot_limit = this_frame_target * 11 / 8;
1445
47.9k
            under_shoot_limit = this_frame_target * 5 / 8;
1446
47.9k
          }
1447
55.5k
        }
1448
55.5k
      }
1449
60.9k
    }
1450
1451
    /* For very small rate targets where the fractional adjustment
1452
     * (eg * 7/8) may be tiny make sure there is at least a minimum
1453
     * range.
1454
     */
1455
73.1k
    over_shoot_limit += 200;
1456
73.1k
    under_shoot_limit -= 200;
1457
73.1k
    if (under_shoot_limit < 0) under_shoot_limit = 0;
1458
73.1k
    if (under_shoot_limit > INT_MAX) under_shoot_limit = INT_MAX;
1459
73.1k
    if (over_shoot_limit > INT_MAX) over_shoot_limit = INT_MAX;
1460
73.1k
    *frame_under_shoot_limit = (int)under_shoot_limit;
1461
73.1k
    *frame_over_shoot_limit = (int)over_shoot_limit;
1462
73.1k
  }
1463
73.1k
}
1464
1465
/* return of 0 means drop frame */
1466
73.1k
int vp8_pick_frame_size(VP8_COMP *cpi) {
1467
73.1k
  VP8_COMMON *cm = &cpi->common;
1468
1469
73.1k
  if (cm->frame_type == KEY_FRAME) {
1470
12.1k
    calc_iframe_target_size(cpi);
1471
60.9k
  } else {
1472
60.9k
    calc_pframe_target_size(cpi);
1473
1474
    /* Check if we're dropping the frame: */
1475
60.9k
    if (cpi->drop_frame) {
1476
0
      cpi->drop_frame = 0;
1477
0
      return 0;
1478
0
    }
1479
60.9k
  }
1480
73.1k
  return 1;
1481
73.1k
}
1482
// If this just encoded frame (mcomp/transform/quant, but before loopfilter and
1483
// pack_bitstream) has large overshoot, and was not being encoded close to the
1484
// max QP, then drop this frame and force next frame to be encoded at max QP.
1485
// Allow this for screen_content_mode = 2, or if drop frames is allowed.
1486
// TODO(marpan): Should do this exit condition during the encode_frame
1487
// (i.e., halfway during the encoding of the frame) to save cycles.
1488
0
int vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) {
1489
0
  int force_drop_overshoot = 0;
1490
#if CONFIG_MULTI_RES_ENCODING
1491
  // Only check for dropping due to overshoot on the lowest stream.
1492
  // If the lowest stream of the multi-res encoding was dropped due to
1493
  // overshoot, then force dropping on all upper layer streams
1494
  // (mr_encoder_id > 0).
1495
  LOWER_RES_FRAME_INFO *low_res_frame_info =
1496
      (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
1497
  if (cpi->oxcf.mr_total_resolutions > 1 && cpi->oxcf.mr_encoder_id > 0) {
1498
    force_drop_overshoot = low_res_frame_info->is_frame_dropped_overshoot_maxqp;
1499
    if (!force_drop_overshoot) {
1500
      cpi->force_maxqp = 0;
1501
      cpi->frames_since_last_drop_overshoot++;
1502
      return 0;
1503
    }
1504
  }
1505
#endif
1506
0
  if (cpi->common.frame_type != KEY_FRAME &&
1507
0
      (cpi->oxcf.screen_content_mode == 2 ||
1508
0
       (cpi->drop_frames_allowed &&
1509
0
        (force_drop_overshoot ||
1510
0
         (cpi->rate_correction_factor < (8.0f * MIN_BPB_FACTOR) &&
1511
0
          cpi->frames_since_last_drop_overshoot > (int)cpi->framerate))))) {
1512
    // Note: the "projected_frame_size" from encode_frame() only gives estimate
1513
    // of mode/motion vector rate (in non-rd mode): so below we only require
1514
    // that projected_frame_size is somewhat greater than per-frame-bandwidth,
1515
    // but add additional condition with high threshold on prediction residual.
1516
1517
    // QP threshold: only allow dropping if we are not close to qp_max.
1518
0
    int thresh_qp = 3 * cpi->worst_quality >> 2;
1519
    // Rate threshold, in bytes.
1520
0
    int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3);
1521
    // Threshold for the average (over all macroblocks) of the pixel-sum
1522
    // residual error over 16x16 block.
1523
0
    int thresh_pred_err_mb = (200 << 4);
1524
0
    int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs);
1525
    // Reduce/ignore thresh_rate if pred_err_mb much larger than its threshold,
1526
    // give more weight to pred_err metric for overshoot detection.
1527
0
    if (cpi->drop_frames_allowed && pred_err_mb > (thresh_pred_err_mb << 4))
1528
0
      thresh_rate = thresh_rate >> 3;
1529
0
    if ((Q < thresh_qp && cpi->projected_frame_size > thresh_rate &&
1530
0
         pred_err_mb > thresh_pred_err_mb &&
1531
0
         pred_err_mb > 2 * cpi->last_pred_err_mb) ||
1532
0
        force_drop_overshoot) {
1533
0
      unsigned int i;
1534
0
      double new_correction_factor;
1535
0
      int target_bits_per_mb;
1536
0
      const int target_size = cpi->av_per_frame_bandwidth;
1537
      // Flag to indicate we will force next frame to be encoded at max QP.
1538
0
      cpi->force_maxqp = 1;
1539
      // Reset the buffer levels.
1540
0
      cpi->buffer_level = cpi->oxcf.optimal_buffer_level;
1541
0
      cpi->bits_off_target = cpi->oxcf.optimal_buffer_level;
1542
      // Compute a new rate correction factor, corresponding to the current
1543
      // target frame size and max_QP, and adjust the rate correction factor
1544
      // upwards, if needed.
1545
      // This is to prevent a bad state where the re-encoded frame at max_QP
1546
      // undershoots significantly, and then we end up dropping every other
1547
      // frame because the QP/rate_correction_factor may have been too low
1548
      // before the drop and then takes too long to come up.
1549
0
      if (target_size > (INT_MAX >> BPER_MB_NORMBITS)) {
1550
0
        int temp = target_size / cpi->common.MBs;
1551
0
        if (temp > (INT_MAX >> BPER_MB_NORMBITS)) {
1552
0
          target_bits_per_mb = INT_MAX;
1553
0
        } else {
1554
0
          target_bits_per_mb = temp << BPER_MB_NORMBITS;
1555
0
        }
1556
0
      } else {
1557
0
        target_bits_per_mb =
1558
0
            (target_size << BPER_MB_NORMBITS) / cpi->common.MBs;
1559
0
      }
1560
      // Rate correction factor based on target_size_per_mb and max_QP.
1561
0
      new_correction_factor =
1562
0
          (double)target_bits_per_mb /
1563
0
          (double)vp8_bits_per_mb[INTER_FRAME][cpi->worst_quality];
1564
0
      if (new_correction_factor > cpi->rate_correction_factor) {
1565
0
        cpi->rate_correction_factor =
1566
0
            VPXMIN(2.0 * cpi->rate_correction_factor, new_correction_factor);
1567
0
      }
1568
0
      if (cpi->rate_correction_factor > MAX_BPB_FACTOR) {
1569
0
        cpi->rate_correction_factor = MAX_BPB_FACTOR;
1570
0
      }
1571
      // Drop this frame: update frame counters.
1572
0
      cpi->common.current_video_frame++;
1573
0
      cpi->frames_since_key++;
1574
0
      cpi->temporal_pattern_counter++;
1575
0
      cpi->frames_since_last_drop_overshoot = 0;
1576
0
      if (cpi->oxcf.number_of_layers > 1) {
1577
        // Set max_qp and rate correction for all temporal layers if overshoot
1578
        // is detected.
1579
0
        for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1580
0
          LAYER_CONTEXT *lc = &cpi->layer_context[i];
1581
0
          lc->force_maxqp = 1;
1582
0
          lc->frames_since_last_drop_overshoot = 0;
1583
0
          lc->rate_correction_factor = cpi->rate_correction_factor;
1584
0
        }
1585
0
      }
1586
#if CONFIG_MULTI_RES_ENCODING
1587
      if (cpi->oxcf.mr_total_resolutions > 1)
1588
        low_res_frame_info->is_frame_dropped_overshoot_maxqp = 1;
1589
#endif
1590
0
      return 1;
1591
0
    }
1592
0
    cpi->force_maxqp = 0;
1593
0
    cpi->frames_since_last_drop_overshoot++;
1594
#if CONFIG_MULTI_RES_ENCODING
1595
    if (cpi->oxcf.mr_total_resolutions > 1)
1596
      low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1597
#endif
1598
0
    return 0;
1599
0
  }
1600
0
  cpi->force_maxqp = 0;
1601
0
  cpi->frames_since_last_drop_overshoot++;
1602
#if CONFIG_MULTI_RES_ENCODING
1603
  if (cpi->oxcf.mr_total_resolutions > 1)
1604
    low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1605
#endif
1606
0
  return 0;
1607
0
}