vp9_ratectrl.c 36.3 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

187
  /* All buffers are implicitly updated on key frames. */
188
189
  cpi->refresh_golden_frame = 1;
  cpi->refresh_alt_ref_frame = 1;
John Koleszar's avatar
John Koleszar committed
190
}
191

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

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

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

205
206
207
208
209
  // 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;
210
}
211
212


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

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

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

223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
  // 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
248
  if (cpi->oxcf.rc_max_intra_bitrate_pct) {
249
    int max_rate = cpi->rc.per_frame_bandwidth
250
                 * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
John Koleszar's avatar
John Koleszar committed
251

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

258
259
260
261
262
263
264
265
266
267
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
// 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;
    }
    // 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;
    }
    // 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
379

380
381
382
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);
383
  if (cpi->refresh_alt_ref_frame) {
384
    // Special alt reference frame case
John Koleszar's avatar
John Koleszar committed
385
    // Per frame bit target for the alt ref frame
386
387
    cpi->rc.per_frame_bandwidth = cpi->twopass.gf_bits;
    cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
388
  } else {
389
    // Normal frames (gf and inter).
390
    cpi->rc.this_frame_target = cpi->rc.per_frame_bandwidth;
391
392
393
394
395
396
397
398
399
400
401
    // 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
402
  }
John Koleszar's avatar
John Koleszar committed
403

404
405
406
407
408
409
  // 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.
410
  if (cpi->rc.this_frame_target < min_frame_target) {
411
    cpi->rc.this_frame_target = min_frame_target;
412
  }
John Koleszar's avatar
John Koleszar committed
413
414

  // Adjust target frame size for Golden Frames:
415
  if (cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
416
417
418
    // 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
419
    if (!cpi->rc.source_alt_ref_active) {
420
421
422
      // 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;
423
424
    } else {
      // If there is an active ARF at this location use the minimum
425
      // bits on this frame even if it is a constructed arf.
426
      // The active maximum quantizer insures that an appropriate
427
      // number of bits will be spent if needed for constructed ARFs.
428
      cpi->rc.this_frame_target = 0;
John Koleszar's avatar
John Koleszar committed
429
    }
John Koleszar's avatar
John Koleszar committed
430
  }
John Koleszar's avatar
John Koleszar committed
431
432
}

433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
static double get_rate_correction_factor(const VP9_COMP *cpi) {
  if (cpi->common.frame_type == KEY_FRAME) {
    return cpi->rc.key_frame_rate_correction_factor;
  } else {
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
      return cpi->rc.gf_rate_correction_factor;
    else
      return cpi->rc.rate_correction_factor;
  }
}

static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
  if (cpi->common.frame_type == KEY_FRAME) {
    cpi->rc.key_frame_rate_correction_factor = factor;
  } else {
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
      cpi->rc.gf_rate_correction_factor = factor;
    else
      cpi->rc.rate_correction_factor = factor;
  }
}

455
void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
456
457
  const int q = cpi->common.base_qindex;
  int correction_factor = 100;
458
  double rate_correction_factor = get_rate_correction_factor(cpi);
John Koleszar's avatar
John Koleszar committed
459
  double adjustment_limit;
John Koleszar's avatar
John Koleszar committed
460

461
  int projected_size_based_on_q = 0;
John Koleszar's avatar
John Koleszar committed
462

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

466
467
  // 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
468
  // Stay in double to avoid int overflow when values are large
469
470
471
  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
472
473
474

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

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

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

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

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

515
  set_rate_correction_factor(cpi, rate_correction_factor);
John Koleszar's avatar
John Koleszar committed
516
517
518
}


Deb Mukherjee's avatar
Deb Mukherjee committed
519
520
521
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
522
  int last_error = INT_MAX;
523
524
  int i, target_bits_per_mb, bits_per_mb_at_this_q;
  const double correction_factor = get_rate_correction_factor(cpi);
John Koleszar's avatar
John Koleszar committed
525

526
527
  // Calculate required scaling factor based on target frame size and size of
  // frame produced using previous Q.
John Koleszar's avatar
John Koleszar committed
528
  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
529
530
531
    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
532
  else
