Coverage Report

Created: 2025-11-16 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libvpx/vp8/encoder/ratectrl.c
Line
Count
Source
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
49.6k
#define MIN_BPB_FACTOR 0.01
28
54.0k
#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
335k
#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.54k
#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
82.6k
void vp8_save_coding_context(VP8_COMP *cpi) {
176
82.6k
  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
82.6k
  cc->frames_since_key = cpi->frames_since_key;
185
82.6k
  cc->filter_level = cpi->common.filter_level;
186
82.6k
  cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due;
187
82.6k
  cc->frames_since_golden = cpi->frames_since_golden;
188
189
82.6k
  vp8_copy(cc->mvc, cpi->common.fc.mvc);
190
82.6k
  vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts);
191
192
82.6k
  vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
193
82.6k
  vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
194
195
82.6k
  vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
196
82.6k
  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
82.6k
  cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
209
82.6k
}
210
211
28.4k
void vp8_restore_coding_context(VP8_COMP *cpi) {
212
28.4k
  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
28.4k
  cpi->frames_since_key = cc->frames_since_key;
219
28.4k
  cpi->common.filter_level = cc->filter_level;
220
28.4k
  cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due;
221
28.4k
  cpi->frames_since_golden = cc->frames_since_golden;
222
223
28.4k
  vp8_copy(cpi->common.fc.mvc, cc->mvc);
224
225
28.4k
  vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
226
227
28.4k
  vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob);
228
28.4k
  vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob);
229
230
28.4k
  vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
231
28.4k
  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
28.4k
  cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
244
28.4k
}
245
246
26.7k
void vp8_setup_key_frame(VP8_COMP *cpi) {
247
  /* Setup for Key frame: */
248
249
26.7k
  vp8_default_coef_probs(&cpi->common);
250
251
26.7k
  memcpy(cpi->common.fc.mvc, vp8_default_mv_context,
252
26.7k
         sizeof(vp8_default_mv_context));
253
26.7k
  {
254
26.7k
    int flag[2] = { 1, 1 };
255
26.7k
    vp8_build_component_cost_table(
256
26.7k
        cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flag);
257
26.7k
  }
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
26.7k
  cpi->lfc_a = cpi->common.fc;
263
26.7k
  cpi->lfc_g = cpi->common.fc;
264
26.7k
  cpi->lfc_n = cpi->common.fc;
265
266
26.7k
  cpi->common.filter_level = cpi->common.base_qindex * 3 / 8;
267
268
  /* Provisional interval before next GF */
269
26.7k
  if (cpi->auto_gold) {
270
26.7k
    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
271
26.7k
  } else {
272
0
    cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
273
0
  }
274
275
26.7k
  cpi->common.refresh_golden_frame = 1;
276
26.7k
  cpi->common.refresh_alt_ref_frame = 1;
277
26.7k
}
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
15.7k
static void calc_iframe_target_size(VP8_COMP *cpi) {
295
  /* boost defaults to half second */
296
15.7k
  int kf_boost;
297
15.7k
  uint64_t target;
298
299
  /* Clear down mmx registers to allow floating point in what follows */
300
15.7k
  vpx_clear_system_state();
301
302
15.7k
  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
15.7k
  } 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
15.7k
  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
6.70k
    target = (uint64_t)cpi->oxcf.starting_buffer_level / 2;
318
319
6.70k
    if (target > cpi->oxcf.target_bandwidth * 3 / 2) {
320
6.51k
      target = cpi->oxcf.target_bandwidth * 3 / 2;
321
6.51k
    }
322
9.08k
  } else {
323
    /* if this keyframe was forced, use a more recent Q estimate */
324
9.08k
    int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ? cpi->avg_frame_qindex
325
9.08k
                                                       : cpi->ni_av_qi;
326
327
9.08k
    int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
328
    /* Boost depends somewhat on frame rate: only used for 1 layer case. */
329
9.08k
    if (cpi->oxcf.number_of_layers == 1) {
330
9.08k
      kf_boost =
331
9.08k
          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
9.08k
      const int kMaxKfBoost = 2000;
336
9.08k
      if (kf_boost > kMaxKfBoost) kf_boost = kMaxKfBoost;
337
9.08k
    } 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
9.08k
    kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
344
345
    /* frame separation adjustment ( down) */
346
9.08k
    if (cpi->frames_since_key < cpi->output_framerate / 2) {
347
6.25k
      kf_boost =
348
6.25k
          (int)(kf_boost * cpi->frames_since_key / (cpi->output_framerate / 2));
349
6.25k
    }
350
351
    /* Minimal target size is |2* per_frame_bandwidth|. */
352
9.08k
    if (kf_boost < 16) kf_boost = 16;
353
354
9.08k
    target = ((uint64_t)(16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
355
9.08k
    target = VPXMIN(INT_MAX, target);
356
9.08k
  }
357
358
15.7k
  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
15.7k
  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
15.7k
  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
15.7k
}
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.54k
static void calc_gf_params(VP8_COMP *cpi) {
393
5.54k
  int Q =
394
5.54k
      (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
395
5.54k
  int Boost = 0;
396
397
5.54k
  int gf_frame_usage = 0; /* Golden frame usage since last GF */
398
5.54k
  int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
399
5.54k
                cpi->recent_ref_frame_usage[LAST_FRAME] +
400
5.54k
                cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
401
5.54k
                cpi->recent_ref_frame_usage[ALTREF_FRAME];
402
403
5.54k
  int pct_gf_active = (100 * cpi->gf_active_count) /
404
5.54k
                      (cpi->common.mb_rows * cpi->common.mb_cols);
405
406
5.54k
  if (tot_mbs) {
407
5.54k
    gf_frame_usage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
408
5.54k
                      cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
409
5.54k
                     100 / tot_mbs;
410
5.54k
  }
411
412
5.54k
  if (pct_gf_active > gf_frame_usage) gf_frame_usage = pct_gf_active;
413
414
  /* Not two pass */
415
5.54k
  if (cpi->pass != 2) {
416
    /* Single Pass lagged mode: TBD */
417
5.54k
    if (0) {
418
0
    }
419
420
    /* Single Pass compression: Has to use current and historical data */
421
5.54k
    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.54k
      Boost = GFQ_ADJUSTMENT;
475
476
      /* Adjust based upon most recently measure intra usage */
477
5.54k
      Boost = Boost *
478
5.54k
              gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15)
479
5.54k
                                            ? cpi->this_frame_percent_intra
480
5.54k
                                            : 14] /
481
5.54k
              100;
482
483
      /* Adjust gf boost based upon GF usage since last GF */
484
5.54k
      Boost = Boost * gf_adjust_table[gf_frame_usage] / 100;
485
5.54k
#endif
486
5.54k
    }
487
488
    /* golden frame boost without recode loop often goes awry.  be
489
     * safe by keeping numbers down.
490
     */
491
5.54k
    if (!cpi->sf.recode_loop) {
492
3.11k
      if (cpi->compressor_speed == 2) Boost = Boost / 2;
493
3.11k
    }
494
495
    /* Apply an upper limit based on Q for 1 pass encodes */
496
5.54k
    if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0)) {
497
2.37k
      Boost = kf_gf_boost_qlimits[Q];
498
499
      /* Apply lower limits to boost. */
500
3.16k
    } else if (Boost < 110) {
501
993
      Boost = 110;
502
993
    }
