vp9_ratectrl.c 35.6 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  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.
John Koleszar's avatar
John Koleszar committed
9
10
11
12
13
14
15
16
 */


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
Dmitry Kovalev's avatar
Dmitry Kovalev committed
17
#include <math.h>
John Koleszar's avatar
John Koleszar committed
18

19
20
#include "vp9/common/vp9_alloccommon.h"
#include "vp9/common/vp9_common.h"
21
#include "vp9/encoder/vp9_ratectrl.h"
22
#include "vp9/common/vp9_entropymode.h"
John Koleszar's avatar
John Koleszar committed
23
#include "vpx_mem/vpx_mem.h"
24
#include "vp9/common/vp9_systemdependent.h"
25
#include "vp9/encoder/vp9_encodemv.h"
26
#include "vp9/common/vp9_quant_common.h"
27
#include "vp9/common/vp9_seg_common.h"
John Koleszar's avatar
John Koleszar committed
28

Deb Mukherjee's avatar
Deb Mukherjee committed
29
#define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
30

Dmitry Kovalev's avatar
Dmitry Kovalev committed
31
32
#define MIN_BPB_FACTOR 0.005
#define MAX_BPB_FACTOR 50
John Koleszar's avatar
John Koleszar committed
33
34
35
36

// Bits Per MB at different Q (Multiplied by 512)
#define BPER_MB_NORMBITS    9

37
38
39
40
41
42
43
44
// Tables relating active max Q to active min Q
static int kf_low_motion_minq[QINDEX_RANGE];
static int kf_high_motion_minq[QINDEX_RANGE];
static int gf_low_motion_minq[QINDEX_RANGE];
static int gf_high_motion_minq[QINDEX_RANGE];
static int inter_minq[QINDEX_RANGE];
static int afq_low_motion_minq[QINDEX_RANGE];
static int afq_high_motion_minq[QINDEX_RANGE];
Deb Mukherjee's avatar
Deb Mukherjee committed
45
46
47
48
static int gf_high = 2000;
static int gf_low = 400;
static int kf_high = 5000;
static int kf_low = 400;
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

// Functions to compute the active minq lookup table entries based on a
// formulaic approach to facilitate easier adjustment of the Q tables.
// The formulae were derived from computing a 3rd order polynomial best
// fit to the original data (after plotting real maxq vs minq (not q index))
static int calculate_minq_index(double maxq,
                                double x3, double x2, double x1, double c) {
  int i;
  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
                                maxq);

  // Special case handling to deal with the step from q2.0
  // down to lossless mode represented by q 1.0.
  if (minqtarget <= 2.0)
    return 0;

  for (i = 0; i < QINDEX_RANGE; i++) {
    if (minqtarget <= vp9_convert_qindex_to_q(i))
      return i;
  }

  return QINDEX_RANGE - 1;
}

73
void vp9_rc_init_minq_luts(void) {
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  int i;

  for (i = 0; i < QINDEX_RANGE; i++) {
    const double maxq = vp9_convert_qindex_to_q(i);


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.000001,
                                                 -0.0004,
                                                 0.15,
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.000002,
                                                  -0.0012,
Deb Mukherjee's avatar
Deb Mukherjee committed
88
                                                  0.50,
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
                                                  0.0);

    gf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.0000015,
                                                 -0.0009,
                                                 0.32,
                                                 0.0);
    gf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000021,
                                                  -0.00125,
                                                  0.50,
                                                  0.0);
    afq_low_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000015,
                                                  -0.0009,
                                                  0.33,
                                                  0.0);
    afq_high_motion_minq[i] = calculate_minq_index(maxq,
                                                   0.0000021,
                                                   -0.00125,
                                                   0.55,
                                                   0.0);
Deb Mukherjee's avatar
Deb Mukherjee committed
111
112
113
114
115
    inter_minq[i] = calculate_minq_index(maxq,
                                         0.00000271,
                                         -0.00113,
                                         0.75,
                                         0.0);
116
117
118
  }
}

Paul Wilkins's avatar
Paul Wilkins committed
119
120
121
// These functions use formulaic calculations to make playing with the
// quantizer tables easier. If necessary they can be replaced by lookup
// tables if and when things settle down in the experimental bitstream
122
double vp9_convert_qindex_to_q(int qindex) {
John Koleszar's avatar
John Koleszar committed
123
  // Convert the index to a real Q value (scaled down to match old Q values)
124
  return vp9_ac_quant(qindex, 0) / 4.0;
Paul Wilkins's avatar
Paul Wilkins committed
125
126
}

127
128
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
                       double correction_factor) {
129
  const double q = vp9_convert_qindex_to_q(qindex);
130
  int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
Paul Wilkins's avatar
Paul Wilkins committed
131

132
  // q based adjustment to baseline enumerator
Paul Wilkins's avatar
Paul Wilkins committed
133
  enumerator += (int)(enumerator * q) >> 12;
134
135
  return (int)(0.5 + (enumerator * correction_factor / q));
}
John Koleszar's avatar
John Koleszar committed
136

137
void vp9_save_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
138
  CODING_CONTEXT *const cc = &cpi->coding_context;
139
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
140

John Koleszar's avatar
John Koleszar committed
141
  // Stores a snapshot of key state variables which can subsequently be
142
  // restored with a call to vp9_restore_coding_context. These functions are