533
534
    target_bits_per_mb =
        (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
John Koleszar's avatar
John Koleszar committed
535

Deb Mukherjee's avatar
Deb Mukherjee committed
536
  i = active_best_quality;
John Koleszar's avatar
John Koleszar committed
537

John Koleszar's avatar
John Koleszar committed
538
  do {
539
540
    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
541

John Koleszar's avatar
John Koleszar committed
542
543
    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
544
        q = i;
John Koleszar's avatar
John Koleszar committed
545
      else
546
        q = i - 1;
John Koleszar's avatar
John Koleszar committed
547

John Koleszar's avatar
John Koleszar committed
548
      break;
549
    } else {
John Koleszar's avatar
John Koleszar committed
550
      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
551
    }
Deb Mukherjee's avatar
Deb Mukherjee committed
552
  } while (++i <= active_worst_quality);
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577

  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
578
int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
579
                                      int *bottom_index,
580
                                      int *top_index) {
Deb Mukherjee's avatar
Deb Mukherjee committed
581
582
583
584
  const VP9_COMMON *const cm = &cpi->common;
  int active_best_quality;
  int active_worst_quality = cpi->rc.active_worst_quality;
  int q;
585
586

  if (frame_is_intra_only(cm)) {
Deb Mukherjee's avatar
Deb Mukherjee committed
587
    active_best_quality = cpi->rc.best_quality;
588
589
590
591
#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.
592
    if (cpi->rc.this_key_frame_forced) {
593
594
595
596
597
598
      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
599
600
601
602
      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
603
604
605
606
      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
607
608
609
610
611
      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);
612
613
614
615
616
617
618

      // 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.
619
      q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
620
621
622

      // Convert the adjustment factor to a qindex delta
      // on active_best_quality.
Deb Mukherjee's avatar
Deb Mukherjee committed
623
624
      q_val = vp9_convert_qindex_to_q(active_best_quality);
      active_best_quality +=
625
626
627
628
629
          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
630
631
    current_q = vp9_convert_qindex_to_q(active_worst_quality);
    active_best_quality = active_worst_quality
632
633
        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
#endif
634
  } else if (!cpi->rc.is_src_frame_alt_ref &&
635
636
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {

Deb Mukherjee's avatar
Deb Mukherjee committed
637
    // Use the lower of active_worst_quality and recent
638
639
    // average Q as basis for GF/ARF best Q limit unless last frame was
    // a key frame.
640
641
642
    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
643
644
    } else {
      q = active_worst_quality;
645
646
647
648
649
    }
    // 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;
650
      if (cpi->rc.frames_since_key > 1) {
Deb Mukherjee's avatar
Deb Mukherjee committed
651
652
653
654
        active_best_quality = get_active_quality(q, cpi->rc.gfu_boost,
                                                 gf_low, gf_high,
                                                 afq_low_motion_minq,
                                                 afq_high_motion_minq);
655
      } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
656
657
658
659
        active_best_quality = get_active_quality(q, cpi->rc.gfu_boost,
                                                 gf_low, gf_high,
                                                 gf_low_motion_minq,
                                                 gf_high_motion_minq);
660
661
      }
      // Constrained quality use slightly lower active best.
Deb Mukherjee's avatar
Deb Mukherjee committed
662
      active_best_quality = active_best_quality * 15 / 16;
663
664
665

    } else if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
      if (!cpi->refresh_alt_ref_frame) {
Deb Mukherjee's avatar
Deb Mukherjee committed
666
        active_best_quality = cpi->cq_target_quality;
667
      } else {
668
        if (cpi->rc.frames_since_key > 1) {
Deb Mukherjee's avatar
Deb Mukherjee committed
669
670
          active_best_quality = get_active_quality(
              q, cpi->rc.gfu_boost, gf_low, gf_high,
671
              afq_low_motion_minq, afq_high_motion_minq);
672
        } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
673
674
          active_best_quality = get_active_quality(
              q, cpi->rc.gfu_boost, gf_low, gf_high,
675
              gf_low_motion_minq, gf_high_motion_minq);
676
677
678
        }
      }
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
679
680
681
      active_best_quality = get_active_quality(
          q, cpi->rc.gfu_boost, gf_low, gf_high,
          gf_low_motion_minq, gf_high_motion_minq);