503
504
    /* Note the boost used */
505
5.54k
    cpi->last_boost = Boost;
506
5.54k
  }
507
508
  /* Estimate next interval
509
   * This is updated once the real frame size/boost is known.
510
   */
511
5.54k
  if (cpi->oxcf.fixed_q == -1) {
512
5.54k
    if (cpi->pass == 2) { /* 2 Pass */
513
0
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
514
5.54k
    } else { /* 1 Pass */
515
5.54k
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
516
517
5.54k
      if (cpi->last_boost > 750) cpi->frames_till_gf_update_due++;
518
519
5.54k
      if (cpi->last_boost > 1000) cpi->frames_till_gf_update_due++;
520
521
5.54k
      if (cpi->last_boost > 1250) cpi->frames_till_gf_update_due++;
522
523
5.54k
      if (cpi->last_boost >= 1500) cpi->frames_till_gf_update_due++;
524
525
5.54k
      if (gf_interval_table[gf_frame_usage] > cpi->frames_till_gf_update_due) {
526
2.89k
        cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_usage];
527
2.89k
      }
528
529
5.54k
      if (cpi->frames_till_gf_update_due > cpi->max_gf_interval) {
530
56
        cpi->frames_till_gf_update_due = cpi->max_gf_interval;
531
56
      }
532
5.54k
    }
533
5.54k
  } else {
534
0
    cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
535
0
  }
536
537
  /* ARF on or off */
538
5.54k
  if (cpi->pass != 2) {
539
    /* For now Alt ref is not allowed except in 2 pass modes. */
540
5.54k
    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.54k
  }
551
5.54k
}
552
553
69.5k
static void calc_pframe_target_size(VP8_COMP *cpi) {
554
69.5k
  int min_frame_target;
555
69.5k
  int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
556
557
69.5k
  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
69.5k
  min_frame_target = 0;
563
564
69.5k
  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
69.5k
  } else if (min_frame_target < cpi->per_frame_bandwidth / 4) {
571
64.7k
    min_frame_target = cpi->per_frame_bandwidth / 4;
572
64.7k
  }
573
574
  /* Special alt reference frame case */
575
69.5k
  if ((cpi->common.refresh_alt_ref_frame) &&
576
0
      (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
69.5k
  else {
588
    /* 2 pass */
589
69.5k
    if (cpi->pass == 2) {
590
0
      cpi->this_frame_target = cpi->per_frame_bandwidth;
591
0
    }
592
    /* 1 pass */
593
69.5k
    else {
594
69.5k
      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
69.5k
      if (cpi->kf_overspend_bits > 0) {
600
36.5k
        Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits)
601
36.5k
                         ? cpi->kf_bitrate_adjustment
602
36.5k
                         : cpi->kf_overspend_bits;
603
604
36.5k
        if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target)) {
605
6.08k
          Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
606
6.08k
        }
607
608
36.5k
        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
36.5k
        cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
615
616
36.5k
        if (cpi->this_frame_target < min_frame_target) {
617
0
          cpi->this_frame_target = min_frame_target;
618
0
        }
619
36.5k
      } else {
620
33.0k
        cpi->this_frame_target = cpi->per_frame_bandwidth;
621
33.0k
      }
622
623
      /* If appropriate make an adjustment to recover bits spent on a
624
       * recent GF
625
       */
626
69.5k
      if ((cpi->gf_overspend_bits > 0) &&
627
33.4k
          (cpi->this_frame_target > min_frame_target)) {
628
27.0k
        Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits)
629
27.0k
                         ? cpi->non_gf_bitrate_adjustment
630
27.0k
                         : cpi->gf_overspend_bits;
631
632
27.0k
        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
633
3.34k
          Adjustment = (cpi->this_frame_target - min_frame_target);
634
3.34k
        }
635
636
27.0k
        cpi->gf_overspend_bits -= Adjustment;
637
27.0k
        cpi->this_frame_target -= Adjustment;
638
27.0k
      }
639
640
      /* Apply small + and - boosts for non gf frames */
641
69.5k
      if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
642
31.4k
          (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1))) {
643
        /* % Adjustment limited to the range 1% to 10% */
644
20.6k
        Adjustment = (cpi->last_boost - 100) >> 5;
645
646
20.6k
        if (Adjustment > 10) {
647
5.31k
          Adjustment = 10;
648
5.31k
        }
649
20.6k
        assert(Adjustment >= 1);
650
651
        /* Convert to bits */
652
20.6k
        Adjustment = (cpi->this_frame_target * Adjustment) / 100;
653
654
20.6k
        if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
655
717
          Adjustment = (cpi->this_frame_target - min_frame_target);
656
717
        }
657
658
20.6k
        if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1)) {
659
2.28k
          Adjustment = (cpi->current_gf_interval - 1) * Adjustment;
660
          // Limit adjustment to 10% of current target.
661
2.28k
          if (Adjustment > (10 * cpi->this_frame_target) / 100) {
662
1.98k
            Adjustment = (10 * cpi->this_frame_target) / 100;
663
1.98k
          }
664
2.28k
          cpi->this_frame_target += Adjustment;
665
18.3k
        } else {
666
18.3k
          cpi->this_frame_target -= Adjustment;
667
18.3k
        }
668
20.6k
      }
669
69.5k
    }
670
69.5k
  }
671
672
  /* Sanity check that the total sum of adjustments is not above the
673
   * maximum allowed That is that having allowed for KF and GF penalties
674
   * we have not pushed the current interframe target to low. If the
675
   * adjustment we apply here is not capable of recovering all the extra
676
   * bits we have spent in the KF or GF then the remainder will have to
677
   * be recovered over a longer time span via other buffer / rate control
678
   * mechanisms.
679
   */
680
69.5k
  if (cpi->this_frame_target < min_frame_target) {
681
0
    cpi->this_frame_target = min_frame_target;
682
0
  }
683
684
69.5k
  if (!cpi->common.refresh_alt_ref_frame) {
685
    /* Note the baseline target data rate for this inter frame. */
686
69.5k
    cpi->inter_frame_target = cpi->this_frame_target;
687
69.5k
  }
688
689
  /* One Pass specific code */