143
  // intended for use in a re-code loop in vp9_compress_frame where the
John Koleszar's avatar
John Koleszar committed
144
  // quantizer value is adjusted between loop iterations.
145
146
147
148
  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);

149
  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
150

John Koleszar's avatar
John Koleszar committed
151
  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
152
             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
153

154
155
  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
156

157
  cc->fc = cm->fc;
158
}
John Koleszar's avatar
John Koleszar committed
159

160
void vp9_restore_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
161
  CODING_CONTEXT *const cc = &cpi->coding_context;
162
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
163

John Koleszar's avatar
John Koleszar committed
164
  // Restore key state variables to the snapshot state stored in the
165
  // previous call to vp9_save_coding_context.
166
167
168
169
  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);

170
  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
171

John Koleszar's avatar
John Koleszar committed
172
173
  vpx_memcpy(cm->last_frame_seg_map,
             cpi->coding_context.last_frame_seg_map_copy,
174
             (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
175

176
177
  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
178

179
  cm->fc = cc->fc;
John Koleszar's avatar
John Koleszar committed
180
181
}

182
183
void vp9_setup_key_frame(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
184

185
  vp9_setup_past_independence(cm);
John Koleszar's avatar
John Koleszar committed
186

John Koleszar's avatar
John Koleszar committed
187
  // interval before next GF
188
  cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
189
  /* All buffers are implicitly updated on key frames. */
190
191
  cpi->refresh_golden_frame = 1;
  cpi->refresh_alt_ref_frame = 1;
John Koleszar's avatar
John Koleszar committed
192
}
193

194
void vp9_setup_inter_frame(VP9_COMP *cpi) {
195
  VP9_COMMON *cm = &cpi->common;
Adrian Grange's avatar
Adrian Grange committed
196
  if (cm->error_resilient_mode || cm->intra_only)
197
    vp9_setup_past_independence(cm);
198

Dmitry Kovalev's avatar
Dmitry Kovalev committed
199
  assert(cm->frame_context_idx < FRAME_CONTEXTS);
200
  cm->fc = cm->frame_contexts[cm->frame_context_idx];
201
}
John Koleszar's avatar
John Koleszar committed
202

203
static int estimate_bits_at_q(int frame_kind, int q, int mbs,
John Koleszar's avatar
John Koleszar committed
204
                              double correction_factor) {
205
  const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
John Koleszar's avatar
John Koleszar committed
206

207
208
209
210
211
  // Attempt to retain reasonable accuracy without overflow. The cutoff is
  // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
  // largest Bpm takes 20 bits.
  return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
                           : (bpm * mbs) >> BPER_MB_NORMBITS;
212
}
213
214


215
static void calc_iframe_target_size(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
216
217
  // boost defaults to half second
  int target;
John Koleszar's avatar
John Koleszar committed
218

John Koleszar's avatar
John Koleszar committed
219
  // Clear down mmx registers to allow floating point in what follows
220
  vp9_clear_system_state();  // __asm emms;
John Koleszar's avatar
John Koleszar committed
221

John Koleszar's avatar
John Koleszar committed
222
  // New Two pass RC
223
  target = cpi->rc.per_frame_bandwidth;
John Koleszar's avatar
John Koleszar committed
224

225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  // For 1-pass.
  if (cpi->pass == 0) {
    if (cpi->common.current_video_frame == 0) {
      target = cpi->oxcf.starting_buffer_level / 2;
    } else {
      // TODO(marpan): Add in adjustment based on Q.
      // If this keyframe was forced, use a more recent Q estimate.
      // int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ?
      //    cpi->rc.avg_frame_qindex : cpi->rc.ni_av_qi;
      int initial_boost = 32;
      // Boost depends somewhat on frame rate.
      int kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
      // Adjustment up based on q: need to fix.
      // kf_boost = kf_boost * kfboost_qadjust(Q) / 100;
      // Frame separation adjustment (down).
      if (cpi->rc.frames_since_key  < cpi->output_framerate / 2) {
        kf_boost = (int)(kf_boost * cpi->rc.frames_since_key /
            (cpi->output_framerate / 2));
      }
      kf_boost = (kf_boost < 16) ? 16 : kf_boost;
      target = ((16 + kf_boost) * cpi->rc.per_frame_bandwidth) >> 4;
    }
    cpi->rc.active_worst_quality = cpi->rc.worst_quality;
  }

John Koleszar's avatar
John Koleszar committed
250
  if (cpi->oxcf.rc_max_intra_bitrate_pct) {
251
    int max_rate = cpi->rc.per_frame_bandwidth
252
                 * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
John Koleszar's avatar
John Koleszar committed
253

John Koleszar's avatar
John Koleszar committed
254
255
256
    if (target > max_rate)
      target = max_rate;
  }
257
  cpi->rc.this_frame_target = target;
John Koleszar's avatar
John Koleszar committed
258
259
}

260
//  Do the best we can to define the parameters for the next GF based
Paul Wilkins's avatar
Paul Wilkins committed
261
//  on what information we have available.
262
263
264
//
//  In this experimental code only two pass is supported
//  so we just use the interval determined in the two pass code.
265
static void calc_gf_params(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
266
  // Set the gf interval
267
  cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
John Koleszar's avatar
John Koleszar committed
268
269
}

270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
// Update the buffer level: leaky bucket model.
void vp9_update_buffer_level(VP9_COMP *const cpi, int encoded_frame_size) {
  VP9_COMMON *const cm = &cpi->common;
  // Non-viewable frames are a special case and are treated as pure overhead.
  if (!cm->show_frame) {
    cpi->rc.bits_off_target -= encoded_frame_size;
  } else {
    cpi->rc.bits_off_target += cpi->rc.av_per_frame_bandwidth -
        encoded_frame_size;
  }
  // Clip the buffer level to the maximum specified buffer size.
  if (cpi->rc.bits_off_target > cpi->oxcf.maximum_buffer_size) {
    cpi->rc.bits_off_target = cpi->oxcf.maximum_buffer_size;
  }
  cpi->rc.buffer_level = cpi->rc.bits_off_target;
}

int vp9_drop_frame(VP9_COMP *const cpi) {
  if (!cpi->oxcf.drop_frames_water_mark) {
    return 0;
  } else {
    if (cpi->rc.buffer_level < 0) {
      // Always drop if buffer is below 0.
      return 1;
    } else {
      // If buffer is below drop_mark, for now just drop every other frame
      // (starting with the next frame) until it increases back over drop_mark.
      int drop_mark = (int)(cpi->oxcf.drop_frames_water_mark *
          cpi->oxcf.optimal_buffer_level / 100);
      if ((cpi->rc.buffer_level > drop_mark) &&
          (cpi->rc.decimation_factor > 0)) {
        --cpi->rc.decimation_factor;
      } else if (cpi->rc.buffer_level <= drop_mark &&
          cpi->rc.decimation_factor == 0) {
        cpi->rc.decimation_factor = 1;
      }
      if (cpi->rc.decimation_factor > 0) {
        if (cpi->rc.decimation_count > 0) {
          --cpi->rc.decimation_count;
          return 1;
        } else {
          cpi->rc.decimation_count = cpi->rc.decimation_factor;
          return 0;
        }
      } else {
        cpi->rc.decimation_count = 0;
        return 0;
      }
    }
  }
}

// Adjust active_worst_quality level based on buffer level.
static int adjust_active_worst_quality_from_buffer_level(const VP9_COMP *cpi) {
  // Adjust active_worst_quality: If buffer is above the optimal/target level,
  // bring active_worst_quality down depending on fullness over buffer.
  // If buffer is below the optimal level, let the active_worst_quality go from
  // ambient Q (at buffer = optimal level) to worst_quality level
  // (at buffer = critical level).
  int active_worst_quality = cpi->rc.active_worst_quality;
  // Maximum limit for down adjustment, ~20%.
  int max_adjustment_down = active_worst_quality / 5;
  // Buffer level below which we push active_worst to worst_quality.
  int critical_level = cpi->oxcf.optimal_buffer_level >> 2;
  int adjustment = 0;
  int buff_lvl_step = 0;
  if (cpi->rc.buffer_level > cpi->oxcf.optimal_buffer_level) {
    // Adjust down.
    if (max_adjustment_down) {
      buff_lvl_step = (int)((cpi->oxcf.maximum_buffer_size -
          cpi->oxcf.optimal_buffer_level) / max_adjustment_down);
      if (buff_lvl_step) {
        adjustment = (int)((cpi->rc.buffer_level -
            cpi->oxcf.optimal_buffer_level) / buff_lvl_step);
      }
      active_worst_quality -= adjustment;
    }
  } else if (cpi->rc.buffer_level > critical_level) {
    // Adjust up from ambient Q.
    if (critical_level) {
      buff_lvl_step = (cpi->oxcf.optimal_buffer_level - critical_level);
      if (buff_lvl_step) {
        adjustment =
            (cpi->rc.worst_quality - cpi->rc.avg_frame_qindex[INTER_FRAME]) *
            (cpi->oxcf.optimal_buffer_level - cpi->rc.buffer_level) /
            buff_lvl_step;
      }
      active_worst_quality = cpi->rc.avg_frame_qindex[INTER_FRAME] + adjustment;
    }
  } else {
    // Set to worst_quality if buffer is below critical level.
    active_worst_quality = cpi->rc.worst_quality;
  }
  return active_worst_quality;
}

// Adjust target frame size with respect to the buffering constraints:
static int target_size_from_buffer_level(const VP9_COMP *cpi) {
  int this_frame_target = cpi->rc.this_frame_target;
  int percent_low = 0;
  int percent_high = 0;
  int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100);
  if (cpi->rc.buffer_level < cpi->oxcf.optimal_buffer_level) {
    percent_low = (int)((cpi->oxcf.optimal_buffer_level - cpi->rc.buffer_level)
        / one_percent_bits);
    if (percent_low > cpi->oxcf.under_shoot_pct) {
      percent_low = cpi->oxcf.under_shoot_pct;
    } else if (percent_low < 0) {
      percent_low = 0;
    }
    // Lower the target bandwidth for this frame.
    this_frame_target -= (this_frame_target * percent_low) / 200;
  } else  if (cpi->rc.buffer_level > cpi->oxcf.optimal_buffer_level) {
    percent_high = (int)((cpi->rc.buffer_level - cpi->oxcf.optimal_buffer_level)
        / one_percent_bits);
    if (percent_high > cpi->oxcf.over_shoot_pct) {
      percent_high = cpi->oxcf.over_shoot_pct;
    } else if (percent_high < 0) {
      percent_high = 0;
    }
    // Increase the target bandwidth for this frame.
    this_frame_target += (this_frame_target * percent_high) / 200;
  }
  return this_frame_target;
}
John Koleszar's avatar
John Koleszar committed
395