682
683
684
    }
  } else {
    if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
685
      active_best_quality = cpi->cq_target_quality;
686
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
687
      if (cpi->pass == 0 &&
688
          cpi->rc.avg_frame_qindex[INTER_FRAME] < active_worst_quality)
Deb Mukherjee's avatar
Deb Mukherjee committed
689
690
        // 1-pass: for now, use the average Q for the active_best, if its lower
        // than active_worst.
691
        active_best_quality = inter_minq[cpi->rc.avg_frame_qindex[INTER_FRAME]];
Deb Mukherjee's avatar
Deb Mukherjee committed
692
693
      else
        active_best_quality = inter_minq[active_worst_quality];
694
695
696
697

      // 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
698
          (active_best_quality < cpi->cq_target_quality)) {
699
700
701
702
        // 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
703
          active_best_quality = cpi->oxcf.cq_level;
704
        else
Deb Mukherjee's avatar
Deb Mukherjee committed
705
          active_best_quality = cpi->cq_target_quality;
706
707
708
709
710
      }
    }
  }

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

Deb Mukherjee's avatar
Deb Mukherjee committed
714
715
  if (active_best_quality < cpi->rc.best_quality)
    active_best_quality = cpi->rc.best_quality;
716

Deb Mukherjee's avatar
Deb Mukherjee committed
717
718
  if (active_best_quality > cpi->rc.worst_quality)
    active_best_quality = cpi->rc.worst_quality;
719

Deb Mukherjee's avatar
Deb Mukherjee committed
720
721
  if (active_worst_quality < active_best_quality)
    active_worst_quality = active_best_quality;
722

Deb Mukherjee's avatar
Deb Mukherjee committed
723
724
  *top_index = active_worst_quality;
  *bottom_index = active_best_quality;
725
726

#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
727
  // Limit Q range for the adaptive loop.
728
  if (cm->frame_type == KEY_FRAME && !cpi->rc.this_key_frame_forced) {
729
730
    if (!(cpi->pass == 0 && cpi->common.current_video_frame == 0)) {
      *top_index =
Deb Mukherjee's avatar
Deb Mukherjee committed
731
          (active_worst_quality + active_best_quality * 3) / 4;
732
    }
733
  } else if (!cpi->rc.is_src_frame_alt_ref &&
734
735
736
             (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
737
      (active_worst_quality + active_best_quality) / 2;
738
  }
739
#endif
740
741

  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
742
    q = active_best_quality;
743
  // Special case code to try and match quality with forced key frames
744
  } else if ((cm->frame_type == KEY_FRAME) && cpi->rc.this_key_frame_forced) {
745
746
    q = cpi->rc.last_boosted_qindex;
  } else {
747
748
    q = vp9_rc_regulate_q(cpi, cpi->rc.this_frame_target,
                          active_best_quality, active_worst_quality);
749
750
751
    if (q > *top_index)
      q = *top_index;
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
#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
769
770
771
772
773
774
  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);
775
  return q;
John Koleszar's avatar
John Koleszar committed
776
777
}

Deb Mukherjee's avatar
Deb Mukherjee committed
778
void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
779
780
781
                                      int this_frame_target,
                                      int *frame_under_shoot_limit,
                                      int *frame_over_shoot_limit) {
John Koleszar's avatar
John Koleszar committed
782
  // Set-up bounds on acceptable frame size:
783
  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
John Koleszar's avatar
John Koleszar committed
784
785
786
787
    *frame_under_shoot_limit = 0;
    *frame_over_shoot_limit  = INT_MAX;
  } else {
    if (cpi->common.frame_type == KEY_FRAME) {
788
789
      *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
790
    } else {
791
      if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) {
792
793
        *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
794
795
796
      } else {
        // Stron overshoot limit for constrained quality
        if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
797
798
          *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
799
        } else {
800
801
          *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
802
        }
John Koleszar's avatar
John Koleszar committed
803
      }
John Koleszar's avatar
John Koleszar committed
804
    }
John Koleszar's avatar
John Koleszar committed
805
806
807
808
809
810
811
812
813

    // 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
814
}
815
816

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

John Koleszar's avatar
John Koleszar committed
820
821
822
823
  if (cm->frame_type == KEY_FRAME)
    calc_iframe_target_size(cpi);
  else
    calc_pframe_target_size(cpi);
824

825
826
827
  // 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
828
  return 1;
829
}
830

Deb Mukherjee's avatar
Deb Mukherjee committed
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
  // this frame refreshes means next frames don't unless specified by user
  cpi->rc.frames_since_golden = 0;

#if CONFIG_MULTIPLE_ARF
  if (!cpi->multi_arf_enabled)
#endif
    // Clear the alternate reference update pending flag.
    cpi->rc.source_alt_ref_pending = 0;

  // Set the alternate reference frame active flag
  cpi->rc.source_alt_ref_active = 1;
}