690
69.5k
  if (cpi->pass == 0) {
691
    /* Adapt target frame size with respect to any buffering constraints: */
692
69.5k
    if (cpi->buffered_mode) {
693
64.9k
      int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100);
694
695
64.9k
      if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
696
39.2k
          (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level)) {
697
39.2k
        int percent_low = 0;
698
699
        /* Decide whether or not we need to adjust the frame data
700
         * rate target.
701
         *
702
         * If we are are below the optimal buffer fullness level
703
         * and adherence to buffering constraints is important to
704
         * the end usage then adjust the per frame target.
705
         */
706
39.2k
        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
707
0
            (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) {
708
0
          percent_low =
709
0
              (int)((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
710
0
                    one_percent_bits);
711
0
        }
712
        /* Are we overshooting the long term clip data rate... */
713
39.2k
        else if (cpi->bits_off_target < 0) {
714
          /* Adjust per frame data target downwards to compensate. */
715
8.28k
          percent_low =
716
8.28k
              (int)(100 * -cpi->bits_off_target / (cpi->total_byte_count * 8));
717
8.28k
        }
718
719
39.2k
        if (percent_low > cpi->oxcf.under_shoot_pct) {
720
0
          percent_low = cpi->oxcf.under_shoot_pct;
721
39.2k
        } else if (percent_low < 0) {
722
0
          percent_low = 0;
723
0
        }
724
725
        /* lower the target bandwidth for this frame. */
726
39.2k
        cpi->this_frame_target -=
727
39.2k
            (int)(((int64_t)cpi->this_frame_target * percent_low) / 200);
728
729
        /* Are we using allowing control of active_worst_allowed_q
730
         * according to buffer level.
731
         */
732
39.2k
        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
733
951
          int64_t critical_buffer_level;
734
735
          /* For streaming applications the most important factor is
736
           * cpi->buffer_level as this takes into account the
737
           * specified short term buffering constraints. However,
738
           * hitting the long term clip data rate target is also
739
           * important.
740
           */
741
951
          if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
742
            /* Take the smaller of cpi->buffer_level and
743
             * cpi->bits_off_target
744
             */
745
0
            critical_buffer_level = (cpi->buffer_level < cpi->bits_off_target)
746
0
                                        ? cpi->buffer_level
747
0
                                        : cpi->bits_off_target;
748
0
          }
749
          /* For local file playback short term buffering constraints
750
           * are less of an issue
751
           */
752
951
          else {
753
            /* Consider only how we are doing for the clip as a
754
             * whole
755
             */
756
951
            critical_buffer_level = cpi->bits_off_target;
757
951
          }
758
759
          /* Set the active worst quality based upon the selected
760
           * buffer fullness number.
761
           */
762
951
          if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) {
763
951
            if (critical_buffer_level > (cpi->oxcf.optimal_buffer_level >> 2)) {
764
378
              int64_t qadjustment_range = cpi->worst_quality - cpi->ni_av_qi;
765
378
              int64_t above_base = (critical_buffer_level -
766
378
                                    (cpi->oxcf.optimal_buffer_level >> 2));
767
768
              /* Step active worst quality down from
769
               * cpi->ni_av_qi when (critical_buffer_level ==
770
               * cpi->optimal_buffer_level) to
771
               * cpi->worst_quality when
772
               * (critical_buffer_level ==
773
               *     cpi->optimal_buffer_level >> 2)
774
               */
775
378
              cpi->active_worst_quality =
776
378
                  cpi->worst_quality -
777
378
                  (int)((qadjustment_range * above_base) /
778
378
                        (cpi->oxcf.optimal_buffer_level * 3 >> 2));
779
573
            } else {
780
573
              cpi->active_worst_quality = cpi->worst_quality;
781
573
            }
782
951
          } else {
783
0
            cpi->active_worst_quality = cpi->ni_av_qi;
784
0
          }
785
38.3k
        } else {
786
38.3k
          cpi->active_worst_quality = cpi->worst_quality;
787
38.3k
        }
788
39.2k
      } else {
789
25.6k
        int percent_high = 0;
790
25.6k
        int64_t target = cpi->this_frame_target;
791
792
25.6k
        if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
793
0
            (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) {
794
0
          percent_high =
795
0
              (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
796
0
                    one_percent_bits);
797
25.6k
        } else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) {
798
25.1k
          if (cpi->total_byte_count > 0) {
799
25.1k
            percent_high = (int)((100 * cpi->bits_off_target) /
800
25.1k
                                 (cpi->total_byte_count * 8));
801
25.1k
          } else {
802
0
            percent_high = cpi->oxcf.over_shoot_pct;
803
0
          }
804
25.1k
        }
805
806
25.6k
        if (percent_high > cpi->oxcf.over_shoot_pct) {
807
24.7k
          percent_high = cpi->oxcf.over_shoot_pct;
808
24.7k
        } else if (percent_high < 0) {
809
0
          percent_high = 0;
810
0
        }
811
812
25.6k
        target += (target * percent_high) / 200;
813
25.6k
        target = VPXMIN(target, INT_MAX);
814
25.6k
        cpi->this_frame_target = (int)target;
815
816
        /* Are we allowing control of active_worst_allowed_q according
817
         * to buffer level.
818
         */
819
25.6k
        if (cpi->auto_worst_q && cpi->ni_frames > 150) {
820
          /* When using the relaxed buffer model stick to the
821
           * user specified value
822
           */
823
601
          cpi->active_worst_quality = cpi->ni_av_qi;
824
25.0k
        } else {
825
25.0k
          cpi->active_worst_quality = cpi->worst_quality;
826
25.0k
        }
827
25.6k
      }
828
829
      /* Set active_best_quality to prevent quality rising too high */
830
64.9k
      cpi->active_best_quality = cpi->best_quality;
831
832
      /* Worst quality obviously must not be better than best quality */
833
64.9k
      if (cpi->active_worst_quality <= cpi->active_best_quality) {
834
186
        cpi->active_worst_quality = cpi->active_best_quality + 1;
835
186
      }
836
837
64.9k
      if (cpi->active_worst_quality > 127) cpi->active_worst_quality = 127;
838
64.9k
    }
839
    /* Unbuffered mode (eg. video conferencing) */
840
4.62k
    else {
841
      /* Set the active worst quality */
842
4.62k
      cpi->active_worst_quality = cpi->worst_quality;
843
4.62k
    }
844
845
    /* Special trap for constrained quality mode
846
     * "active_worst_quality" may never drop below cq level
847
     * for any frame type.
848
     */
849
69.5k
    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
850
9.26k
        cpi->active_worst_quality < cpi->cq_target_quality) {
851
0
      cpi->active_worst_quality = cpi->cq_target_quality;
852
0
    }
853
69.5k
  }
854
855
  /* Test to see if we have to drop a frame
856
   * The auto-drop frame code is only used in buffered mode.
857
   * In unbufferd mode (eg vide conferencing) the descision to
858
   * code or drop a frame is made outside the codec in response to real
859
   * world comms or buffer considerations.
860
   */