396
397
398
static void calc_pframe_target_size(VP9_COMP *const cpi) {
  int min_frame_target = MAX(cpi->rc.min_frame_bandwidth,
                             cpi->rc.av_per_frame_bandwidth >> 5);
399
  if (cpi->refresh_alt_ref_frame) {
400
    // Special alt reference frame case
John Koleszar's avatar
John Koleszar committed
401
    // Per frame bit target for the alt ref frame
402
403
    cpi->rc.per_frame_bandwidth = cpi->twopass.gf_bits;
    cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
404
  } else {
405
    // Normal frames (gf and inter).
406
    cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
407
408
409
410
411
412
413
414
415
416
417
    // Set target frame size based on buffer level, for 1 pass CBR.
    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
      // Need to decide how low min_frame_target should be for 1-pass CBR.
      // For now, use: cpi->rc.av_per_frame_bandwidth / 16:
      min_frame_target = MAX(cpi->rc.av_per_frame_bandwidth >> 4,
                             FRAME_OVERHEAD_BITS);
      cpi->rc.this_frame_target = target_size_from_buffer_level(cpi);
      // Adjust qp-max based on buffer level.
      cpi->rc.active_worst_quality =
          adjust_active_worst_quality_from_buffer_level(cpi);
    }
John Koleszar's avatar
John Koleszar committed
418
  }