static void update_golden_frame_stats(VP9_COMP *cpi) {
  // Update the Golden frame usage counts.
  if (cpi->refresh_golden_frame) {
    // this frame refreshes means next frames don't unless specified by user
    cpi->rc.frames_since_golden = 0;

    if (!cpi->rc.source_alt_ref_pending)
      cpi->rc.source_alt_ref_active = 0;

    // Decrement count down till next gf
    if (cpi->rc.frames_till_gf_update_due > 0)
      cpi->rc.frames_till_gf_update_due--;

  } else if (!cpi->refresh_alt_ref_frame) {
    // Decrement count down till next gf
    if (cpi->rc.frames_till_gf_update_due > 0)
      cpi->rc.frames_till_gf_update_due--;

    cpi->rc.frames_since_golden++;
  }
}

867
void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
868
  VP9_COMMON *const cm = &cpi->common;
869
  RATE_CONTROL *const rc = &cpi->rc;
870
  // Update rate control heuristics
871
  rc->projected_frame_size = (bytes_used << 3);
872
873

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

877
878
  // Keep a record of last Q and ambient average Q.
  if (cm->frame_type == KEY_FRAME) {
879
880
881
882
    rc->last_q[KEY_FRAME] = cm->base_qindex;
    rc->avg_frame_qindex[KEY_FRAME] = ROUND_POWER_OF_TWO(
        3 * rc->avg_frame_qindex[KEY_FRAME] + cm->base_qindex, 2);
  } else if (!rc->is_src_frame_alt_ref &&
883
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
884
885
886
    rc->last_q[2] = cm->base_qindex;
    rc->avg_frame_qindex[2] = ROUND_POWER_OF_TWO(
        3 * rc->avg_frame_qindex[2] + cm->base_qindex, 2);
887
  } else {
888
889
890
891
892
893
    rc->last_q[INTER_FRAME] = cm->base_qindex;
    rc->avg_frame_qindex[INTER_FRAME] = ROUND_POWER_OF_TWO(
        3 * rc->avg_frame_qindex[INTER_FRAME] + cm->base_qindex, 2);
    rc->ni_frames++;
    rc->tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
    rc->avg_q = rc->tot_q / (double)rc->ni_frames;
894
895

    // Calculate the average Q for normal inter frames (not key or GFU frames).
896
897
    rc->ni_tot_qi += cm->base_qindex;
    rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames;
898
  }
899
900
901
902
903
904

  // 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
905
  if ((cm->base_qindex < rc->last_boosted_qindex) ||
906
907
      ((cpi->static_mb_pct < 100) &&
       ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
908
909
        (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
    rc->last_boosted_qindex = cm->base_qindex;
910
911
  }

912
  vp9_update_buffer_level(cpi, rc->projected_frame_size);
913
914
915
916

  // 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) {
917
918
919
920
921
922
923
924
    rc->rolling_target_bits = ROUND_POWER_OF_TWO(
        rc->rolling_target_bits * 3 + rc->this_frame_target, 2);
    rc->rolling_actual_bits = ROUND_POWER_OF_TWO(
        rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2);
    rc->long_rolling_target_bits = ROUND_POWER_OF_TWO(
        rc->long_rolling_target_bits * 31 + rc->this_frame_target, 5);
    rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO(
        rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5);
925
926
927
  }

  // Actual bits spent
928
  rc->total_actual_bits += rc->projected_frame_size;
929
930

  // Debug stats
931
932
  rc->total_target_vs_actual += (rc->this_frame_target -
                                 rc->projected_frame_size);
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948

#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
Deb Mukherjee's avatar
Deb Mukherjee committed
949

950
951
  if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame &&
      (cm->frame_type != KEY_FRAME))
Deb Mukherjee's avatar
Deb Mukherjee committed
952
953
954
955
956
957
958
    // Update the alternate reference frame stats as appropriate.
    update_alt_ref_frame_stats(cpi);
  else
    // Update the Golden frame stats as appropriate.
    update_golden_frame_stats(cpi);

  if (cm->frame_type == KEY_FRAME)
959
    rc->frames_since_key = 0;
Deb Mukherjee's avatar
Deb Mukherjee committed
960
  if (cm->show_frame) {
961
962
    rc->frames_since_key++;
    rc->frames_to_key--;
Deb Mukherjee's avatar
Deb Mukherjee committed
963
964
965
966
967
  }
}

void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {
  cpi->rc.frames_since_key++;
Deb Mukherjee's avatar
Deb Mukherjee committed
968
  cpi->rc.frames_to_key--;
969
}