861
69.5k
  if (cpi->drop_frames_allowed &&
862
0
      (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
863
0
      ((cpi->common.frame_type != KEY_FRAME))) {
864
    /* Check for a buffer underun-crisis in which case we have to drop
865
     * a frame
866
     */
867
0
    if ((cpi->buffer_level < 0)) {
868
#if 0
869
            FILE *f = fopen("dec.stt", "a");
870
            fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
871
                    (int) cpi->common.current_video_frame,
872
                    cpi->decimation_factor, cpi->common.horiz_scale,
873
                    (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
874
            fclose(f);
875
#endif
876
0
      cpi->drop_frame = 1;
877
878
      /* Update the buffer level variable. */
879
0
      cpi->bits_off_target += cpi->av_per_frame_bandwidth;
880
0
      if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
881
0
        cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
882
0
      }
883
0
      cpi->buffer_level = cpi->bits_off_target;
884
885
0
      if (cpi->oxcf.number_of_layers > 1) {
886
0
        unsigned int i;
887
888
        // Propagate bits saved by dropping the frame to higher layers.
889
0
        for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
890
0
          LAYER_CONTEXT *lc = &cpi->layer_context[i];
891
0
          lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
892
0
          if (lc->bits_off_target > lc->maximum_buffer_size) {
893
0
            lc->bits_off_target = lc->maximum_buffer_size;
894
0
          }
895
0
          lc->buffer_level = lc->bits_off_target;
896
0
        }
897
0
      }
898
0
    }
899
0
  }
900
901
  /* Adjust target frame size for Golden Frames: */
902
69.5k
  if (cpi->oxcf.error_resilient_mode == 0 &&
903
69.5k
      (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame) {
904
11.4k
    if (!cpi->gf_update_onepass_cbr) {
905
11.4k
      int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
906
11.4k
                                      : cpi->oxcf.fixed_q;
907
908
11.4k
      int gf_frame_usage = 0; /* Golden frame usage since last GF */
909
11.4k
      int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
910
11.4k
                    cpi->recent_ref_frame_usage[LAST_FRAME] +
911
11.4k
                    cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
912
11.4k
                    cpi->recent_ref_frame_usage[ALTREF_FRAME];
913
914
11.4k
      int pct_gf_active = (100 * cpi->gf_active_count) /
915
11.4k
                          (cpi->common.mb_rows * cpi->common.mb_cols);
916
917
11.4k
      if (tot_mbs) {
918
11.4k
        gf_frame_usage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
919
11.4k
                          cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
920
11.4k
                         100 / tot_mbs;
921
11.4k
      }
922
923
11.4k
      if (pct_gf_active > gf_frame_usage) gf_frame_usage = pct_gf_active;
924
925
      /* Is a fixed manual GF frequency being used */
926
11.4k
      if (cpi->auto_gold) {
927
        /* For one pass throw a GF if recent frame intra usage is
928
         * low or the GF usage is high
929
         */
930
11.4k
        if ((cpi->pass == 0) &&
931
11.4k
            (cpi->this_frame_percent_intra < 15 || gf_frame_usage >= 5)) {
932
5.54k
          cpi->common.refresh_golden_frame = 1;
933
934
          /* Two pass GF descision */
935
5.86k
        } else if (cpi->pass == 2) {
936
0
          cpi->common.refresh_golden_frame = 1;
937
0
        }
938
11.4k
      }
939
940
#if 0
941
942
          /* Debug stats */
943
          if (0) {
944
              FILE *f;
945
946
              f = fopen("gf_usaget.stt", "a");
947
              fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
948
                      cpi->common.current_video_frame,  cpi->gfu_boost,
949
                      GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_usage);
950
              fclose(f);
951
          }
952
953
#endif
954
955
11.4k
      if (cpi->common.refresh_golden_frame == 1) {
956
#if 0
957
958
            if (0) {
959
                FILE *f;
960
961
                f = fopen("GFexit.stt", "a");
962
                fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
963
                fclose(f);
964
            }
965
966
#endif
967
968
5.54k
        if (cpi->auto_adjust_gold_quantizer) {
969
5.54k
          calc_gf_params(cpi);
970
5.54k
        }
971
972
        /* If we are using alternate ref instead of gf then do not apply the
973
         * boost It will instead be applied to the altref update Jims
974
         * modified boost
975
         */
976
5.54k
        if (!cpi->source_alt_ref_active) {
977
5.54k
          if (cpi->oxcf.fixed_q < 0) {
978
5.54k
            if (cpi->pass == 2) {
979
              /* The spend on the GF is defined in the two pass
980
               * code for two pass encodes
981
               */
982
0
              cpi->this_frame_target = cpi->per_frame_bandwidth;
983
5.54k
            } else {
984
5.54k
              int Boost = cpi->last_boost;
985
5.54k
              int frames_in_section = cpi->frames_till_gf_update_due + 1;
986
5.54k
              int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
987
5.54k
              int bits_in_section = cpi->inter_frame_target * frames_in_section;
988
989
              /* Normalize Altboost and allocations chunck down to
990
               * prevent overflow
991
               */
992
5.54k
              while (Boost > 1000) {
993
0
                Boost /= 2;
994
0
                allocation_chunks /= 2;
995
0
              }
996
997
              /* Avoid loss of precision but avoid overflow */
998
5.54k
              if ((bits_in_section >> 7) > allocation_chunks) {
999
1.26k
                cpi->this_frame_target =
1000
1.26k
                    Boost * (bits_in_section / allocation_chunks);
1001
4.27k
              } else {
1002
4.27k
                cpi->this_frame_target =
1003
4.27k
                    (Boost * bits_in_section) / allocation_chunks;
1004
4.27k
              }
1005
5.54k
            }
1006
5.54k
          } else {
1007
0
            cpi->this_frame_target =
1008
0
                (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) *
1009
0
                 cpi->last_boost) /
1010
0
                100;
1011
0
          }
1012
5.54k
        } else {
1013
          /* If there is an active ARF at this location use the minimum
1014
           * bits on this frame even if it is a contructed arf.
1015
           * The active maximum quantizer insures that an appropriate
1016
           * number of bits will be spent if needed for contstructed ARFs.
1017
           */
1018
0
          cpi->this_frame_target = 0;
1019
0
        }
1020
1021
5.54k
        cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1022
5.54k
      }
1023
11.4k
    } else {
1024
      // Special case for 1 pass CBR: fixed gf period.
1025
      // TODO(marpan): Adjust this boost/interval logic.
1026
      // If gf_cbr_boost_pct is small (below threshold) set the flag
1027
      // gf_noboost_onepass_cbr = 1, which forces the gf to use the same
1028
      // rate correction factor as last.
1029
0
      cpi->gf_noboost_onepass_cbr = (cpi->oxcf.gf_cbr_boost_pct <= 100);
1030
0
      cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1031
      // Skip this update if the zero_mvcount is low.
1032
0
      if (cpi->zeromv_count > (cpi->common.MBs >> 1)) {
1033
0
        cpi->common.refresh_golden_frame = 1;
1034
0
        cpi->this_frame_target =
1035
0
            (cpi->this_frame_target * (100 + cpi->oxcf.gf_cbr_boost_pct)) / 100;
1036
0
      }
1037
0
      cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
1038
0
      cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1039
0
    }
1040
11.4k
  }
