1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <assert.h>
12#include <limits.h>
13#include <math.h>
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17
18#include "vpx_mem/vpx_mem.h"
19
20#include "vp9/common/vp9_alloccommon.h"
21#include "vp9/common/vp9_common.h"
22#include "vp9/common/vp9_entropymode.h"
23#include "vp9/common/vp9_quant_common.h"
24#include "vp9/common/vp9_seg_common.h"
25#include "vp9/common/vp9_systemdependent.h"
26
27#include "vp9/encoder/vp9_encodemv.h"
28#include "vp9/encoder/vp9_ratectrl.h"
29
30#define DEFAULT_KF_BOOST 2000
31#define DEFAULT_GF_BOOST 2000
32
33#define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
34
35#define MIN_BPB_FACTOR 0.005
36#define MAX_BPB_FACTOR 50
37
38// Bits Per MB at different Q (Multiplied by 512)
39#define BPER_MB_NORMBITS    9
40
41// Tables relating active max Q to active min Q
42static int kf_low_motion_minq[QINDEX_RANGE];
43static int kf_high_motion_minq[QINDEX_RANGE];
44static int gf_low_motion_minq[QINDEX_RANGE];
45static int gf_high_motion_minq[QINDEX_RANGE];
46static int inter_minq[QINDEX_RANGE];
47static int afq_low_motion_minq[QINDEX_RANGE];
48static int afq_high_motion_minq[QINDEX_RANGE];
49static int gf_high = 2000;
50static int gf_low = 400;
51static int kf_high = 5000;
52static int kf_low = 400;
53
54// Functions to compute the active minq lookup table entries based on a
55// formulaic approach to facilitate easier adjustment of the Q tables.
56// The formulae were derived from computing a 3rd order polynomial best
57// fit to the original data (after plotting real maxq vs minq (not q index))
58static int get_minq_index(double maxq, double x3, double x2, double x1) {
59  int i;
60  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq,
61                                maxq);
62
63  // Special case handling to deal with the step from q2.0
64  // down to lossless mode represented by q 1.0.
65  if (minqtarget <= 2.0)
66    return 0;
67
68  for (i = 0; i < QINDEX_RANGE; i++)
69    if (minqtarget <= vp9_convert_qindex_to_q(i))
70      return i;
71
72  return QINDEX_RANGE - 1;
73}
74
75void vp9_rc_init_minq_luts() {
76  int i;
77
78  for (i = 0; i < QINDEX_RANGE; i++) {
79    const double maxq = vp9_convert_qindex_to_q(i);
80
81    kf_low_motion_minq[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.15);
82    kf_high_motion_minq[i] = get_minq_index(maxq, 0.000002, -0.0012, 0.50);
83    gf_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.32);
84    gf_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.50);
85    afq_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.33);
86    afq_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55);
87    inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.75);
88  }
89}
90
91// These functions use formulaic calculations to make playing with the
92// quantizer tables easier. If necessary they can be replaced by lookup
93// tables if and when things settle down in the experimental bitstream
94double vp9_convert_qindex_to_q(int qindex) {
95  // Convert the index to a real Q value (scaled down to match old Q values)
96  return vp9_ac_quant(qindex, 0) / 4.0;
97}
98
99int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
100                       double correction_factor) {
101  const double q = vp9_convert_qindex_to_q(qindex);
102  int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
103
104  // q based adjustment to baseline enumerator
105  enumerator += (int)(enumerator * q) >> 12;
106  return (int)(0.5 + (enumerator * correction_factor / q));
107}
108
109void vp9_save_coding_context(VP9_COMP *cpi) {
110  CODING_CONTEXT *const cc = &cpi->coding_context;
111  VP9_COMMON *cm = &cpi->common;
112
113  // Stores a snapshot of key state variables which can subsequently be
114  // restored with a call to vp9_restore_coding_context. These functions are
115  // intended for use in a re-code loop in vp9_compress_frame where the
116  // quantizer value is adjusted between loop iterations.
117  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
118  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
119  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
120
121  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
122
123  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
124             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
125
126  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
127  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
128
129  cc->fc = cm->fc;
130}
131
132void vp9_restore_coding_context(VP9_COMP *cpi) {
133  CODING_CONTEXT *const cc = &cpi->coding_context;
134  VP9_COMMON *cm = &cpi->common;
135
136  // Restore key state variables to the snapshot state stored in the
137  // previous call to vp9_save_coding_context.
138  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
139  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
140  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
141
142  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
143
144  vpx_memcpy(cm->last_frame_seg_map,
145             cpi->coding_context.last_frame_seg_map_copy,
146             (cm->mi_rows * cm->mi_cols));
147
148  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
149  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
150
151  cm->fc = cc->fc;
152}
153
154static int estimate_bits_at_q(int frame_kind, int q, int mbs,
155                              double correction_factor) {
156  const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
157
158  // Attempt to retain reasonable accuracy without overflow. The cutoff is
159  // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
160  // largest Bpm takes 20 bits.
161  return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
162                           : (bpm * mbs) >> BPER_MB_NORMBITS;
163}
164
165int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
166  const RATE_CONTROL *rc = &cpi->rc;
167  const int min_frame_target = MAX(rc->min_frame_bandwidth,
168                                   rc->av_per_frame_bandwidth >> 5);
169  if (target < min_frame_target)
170    target = min_frame_target;
171  if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
172    // If there is an active ARF at this location use the minimum
173    // bits on this frame even if it is a constructed arf.
174    // The active maximum quantizer insures that an appropriate
175    // number of bits will be spent if needed for constructed ARFs.
176    target = min_frame_target;
177  }
178  // Clip the frame target to the maximum allowed value.
179  if (target > rc->max_frame_bandwidth)
180    target = rc->max_frame_bandwidth;
181  return target;
182}
183
184int vp9_rc_clamp_iframe_target_size(const VP9_COMP *const cpi, int target) {
185  const RATE_CONTROL *rc = &cpi->rc;
186  const VP9_CONFIG *oxcf = &cpi->oxcf;
187  if (oxcf->rc_max_intra_bitrate_pct) {
188    const int max_rate = rc->av_per_frame_bandwidth *
189        oxcf->rc_max_intra_bitrate_pct / 100;
190    target = MIN(target, max_rate);
191  }
192  if (target > rc->max_frame_bandwidth)
193    target = rc->max_frame_bandwidth;
194  return target;
195}
196
197
198// Update the buffer level for higher layers, given the encoded current layer.
199static void update_layer_buffer_level(VP9_COMP *const cpi,
200                                      int encoded_frame_size) {
201  int temporal_layer = 0;
202  int current_temporal_layer = cpi->svc.temporal_layer_id;
203  for (temporal_layer = current_temporal_layer + 1;
204      temporal_layer < cpi->svc.number_temporal_layers; ++temporal_layer) {
205    LAYER_CONTEXT *lc = &cpi->svc.layer_context[temporal_layer];
206    RATE_CONTROL *lrc = &lc->rc;
207    int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
208        encoded_frame_size);
209    lrc->bits_off_target += bits_off_for_this_layer;
210
211    // Clip buffer level to maximum buffer size for the layer.
212    lrc->bits_off_target = MIN(lrc->bits_off_target, lc->maximum_buffer_size);
213    lrc->buffer_level = lrc->bits_off_target;
214  }
215}
216
217// Update the buffer level: leaky bucket model.
218static void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) {
219  const VP9_COMMON *const cm = &cpi->common;
220  const VP9_CONFIG *oxcf = &cpi->oxcf;
221  RATE_CONTROL *const rc = &cpi->rc;
222
223  // Non-viewable frames are a special case and are treated as pure overhead.
224  if (!cm->show_frame) {
225    rc->bits_off_target -= encoded_frame_size;
226  } else {
227    rc->bits_off_target += rc->av_per_frame_bandwidth - encoded_frame_size;
228  }
229
230  // Clip the buffer level to the maximum specified buffer size.
231  rc->bits_off_target = MIN(rc->bits_off_target, oxcf->maximum_buffer_size);
232  rc->buffer_level = rc->bits_off_target;
233
234  if (cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
235    update_layer_buffer_level(cpi, encoded_frame_size);
236  }
237}
238
239int vp9_rc_drop_frame(VP9_COMP *cpi) {
240  const VP9_CONFIG *oxcf = &cpi->oxcf;
241  RATE_CONTROL *const rc = &cpi->rc;
242
243  if (!oxcf->drop_frames_water_mark) {
244    return 0;
245  } else {
246    if (rc->buffer_level < 0) {
247      // Always drop if buffer is below 0.
248      return 1;
249    } else {
250      // If buffer is below drop_mark, for now just drop every other frame
251      // (starting with the next frame) until it increases back over drop_mark.
252      int drop_mark = (int)(oxcf->drop_frames_water_mark *
253          oxcf->optimal_buffer_level / 100);
254      if ((rc->buffer_level > drop_mark) &&
255          (rc->decimation_factor > 0)) {
256        --rc->decimation_factor;
257      } else if (rc->buffer_level <= drop_mark &&
258          rc->decimation_factor == 0) {
259        rc->decimation_factor = 1;
260      }
261      if (rc->decimation_factor > 0) {
262        if (rc->decimation_count > 0) {
263          --rc->decimation_count;
264          return 1;
265        } else {
266          rc->decimation_count = rc->decimation_factor;
267          return 0;
268        }
269      } else {
270        rc->decimation_count = 0;
271        return 0;
272      }
273    }
274  }
275}
276
277static double get_rate_correction_factor(const VP9_COMP *cpi) {
278  if (cpi->common.frame_type == KEY_FRAME) {
279    return cpi->rc.key_frame_rate_correction_factor;
280  } else {
281    if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
282        !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
283      return cpi->rc.gf_rate_correction_factor;
284    else
285      return cpi->rc.rate_correction_factor;
286  }
287}
288
289static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
290  if (cpi->common.frame_type == KEY_FRAME) {
291    cpi->rc.key_frame_rate_correction_factor = factor;
292  } else {
293    if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
294        !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
295      cpi->rc.gf_rate_correction_factor = factor;
296    else
297      cpi->rc.rate_correction_factor = factor;
298  }
299}
300
301void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
302  const int q = cpi->common.base_qindex;
303  int correction_factor = 100;
304  double rate_correction_factor = get_rate_correction_factor(cpi);
305  double adjustment_limit;
306
307  int projected_size_based_on_q = 0;
308
309  // Clear down mmx registers to allow floating point in what follows
310  vp9_clear_system_state();
311
312  // Work out how big we would have expected the frame to be at this Q given
313  // the current correction factor.
314  // Stay in double to avoid int overflow when values are large
315  projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
316                                                 cpi->common.MBs,
317                                                 rate_correction_factor);
318  // Work out a size correction factor.
319  if (projected_size_based_on_q > 0)
320    correction_factor = (100 * cpi->rc.projected_frame_size) /
321                            projected_size_based_on_q;
322
323  // More heavily damped adjustment used if we have been oscillating either side
324  // of target.
325  switch (damp_var) {
326    case 0:
327      adjustment_limit = 0.75;
328      break;
329    case 1:
330      adjustment_limit = 0.375;
331      break;
332    case 2:
333    default:
334      adjustment_limit = 0.25;
335      break;
336  }
337
338  if (correction_factor > 102) {
339    // We are not already at the worst allowable quality
340    correction_factor =
341        (int)(100 + ((correction_factor - 100) * adjustment_limit));
342    rate_correction_factor =
343        ((rate_correction_factor * correction_factor) / 100);
344
345    // Keep rate_correction_factor within limits
346    if (rate_correction_factor > MAX_BPB_FACTOR)
347      rate_correction_factor = MAX_BPB_FACTOR;
348  } else if (correction_factor < 99) {
349    // We are not already at the best allowable quality
350    correction_factor =
351        (int)(100 - ((100 - correction_factor) * adjustment_limit));
352    rate_correction_factor =
353        ((rate_correction_factor * correction_factor) / 100);
354
355    // Keep rate_correction_factor within limits
356    if (rate_correction_factor < MIN_BPB_FACTOR)
357      rate_correction_factor = MIN_BPB_FACTOR;
358  }
359
360  set_rate_correction_factor(cpi, rate_correction_factor);
361}
362
363
364int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
365                      int active_best_quality, int active_worst_quality) {
366  const VP9_COMMON *const cm = &cpi->common;
367  int q = active_worst_quality;
368  int last_error = INT_MAX;
369  int i, target_bits_per_mb;
370  const double correction_factor = get_rate_correction_factor(cpi);
371
372  // Calculate required scaling factor based on target frame size and size of
373  // frame produced using previous Q.
374  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
375    // Case where we would overflow int
376    target_bits_per_mb = (target_bits_per_frame / cm->MBs) << BPER_MB_NORMBITS;
377  else
378    target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs;
379
380  i = active_best_quality;
381
382  do {
383    const int bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cm->frame_type, i,
384                                                             correction_factor);
385
386    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
387      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
388        q = i;
389      else
390        q = i - 1;
391
392      break;
393    } else {
394      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
395    }
396  } while (++i <= active_worst_quality);
397
398  return q;
399}
400
401static int get_active_quality(int q, int gfu_boost, int low, int high,
402                              int *low_motion_minq, int *high_motion_minq) {
403  if (gfu_boost > high) {
404    return low_motion_minq[q];
405  } else if (gfu_boost < low) {
406    return high_motion_minq[q];
407  } else {
408    const int gap = high - low;
409    const int offset = high - gfu_boost;
410    const int qdiff = high_motion_minq[q] - low_motion_minq[q];
411    const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
412    return low_motion_minq[q] + adjustment;
413  }
414}
415
416static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) {
417  const RATE_CONTROL *const rc = &cpi->rc;
418  const unsigned int curr_frame = cpi->common.current_video_frame;
419  int active_worst_quality;
420
421  if (cpi->common.frame_type == KEY_FRAME) {
422    active_worst_quality = curr_frame == 0 ? rc->worst_quality
423                                           : rc->last_q[KEY_FRAME] * 2;
424  } else {
425    if (!rc->is_src_frame_alt_ref &&
426        (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
427      active_worst_quality =  curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4
428                                              : rc->last_q[INTER_FRAME];
429    } else {
430      active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2
431                                             : rc->last_q[INTER_FRAME] * 2;
432    }
433  }
434
435  return MIN(active_worst_quality, rc->worst_quality);
436}
437
438// Adjust active_worst_quality level based on buffer level.
439static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) {
440  // Adjust active_worst_quality: If buffer is above the optimal/target level,
441  // bring active_worst_quality down depending on fullness of buffer.
442  // If buffer is below the optimal level, let the active_worst_quality go from
443  // ambient Q (at buffer = optimal level) to worst_quality level
444  // (at buffer = critical level).
445  const VP9_CONFIG *oxcf = &cpi->oxcf;
446  const RATE_CONTROL *rc = &cpi->rc;
447  // Buffer level below which we push active_worst to worst_quality.
448  int64_t critical_level = oxcf->optimal_buffer_level >> 2;
449  int64_t buff_lvl_step = 0;
450  int adjustment = 0;
451  int active_worst_quality;
452  if (cpi->common.frame_type == KEY_FRAME)
453    return rc->worst_quality;
454  if (cpi->common.current_video_frame > 1)
455    active_worst_quality = MIN(rc->worst_quality,
456                               rc->avg_frame_qindex[INTER_FRAME] * 5 / 4);
457  else
458    active_worst_quality = MIN(rc->worst_quality,
459                               rc->avg_frame_qindex[KEY_FRAME] * 3 / 2);
460  if (rc->buffer_level > oxcf->optimal_buffer_level) {
461    // Adjust down.
462    // Maximum limit for down adjustment, ~30%.
463    int max_adjustment_down = active_worst_quality / 3;
464    if (max_adjustment_down) {
465      buff_lvl_step = ((oxcf->maximum_buffer_size -
466                        oxcf->optimal_buffer_level) / max_adjustment_down);
467      if (buff_lvl_step)
468        adjustment = (int)((rc->buffer_level - oxcf->optimal_buffer_level) /
469                            buff_lvl_step);
470      active_worst_quality -= adjustment;
471    }
472  } else if (rc->buffer_level > critical_level) {
473    // Adjust up from ambient Q.
474    if (critical_level) {
475      buff_lvl_step = (oxcf->optimal_buffer_level - critical_level);
476      if (buff_lvl_step) {
477        adjustment =
478            (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) *
479                  (oxcf->optimal_buffer_level - rc->buffer_level) /
480                  buff_lvl_step);
481      }
482      active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment;
483    }
484  } else {
485    // Set to worst_quality if buffer is below critical level.
486    active_worst_quality = rc->worst_quality;
487  }
488  return active_worst_quality;
489}
490
491static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi,
492                                             int *bottom_index,
493                                             int *top_index) {
494  const VP9_COMMON *const cm = &cpi->common;
495  const RATE_CONTROL *const rc = &cpi->rc;
496  int active_best_quality;
497  int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi);
498  int q;
499
500  if (frame_is_intra_only(cm)) {
501    active_best_quality = rc->best_quality;
502    // Handle the special case for key frames forced when we have75 reached
503    // the maximum key frame interval. Here force the Q to a range
504    // based on the ambient Q to reduce the risk of popping.
505    if (rc->this_key_frame_forced) {
506      int qindex = rc->last_boosted_qindex;
507      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
508      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
509                                            (last_boosted_q * 0.75));
510      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
511    } else if (cm->current_video_frame > 0) {
512      // not first frame of one pass and kf_boost is set
513      double q_adj_factor = 1.0;
514      double q_val;
515
516      active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
517                                               rc->kf_boost,
518                                               kf_low, kf_high,
519                                               kf_low_motion_minq,
520                                               kf_high_motion_minq);
521
522      // Allow somewhat lower kf minq with small image formats.
523      if ((cm->width * cm->height) <= (352 * 288)) {
524        q_adj_factor -= 0.25;
525      }
526
527      // Convert the adjustment factor to a qindex delta
528      // on active_best_quality.
529      q_val = vp9_convert_qindex_to_q(active_best_quality);
530      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
531                                                   q_adj_factor);
532    }
533  } else if (!rc->is_src_frame_alt_ref &&
534             !cpi->use_svc &&
535             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
536    // Use the lower of active_worst_quality and recent
537    // average Q as basis for GF/ARF best Q limit unless last frame was
538    // a key frame.
539    if (rc->frames_since_key > 1 &&
540        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
541      q = rc->avg_frame_qindex[INTER_FRAME];
542    } else {
543      q = active_worst_quality;
544    }
545    active_best_quality = get_active_quality(
546        q, rc->gfu_boost, gf_low, gf_high,
547        gf_low_motion_minq, gf_high_motion_minq);
548  } else {
549    // Use the lower of active_worst_quality and recent/average Q.
550    if (cm->current_video_frame > 1) {
551      if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality)
552        active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
553      else
554        active_best_quality = inter_minq[active_worst_quality];
555    } else {
556      if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality)
557        active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
558      else
559        active_best_quality = inter_minq[active_worst_quality];
560    }
561  }
562
563  // Clip the active best and worst quality values to limits
564  active_best_quality = clamp(active_best_quality,
565                              rc->best_quality, rc->worst_quality);
566  active_worst_quality = clamp(active_worst_quality,
567                               active_best_quality, rc->worst_quality);
568
569  *top_index = active_worst_quality;
570  *bottom_index = active_best_quality;
571
572#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
573  // Limit Q range for the adaptive loop.
574  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
575    if (!(cm->current_video_frame == 0))
576      *top_index = (active_worst_quality + active_best_quality * 3) / 4;
577  }
578#endif
579  // Special case code to try and match quality with forced key frames
580  if (cm->frame_type == KEY_FRAME && rc->this_key_frame_forced) {
581    q = rc->last_boosted_qindex;
582  } else {
583    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
584                          active_best_quality, active_worst_quality);
585    if (q > *top_index) {
586      // Special case when we are targeting the max allowed rate
587      if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
588        *top_index = q;
589      else
590        q = *top_index;
591    }
592  }
593  assert(*top_index <= rc->worst_quality &&
594         *top_index >= rc->best_quality);
595  assert(*bottom_index <= rc->worst_quality &&
596         *bottom_index >= rc->best_quality);
597  assert(q <= rc->worst_quality && q >= rc->best_quality);
598  return q;
599}
600
601static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
602                                             int *bottom_index,
603                                             int *top_index) {
604  const VP9_COMMON *const cm = &cpi->common;
605  const RATE_CONTROL *const rc = &cpi->rc;
606  const VP9_CONFIG *const oxcf = &cpi->oxcf;
607  int active_best_quality;
608  int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi);
609  int q;
610
611  if (frame_is_intra_only(cm)) {
612    active_best_quality = rc->best_quality;
613#if !CONFIG_MULTIPLE_ARF
614    // Handle the special case for key frames forced when we have75 reached
615    // the maximum key frame interval. Here force the Q to a range
616    // based on the ambient Q to reduce the risk of popping.
617    if (rc->this_key_frame_forced) {
618      int qindex = rc->last_boosted_qindex;
619      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
620      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
621                                            (last_boosted_q * 0.75));
622      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
623    } else if (cm->current_video_frame > 0) {
624      // not first frame of one pass and kf_boost is set
625      double q_adj_factor = 1.0;
626      double q_val;
627
628      active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
629                                               rc->kf_boost,
630                                               kf_low, kf_high,
631                                               kf_low_motion_minq,
632                                               kf_high_motion_minq);
633
634      // Allow somewhat lower kf minq with small image formats.
635      if ((cm->width * cm->height) <= (352 * 288)) {
636        q_adj_factor -= 0.25;
637      }
638
639      // Convert the adjustment factor to a qindex delta
640      // on active_best_quality.
641      q_val = vp9_convert_qindex_to_q(active_best_quality);
642      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
643                                                   q_adj_factor);
644    }
645#else
646    double current_q;
647    // Force the KF quantizer to be 30% of the active_worst_quality.
648    current_q = vp9_convert_qindex_to_q(active_worst_quality);
649    active_best_quality = active_worst_quality
650        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
651#endif
652  } else if (!rc->is_src_frame_alt_ref &&
653             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
654    // Use the lower of active_worst_quality and recent
655    // average Q as basis for GF/ARF best Q limit unless last frame was
656    // a key frame.
657    if (rc->frames_since_key > 1 &&
658        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
659      q = rc->avg_frame_qindex[INTER_FRAME];
660    } else {
661      q = rc->avg_frame_qindex[KEY_FRAME];
662    }
663    // For constrained quality dont allow Q less than the cq level
664    if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
665      if (q < cpi->cq_target_quality)
666        q = cpi->cq_target_quality;
667      if (rc->frames_since_key > 1) {
668        active_best_quality = get_active_quality(q, rc->gfu_boost,
669                                                 gf_low, gf_high,
670                                                 afq_low_motion_minq,
671                                                 afq_high_motion_minq);
672      } else {
673        active_best_quality = get_active_quality(q, rc->gfu_boost,
674                                                 gf_low, gf_high,
675                                                 gf_low_motion_minq,
676                                                 gf_high_motion_minq);
677      }
678      // Constrained quality use slightly lower active best.
679      active_best_quality = active_best_quality * 15 / 16;
680
681    } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
682      if (!cpi->refresh_alt_ref_frame) {
683        active_best_quality = cpi->cq_target_quality;
684      } else {
685        if (rc->frames_since_key > 1) {
686          active_best_quality = get_active_quality(
687              q, rc->gfu_boost, gf_low, gf_high,
688              afq_low_motion_minq, afq_high_motion_minq);
689        } else {
690          active_best_quality = get_active_quality(
691              q, rc->gfu_boost, gf_low, gf_high,
692              gf_low_motion_minq, gf_high_motion_minq);
693        }
694      }
695    } else {
696      active_best_quality = get_active_quality(
697          q, rc->gfu_boost, gf_low, gf_high,
698          gf_low_motion_minq, gf_high_motion_minq);
699    }
700  } else {
701    if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
702      active_best_quality = cpi->cq_target_quality;
703    } else {
704      // Use the lower of active_worst_quality and recent/average Q.
705      if (cm->current_video_frame > 1)
706        active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
707      else
708        active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
709      // For the constrained quality mode we don't want
710      // q to fall below the cq level.
711      if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
712          (active_best_quality < cpi->cq_target_quality)) {
713        // If we are strongly undershooting the target rate in the last
714        // frames then use the user passed in cq value not the auto
715        // cq value.
716        if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
717          active_best_quality = oxcf->cq_level;
718        else
719          active_best_quality = cpi->cq_target_quality;
720      }
721    }
722  }
723
724  // Clip the active best and worst quality values to limits
725  active_best_quality = clamp(active_best_quality,
726                              rc->best_quality, rc->worst_quality);
727  active_worst_quality = clamp(active_worst_quality,
728                               active_best_quality, rc->worst_quality);
729
730  *top_index = active_worst_quality;
731  *bottom_index = active_best_quality;
732
733#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
734  // Limit Q range for the adaptive loop.
735  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
736    if (!(cm->current_video_frame == 0))
737      *top_index = (active_worst_quality + active_best_quality * 3) / 4;
738  } else if (!rc->is_src_frame_alt_ref &&
739             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
740    *top_index = (active_worst_quality + active_best_quality) / 2;
741  }
742#endif
743  if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
744    q = active_best_quality;
745  // Special case code to try and match quality with forced key frames
746  } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
747    q = rc->last_boosted_qindex;
748  } else {
749    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
750                          active_best_quality, active_worst_quality);
751    if (q > *top_index) {
752      // Special case when we are targeting the max allowed rate
753      if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
754        *top_index = q;
755      else
756        q = *top_index;
757    }
758  }
759#if CONFIG_MULTIPLE_ARF
760  // Force the quantizer determined by the coding order pattern.
761  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
762      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
763    double new_q;
764    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
765    int level = cpi->this_frame_weight;
766    assert(level >= 0);
767    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
768    q = active_worst_quality +
769        vp9_compute_qdelta(cpi, current_q, new_q);
770
771    *bottom_index = q;
772    *top_index    = q;
773    printf("frame:%d q:%d\n", cm->current_video_frame, q);
774  }
775#endif
776  assert(*top_index <= rc->worst_quality &&
777         *top_index >= rc->best_quality);
778  assert(*bottom_index <= rc->worst_quality &&
779         *bottom_index >= rc->best_quality);
780  assert(q <= rc->worst_quality && q >= rc->best_quality);
781  return q;
782}
783
784static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi,
785                                         int *bottom_index,
786                                         int *top_index) {
787  const VP9_COMMON *const cm = &cpi->common;
788  const RATE_CONTROL *const rc = &cpi->rc;
789  const VP9_CONFIG *const oxcf = &cpi->oxcf;
790  int active_best_quality;
791  int active_worst_quality = cpi->twopass.active_worst_quality;
792  int q;
793
794  if (frame_is_intra_only(cm)) {
795#if !CONFIG_MULTIPLE_ARF
796    // Handle the special case for key frames forced when we have75 reached
797    // the maximum key frame interval. Here force the Q to a range
798    // based on the ambient Q to reduce the risk of popping.
799    if (rc->this_key_frame_forced) {
800      int qindex = rc->last_boosted_qindex;
801      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
802      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
803                                            (last_boosted_q * 0.75));
804      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
805    } else {
806      // Not forced keyframe.
807      double q_adj_factor = 1.0;
808      double q_val;
809      // Baseline value derived from cpi->active_worst_quality and kf boost.
810      active_best_quality = get_active_quality(active_worst_quality,
811                                               rc->kf_boost,
812                                               kf_low, kf_high,
813                                               kf_low_motion_minq,
814                                               kf_high_motion_minq);
815
816      // Allow somewhat lower kf minq with small image formats.
817      if ((cm->width * cm->height) <= (352 * 288)) {
818        q_adj_factor -= 0.25;
819      }
820
821      // Make a further adjustment based on the kf zero motion measure.
822      q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
823
824      // Convert the adjustment factor to a qindex delta
825      // on active_best_quality.
826      q_val = vp9_convert_qindex_to_q(active_best_quality);
827      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
828                                                   q_adj_factor);
829    }
830#else
831    double current_q;
832    // Force the KF quantizer to be 30% of the active_worst_quality.
833    current_q = vp9_convert_qindex_to_q(active_worst_quality);
834    active_best_quality = active_worst_quality
835        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
836#endif
837  } else if (!rc->is_src_frame_alt_ref &&
838             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
839    // Use the lower of active_worst_quality and recent
840    // average Q as basis for GF/ARF best Q limit unless last frame was
841    // a key frame.
842    if (rc->frames_since_key > 1 &&
843        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
844      q = rc->avg_frame_qindex[INTER_FRAME];
845    } else {
846      q = active_worst_quality;
847    }
848    // For constrained quality dont allow Q less than the cq level
849    if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
850      if (q < cpi->cq_target_quality)
851        q = cpi->cq_target_quality;
852      if (rc->frames_since_key > 1) {
853        active_best_quality = get_active_quality(q, rc->gfu_boost,
854                                                 gf_low, gf_high,
855                                                 afq_low_motion_minq,
856                                                 afq_high_motion_minq);
857      } else {
858        active_best_quality = get_active_quality(q, rc->gfu_boost,
859                                                 gf_low, gf_high,
860                                                 gf_low_motion_minq,
861                                                 gf_high_motion_minq);
862      }
863      // Constrained quality use slightly lower active best.
864      active_best_quality = active_best_quality * 15 / 16;
865
866    } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
867      if (!cpi->refresh_alt_ref_frame) {
868        active_best_quality = cpi->cq_target_quality;
869      } else {
870        if (rc->frames_since_key > 1) {
871          active_best_quality = get_active_quality(
872              q, rc->gfu_boost, gf_low, gf_high,
873              afq_low_motion_minq, afq_high_motion_minq);
874        } else {
875          active_best_quality = get_active_quality(
876              q, rc->gfu_boost, gf_low, gf_high,
877              gf_low_motion_minq, gf_high_motion_minq);
878        }
879      }
880    } else {
881      active_best_quality = get_active_quality(
882          q, rc->gfu_boost, gf_low, gf_high,
883          gf_low_motion_minq, gf_high_motion_minq);
884    }
885  } else {
886    if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
887      active_best_quality = cpi->cq_target_quality;
888    } else {
889      active_best_quality = inter_minq[active_worst_quality];
890
891      // For the constrained quality mode we don't want
892      // q to fall below the cq level.
893      if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
894          (active_best_quality < cpi->cq_target_quality)) {
895        // If we are strongly undershooting the target rate in the last
896        // frames then use the user passed in cq value not the auto
897        // cq value.
898        if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
899          active_best_quality = oxcf->cq_level;
900        else
901          active_best_quality = cpi->cq_target_quality;
902      }
903    }
904  }
905
906  // Clip the active best and worst quality values to limits.
907  active_best_quality = clamp(active_best_quality,
908                              rc->best_quality, rc->worst_quality);
909  active_worst_quality = clamp(active_worst_quality,
910                               active_best_quality, rc->worst_quality);
911
912  *top_index = active_worst_quality;
913  *bottom_index = active_best_quality;
914
915#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
916  // Limit Q range for the adaptive loop.
917  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
918    *top_index = (active_worst_quality + active_best_quality * 3) / 4;
919  } else if (!rc->is_src_frame_alt_ref &&
920             (oxcf->end_usage != USAGE_STREAM_FROM_SERVER) &&
921             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
922    *top_index = (active_worst_quality + active_best_quality) / 2;
923  }
924#endif
925
926  if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
927    q = active_best_quality;
928  // Special case code to try and match quality with forced key frames.
929  } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
930    q = rc->last_boosted_qindex;
931  } else {
932    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
933                          active_best_quality, active_worst_quality);
934    if (q > *top_index) {
935      // Special case when we are targeting the max allowed rate.
936      if (rc->this_frame_target >= rc->max_frame_bandwidth)
937        *top_index = q;
938      else
939        q = *top_index;
940    }
941  }
942#if CONFIG_MULTIPLE_ARF
943  // Force the quantizer determined by the coding order pattern.
944  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
945      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
946    double new_q;
947    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
948    int level = cpi->this_frame_weight;
949    assert(level >= 0);
950    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
951    q = active_worst_quality +
952        vp9_compute_qdelta(cpi, current_q, new_q);
953
954    *bottom_index = q;
955    *top_index    = q;
956    printf("frame:%d q:%d\n", cm->current_video_frame, q);
957  }
958#endif
959  assert(*top_index <= rc->worst_quality &&
960         *top_index >= rc->best_quality);
961  assert(*bottom_index <= rc->worst_quality &&
962         *bottom_index >= rc->best_quality);
963  assert(q <= rc->worst_quality && q >= rc->best_quality);
964  return q;
965}
966
967int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi,
968                             int *bottom_index,
969                             int *top_index) {
970  int q;
971  if (cpi->pass == 0) {
972    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
973      q = rc_pick_q_and_bounds_one_pass_cbr(cpi, bottom_index, top_index);
974    else
975      q = rc_pick_q_and_bounds_one_pass_vbr(cpi, bottom_index, top_index);
976  } else {
977    q = rc_pick_q_and_bounds_two_pass(cpi, bottom_index, top_index);
978  }
979
980  // Q of 0 is disabled because we force tx size to be
981  // 16x16...
982  if (cpi->sf.use_nonrd_pick_mode) {
983    if (q == 0)
984      q++;
985    if (cpi->sf.force_frame_boost == 1)
986      q -= cpi->sf.max_delta_qindex;
987
988    if (q < *bottom_index)
989      *bottom_index = q;
990    else if (q > *top_index)
991      *top_index = q;
992  }
993  return q;
994}
995
996void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
997                                      int this_frame_target,
998                                      int *frame_under_shoot_limit,
999                                      int *frame_over_shoot_limit) {
1000  // Set-up bounds on acceptable frame size:
1001  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
1002    *frame_under_shoot_limit = 0;
1003    *frame_over_shoot_limit  = INT_MAX;
1004  } else {
1005    int recode_tolerance =
1006      (cpi->sf.recode_tolerance * this_frame_target) / 100;
1007
1008    *frame_over_shoot_limit = this_frame_target + recode_tolerance;
1009    *frame_under_shoot_limit = this_frame_target - recode_tolerance;
1010
1011    // For very small rate targets where the fractional adjustment
1012    // may be tiny make sure there is at least a minimum range.
1013    *frame_over_shoot_limit += 200;
1014    *frame_under_shoot_limit -= 200;
1015    if (*frame_under_shoot_limit < 0)
1016      *frame_under_shoot_limit = 0;
1017
1018    // Clip to maximum allowed rate for a frame.
1019    if (*frame_over_shoot_limit > cpi->rc.max_frame_bandwidth) {
1020      *frame_over_shoot_limit = cpi->rc.max_frame_bandwidth;
1021    }
1022  }
1023}
1024
1025void vp9_rc_set_frame_target(VP9_COMP *cpi, int target) {
1026  const VP9_COMMON *const cm = &cpi->common;
1027  RATE_CONTROL *const rc = &cpi->rc;
1028
1029  rc->this_frame_target = target;
1030  // Target rate per SB64 (including partial SB64s.
1031  rc->sb64_target_rate = ((int64_t)rc->this_frame_target * 64 * 64) /
1032                             (cm->width * cm->height);
1033}
1034
1035static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
1036  // this frame refreshes means next frames don't unless specified by user
1037  cpi->rc.frames_since_golden = 0;
1038
1039#if CONFIG_MULTIPLE_ARF
1040  if (!cpi->multi_arf_enabled)
1041#endif
1042    // Clear the alternate reference update pending flag.
1043    cpi->rc.source_alt_ref_pending = 0;
1044
1045  // Set the alternate reference frame active flag
1046  cpi->rc.source_alt_ref_active = 1;
1047}
1048
1049static void update_golden_frame_stats(VP9_COMP *cpi) {
1050  RATE_CONTROL *const rc = &cpi->rc;
1051
1052  // Update the Golden frame usage counts.
1053  if (cpi->refresh_golden_frame) {
1054    // this frame refreshes means next frames don't unless specified by user
1055    rc->frames_since_golden = 0;
1056
1057    if (!rc->source_alt_ref_pending)
1058      rc->source_alt_ref_active = 0;
1059
1060    // Decrement count down till next gf
1061    if (rc->frames_till_gf_update_due > 0)
1062      rc->frames_till_gf_update_due--;
1063
1064  } else if (!cpi->refresh_alt_ref_frame) {
1065    // Decrement count down till next gf
1066    if (rc->frames_till_gf_update_due > 0)
1067      rc->frames_till_gf_update_due--;
1068
1069    rc->frames_since_golden++;
1070  }
1071}
1072
1073void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
1074  VP9_COMMON *const cm = &cpi->common;
1075  RATE_CONTROL *const rc = &cpi->rc;
1076
1077  cm->last_frame_type = cm->frame_type;
1078  // Update rate control heuristics
1079  rc->projected_frame_size = (int)(bytes_used << 3);
1080
1081  // Post encode loop adjustment of Q prediction.
1082  vp9_rc_update_rate_correction_factors(
1083      cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF ||
1084            cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);
1085
1086  // Keep a record of last Q and ambient average Q.
1087  if (cm->frame_type == KEY_FRAME) {
1088    rc->last_q[KEY_FRAME] = cm->base_qindex;
1089    rc->avg_frame_qindex[KEY_FRAME] = ROUND_POWER_OF_TWO(
1090        3 * rc->avg_frame_qindex[KEY_FRAME] + cm->base_qindex, 2);
1091  } else if (!rc->is_src_frame_alt_ref &&
1092      (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) &&
1093      !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
1094    rc->last_q[2] = cm->base_qindex;
1095    rc->avg_frame_qindex[2] = ROUND_POWER_OF_TWO(
1096        3 * rc->avg_frame_qindex[2] + cm->base_qindex, 2);
1097  } else {
1098    rc->last_q[INTER_FRAME] = cm->base_qindex;
1099    rc->avg_frame_qindex[INTER_FRAME] = ROUND_POWER_OF_TWO(
1100        3 * rc->avg_frame_qindex[INTER_FRAME] + cm->base_qindex, 2);
1101    rc->ni_frames++;
1102    rc->tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
1103    rc->avg_q = rc->tot_q / (double)rc->ni_frames;
1104
1105    // Calculate the average Q for normal inter frames (not key or GFU frames).
1106    rc->ni_tot_qi += cm->base_qindex;
1107    rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames;
1108  }
1109
1110  // Keep record of last boosted (KF/KF/ARF) Q value.
1111  // If the current frame is coded at a lower Q then we also update it.
1112  // If all mbs in this group are skipped only update if the Q value is
1113  // better than that already stored.
1114  // This is used to help set quality in forced key frames to reduce popping
1115  if ((cm->base_qindex < rc->last_boosted_qindex) ||
1116      ((cpi->static_mb_pct < 100) &&
1117       ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
1118        (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
1119    rc->last_boosted_qindex = cm->base_qindex;
1120  }
1121
1122  update_buffer_level(cpi, rc->projected_frame_size);
1123
1124  // Rolling monitors of whether we are over or underspending used to help
1125  // regulate min and Max Q in two pass.
1126  if (cm->frame_type != KEY_FRAME) {
1127    rc->rolling_target_bits = ROUND_POWER_OF_TWO(
1128        rc->rolling_target_bits * 3 + rc->this_frame_target, 2);
1129    rc->rolling_actual_bits = ROUND_POWER_OF_TWO(
1130        rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2);
1131    rc->long_rolling_target_bits = ROUND_POWER_OF_TWO(
1132        rc->long_rolling_target_bits * 31 + rc->this_frame_target, 5);
1133    rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO(
1134        rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5);
1135  }
1136
1137  // Actual bits spent
1138  rc->total_actual_bits += rc->projected_frame_size;
1139  rc->total_target_bits += (cm->show_frame ? rc->av_per_frame_bandwidth : 0);
1140
1141  rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits;
1142
1143  if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame &&
1144      (cm->frame_type != KEY_FRAME))
1145    // Update the alternate reference frame stats as appropriate.
1146    update_alt_ref_frame_stats(cpi);
1147  else
1148    // Update the Golden frame stats as appropriate.
1149    update_golden_frame_stats(cpi);
1150
1151  if (cm->frame_type == KEY_FRAME)
1152    rc->frames_since_key = 0;
1153  if (cm->show_frame) {
1154    rc->frames_since_key++;
1155    rc->frames_to_key--;
1156  }
1157}
1158
1159void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {
1160  // Update buffer level with zero size, update frame counters, and return.
1161  update_buffer_level(cpi, 0);
1162  cpi->common.last_frame_type = cpi->common.frame_type;
1163  cpi->rc.frames_since_key++;
1164  cpi->rc.frames_to_key--;
1165}
1166
1167static int test_for_kf_one_pass(VP9_COMP *cpi) {
1168  // Placeholder function for auto key frame
1169  return 0;
1170}
1171// Use this macro to turn on/off use of alt-refs in one-pass mode.
1172#define USE_ALTREF_FOR_ONE_PASS   1
1173
1174static int calc_pframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1175  static const int af_ratio = 10;
1176  const RATE_CONTROL *const rc = &cpi->rc;
1177  int target;
1178#if USE_ALTREF_FOR_ONE_PASS
1179  target = (!rc->is_src_frame_alt_ref &&
1180            (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) ?
1181      (rc->av_per_frame_bandwidth * rc->baseline_gf_interval * af_ratio) /
1182      (rc->baseline_gf_interval + af_ratio - 1) :
1183      (rc->av_per_frame_bandwidth * rc->baseline_gf_interval) /
1184      (rc->baseline_gf_interval + af_ratio - 1);
1185#else
1186  target = rc->av_per_frame_bandwidth;
1187#endif
1188  return vp9_rc_clamp_pframe_target_size(cpi, target);
1189}
1190
1191static int calc_iframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1192  static const int kf_ratio = 25;
1193  const RATE_CONTROL *rc = &cpi->rc;
1194  int target = rc->av_per_frame_bandwidth * kf_ratio;
1195  return vp9_rc_clamp_iframe_target_size(cpi, target);
1196}
1197
1198void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) {
1199  VP9_COMMON *const cm = &cpi->common;
1200  RATE_CONTROL *const rc = &cpi->rc;
1201  int target;
1202  if (!cpi->refresh_alt_ref_frame &&
1203      (cm->current_video_frame == 0 ||
1204       (cm->frame_flags & FRAMEFLAGS_KEY) ||
1205       rc->frames_to_key == 0 ||
1206       (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1207    cm->frame_type = KEY_FRAME;
1208    rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1209                                rc->frames_to_key == 0;
1210    rc->frames_to_key = cpi->key_frame_frequency;
1211    rc->kf_boost = DEFAULT_KF_BOOST;
1212    rc->source_alt_ref_active = 0;
1213  } else {
1214    cm->frame_type = INTER_FRAME;
1215  }
1216  if (rc->frames_till_gf_update_due == 0) {
1217    rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1218    rc->frames_till_gf_update_due = rc->baseline_gf_interval;
1219    // NOTE: frames_till_gf_update_due must be <= frames_to_key.
1220    if (rc->frames_till_gf_update_due > rc->frames_to_key)
1221      rc->frames_till_gf_update_due = rc->frames_to_key;
1222    cpi->refresh_golden_frame = 1;
1223    rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS;
1224    rc->gfu_boost = DEFAULT_GF_BOOST;
1225  }
1226  if (cm->frame_type == KEY_FRAME)
1227    target = calc_iframe_target_size_one_pass_vbr(cpi);
1228  else
1229    target = calc_pframe_target_size_one_pass_vbr(cpi);
1230  vp9_rc_set_frame_target(cpi, target);
1231}
1232
1233static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1234  const VP9_CONFIG *oxcf = &cpi->oxcf;
1235  const RATE_CONTROL *rc = &cpi->rc;
1236  const int64_t diff = oxcf->optimal_buffer_level - rc->buffer_level;
1237  const int64_t one_pct_bits = 1 + oxcf->optimal_buffer_level / 100;
1238  int min_frame_target = MAX(rc->av_per_frame_bandwidth >> 4,
1239                             FRAME_OVERHEAD_BITS);
1240  int target = rc->av_per_frame_bandwidth;
1241  if (cpi->svc.number_temporal_layers > 1 &&
1242      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1243    // Note that for layers, av_per_frame_bandwidth is the cumulative
1244    // per-frame-bandwidth. For the target size of this frame, use the
1245    // layer average frame size (i.e., non-cumulative per-frame-bw).
1246    int current_temporal_layer = cpi->svc.temporal_layer_id;
1247    const LAYER_CONTEXT *lc = &cpi->svc.layer_context[current_temporal_layer];
1248    target = lc->avg_frame_size;
1249    min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS);
1250  }
1251  if (diff > 0) {
1252    // Lower the target bandwidth for this frame.
1253    const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct);
1254    target -= (target * pct_low) / 200;
1255  } else if (diff < 0) {
1256    // Increase the target bandwidth for this frame.
1257    const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct);
1258    target += (target * pct_high) / 200;
1259  }
1260  return MAX(min_frame_target, target);
1261}
1262
1263static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1264  const RATE_CONTROL *rc = &cpi->rc;
1265  int target;
1266
1267  if (cpi->common.current_video_frame == 0) {
1268    target = ((cpi->oxcf.starting_buffer_level / 2) > INT_MAX)
1269      ? INT_MAX : (int)(cpi->oxcf.starting_buffer_level / 2);
1270  } else {
1271    const int initial_boost = 32;
1272    int kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
1273    if (rc->frames_since_key < cpi->output_framerate / 2) {
1274      kf_boost = (int)(kf_boost * rc->frames_since_key /
1275                       (cpi->output_framerate / 2));
1276    }
1277    target = ((16 + kf_boost) * rc->av_per_frame_bandwidth) >> 4;
1278  }
1279  return vp9_rc_clamp_iframe_target_size(cpi, target);
1280}
1281
1282void vp9_rc_get_svc_params(VP9_COMP *cpi) {
1283  VP9_COMMON *const cm = &cpi->common;
1284  RATE_CONTROL *const rc = &cpi->rc;
1285  int target = rc->av_per_frame_bandwidth;
1286  if ((cm->current_video_frame == 0) ||
1287      (cm->frame_flags & FRAMEFLAGS_KEY) ||
1288      (cpi->oxcf.auto_key && (rc->frames_since_key %
1289                              cpi->key_frame_frequency == 0))) {
1290    cm->frame_type = KEY_FRAME;
1291    rc->source_alt_ref_active = 0;
1292    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1293      target = calc_iframe_target_size_one_pass_cbr(cpi);
1294    }
1295  } else {
1296    cm->frame_type = INTER_FRAME;
1297    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1298      target = calc_pframe_target_size_one_pass_cbr(cpi);
1299    }
1300  }
1301  vp9_rc_set_frame_target(cpi, target);
1302  rc->frames_till_gf_update_due = INT_MAX;
1303  rc->baseline_gf_interval = INT_MAX;
1304}
1305
1306void vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) {
1307  VP9_COMMON *const cm = &cpi->common;
1308  RATE_CONTROL *const rc = &cpi->rc;
1309  int target;
1310  if ((cm->current_video_frame == 0 ||
1311      (cm->frame_flags & FRAMEFLAGS_KEY) ||
1312      rc->frames_to_key == 0 ||
1313      (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1314    cm->frame_type = KEY_FRAME;
1315    rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1316                                rc->frames_to_key == 0;
1317    rc->frames_to_key = cpi->key_frame_frequency;
1318    rc->kf_boost = DEFAULT_KF_BOOST;
1319    rc->source_alt_ref_active = 0;
1320    target = calc_iframe_target_size_one_pass_cbr(cpi);
1321  } else {
1322    cm->frame_type = INTER_FRAME;
1323    target = calc_pframe_target_size_one_pass_cbr(cpi);
1324  }
1325  vp9_rc_set_frame_target(cpi, target);
1326  // Don't use gf_update by default in CBR mode.
1327  rc->frames_till_gf_update_due = INT_MAX;
1328  rc->baseline_gf_interval = INT_MAX;
1329}
1330