John Koleszar's avatar
John Koleszar committed
419

420
421
422
423
424
425
  // Check that the total sum of adjustments is not above the maximum allowed.
  // That is, having allowed for the KF and GF penalties, we have not pushed
  // the current inter-frame target too low. If the adjustment we apply here is
  // not capable of recovering all the extra bits we have spent in the KF or GF,
  // then the remainder will have to be recovered over a longer time span via
  // other buffer / rate control mechanisms.
426
  if (cpi->rc.this_frame_target < min_frame_target) {
427
    cpi->rc.this_frame_target = min_frame_target;
428
  }
John Koleszar's avatar
John Koleszar committed
429
430

  // Adjust target frame size for Golden Frames:
431
  if (cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
432
433
434
    // If we are using alternate ref instead of gf then do not apply the boost
    // It will instead be applied to the altref update
    // Jims modified boost
435
    if (!cpi->rc.source_alt_ref_active) {
436
437
438
      // The spend on the GF is defined in the two pass code
      // for two pass encodes
      cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
439
440
    } else {
      // If there is an active ARF at this location use the minimum
441
      // bits on this frame even if it is a constructed arf.
442
      // The active maximum quantizer insures that an appropriate
443
      // number of bits will be spent if needed for constructed ARFs.
444
      cpi->rc.this_frame_target = 0;
John Koleszar's avatar
John Koleszar committed
445
    }
John Koleszar's avatar
John Koleszar committed
446
  }
John Koleszar's avatar
John Koleszar committed
447
448
}

449
void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
450
451
  const int q = cpi->common.base_qindex;
  int correction_factor = 100;
John Koleszar's avatar
John Koleszar committed
452
453
  double rate_correction_factor;
  double adjustment_limit;
John Koleszar's avatar
John Koleszar committed
454

455
  int projected_size_based_on_q = 0;
John Koleszar's avatar
John Koleszar committed
456

John Koleszar's avatar
John Koleszar committed
457
  // Clear down mmx registers to allow floating point in what follows
458
  vp9_clear_system_state();  // __asm emms;
John Koleszar's avatar
John Koleszar committed
459

John Koleszar's avatar
John Koleszar committed
460
  if (cpi->common.frame_type == KEY_FRAME) {
461
    rate_correction_factor = cpi->rc.key_frame_rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
462
  } else {
463
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
464
      rate_correction_factor = cpi->rc.gf_rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
465
    else
466
      rate_correction_factor = cpi->rc.rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
467
468
  }

469
470
  // Work out how big we would have expected the frame to be at this Q given
  // the current correction factor.
John Koleszar's avatar
John Koleszar committed
471
  // Stay in double to avoid int overflow when values are large
472
473
474
  projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
                                                 cpi->common.MBs,
                                                 rate_correction_factor);
John Koleszar's avatar
John Koleszar committed
475
476
477

  // Work out a size correction factor.
  if (projected_size_based_on_q > 0)
478
    correction_factor =
479
        (100 * cpi->rc.projected_frame_size) / projected_size_based_on_q;
John Koleszar's avatar
John Koleszar committed
480

481
482
  // More heavily damped adjustment used if we have been oscillating either side
  // of target.