1041
1042
69.5k
  cpi->per_frame_bandwidth = old_per_frame_bandwidth;
1043
69.5k
}
1044
1045
111k
void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) {
1046
111k
  int Q = cpi->common.base_qindex;
1047
111k
  int correction_factor = 100;
1048
111k
  double rate_correction_factor;
1049
111k
  double adjustment_limit;
1050
1051
111k
  int projected_size_based_on_q = 0;
1052
1053
  /* Clear down mmx registers to allow floating point in what follows */
1054
111k
  vpx_clear_system_state();
1055
1056
111k
  if (cpi->common.frame_type == KEY_FRAME) {
1057
27.7k
    rate_correction_factor = cpi->key_frame_rate_correction_factor;
1058
83.5k
  } else {
1059
83.5k
    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1060
83.5k
        (cpi->common.refresh_alt_ref_frame ||
1061
83.5k
         cpi->common.refresh_golden_frame)) {
1062
8.14k
      rate_correction_factor = cpi->gf_rate_correction_factor;
1063
75.4k
    } else {
1064
75.4k
      rate_correction_factor = cpi->rate_correction_factor;
1065
75.4k
    }
1066
83.5k
  }
1067
1068
  /* Work out how big we would have expected the frame to be at this Q
1069
   * given the current correction factor. Stay in double to avoid int
1070
   * overflow when values are large
1071
   */
1072
111k
  projected_size_based_on_q =
1073
111k
      (int)(((.5 + rate_correction_factor *
1074
111k
                       vp8_bits_per_mb[cpi->common.frame_type][Q]) *
1075
111k
             cpi->common.MBs) /
1076
111k
            (1 << BPER_MB_NORMBITS));
1077
1078
  /* Make some allowance for cpi->zbin_over_quant */
1079
111k
  if (cpi->mb.zbin_over_quant > 0) {
1080
21.3k
    int Z = cpi->mb.zbin_over_quant;
1081
21.3k
    double Factor = 0.99;
1082
21.3k
    double factor_adjustment = 0.01 / 256.0;
1083
1084
2.98M
    while (Z > 0) {
1085
2.96M
      Z--;
1086
2.96M
      projected_size_based_on_q = (int)(Factor * projected_size_based_on_q);
1087
2.96M
      Factor += factor_adjustment;
1088
1089
2.96M
      if (Factor >= 0.999) Factor = 0.999;
1090
2.96M
    }
1091
21.3k
  }
1092
1093
  /* Work out a size correction factor. */
1094
111k
  if (projected_size_based_on_q > 0) {
1095
103k
    correction_factor = (int)((100 * (int64_t)cpi->projected_frame_size) /
1096
103k
                              projected_size_based_on_q);
1097
103k
  }
1098
1099
  /* More heavily damped adjustment used if we have been oscillating
1100
   * either side of target
1101
   */
1102
111k
  switch (damp_var) {
1103
25.1k
    case 0: adjustment_limit = 0.75; break;
1104
3.74k
    case 1: adjustment_limit = 0.375; break;
1105
82.4k
    case 2:
1106
82.4k
    default: adjustment_limit = 0.25; break;
1107
111k
  }