John Koleszar's avatar
John Koleszar committed
483
  switch (damp_var) {
John Koleszar's avatar
John Koleszar committed
484
    case 0:
John Koleszar's avatar
John Koleszar committed
485
486
      adjustment_limit = 0.75;
      break;
John Koleszar's avatar
John Koleszar committed
487
    case 1:
John Koleszar's avatar
John Koleszar committed
488
489
      adjustment_limit = 0.375;
      break;
John Koleszar's avatar
John Koleszar committed
490
491
    case 2:
    default:
John Koleszar's avatar
John Koleszar committed
492
493
494
495
496
497
      adjustment_limit = 0.25;
      break;
  }

  if (correction_factor > 102) {
    // We are not already at the worst allowable quality
498
    correction_factor =
499
        (int)(100 + ((correction_factor - 100) * adjustment_limit));
500
501
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
502
503
504
505

    // Keep rate_correction_factor within limits
    if (rate_correction_factor > MAX_BPB_FACTOR)
      rate_correction_factor = MAX_BPB_FACTOR;
506
  } else if (correction_factor < 99) {
John Koleszar's avatar
John Koleszar committed
507
    // We are not already at the best allowable quality
508
    correction_factor =
509
        (int)(100 - ((100 - correction_factor) * adjustment_limit));
510
511
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
512
513
514
515
516
517

    // Keep rate_correction_factor within limits
    if (rate_correction_factor < MIN_BPB_FACTOR)
      rate_correction_factor = MIN_BPB_FACTOR;
  }

518
  if (cpi->common.frame_type == KEY_FRAME) {
519
    cpi->rc.key_frame_rate_correction_factor = rate_correction_factor;
520
  } else {
521
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
522
      cpi->rc.gf_rate_correction_factor = rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
523
    else
524
      cpi->rc.rate_correction_factor = rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
525
  }
John Koleszar's avatar
John Koleszar committed
526
527
528
}


Deb Mukherjee's avatar
Deb Mukherjee committed
529
530
531
int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
                      int active_best_quality, int active_worst_quality) {
  int q = active_worst_quality;
John Koleszar's avatar
John Koleszar committed
532

John Koleszar's avatar
John Koleszar committed
533
534
535
536
537
  int i;
  int last_error = INT_MAX;
  int target_bits_per_mb;
  int bits_per_mb_at_this_q;
  double correction_factor;
538

John Koleszar's avatar
John Koleszar committed
539
  // Select the appropriate correction factor based upon type of frame.
540
  if (cpi->common.frame_type == KEY_FRAME) {
541
    correction_factor = cpi->rc.key_frame_rate_correction_factor;
542
  } else {
543
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
544
      correction_factor = cpi->rc.gf_rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
545
    else
546
      correction_factor = cpi->rc.rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
547
  }
John Koleszar's avatar
John Koleszar committed
548

549
550
  // Calculate required scaling factor based on target frame size and size of
  // frame produced using previous Q.
John Koleszar's avatar
John Koleszar committed
551
  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
552
553
554
    target_bits_per_mb =
        (target_bits_per_frame / cpi->common.MBs)
        << BPER_MB_NORMBITS;  // Case where we would overflow int
John Koleszar's avatar
John Koleszar committed
555
  else
556
557
    target_bits_per_mb =
        (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
John Koleszar's avatar
John Koleszar committed
558

Deb Mukherjee's avatar
Deb Mukherjee committed
559
  i = active_best_quality;
John Koleszar's avatar
John Koleszar committed
560

John Koleszar's avatar
John Koleszar committed
561
  do {
562
563
    bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cpi->common.frame_type, i,
                                                    correction_factor);
John Koleszar's avatar
John Koleszar committed
564

John Koleszar's avatar
John Koleszar committed
565
566
    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
567
        q = i;
John Koleszar's avatar
John Koleszar committed
568
      else
569
        q = i - 1;
John Koleszar's avatar
John Koleszar committed
570

John Koleszar's avatar
John Koleszar committed
571
      break;
572
    } else {
John Koleszar's avatar
John Koleszar committed
573
      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
574
    }
Deb Mukherjee's avatar
Deb Mukherjee committed
575
  } while (++i <= active_worst_quality);
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600

  return q;
}

static int get_active_quality(int q,
                              int gfu_boost,
                              int low,
                              int high,
                              int *low_motion_minq,
                              int *high_motion_minq) {
  int active_best_quality;
  if (gfu_boost > high) {
    active_best_quality = low_motion_minq[q];
  } else if (gfu_boost < low) {
    active_best_quality = high_motion_minq[q];
  } else {
    const int gap = high - low;
    const int offset = high - gfu_boost;
    const int qdiff = high_motion_minq[q] - low_motion_minq[q];
    const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
    active_best_quality = low_motion_minq[q] + adjustment;
  }
  return active_best_quality;
}

Deb Mukherjee's avatar
Deb Mukherjee committed
601
int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
602
                                      int *bottom_index,