1108
1109
111k
  if (correction_factor > 102) {
1110
    /* We are not already at the worst allowable quality */
1111
50.6k
    correction_factor =
1112
50.6k
        (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
1113
50.6k
    rate_correction_factor =
1114
50.6k
        ((rate_correction_factor * correction_factor) / 100);
1115
1116
    /* Keep rate_correction_factor within limits */
1117
50.6k
    if (rate_correction_factor > MAX_BPB_FACTOR) {
1118
3.41k
      rate_correction_factor = MAX_BPB_FACTOR;
1119
3.41k
    }
1120
60.7k
  } else if (correction_factor < 99) {
1121
    /* We are not already at the best allowable quality */
1122
49.1k
    correction_factor =
1123
49.1k
        (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
1124
49.1k
    rate_correction_factor =
1125
49.1k
        ((rate_correction_factor * correction_factor) / 100);
1126
1127
    /* Keep rate_correction_factor within limits */
1128
49.1k
    if (rate_correction_factor < MIN_BPB_FACTOR) {
1129
491
      rate_correction_factor = MIN_BPB_FACTOR;
1130
491
    }
1131
49.1k
  }
1132
1133
111k
  if (cpi->common.frame_type == KEY_FRAME) {
1134
27.7k
    cpi->key_frame_rate_correction_factor = rate_correction_factor;
1135
83.5k
  } else {
1136
83.5k
    if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1137
83.5k
        (cpi->common.refresh_alt_ref_frame ||
1138
83.5k
         cpi->common.refresh_golden_frame)) {
1139
8.14k
      cpi->gf_rate_correction_factor = rate_correction_factor;
1140
75.4k
    } else {
1141
75.4k
      cpi->rate_correction_factor = rate_correction_factor;
1142
75.4k
    }
1143
83.5k
  }
1144
111k
}
1145
1146
0
static int limit_q_cbr_inter(int last_q, int current_q) {
1147
0
  int limit_down = 12;
1148
0
  if (last_q - current_q > limit_down)
1149
0
    return (last_q - limit_down);
1150
0
  else
1151
0
    return current_q;
1152
0
}
1153
1154
110k
int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) {
1155
110k
  int Q = cpi->active_worst_quality;
1156
1157
110k
  if (cpi->force_maxqp == 1) {
1158
0
    cpi->active_worst_quality = cpi->worst_quality;
1159
0
    return cpi->worst_quality;
1160
0
  }
1161
  /* Reset Zbin OQ value */
1162
110k
  cpi->mb.zbin_over_quant = 0;
1163
1164
110k
  if (cpi->oxcf.fixed_q >= 0) {
1165
0
    Q = cpi->oxcf.fixed_q;
1166
1167
0
    if (cpi->common.frame_type == KEY_FRAME) {
1168
0
      Q = cpi->oxcf.key_q;
1169
0
    } else if (cpi->oxcf.number_of_layers == 1 &&
1170
0
               cpi->common.refresh_alt_ref_frame &&
1171
0
               !cpi->gf_noboost_onepass_cbr) {
1172
0
      Q = cpi->oxcf.alt_q;
1173
0
    } else if (cpi->oxcf.number_of_layers == 1 &&
1174
0
               cpi->common.refresh_golden_frame &&
1175
0
               !cpi->gf_noboost_onepass_cbr) {
1176
0
      Q = cpi->oxcf.gold_q;
1177
0
    }
1178
110k
  } else {
1179
110k
    int i;
1180
110k
    int last_error = INT_MAX;
1181
110k
    int target_bits_per_mb;
1182
110k
    int bits_per_mb_at_this_q;
1183
110k
    double correction_factor;
1184
1185
    /* Select the appropriate correction factor based upon type of frame. */
1186
110k
    if (cpi->common.frame_type == KEY_FRAME) {
1187
24.8k
      correction_factor = cpi->key_frame_rate_correction_factor;
1188
85.8k
    } else {
1189
85.8k
      if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1190
85.8k
          (cpi->common.refresh_alt_ref_frame ||
1191
85.8k
           cpi->common.refresh_golden_frame)) {
1192
8.12k
        correction_factor = cpi->gf_rate_correction_factor;
1193
77.7k
      } else {
1194
77.7k
        correction_factor = cpi->rate_correction_factor;
1195
77.7k
      }
1196
85.8k
    }
1197
1198
    /* Calculate required scaling factor based on target frame size and
1199
     * size of frame produced using previous Q
1200
     */
1201
110k
    if (target_bits_per_frame > (INT_MAX >> BPER_MB_NORMBITS)) {
1202
3.41k
      int temp = target_bits_per_frame / cpi->common.MBs;
1203
3.41k
      if (temp > (INT_MAX >> BPER_MB_NORMBITS)) {
1204
524
        target_bits_per_mb = INT_MAX;
1205
2.88k
      } else {
1206
2.88k
        target_bits_per_mb = temp << BPER_MB_NORMBITS;
1207
2.88k
      }
1208
107k
    } else {
1209
107k
      target_bits_per_mb =
1210
107k
          (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
1211
107k
    }
1212
1213
110k
    i = cpi->active_best_quality;
1214
1215
4.86M
    do {
1216
4.86M
      bits_per_mb_at_this_q =
1217
4.86M
          (int)(.5 +
1218
4.86M
                correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
1219
1220
4.86M
      if (bits_per_mb_at_this_q <= target_bits_per_mb) {
1221
84.5k
        if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) {
1222
65.1k
          Q = i;
1223
65.1k
        } else {
1224
19.4k
          Q = i - 1;
1225
19.4k
        }
1226
1227
84.5k
        break;
1228
4.78M
      } else {
1229
4.78M
        last_error = bits_per_mb_at_this_q - target_bits_per_mb;
1230
4.78M
      }
1231
4.86M
    } while (++i <= cpi->active_worst_quality);
1232
1233
    /* If we are at MAXQ then enable Q over-run which seeks to claw
1234
     * back additional bits through things like the RD multiplier
1235
     * and zero bin size.
1236
     */
1237
110k
    if (Q >= MAXQ) {
1238
25.8k
      int zbin_oqmax;
1239
1240
25.8k
      double Factor = 0.99;
1241
25.8k
      double factor_adjustment = 0.01 / 256.0;
1242
1243
25.8k
      if (cpi->common.frame_type == KEY_FRAME) {
1244
3.52k
        zbin_oqmax = 0;
1245
22.3k
      } else if (cpi->oxcf.number_of_layers == 1 &&
1246
22.3k
                 !cpi->gf_noboost_onepass_cbr &&
1247
22.3k
                 (cpi->common.refresh_alt_ref_frame ||
1248
22.3k
                  (cpi->common.refresh_golden_frame &&
1249
980
                   !cpi->source_alt_ref_active))) {
1250
980
        zbin_oqmax = 16;
1251
21.3k
      } else {
1252
21.3k
        zbin_oqmax = ZBIN_OQ_MAX;
1253
21.3k
      }
1254
1255
      /*{
1256
          double Factor =
1257
      (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
1258
          double Oq;
1259
1260
          Factor = Factor/1.2683;
1261
1262
          Oq = pow( Factor, (1.0/-0.165) );
1263
1264
          if ( Oq > zbin_oqmax )
1265
              Oq = zbin_oqmax;
1266
1267
          cpi->zbin_over_quant = (int)Oq;
1268
      }*/
1269
1270
      /* Each incrment in the zbin is assumed to have a fixed effect
1271
       * on bitrate. This is not of course true. The effect will be
1272
       * highly clip dependent and may well have sudden steps. The
1273
       * idea here is to acheive higher effective quantizers than the
1274
       * normal maximum by expanding the zero bin and hence
1275
       * decreasing the number of low magnitude non zero coefficients.
1276
       */
1277
3.10M
      while (cpi->mb.zbin_over_quant < zbin_oqmax) {
1278
3.08M
        cpi->mb.zbin_over_quant++;
1279
1280
3.08M
        if (cpi->mb.zbin_over_quant > zbin_oqmax) {
1281
0
          cpi->mb.zbin_over_quant = zbin_oqmax;
1282
0
        }
1283
1284
        /* Adjust bits_per_mb_at_this_q estimate */
1285
3.08M
        bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
1286
3.08M
        Factor += factor_adjustment;
1287
1288
3.08M
        if (Factor >= 0.999) Factor = 0.999;
1289
1290
        /* Break out if we get down to the target rate */
1291
3.08M
        if (bits_per_mb_at_this_q <= target_bits_per_mb) break;
1292
3.08M
      }
1293
25.8k
    }
1294
110k
  }
1295
1296
  // Limit decrease in Q for 1 pass CBR screen content mode.
1297
110k
  if (cpi->common.frame_type != KEY_FRAME && cpi->pass == 0 &&
1298
85.8k
      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1299
0
      cpi->oxcf.screen_content_mode)
1300
0
    Q = limit_q_cbr_inter(cpi->last_q[1], Q);
1301
1302
110k
  return Q;
1303
110k
}
1304
1305
10.4k
static int estimate_keyframe_frequency(VP8_COMP *cpi) {
1306
10.4k
  int i;
1307
1308
  /* Average key frame frequency */
1309
10.4k
  int av_key_frame_frequency = 0;
1310
1311
  /* First key frame at start of sequence is a special case. We have no
1312
   * frequency data.
1313
   */
1314
10.4k
  if (cpi->key_frame_count == 1) {
1315
    /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
1316
     * whichever is smaller.
1317
     */
1318
3.65k
    int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
1319
3.65k
    av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
1320
1321
3.65k
    if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) {
1322
334
      av_key_frame_frequency = key_freq;
1323
334
    }
1324
1325
3.65k
    cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] =
1326
3.65k
        av_key_frame_frequency;
1327
6.84k
  } else {
1328
6.84k
    unsigned int total_weight = 0;
1329
6.84k
    int last_kf_interval =
1330
6.84k
        (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1331
1332
    /* reset keyframe context and calculate weighted average of last
1333
     * KEY_FRAME_CONTEXT keyframes
1334
     */
1335
41.0k
    for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
1336
34.2k
      if (i < KEY_FRAME_CONTEXT - 1) {
1337
27.3k
        cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i + 1];
1338
27.3k
      } else {
1339
6.84k
        cpi->prior_key_frame_distance[i] = last_kf_interval;
1340
6.84k
      }
1341
1342
34.2k
      av_key_frame_frequency +=
1343
34.2k
          prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i];
1344
34.2k
      total_weight += prior_key_frame_weight[i];
1345
34.2k
    }
1346
1347
6.84k
    av_key_frame_frequency /= total_weight;
1348
6.84k
  }
1349
  // TODO (marpan): Given the checks above, |av_key_frame_frequency|