603
                                      int *top_index) {
Deb Mukherjee's avatar
Deb Mukherjee committed
604
605
606
607
  const VP9_COMMON *const cm = &cpi->common;
  int active_best_quality;
  int active_worst_quality = cpi->rc.active_worst_quality;
  int q;
608
609

  if (frame_is_intra_only(cm)) {
Deb Mukherjee's avatar
Deb Mukherjee committed
610
    active_best_quality = cpi->rc.best_quality;
611
612
613
614
#if !CONFIG_MULTIPLE_ARF
    // Handle the special case for key frames forced when we have75 reached
    // the maximum key frame interval. Here force the Q to a range
    // based on the ambient Q to reduce the risk of popping.
615
    if (cpi->rc.this_key_frame_forced) {
616
617
618
619
620
621
      int delta_qindex;
      int qindex = cpi->rc.last_boosted_qindex;
      double last_boosted_q = vp9_convert_qindex_to_q(qindex);

      delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
                                        (last_boosted_q * 0.75));
Deb Mukherjee's avatar
Deb Mukherjee committed
622
623
624
625
      active_best_quality = MAX(qindex + delta_qindex,
                                cpi->rc.best_quality);
    } else if (!(cpi->pass == 0 && cpi->common.current_video_frame == 0)) {
      // not first frame of one pass
626
627
628
629
      double q_adj_factor = 1.0;
      double q_val;

      // Baseline value derived from cpi->active_worst_quality and kf boost
Deb Mukherjee's avatar
Deb Mukherjee committed
630
631
632
633
634
      active_best_quality = get_active_quality(active_worst_quality,
                                               cpi->rc.kf_boost,
                                               kf_low, kf_high,
                                               kf_low_motion_minq,
                                               kf_high_motion_minq);
635
636
637
638
639
640
641

      // Allow somewhat lower kf minq with small image formats.
      if ((cm->width * cm->height) <= (352 * 288)) {
        q_adj_factor -= 0.25;
      }

      // Make a further adjustment based on the kf zero motion measure.
642
      q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
643
644
645

      // Convert the adjustment factor to a qindex delta
      // on active_best_quality.
Deb Mukherjee's avatar
Deb Mukherjee committed
646
647
      q_val = vp9_convert_qindex_to_q(active_best_quality);
      active_best_quality +=
648
649
650
651
652
          vp9_compute_qdelta(cpi, q_val, (q_val * q_adj_factor));
    }
#else
    double current_q;
    // Force the KF quantizer to be 30% of the active_worst_quality.
Deb Mukherjee's avatar
Deb Mukherjee committed
653
654
    current_q = vp9_convert_qindex_to_q(active_worst_quality);
    active_best_quality = active_worst_quality
655
656
        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
#endif
657
  } else if (!cpi->rc.is_src_frame_alt_ref &&
658
659
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {

Deb Mukherjee's avatar
Deb Mukherjee committed
660
    // Use the lower of active_worst_quality and recent
661
662
    // average Q as basis for GF/ARF best Q limit unless last frame was
    // a key frame.
663
664
665
    if (cpi->rc.frames_since_key > 1 &&
        cpi->rc.avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
      q = cpi->rc.avg_frame_qindex[INTER_FRAME];
Deb Mukherjee's avatar
Deb Mukherjee committed
666
667
    } else {
      q = active_worst_quality;
668
669
670
671
672
    }
    // For constrained quality dont allow Q less than the cq level
    if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
      if (q < cpi->cq_target_quality)
        q = cpi->cq_target_quality;
673
      if (cpi->rc.frames_since_key > 1) {
Deb Mukherjee's avatar
Deb Mukherjee committed
674
675
676
677
        active_best_quality = get_active_quality(q, cpi->rc.gfu_boost,
                                                 gf_low, gf_high,
                                                 afq_low_motion_minq,
                                                 afq_high_motion_minq);
678
      } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
679
680
681
682
        active_best_quality = get_active_quality(q, cpi->rc.gfu_boost,
                                                 gf_low, gf_high,
                                                 gf_low_motion_minq,
                                                 gf_high_motion_minq);
683
684
      }
      // Constrained quality use slightly lower active best.
Deb Mukherjee's avatar
Deb Mukherjee committed
685
      active_best_quality = active_best_quality * 15 / 16;
686
687
688

    } else if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
      if (!cpi->refresh_alt_ref_frame) {
Deb Mukherjee's avatar
Deb Mukherjee committed
689
        active_best_quality = cpi->cq_target_quality;
690
      } else {
691
        if (cpi->rc.frames_since_key > 1) {
Deb Mukherjee's avatar
Deb Mukherjee committed
692
693
          active_best_quality = get_active_quality(
              q, cpi->rc.gfu_boost, gf_low, gf_high,
694
              afq_low_motion_minq, afq_high_motion_minq);
695
        } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
696
697
          active_best_quality = get_active_quality(
              q, cpi->rc.gfu_boost, gf_low, gf_high,
698
              gf_low_motion_minq, gf_high_motion_minq);
699
700
701
        }
      }
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
702
703
704
      active_best_quality = get_active_quality(
          q, cpi->rc.gfu_boost, gf_low, gf_high,
          gf_low_motion_minq, gf_high_motion_minq);
705
706
707
    }
  } else {
    if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
708
      active_best_quality = cpi->cq_target_quality;
709
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
710
      if (cpi->pass == 0 &&
711
          cpi->rc.avg_frame_qindex[INTER_FRAME] < active_worst_quality)
Deb Mukherjee's avatar
Deb Mukherjee committed
712
713
        // 1-pass: for now, use the average Q for the active_best, if its lower
        // than active_worst.
714
        active_best_quality = inter_minq[cpi->rc.avg_frame_qindex[INTER_FRAME]];
Deb Mukherjee's avatar
Deb Mukherjee committed
715
716
      else
        active_best_quality = inter_minq[active_worst_quality];
717
718
719
720

      // For the constrained quality mode we don't want
      // q to fall below the cq level.
      if ((cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
Deb Mukherjee's avatar
Deb Mukherjee committed
721
          (active_best_quality < cpi->cq_target_quality)) {
722
723
724
725
        // If we are strongly undershooting the target rate in the last
        // frames then use the user passed in cq value not the auto
        // cq value.
        if (cpi->rc.rolling_actual_bits < cpi->rc.min_frame_bandwidth)
Deb Mukherjee's avatar
Deb Mukherjee committed
726
          active_best_quality = cpi->oxcf.cq_level;
727
        else
Deb Mukherjee's avatar
Deb Mukherjee committed
728
          active_best_quality = cpi->cq_target_quality;
729
730
731
732
733
      }
    }
  }

  // Clip the active best and worst quality values to limits
Deb Mukherjee's avatar
Deb Mukherjee committed
734
735
  if (active_worst_quality > cpi->rc.worst_quality)
    active_worst_quality = cpi->rc.worst_quality;
736

Deb Mukherjee's avatar
Deb Mukherjee committed
737
738
  if (active_best_quality < cpi->rc.best_quality)
    active_best_quality = cpi->rc.best_quality;
739

Deb Mukherjee's avatar
Deb Mukherjee committed
740
741
  if (active_best_quality > cpi->rc.worst_quality)
    active_best_quality = cpi->rc.worst_quality;
742

Deb Mukherjee's avatar
Deb Mukherjee committed
743
744
  if (active_worst_quality < active_best_quality)
    active_worst_quality = active_best_quality;
745

Deb Mukherjee's avatar
Deb Mukherjee committed
746
747
  *top_index = active_worst_quality;
  *bottom_index = active_best_quality;
748
749

#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
750
  // Limit Q range for the adaptive loop.
751
  if (cm->frame_type == KEY_FRAME && !cpi->rc.this_key_frame_forced) {
752
753
    if (!(cpi->pass == 0 && cpi->common.current_video_frame == 0)) {
      *top_index =
Deb Mukherjee's avatar
Deb Mukherjee committed
754
          (active_worst_quality + active_best_quality * 3) / 4;
755
    }
756
  } else if (!cpi->rc.is_src_frame_alt_ref &&
757
758
759
             (cpi->oxcf.end_usage != USAGE_STREAM_FROM_SERVER) &&
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
    *top_index =
Deb Mukherjee's avatar
Deb Mukherjee committed
760
      (active_worst_quality + active_best_quality) / 2;
761
  }
762
#endif
763
764

  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
765
    q = active_best_quality;
766
  // Special case code to try and match quality with forced key frames
767
  } else if ((cm->frame_type == KEY_FRAME) && cpi->rc.this_key_frame_forced) {
768
769
    q = cpi->rc.last_boosted_qindex;
  } else {
770
771
    q = vp9_rc_regulate_q(cpi, cpi->rc.this_frame_target,
                          active_best_quality, active_worst_quality);
772
773
774
    if (q > *top_index)
      q = *top_index;
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
#if CONFIG_MULTIPLE_ARF
  // Force the quantizer determined by the coding order pattern.
  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
    double new_q;
    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
    int level = cpi->this_frame_weight;
    assert(level >= 0);
    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
    q = active_worst_quality +
        vp9_compute_qdelta(cpi, current_q, new_q);

    *bottom_index = q;
    *top_index    = q;
    printf("frame:%d q:%d\n", cm->current_video_frame, q);
  }
#endif
792
793
794
795
796
797
  assert(*top_index <= cpi->rc.worst_quality &&
         *top_index >= cpi->rc.best_quality);
  assert(*bottom_index <= cpi->rc.worst_quality &&
         *bottom_index >= cpi->rc.best_quality);
  assert(q <= cpi->rc.worst_quality &&
         q >= cpi->rc.best_quality);
798
  return q;
John Koleszar's avatar
John Koleszar committed
799
800
}

Deb Mukherjee's avatar
Deb Mukherjee committed
801
void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
802
803
804
                                      int this_frame_target,
                                      int *frame_under_shoot_limit,
                                      int *frame_over_shoot_limit) {
John Koleszar's avatar
John Koleszar committed
805
  // Set-up bounds on acceptable frame size:
806
  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
John Koleszar's avatar
John Koleszar committed
807
808
809
810
    *frame_under_shoot_limit = 0;
    *frame_over_shoot_limit  = INT_MAX;
  } else {
    if (cpi->common.frame_type == KEY_FRAME) {
811
812
      *frame_over_shoot_limit  = this_frame_target * 9 / 8;
      *frame_under_shoot_limit = this_frame_target * 7 / 8;
John Koleszar's avatar
John Koleszar committed
813
    } else {
814
      if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) {
815
816
        *frame_over_shoot_limit  = this_frame_target * 9 / 8;
        *frame_under_shoot_limit = this_frame_target * 7 / 8;
John Koleszar's avatar
John Koleszar committed
817
818
819
      } else {
        // Stron overshoot limit for constrained quality
        if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
820
821
          *frame_over_shoot_limit  = this_frame_target * 11 / 8;
          *frame_under_shoot_limit = this_frame_target * 2 / 8;
John Koleszar's avatar
John Koleszar committed
822
        } else {
823
824
          *frame_over_shoot_limit  = this_frame_target * 11 / 8;
          *frame_under_shoot_limit = this_frame_target * 5 / 8;
John Koleszar's avatar
John Koleszar committed
825
        }
John Koleszar's avatar
John Koleszar committed
826
      }
John Koleszar's avatar
John Koleszar committed
827
    }
John Koleszar's avatar
John Koleszar committed
828
829
830
831
832
833
834
835
836

    // For very small rate targets where the fractional adjustment
    // (eg * 7/8) may be tiny make sure there is at least a minimum
    // range.
    *frame_over_shoot_limit += 200;
    *frame_under_shoot_limit -= 200;
    if (*frame_under_shoot_limit < 0)
      *frame_under_shoot_limit = 0;
  }