1350
  // should always be above 0. But for now we keep the sanity check in.
1351
10.4k
  if (av_key_frame_frequency == 0) av_key_frame_frequency = 1;
1352
10.4k
  return av_key_frame_frequency;
1353
10.4k
}
1354
1355
15.7k
void vp8_adjust_key_frame_context(VP8_COMP *cpi) {
1356
  /* Clear down mmx registers to allow floating point in what follows */
1357
15.7k
  vpx_clear_system_state();
1358
1359
  /* Do we have any key frame overspend to recover? */
1360
  /* Two-pass overspend handled elsewhere. */
1361
15.7k
  if ((cpi->pass != 2) &&
1362
15.7k
      (cpi->projected_frame_size > cpi->per_frame_bandwidth)) {
1363
10.4k
    int overspend;
1364
1365
    /* Update the count of key frame overspend to be recovered in
1366
     * subsequent frames. A portion of the KF overspend is treated as gf
1367
     * overspend (and hence recovered more quickly) as the kf is also a
1368
     * gf. Otherwise the few frames following each kf tend to get more
1369
     * bits allocated than those following other gfs.
1370
     */
1371
10.4k
    overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
1372
1373
10.4k
    if (cpi->oxcf.number_of_layers > 1) {
1374
0
      cpi->kf_overspend_bits += overspend;
1375
10.4k
    } else {
1376
10.4k
      cpi->kf_overspend_bits += overspend * 7 / 8;
1377
10.4k
      cpi->gf_overspend_bits += overspend * 1 / 8;
1378
10.4k
    }
1379
1380
    /* Work out how much to try and recover per frame. */
1381
10.4k
    cpi->kf_bitrate_adjustment =
1382
10.4k
        cpi->kf_overspend_bits / estimate_keyframe_frequency(cpi);
1383
10.4k
  }
1384
1385
15.7k
  cpi->frames_since_key = 0;
1386
15.7k
  cpi->key_frame_count++;
1387
15.7k
}
1388
1389
void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
1390
85.3k
                                   int *frame_over_shoot_limit) {
1391
  /* Set-up bounds on acceptable frame size: */
1392
85.3k
  if (cpi->oxcf.fixed_q >= 0) {
1393
    /* Fixed Q scenario: frame size never outranges target
1394
     * (there is no target!)
1395
     */
1396
0
    *frame_under_shoot_limit = 0;
1397
0
    *frame_over_shoot_limit = INT_MAX;
1398
85.3k
  } else {
1399
85.3k
    const int64_t this_frame_target = cpi->this_frame_target;
1400
85.3k
    int64_t over_shoot_limit, under_shoot_limit;
1401
1402
85.3k
    if (cpi->common.frame_type == KEY_FRAME) {
1403
15.7k
      over_shoot_limit = this_frame_target * 9 / 8;
1404
15.7k
      under_shoot_limit = this_frame_target * 7 / 8;
1405
69.5k
    } else {
1406
69.5k
      if (cpi->oxcf.number_of_layers > 1 || cpi->common.refresh_alt_ref_frame ||
1407
69.5k
          cpi->common.refresh_golden_frame) {
1408
5.54k
        over_shoot_limit = this_frame_target * 9 / 8;
1409
5.54k
        under_shoot_limit = this_frame_target * 7 / 8;
1410
64.0k
      } else {
1411
        /* For CBR take buffer fullness into account */
1412
64.0k
        if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1413
0
          if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level +
1414
0
                                     cpi->oxcf.maximum_buffer_size) >>
1415
0
                                    1)) {
1416
            /* Buffer is too full so relax overshoot and tighten
1417
             * undershoot
1418
             */
1419
0
            over_shoot_limit = this_frame_target * 12 / 8;
1420
0
            under_shoot_limit = this_frame_target * 6 / 8;
1421
0
          } else if (cpi->buffer_level <=
1422
0
                     (cpi->oxcf.optimal_buffer_level >> 1)) {
1423
            /* Buffer is too low so relax undershoot and tighten
1424
             * overshoot
1425
             */
1426
0
            over_shoot_limit = this_frame_target * 10 / 8;
1427
0
            under_shoot_limit = this_frame_target * 4 / 8;
1428
0
          } else {
1429
0
            over_shoot_limit = this_frame_target * 11 / 8;
1430
0
            under_shoot_limit = this_frame_target * 5 / 8;
1431
0
          }
1432
0
        }
1433
        /* VBR and CQ mode */
1434
        /* Note that tighter restrictions here can help quality
1435
         * but hurt encode speed
1436
         */
1437
64.0k
        else {
1438
          /* Stron overshoot limit for constrained quality */
1439
64.0k
          if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
1440
8.48k
            over_shoot_limit = this_frame_target * 11 / 8;
1441
8.48k
            under_shoot_limit = this_frame_target * 2 / 8;
1442
55.5k
          } else {
1443
55.5k
            over_shoot_limit = this_frame_target * 11 / 8;
1444
55.5k
            under_shoot_limit = this_frame_target * 5 / 8;
1445
55.5k
          }
1446
64.0k
        }
1447
64.0k
      }
1448
69.5k
    }
1449
1450
    /* For very small rate targets where the fractional adjustment
1451
     * (eg * 7/8) may be tiny make sure there is at least a minimum
1452
     * range.
1453
     */
1454
85.3k
    over_shoot_limit += 200;
1455
85.3k
    under_shoot_limit -= 200;
1456
85.3k
    if (under_shoot_limit < 0) under_shoot_limit = 0;
1457
85.3k
    if (under_shoot_limit > INT_MAX) under_shoot_limit = INT_MAX;
1458
85.3k
    if (over_shoot_limit > INT_MAX) over_shoot_limit = INT_MAX;
1459
85.3k
    *frame_under_shoot_limit = (int)under_shoot_limit;
1460
85.3k
    *frame_over_shoot_limit = (int)over_shoot_limit;
1461
85.3k
  }