John Koleszar's avatar
John Koleszar committed
837
}
838
839

// return of 0 means drop frame
Deb Mukherjee's avatar
Deb Mukherjee committed
840
int vp9_rc_pick_frame_size_target(VP9_COMP *cpi) {
841
  VP9_COMMON *cm = &cpi->common;
842

John Koleszar's avatar
John Koleszar committed
843
844
845
846
  if (cm->frame_type == KEY_FRAME)
    calc_iframe_target_size(cpi);
  else
    calc_pframe_target_size(cpi);
847

848
849
850
  // Target rate per SB64 (including partial SB64s.
  cpi->rc.sb64_target_rate = ((int64_t)cpi->rc.this_frame_target * 64 * 64) /
                             (cpi->common.width * cpi->common.height);
John Koleszar's avatar
John Koleszar committed
851
  return 1;
852
}
853

854
void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
855
856
857
858
859
860
861
862
863
  VP9_COMMON *const cm = &cpi->common;
  // Update rate control heuristics
  cpi->rc.projected_frame_size = (bytes_used << 3);

  // Post encode loop adjustment of Q prediction.
  vp9_rc_update_rate_correction_factors(
      cpi, (cpi->sf.recode_loop ||
            cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);

864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
  // Keep a record of last Q and ambient average Q.
  if (cm->frame_type == KEY_FRAME) {
    cpi->rc.last_q[KEY_FRAME] = cm->base_qindex;
    cpi->rc.avg_frame_qindex[KEY_FRAME] =
        (2 + 3 * cpi->rc.avg_frame_qindex[KEY_FRAME] + cm->base_qindex) >> 2;
  } else if (!cpi->rc.is_src_frame_alt_ref &&
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
    cpi->rc.last_q[2] = cm->base_qindex;
    cpi->rc.avg_frame_qindex[2] =
        (2 + 3 * cpi->rc.avg_frame_qindex[2] + cm->base_qindex) >> 2;
  } else {
    cpi->rc.last_q[INTER_FRAME] = cm->base_qindex;
    cpi->rc.avg_frame_qindex[INTER_FRAME] =
        (2 + 3 * cpi->rc.avg_frame_qindex[INTER_FRAME] +
         cm->base_qindex) >> 2;
    cpi->rc.ni_frames++;
    cpi->rc.tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
    cpi->rc.avg_q = cpi->rc.tot_q / (double)cpi->rc.ni_frames;

    // Calculate the average Q for normal inter frames (not key or GFU frames).
    cpi->rc.ni_tot_qi += cm->base_qindex;
    cpi->rc.ni_av_qi = cpi->rc.ni_tot_qi / cpi->rc.ni_frames;
  }
887
888
889
890
891
892
893
894
895

  // Keep record of last boosted (KF/KF/ARF) Q value.
  // If the current frame is coded at a lower Q then we also update it.
  // If all mbs in this group are skipped only update if the Q value is
  // better than that already stored.
  // This is used to help set quality in forced key frames to reduce popping
  if ((cm->base_qindex < cpi->rc.last_boosted_qindex) ||
      ((cpi->static_mb_pct < 100) &&
       ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
896
        (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)))) {
897
898
899
    cpi->rc.last_boosted_qindex = cm->base_qindex;
  }

900
  vp9_update_buffer_level(cpi, cpi->rc.projected_frame_size);
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941

  // Rolling monitors of whether we are over or underspending used to help
  // regulate min and Max Q in two pass.
  if (cm->frame_type != KEY_FRAME) {
    cpi->rc.rolling_target_bits =
        ((cpi->rc.rolling_target_bits * 3) +
         cpi->rc.this_frame_target + 2) / 4;
    cpi->rc.rolling_actual_bits =
        ((cpi->rc.rolling_actual_bits * 3) +
         cpi->rc.projected_frame_size + 2) / 4;
    cpi->rc.long_rolling_target_bits =
        ((cpi->rc.long_rolling_target_bits * 31) +
         cpi->rc.this_frame_target + 16) / 32;
    cpi->rc.long_rolling_actual_bits =
        ((cpi->rc.long_rolling_actual_bits * 31) +
         cpi->rc.projected_frame_size + 16) / 32;
  }

  // Actual bits spent
  cpi->rc.total_actual_bits += cpi->rc.projected_frame_size;

  // Debug stats
  cpi->rc.total_target_vs_actual += (cpi->rc.this_frame_target -
                                     cpi->rc.projected_frame_size);

#ifndef DISABLE_RC_LONG_TERM_MEM
  // Update bits left to the kf and gf groups to account for overshoot or
  // undershoot on these frames
  if (cm->frame_type == KEY_FRAME) {
    cpi->twopass.kf_group_bits += cpi->rc.this_frame_target -
                                  cpi->rc.projected_frame_size;

    cpi->twopass.kf_group_bits = MAX(cpi->twopass.kf_group_bits, 0);
  } else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) {
    cpi->twopass.gf_group_bits += cpi->rc.this_frame_target -
                                  cpi->rc.projected_frame_size;

    cpi->twopass.gf_group_bits = MAX(cpi->twopass.gf_group_bits, 0);
  }
#endif
}