1462
85.3k
}
1463
1464
/* return of 0 means drop frame */
1465
85.3k
int vp8_pick_frame_size(VP8_COMP *cpi) {
1466
85.3k
  VP8_COMMON *cm = &cpi->common;
1467
1468
85.3k
  if (cm->frame_type == KEY_FRAME) {
1469
15.7k
    calc_iframe_target_size(cpi);
1470
69.5k
  } else {
1471
69.5k
    calc_pframe_target_size(cpi);
1472
1473
    /* Check if we're dropping the frame: */
1474
69.5k
    if (cpi->drop_frame) {
1475
0
      cpi->drop_frame = 0;
1476
0
      return 0;
1477
0
    }
1478
69.5k
  }
1479
85.3k
  return 1;
1480
85.3k
}
1481
// If this just encoded frame (mcomp/transform/quant, but before loopfilter and
1482
// pack_bitstream) has large overshoot, and was not being encoded close to the
1483
// max QP, then drop this frame and force next frame to be encoded at max QP.
1484
// Allow this for screen_content_mode = 2, or if drop frames is allowed.
1485
// TODO(marpan): Should do this exit condition during the encode_frame
1486
// (i.e., halfway during the encoding of the frame) to save cycles.
1487
0
int vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) {
1488
0
  int force_drop_overshoot = 0;
1489
#if CONFIG_MULTI_RES_ENCODING
1490
  // Only check for dropping due to overshoot on the lowest stream.
1491
  // If the lowest stream of the multi-res encoding was dropped due to
1492
  // overshoot, then force dropping on all upper layer streams
1493
  // (mr_encoder_id > 0).
1494
  LOWER_RES_FRAME_INFO *low_res_frame_info =
1495
      (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
1496
  if (cpi->oxcf.mr_total_resolutions > 1 && cpi->oxcf.mr_encoder_id > 0) {
1497
    force_drop_overshoot = low_res_frame_info->is_frame_dropped_overshoot_maxqp;
1498
    if (!force_drop_overshoot) {
1499
      cpi->force_maxqp = 0;
1500
      cpi->frames_since_last_drop_overshoot++;
1501
      return 0;
1502
    }
1503
  }
1504
#endif
1505
0
  if (cpi->common.frame_type != KEY_FRAME &&
1506
0
      (cpi->oxcf.screen_content_mode == 2 ||
1507
0
       (cpi->drop_frames_allowed &&
1508
0
        (force_drop_overshoot ||
1509
0
         (cpi->rate_correction_factor < (8.0f * MIN_BPB_FACTOR) &&
1510
0
          cpi->frames_since_last_drop_overshoot > (int)cpi->framerate))))) {
1511
    // Note: the "projected_frame_size" from encode_frame() only gives estimate
1512
    // of mode/motion vector rate (in non-rd mode): so below we only require
1513
    // that projected_frame_size is somewhat greater than per-frame-bandwidth,
1514
    // but add additional condition with high threshold on prediction residual.
1515
1516
    // QP threshold: only allow dropping if we are not close to qp_max.
1517
0
    int thresh_qp = 3 * cpi->worst_quality >> 2;
1518
    // Rate threshold, in bytes.
1519
0
    int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3);
1520
    // Threshold for the average (over all macroblocks) of the pixel-sum
1521
    // residual error over 16x16 block.
1522
0
    int thresh_pred_err_mb = (200 << 4);
1523
0
    int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs);
1524
    // Reduce/ignore thresh_rate if pred_err_mb much larger than its threshold,
1525
    // give more weight to pred_err metric for overshoot detection.
1526
0
    if (cpi->drop_frames_allowed && pred_err_mb > (thresh_pred_err_mb << 4))
1527
0
      thresh_rate = thresh_rate >> 3;
1528
0
    if ((Q < thresh_qp && cpi->projected_frame_size > thresh_rate &&
1529
0
         pred_err_mb > thresh_pred_err_mb &&
1530
0
         pred_err_mb > 2 * cpi->last_pred_err_mb) ||
1531
0
        force_drop_overshoot) {
1532
0
      unsigned int i;
1533
0
      double new_correction_factor;
1534
0
      int target_bits_per_mb;
1535
0
      const int target_size = cpi->av_per_frame_bandwidth;
1536
      // Flag to indicate we will force next frame to be encoded at max QP.
1537
0
      cpi->force_maxqp = 1;
1538
      // Reset the buffer levels.
1539
0
      cpi->buffer_level = cpi->oxcf.optimal_buffer_level;
1540
0
      cpi->bits_off_target = cpi->oxcf.optimal_buffer_level;
1541
      // Compute a new rate correction factor, corresponding to the current
1542
      // target frame size and max_QP, and adjust the rate correction factor
1543
      // upwards, if needed.
1544
      // This is to prevent a bad state where the re-encoded frame at max_QP
1545
      // undershoots significantly, and then we end up dropping every other
1546
      // frame because the QP/rate_correction_factor may have been too low
1547
      // before the drop and then takes too long to come up.
1548
0
      if (target_size > (INT_MAX >> BPER_MB_NORMBITS)) {
1549
0
        int temp = target_size / cpi->common.MBs;
1550
0
        if (temp > (INT_MAX >> BPER_MB_NORMBITS)) {
1551
0
          target_bits_per_mb = INT_MAX;
1552
0
        } else {
1553
0
          target_bits_per_mb = temp << BPER_MB_NORMBITS;
1554
0
        }
1555
0
      } else {
1556
0
        target_bits_per_mb =
1557
0
            (target_size << BPER_MB_NORMBITS) / cpi->common.MBs;
1558
0
      }
1559
      // Rate correction factor based on target_size_per_mb and max_QP.
1560
0
      new_correction_factor =
1561
0
          (double)target_bits_per_mb /
1562
0
          (double)vp8_bits_per_mb[INTER_FRAME][cpi->worst_quality];
1563
0
      if (new_correction_factor > cpi->rate_correction_factor) {
1564
0
        cpi->rate_correction_factor =
1565
0
            VPXMIN(2.0 * cpi->rate_correction_factor, new_correction_factor);
1566
0
      }
1567
0
      if (cpi->rate_correction_factor > MAX_BPB_FACTOR) {
1568
0
        cpi->rate_correction_factor = MAX_BPB_FACTOR;
1569
0
      }
1570
      // Drop this frame: update frame counters.
1571
0
      cpi->common.current_video_frame++;
1572
0
      cpi->frames_since_key++;
1573
0
      cpi->temporal_pattern_counter++;
1574
0
      cpi->frames_since_last_drop_overshoot = 0;
1575
0
      if (cpi->oxcf.number_of_layers > 1) {
1576
        // Set max_qp and rate correction for all temporal layers if overshoot
1577
        // is detected.
1578
0
        for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1579
0
          LAYER_CONTEXT *lc = &cpi->layer_context[i];
1580
0
          lc->force_maxqp = 1;
1581
0
          lc->frames_since_last_drop_overshoot = 0;
1582
0
          lc->rate_correction_factor = cpi->rate_correction_factor;
1583
0
        }
1584
0
      }
1585
#if CONFIG_MULTI_RES_ENCODING
1586
      if (cpi->oxcf.mr_total_resolutions > 1)
1587
        low_res_frame_info->is_frame_dropped_overshoot_maxqp = 1;
1588
#endif
1589
0
      return 1;
1590
0
    }
1591
0
    cpi->force_maxqp = 0;
1592
0
    cpi->frames_since_last_drop_overshoot++;
1593
#if CONFIG_MULTI_RES_ENCODING
1594
    if (cpi->oxcf.mr_total_resolutions > 1)
1595
      low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1596
#endif
1597
0
    return 0;
1598
0
  }
1599
0
  cpi->force_maxqp = 0;
1600
0
  cpi->frames_since_last_drop_overshoot++;
1601
#if CONFIG_MULTI_RES_ENCODING
1602
  if (cpi->oxcf.mr_total_resolutions > 1)
1603
    low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1604
#endif
1605
0
  return 0;
1606
0
}