1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <assert.h>
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h>
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h>
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h>
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h>
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h>
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_mem/vpx_mem.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_alloccommon.h"
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_common.h"
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropymode.h"
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_quant_common.h"
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_seg_common.h"
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_systemdependent.h"
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_encodemv.h"
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/encoder/vp9_ratectrl.h"
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define DEFAULT_KF_BOOST 2000
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define DEFAULT_GF_BOOST 2000
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MIN_BPB_FACTOR 0.005
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_BPB_FACTOR 50
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Bits Per MB at different Q (Multiplied by 512)
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define BPER_MB_NORMBITS    9
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Tables relating active max Q to active min Q
42233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int kf_low_motion_minq[QINDEX_RANGE];
43233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int kf_high_motion_minq[QINDEX_RANGE];
44233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int gf_low_motion_minq[QINDEX_RANGE];
45233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int gf_high_motion_minq[QINDEX_RANGE];
46233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int inter_minq[QINDEX_RANGE];
47233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int afq_low_motion_minq[QINDEX_RANGE];
48233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int afq_high_motion_minq[QINDEX_RANGE];
49233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int gf_high = 2000;
50233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int gf_low = 400;
51233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int kf_high = 5000;
52233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int kf_low = 400;
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Functions to compute the active minq lookup table entries based on a
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan// formulaic approach to facilitate easier adjustment of the Q tables.
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan// The formulae were derived from computing a 3rd order polynomial best
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan// fit to the original data (after plotting real maxq vs minq (not q index))
58233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int get_minq_index(double maxq, double x3, double x2, double x1) {
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq,
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                maxq);
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Special case handling to deal with the step from q2.0
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // down to lossless mode represented by q 1.0.
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (minqtarget <= 2.0)
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return 0;
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < QINDEX_RANGE; i++)
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (minqtarget <= vp9_convert_qindex_to_q(i))
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return i;
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return QINDEX_RANGE - 1;
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan
75233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_init_minq_luts() {
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (i = 0; i < QINDEX_RANGE; i++) {
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const double maxq = vp9_convert_qindex_to_q(i);
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    kf_low_motion_minq[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.15);
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    kf_high_motion_minq[i] = get_minq_index(maxq, 0.000002, -0.0012, 0.50);
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    gf_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.32);
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    gf_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.50);
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    afq_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.33);
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    afq_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55);
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.75);
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan// These functions use formulaic calculations to make playing with the
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan// quantizer tables easier. If necessary they can be replaced by lookup
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan// tables if and when things settle down in the experimental bitstream
94233d2500723e5594f3e7c70896ffeeef32b9c950ywandouble vp9_convert_qindex_to_q(int qindex) {
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Convert the index to a real Q value (scaled down to match old Q values)
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return vp9_ac_quant(qindex, 0) / 4.0;
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       double correction_factor) {
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const double q = vp9_convert_qindex_to_q(qindex);
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // q based adjustment to baseline enumerator
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  enumerator += (int)(enumerator * q) >> 12;
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (int)(0.5 + (enumerator * correction_factor / q));
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
109233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_save_coding_context(VP9_COMP *cpi) {
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CODING_CONTEXT *const cc = &cpi->coding_context;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *cm = &cpi->common;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Stores a snapshot of key state variables which can subsequently be
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // restored with a call to vp9_restore_coding_context. These functions are
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // intended for use in a re-code loop in vp9_compress_frame where the
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // quantizer value is adjusted between loop iterations.
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cc->fc = cm->fc;
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
132233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_restore_coding_context(VP9_COMP *cpi) {
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  CODING_CONTEXT *const cc = &cpi->coding_context;
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *cm = &cpi->common;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Restore key state variables to the snapshot state stored in the
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // previous call to vp9_save_coding_context.
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vpx_memcpy(cm->last_frame_seg_map,
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan             cpi->coding_context.last_frame_seg_map_copy,
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cm->mi_rows * cm->mi_cols));
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cm->fc = cc->fc;
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
154233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int estimate_bits_at_q(int frame_kind, int q, int mbs,
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              double correction_factor) {
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Attempt to retain reasonable accuracy without overflow. The cutoff is
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // largest Bpm takes 20 bits.
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan                           : (bpm * mbs) >> BPER_MB_NORMBITS;
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan
165233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int min_frame_target = MAX(rc->min_frame_bandwidth,
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   rc->av_per_frame_bandwidth >> 5);
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (target < min_frame_target)
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = min_frame_target;
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // If there is an active ARF at this location use the minimum
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // bits on this frame even if it is a constructed arf.
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // The active maximum quantizer insures that an appropriate
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // number of bits will be spent if needed for constructed ARFs.
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = min_frame_target;
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clip the frame target to the maximum allowed value.
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (target > rc->max_frame_bandwidth)
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = rc->max_frame_bandwidth;
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return target;
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan
184233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_clamp_iframe_target_size(const VP9_COMP *const cpi, int target) {
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *oxcf = &cpi->oxcf;
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (oxcf->rc_max_intra_bitrate_pct) {
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int max_rate = rc->av_per_frame_bandwidth *
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan        oxcf->rc_max_intra_bitrate_pct / 100;
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = MIN(target, max_rate);
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (target > rc->max_frame_bandwidth)
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = rc->max_frame_bandwidth;
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return target;
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Update the buffer level for higher layers, given the encoded current layer.
199233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_layer_buffer_level(VP9_COMP *const cpi,
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      int encoded_frame_size) {
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int temporal_layer = 0;
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int current_temporal_layer = cpi->svc.temporal_layer_id;
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan  for (temporal_layer = current_temporal_layer + 1;
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan      temporal_layer < cpi->svc.number_temporal_layers; ++temporal_layer) {
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    LAYER_CONTEXT *lc = &cpi->svc.layer_context[temporal_layer];
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    RATE_CONTROL *lrc = &lc->rc;
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan        encoded_frame_size);
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lrc->bits_off_target += bits_off_for_this_layer;
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Clip buffer level to maximum buffer size for the layer.
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lrc->bits_off_target = MIN(lrc->bits_off_target, lc->maximum_buffer_size);
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lrc->buffer_level = lrc->bits_off_target;
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Update the buffer level: leaky bucket model.
218233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) {
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *oxcf = &cpi->oxcf;
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Non-viewable frames are a special case and are treated as pure overhead.
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!cm->show_frame) {
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->bits_off_target -= encoded_frame_size;
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->bits_off_target += rc->av_per_frame_bandwidth - encoded_frame_size;
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clip the buffer level to the maximum specified buffer size.
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->bits_off_target = MIN(rc->bits_off_target, oxcf->maximum_buffer_size);
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->buffer_level = rc->bits_off_target;
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan    update_layer_buffer_level(cpi, encoded_frame_size);
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan
239233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_drop_frame(VP9_COMP *cpi) {
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *oxcf = &cpi->oxcf;
241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!oxcf->drop_frames_water_mark) {
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return 0;
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->buffer_level < 0) {
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Always drop if buffer is below 0.
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return 1;
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // If buffer is below drop_mark, for now just drop every other frame
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // (starting with the next frame) until it increases back over drop_mark.
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int drop_mark = (int)(oxcf->drop_frames_water_mark *
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan          oxcf->optimal_buffer_level / 100);
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((rc->buffer_level > drop_mark) &&
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan          (rc->decimation_factor > 0)) {
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan        --rc->decimation_factor;
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else if (rc->buffer_level <= drop_mark &&
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan          rc->decimation_factor == 0) {
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->decimation_factor = 1;
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->decimation_factor > 0) {
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (rc->decimation_count > 0) {
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan          --rc->decimation_count;
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan          return 1;
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan        } else {
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan          rc->decimation_count = rc->decimation_factor;
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan          return 0;
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else {
270233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->decimation_count = 0;
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan        return 0;
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
274233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan
277233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic double get_rate_correction_factor(const VP9_COMP *cpi) {
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.frame_type == KEY_FRAME) {
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return cpi->rc.key_frame_rate_correction_factor;
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan        !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return cpi->rc.gf_rate_correction_factor;
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
285233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return cpi->rc.rate_correction_factor;
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan
289233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.frame_type == KEY_FRAME) {
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cpi->rc.key_frame_rate_correction_factor = factor;
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan        !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi->rc.gf_rate_correction_factor = factor;
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi->rc.rate_correction_factor = factor;
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan
301233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int q = cpi->common.base_qindex;
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int correction_factor = 100;
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan  double rate_correction_factor = get_rate_correction_factor(cpi);
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan  double adjustment_limit;
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int projected_size_based_on_q = 0;
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clear down mmx registers to allow floating point in what follows
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_clear_system_state();
311233d2500723e5594f3e7c70896ffeeef32b9c950ywan
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Work out how big we would have expected the frame to be at this Q given
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // the current correction factor.
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Stay in double to avoid int overflow when values are large
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan  projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 cpi->common.MBs,
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 rate_correction_factor);
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Work out a size correction factor.
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (projected_size_based_on_q > 0)
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    correction_factor = (100 * cpi->rc.projected_frame_size) /
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            projected_size_based_on_q;
322233d2500723e5594f3e7c70896ffeeef32b9c950ywan
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // More heavily damped adjustment used if we have been oscillating either side
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // of target.
325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  switch (damp_var) {
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case 0:
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan      adjustment_limit = 0.75;
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan      break;
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case 1:
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan      adjustment_limit = 0.375;
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan      break;
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case 2:
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    default:
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan      adjustment_limit = 0.25;
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan      break;
336233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (correction_factor > 102) {
339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // We are not already at the worst allowable quality
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan    correction_factor =
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (int)(100 + ((correction_factor - 100) * adjustment_limit));
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rate_correction_factor =
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ((rate_correction_factor * correction_factor) / 100);
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Keep rate_correction_factor within limits
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rate_correction_factor > MAX_BPB_FACTOR)
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rate_correction_factor = MAX_BPB_FACTOR;
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (correction_factor < 99) {
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // We are not already at the best allowable quality
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan    correction_factor =
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (int)(100 - ((100 - correction_factor) * adjustment_limit));
352233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rate_correction_factor =
353233d2500723e5594f3e7c70896ffeeef32b9c950ywan        ((rate_correction_factor * correction_factor) / 100);
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan
355233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Keep rate_correction_factor within limits
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rate_correction_factor < MIN_BPB_FACTOR)
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rate_correction_factor = MIN_BPB_FACTOR;
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan  set_rate_correction_factor(cpi, rate_correction_factor);
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan
364233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      int active_best_quality, int active_worst_quality) {
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q = active_worst_quality;
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int last_error = INT_MAX;
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int i, target_bits_per_mb;
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const double correction_factor = get_rate_correction_factor(cpi);
371233d2500723e5594f3e7c70896ffeeef32b9c950ywan
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Calculate required scaling factor based on target frame size and size of
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // frame produced using previous Q.
374233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Case where we would overflow int
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target_bits_per_mb = (target_bits_per_frame / cm->MBs) << BPER_MB_NORMBITS;
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs;
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan  i = active_best_quality;
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan  do {
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cm->frame_type, i,
384233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                             correction_factor);
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = i;
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = i - 1;
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan      break;
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } while (++i <= active_worst_quality);
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return q;
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
400233d2500723e5594f3e7c70896ffeeef32b9c950ywan
401233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int get_active_quality(int q, int gfu_boost, int low, int high,
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              int *low_motion_minq, int *high_motion_minq) {
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (gfu_boost > high) {
404233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return low_motion_minq[q];
405233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (gfu_boost < low) {
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return high_motion_minq[q];
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int gap = high - low;
409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int offset = high - gfu_boost;
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int qdiff = high_motion_minq[q] - low_motion_minq[q];
411233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return low_motion_minq[q] + adjustment;
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
415233d2500723e5594f3e7c70896ffeeef32b9c950ywan
416233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) {
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *const rc = &cpi->rc;
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const unsigned int curr_frame = cpi->common.current_video_frame;
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_worst_quality;
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.frame_type == KEY_FRAME) {
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_worst_quality = curr_frame == 0 ? rc->worst_quality
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                           : rc->last_q[KEY_FRAME] * 2;
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!rc->is_src_frame_alt_ref &&
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_worst_quality =  curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                              : rc->last_q[INTER_FRAME];
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2
431233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             : rc->last_q[INTER_FRAME] * 2;
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return MIN(active_worst_quality, rc->worst_quality);
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Adjust active_worst_quality level based on buffer level.
439233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) {
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Adjust active_worst_quality: If buffer is above the optimal/target level,
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // bring active_worst_quality down depending on fullness of buffer.
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If buffer is below the optimal level, let the active_worst_quality go from
443233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // ambient Q (at buffer = optimal level) to worst_quality level
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // (at buffer = critical level).
445233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *oxcf = &cpi->oxcf;
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Buffer level below which we push active_worst to worst_quality.
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int64_t critical_level = oxcf->optimal_buffer_level >> 2;
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int64_t buff_lvl_step = 0;
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int adjustment = 0;
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_worst_quality;
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.frame_type == KEY_FRAME)
453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return rc->worst_quality;
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.current_video_frame > 1)
455233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_worst_quality = MIN(rc->worst_quality,
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               rc->avg_frame_qindex[INTER_FRAME] * 5 / 4);
457233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_worst_quality = MIN(rc->worst_quality,
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               rc->avg_frame_qindex[KEY_FRAME] * 3 / 2);
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (rc->buffer_level > oxcf->optimal_buffer_level) {
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Adjust down.
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Maximum limit for down adjustment, ~30%.
463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int max_adjustment_down = active_worst_quality / 3;
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (max_adjustment_down) {
465233d2500723e5594f3e7c70896ffeeef32b9c950ywan      buff_lvl_step = ((oxcf->maximum_buffer_size -
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        oxcf->optimal_buffer_level) / max_adjustment_down);
467233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (buff_lvl_step)
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan        adjustment = (int)((rc->buffer_level - oxcf->optimal_buffer_level) /
469233d2500723e5594f3e7c70896ffeeef32b9c950ywan                            buff_lvl_step);
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_worst_quality -= adjustment;
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
472233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (rc->buffer_level > critical_level) {
473233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Adjust up from ambient Q.
474233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (critical_level) {
475233d2500723e5594f3e7c70896ffeeef32b9c950ywan      buff_lvl_step = (oxcf->optimal_buffer_level - critical_level);
476233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (buff_lvl_step) {
477233d2500723e5594f3e7c70896ffeeef32b9c950ywan        adjustment =
478233d2500723e5594f3e7c70896ffeeef32b9c950ywan            (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) *
479233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  (oxcf->optimal_buffer_level - rc->buffer_level) /
480233d2500723e5594f3e7c70896ffeeef32b9c950ywan                  buff_lvl_step);
481233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
482233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment;
483233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
484233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
485233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Set to worst_quality if buffer is below critical level.
486233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_worst_quality = rc->worst_quality;
487233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
488233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return active_worst_quality;
489233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
490233d2500723e5594f3e7c70896ffeeef32b9c950ywan
491233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi,
492233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             int *bottom_index,
493233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             int *top_index) {
494233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
495233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *const rc = &cpi->rc;
496233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_best_quality;
497233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi);
498233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q;
499233d2500723e5594f3e7c70896ffeeef32b9c950ywan
500233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (frame_is_intra_only(cm)) {
501233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_best_quality = rc->best_quality;
502233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Handle the special case for key frames forced when we have75 reached
503233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the maximum key frame interval. Here force the Q to a range
504233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // based on the ambient Q to reduce the risk of popping.
505233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->this_key_frame_forced) {
506233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int qindex = rc->last_boosted_qindex;
507233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
508233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
509233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            (last_boosted_q * 0.75));
510233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
511233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else if (cm->current_video_frame > 0) {
512233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // not first frame of one pass and kf_boost is set
513233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_adj_factor = 1.0;
514233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_val;
515233d2500723e5594f3e7c70896ffeeef32b9c950ywan
516233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
517233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               rc->kf_boost,
518233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low, kf_high,
519233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low_motion_minq,
520233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_high_motion_minq);
521233d2500723e5594f3e7c70896ffeeef32b9c950ywan
522233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Allow somewhat lower kf minq with small image formats.
523233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((cm->width * cm->height) <= (352 * 288)) {
524233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q_adj_factor -= 0.25;
525233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
526233d2500723e5594f3e7c70896ffeeef32b9c950ywan
527233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Convert the adjustment factor to a qindex delta
528233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // on active_best_quality.
529233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q_val = vp9_convert_qindex_to_q(active_best_quality);
530233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
531233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   q_adj_factor);
532233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
533233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
534233d2500723e5594f3e7c70896ffeeef32b9c950ywan             !cpi->use_svc &&
535233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
536233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Use the lower of active_worst_quality and recent
537233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // average Q as basis for GF/ARF best Q limit unless last frame was
538233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // a key frame.
539233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_since_key > 1 &&
540233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
541233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc->avg_frame_qindex[INTER_FRAME];
542233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
543233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = active_worst_quality;
544233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
545233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_best_quality = get_active_quality(
546233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q, rc->gfu_boost, gf_low, gf_high,
547233d2500723e5594f3e7c70896ffeeef32b9c950ywan        gf_low_motion_minq, gf_high_motion_minq);
548233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
549233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Use the lower of active_worst_quality and recent/average Q.
550233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cm->current_video_frame > 1) {
551233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality)
552233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
553233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
554233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[active_worst_quality];
555233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
556233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality)
557233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
558233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
559233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[active_worst_quality];
560233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
561233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
562233d2500723e5594f3e7c70896ffeeef32b9c950ywan
563233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clip the active best and worst quality values to limits
564233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_best_quality = clamp(active_best_quality,
565233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              rc->best_quality, rc->worst_quality);
566233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_worst_quality = clamp(active_worst_quality,
567233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               active_best_quality, rc->worst_quality);
568233d2500723e5594f3e7c70896ffeeef32b9c950ywan
569233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *top_index = active_worst_quality;
570233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *bottom_index = active_best_quality;
571233d2500723e5594f3e7c70896ffeeef32b9c950ywan
572233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
573233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Limit Q range for the adaptive loop.
574233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
575233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!(cm->current_video_frame == 0))
576233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *top_index = (active_worst_quality + active_best_quality * 3) / 4;
577233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
578233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
579233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Special case code to try and match quality with forced key frames
580233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME && rc->this_key_frame_forced) {
581233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = rc->last_boosted_qindex;
582233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
583233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
584233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          active_best_quality, active_worst_quality);
585233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (q > *top_index) {
586233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Special case when we are targeting the max allowed rate
587233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
588233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *top_index = q;
589233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
590233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = *top_index;
591233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
592233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
593233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*top_index <= rc->worst_quality &&
594233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *top_index >= rc->best_quality);
595233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*bottom_index <= rc->worst_quality &&
596233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *bottom_index >= rc->best_quality);
597233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(q <= rc->worst_quality && q >= rc->best_quality);
598233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return q;
599233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
600233d2500723e5594f3e7c70896ffeeef32b9c950ywan
601233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
602233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             int *bottom_index,
603233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                             int *top_index) {
604233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
605233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *const rc = &cpi->rc;
606233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *const oxcf = &cpi->oxcf;
607233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_best_quality;
608233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi);
609233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q;
610233d2500723e5594f3e7c70896ffeeef32b9c950ywan
611233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (frame_is_intra_only(cm)) {
612233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_best_quality = rc->best_quality;
613233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !CONFIG_MULTIPLE_ARF
614233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Handle the special case for key frames forced when we have75 reached
615233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the maximum key frame interval. Here force the Q to a range
616233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // based on the ambient Q to reduce the risk of popping.
617233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->this_key_frame_forced) {
618233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int qindex = rc->last_boosted_qindex;
619233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
620233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
621233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            (last_boosted_q * 0.75));
622233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
623233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else if (cm->current_video_frame > 0) {
624233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // not first frame of one pass and kf_boost is set
625233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_adj_factor = 1.0;
626233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_val;
627233d2500723e5594f3e7c70896ffeeef32b9c950ywan
628233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
629233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               rc->kf_boost,
630233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low, kf_high,
631233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low_motion_minq,
632233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_high_motion_minq);
633233d2500723e5594f3e7c70896ffeeef32b9c950ywan
634233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Allow somewhat lower kf minq with small image formats.
635233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((cm->width * cm->height) <= (352 * 288)) {
636233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q_adj_factor -= 0.25;
637233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
638233d2500723e5594f3e7c70896ffeeef32b9c950ywan
639233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Convert the adjustment factor to a qindex delta
640233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // on active_best_quality.
641233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q_val = vp9_convert_qindex_to_q(active_best_quality);
642233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
643233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   q_adj_factor);
644233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
645233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
646233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double current_q;
647233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Force the KF quantizer to be 30% of the active_worst_quality.
648233d2500723e5594f3e7c70896ffeeef32b9c950ywan    current_q = vp9_convert_qindex_to_q(active_worst_quality);
649233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_best_quality = active_worst_quality
650233d2500723e5594f3e7c70896ffeeef32b9c950ywan        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
651233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
652233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
653233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
654233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Use the lower of active_worst_quality and recent
655233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // average Q as basis for GF/ARF best Q limit unless last frame was
656233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // a key frame.
657233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_since_key > 1 &&
658233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
659233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc->avg_frame_qindex[INTER_FRAME];
660233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
661233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc->avg_frame_qindex[KEY_FRAME];
662233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
663233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // For constrained quality dont allow Q less than the cq level
664233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
665233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (q < cpi->cq_target_quality)
666233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = cpi->cq_target_quality;
667233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->frames_since_key > 1) {
668233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = get_active_quality(q, rc->gfu_boost,
669233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low, gf_high,
670233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 afq_low_motion_minq,
671233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 afq_high_motion_minq);
672233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else {
673233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = get_active_quality(q, rc->gfu_boost,
674233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low, gf_high,
675233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low_motion_minq,
676233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_high_motion_minq);
677233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
678233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Constrained quality use slightly lower active best.
679233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = active_best_quality * 15 / 16;
680233d2500723e5594f3e7c70896ffeeef32b9c950ywan
681233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
682233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!cpi->refresh_alt_ref_frame) {
683233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = cpi->cq_target_quality;
684233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else {
685233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (rc->frames_since_key > 1) {
686233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = get_active_quality(
687233d2500723e5594f3e7c70896ffeeef32b9c950ywan              q, rc->gfu_boost, gf_low, gf_high,
688233d2500723e5594f3e7c70896ffeeef32b9c950ywan              afq_low_motion_minq, afq_high_motion_minq);
689233d2500723e5594f3e7c70896ffeeef32b9c950ywan        } else {
690233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = get_active_quality(
691233d2500723e5594f3e7c70896ffeeef32b9c950ywan              q, rc->gfu_boost, gf_low, gf_high,
692233d2500723e5594f3e7c70896ffeeef32b9c950ywan              gf_low_motion_minq, gf_high_motion_minq);
693233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
694233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
695233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
696233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = get_active_quality(
697233d2500723e5594f3e7c70896ffeeef32b9c950ywan          q, rc->gfu_boost, gf_low, gf_high,
698233d2500723e5594f3e7c70896ffeeef32b9c950ywan          gf_low_motion_minq, gf_high_motion_minq);
699233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
700233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
701233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
702233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = cpi->cq_target_quality;
703233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
704233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Use the lower of active_worst_quality and recent/average Q.
705233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (cm->current_video_frame > 1)
706233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
707233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
708233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
709233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // For the constrained quality mode we don't want
710233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // q to fall below the cq level.
711233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
712233d2500723e5594f3e7c70896ffeeef32b9c950ywan          (active_best_quality < cpi->cq_target_quality)) {
713233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // If we are strongly undershooting the target rate in the last
714233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // frames then use the user passed in cq value not the auto
715233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // cq value.
716233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
717233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = oxcf->cq_level;
718233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
719233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = cpi->cq_target_quality;
720233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
721233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
722233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
723233d2500723e5594f3e7c70896ffeeef32b9c950ywan
724233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clip the active best and worst quality values to limits
725233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_best_quality = clamp(active_best_quality,
726233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              rc->best_quality, rc->worst_quality);
727233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_worst_quality = clamp(active_worst_quality,
728233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               active_best_quality, rc->worst_quality);
729233d2500723e5594f3e7c70896ffeeef32b9c950ywan
730233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *top_index = active_worst_quality;
731233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *bottom_index = active_best_quality;
732233d2500723e5594f3e7c70896ffeeef32b9c950ywan
733233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
734233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Limit Q range for the adaptive loop.
735233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
736233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!(cm->current_video_frame == 0))
737233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *top_index = (active_worst_quality + active_best_quality * 3) / 4;
738233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
739233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
740233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *top_index = (active_worst_quality + active_best_quality) / 2;
741233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
742233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
743233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
744233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = active_best_quality;
745233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Special case code to try and match quality with forced key frames
746233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
747233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = rc->last_boosted_qindex;
748233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
749233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
750233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          active_best_quality, active_worst_quality);
751233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (q > *top_index) {
752233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Special case when we are targeting the max allowed rate
753233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
754233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *top_index = q;
755233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
756233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = *top_index;
757233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
758233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
759233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF
760233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Force the quantizer determined by the coding order pattern.
761233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
762233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
763233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double new_q;
764233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
765233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int level = cpi->this_frame_weight;
766233d2500723e5594f3e7c70896ffeeef32b9c950ywan    assert(level >= 0);
767233d2500723e5594f3e7c70896ffeeef32b9c950ywan    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
768233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = active_worst_quality +
769233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vp9_compute_qdelta(cpi, current_q, new_q);
770233d2500723e5594f3e7c70896ffeeef32b9c950ywan
771233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *bottom_index = q;
772233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *top_index    = q;
773233d2500723e5594f3e7c70896ffeeef32b9c950ywan    printf("frame:%d q:%d\n", cm->current_video_frame, q);
774233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
775233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
776233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*top_index <= rc->worst_quality &&
777233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *top_index >= rc->best_quality);
778233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*bottom_index <= rc->worst_quality &&
779233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *bottom_index >= rc->best_quality);
780233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(q <= rc->worst_quality && q >= rc->best_quality);
781233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return q;
782233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
783233d2500723e5594f3e7c70896ffeeef32b9c950ywan
784233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi,
785233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         int *bottom_index,
786233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                         int *top_index) {
787233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
788233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *const rc = &cpi->rc;
789233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *const oxcf = &cpi->oxcf;
790233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_best_quality;
791233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int active_worst_quality = cpi->twopass.active_worst_quality;
792233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q;
793233d2500723e5594f3e7c70896ffeeef32b9c950ywan
794233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (frame_is_intra_only(cm)) {
795233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !CONFIG_MULTIPLE_ARF
796233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Handle the special case for key frames forced when we have75 reached
797233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // the maximum key frame interval. Here force the Q to a range
798233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // based on the ambient Q to reduce the risk of popping.
799233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->this_key_frame_forced) {
800233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int qindex = rc->last_boosted_qindex;
801233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
802233d2500723e5594f3e7c70896ffeeef32b9c950ywan      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
803233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                            (last_boosted_q * 0.75));
804233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
805233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
806233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Not forced keyframe.
807233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_adj_factor = 1.0;
808233d2500723e5594f3e7c70896ffeeef32b9c950ywan      double q_val;
809233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Baseline value derived from cpi->active_worst_quality and kf boost.
810233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = get_active_quality(active_worst_quality,
811233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               rc->kf_boost,
812233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low, kf_high,
813233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_low_motion_minq,
814233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                               kf_high_motion_minq);
815233d2500723e5594f3e7c70896ffeeef32b9c950ywan
816233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Allow somewhat lower kf minq with small image formats.
817233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((cm->width * cm->height) <= (352 * 288)) {
818233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q_adj_factor -= 0.25;
819233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
820233d2500723e5594f3e7c70896ffeeef32b9c950ywan
821233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Make a further adjustment based on the kf zero motion measure.
822233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
823233d2500723e5594f3e7c70896ffeeef32b9c950ywan
824233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Convert the adjustment factor to a qindex delta
825233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // on active_best_quality.
826233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q_val = vp9_convert_qindex_to_q(active_best_quality);
827233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
828233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   q_adj_factor);
829233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
830233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
831233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double current_q;
832233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Force the KF quantizer to be 30% of the active_worst_quality.
833233d2500723e5594f3e7c70896ffeeef32b9c950ywan    current_q = vp9_convert_qindex_to_q(active_worst_quality);
834233d2500723e5594f3e7c70896ffeeef32b9c950ywan    active_best_quality = active_worst_quality
835233d2500723e5594f3e7c70896ffeeef32b9c950ywan        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
836233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
837233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
838233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
839233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Use the lower of active_worst_quality and recent
840233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // average Q as basis for GF/ARF best Q limit unless last frame was
841233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // a key frame.
842233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_since_key > 1 &&
843233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
844233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc->avg_frame_qindex[INTER_FRAME];
845233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
846233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = active_worst_quality;
847233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
848233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // For constrained quality dont allow Q less than the cq level
849233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
850233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (q < cpi->cq_target_quality)
851233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = cpi->cq_target_quality;
852233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->frames_since_key > 1) {
853233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = get_active_quality(q, rc->gfu_boost,
854233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low, gf_high,
855233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 afq_low_motion_minq,
856233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 afq_high_motion_minq);
857233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else {
858233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = get_active_quality(q, rc->gfu_boost,
859233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low, gf_high,
860233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_low_motion_minq,
861233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                 gf_high_motion_minq);
862233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
863233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Constrained quality use slightly lower active best.
864233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = active_best_quality * 15 / 16;
865233d2500723e5594f3e7c70896ffeeef32b9c950ywan
866233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
867233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (!cpi->refresh_alt_ref_frame) {
868233d2500723e5594f3e7c70896ffeeef32b9c950ywan        active_best_quality = cpi->cq_target_quality;
869233d2500723e5594f3e7c70896ffeeef32b9c950ywan      } else {
870233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (rc->frames_since_key > 1) {
871233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = get_active_quality(
872233d2500723e5594f3e7c70896ffeeef32b9c950ywan              q, rc->gfu_boost, gf_low, gf_high,
873233d2500723e5594f3e7c70896ffeeef32b9c950ywan              afq_low_motion_minq, afq_high_motion_minq);
874233d2500723e5594f3e7c70896ffeeef32b9c950ywan        } else {
875233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = get_active_quality(
876233d2500723e5594f3e7c70896ffeeef32b9c950ywan              q, rc->gfu_boost, gf_low, gf_high,
877233d2500723e5594f3e7c70896ffeeef32b9c950ywan              gf_low_motion_minq, gf_high_motion_minq);
878233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
879233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
880233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
881233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = get_active_quality(
882233d2500723e5594f3e7c70896ffeeef32b9c950ywan          q, rc->gfu_boost, gf_low, gf_high,
883233d2500723e5594f3e7c70896ffeeef32b9c950ywan          gf_low_motion_minq, gf_high_motion_minq);
884233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
885233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
886233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
887233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = cpi->cq_target_quality;
888233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } else {
889233d2500723e5594f3e7c70896ffeeef32b9c950ywan      active_best_quality = inter_minq[active_worst_quality];
890233d2500723e5594f3e7c70896ffeeef32b9c950ywan
891233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // For the constrained quality mode we don't want
892233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // q to fall below the cq level.
893233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
894233d2500723e5594f3e7c70896ffeeef32b9c950ywan          (active_best_quality < cpi->cq_target_quality)) {
895233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // If we are strongly undershooting the target rate in the last
896233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // frames then use the user passed in cq value not the auto
897233d2500723e5594f3e7c70896ffeeef32b9c950ywan        // cq value.
898233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
899233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = oxcf->cq_level;
900233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
901233d2500723e5594f3e7c70896ffeeef32b9c950ywan          active_best_quality = cpi->cq_target_quality;
902233d2500723e5594f3e7c70896ffeeef32b9c950ywan      }
903233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
904233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
905233d2500723e5594f3e7c70896ffeeef32b9c950ywan
906233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Clip the active best and worst quality values to limits.
907233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_best_quality = clamp(active_best_quality,
908233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              rc->best_quality, rc->worst_quality);
909233d2500723e5594f3e7c70896ffeeef32b9c950ywan  active_worst_quality = clamp(active_worst_quality,
910233d2500723e5594f3e7c70896ffeeef32b9c950ywan                               active_best_quality, rc->worst_quality);
911233d2500723e5594f3e7c70896ffeeef32b9c950ywan
912233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *top_index = active_worst_quality;
913233d2500723e5594f3e7c70896ffeeef32b9c950ywan  *bottom_index = active_best_quality;
914233d2500723e5594f3e7c70896ffeeef32b9c950ywan
915233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
916233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Limit Q range for the adaptive loop.
917233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
918233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *top_index = (active_worst_quality + active_best_quality * 3) / 4;
919233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
920233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (oxcf->end_usage != USAGE_STREAM_FROM_SERVER) &&
921233d2500723e5594f3e7c70896ffeeef32b9c950ywan             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
922233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *top_index = (active_worst_quality + active_best_quality) / 2;
923233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
924233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
925233d2500723e5594f3e7c70896ffeeef32b9c950ywan
926233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
927233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = active_best_quality;
928233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Special case code to try and match quality with forced key frames.
929233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
930233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = rc->last_boosted_qindex;
931233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
932233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
933233d2500723e5594f3e7c70896ffeeef32b9c950ywan                          active_best_quality, active_worst_quality);
934233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (q > *top_index) {
935233d2500723e5594f3e7c70896ffeeef32b9c950ywan      // Special case when we are targeting the max allowed rate.
936233d2500723e5594f3e7c70896ffeeef32b9c950ywan      if (rc->this_frame_target >= rc->max_frame_bandwidth)
937233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *top_index = q;
938233d2500723e5594f3e7c70896ffeeef32b9c950ywan      else
939233d2500723e5594f3e7c70896ffeeef32b9c950ywan        q = *top_index;
940233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
941233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
942233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF
943233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Force the quantizer determined by the coding order pattern.
944233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
945233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
946233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double new_q;
947233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
948233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int level = cpi->this_frame_weight;
949233d2500723e5594f3e7c70896ffeeef32b9c950ywan    assert(level >= 0);
950233d2500723e5594f3e7c70896ffeeef32b9c950ywan    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
951233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = active_worst_quality +
952233d2500723e5594f3e7c70896ffeeef32b9c950ywan        vp9_compute_qdelta(cpi, current_q, new_q);
953233d2500723e5594f3e7c70896ffeeef32b9c950ywan
954233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *bottom_index = q;
955233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *top_index    = q;
956233d2500723e5594f3e7c70896ffeeef32b9c950ywan    printf("frame:%d q:%d\n", cm->current_video_frame, q);
957233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
958233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
959233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*top_index <= rc->worst_quality &&
960233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *top_index >= rc->best_quality);
961233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(*bottom_index <= rc->worst_quality &&
962233d2500723e5594f3e7c70896ffeeef32b9c950ywan         *bottom_index >= rc->best_quality);
963233d2500723e5594f3e7c70896ffeeef32b9c950ywan  assert(q <= rc->worst_quality && q >= rc->best_quality);
964233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return q;
965233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
966233d2500723e5594f3e7c70896ffeeef32b9c950ywan
967233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi,
968233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             int *bottom_index,
969233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             int *top_index) {
970233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q;
971233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->pass == 0) {
972233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
973233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc_pick_q_and_bounds_one_pass_cbr(cpi, bottom_index, top_index);
974233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else
975233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q = rc_pick_q_and_bounds_one_pass_vbr(cpi, bottom_index, top_index);
976233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
977233d2500723e5594f3e7c70896ffeeef32b9c950ywan    q = rc_pick_q_and_bounds_two_pass(cpi, bottom_index, top_index);
978233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
979233d2500723e5594f3e7c70896ffeeef32b9c950ywan
980233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Q of 0 is disabled because we force tx size to be
981233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // 16x16...
982233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->sf.use_nonrd_pick_mode) {
983233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (q == 0)
984233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q++;
985233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cpi->sf.force_frame_boost == 1)
986233d2500723e5594f3e7c70896ffeeef32b9c950ywan      q -= cpi->sf.max_delta_qindex;
987233d2500723e5594f3e7c70896ffeeef32b9c950ywan
988233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (q < *bottom_index)
989233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *bottom_index = q;
990233d2500723e5594f3e7c70896ffeeef32b9c950ywan    else if (q > *top_index)
991233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *top_index = q;
992233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
993233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return q;
994233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
995233d2500723e5594f3e7c70896ffeeef32b9c950ywan
996233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
997233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      int this_frame_target,
998233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      int *frame_under_shoot_limit,
999233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                      int *frame_over_shoot_limit) {
1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Set-up bounds on acceptable frame size:
1001233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_under_shoot_limit = 0;
1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_over_shoot_limit  = INT_MAX;
1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int recode_tolerance =
1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cpi->sf.recode_tolerance * this_frame_target) / 100;
1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_over_shoot_limit = this_frame_target + recode_tolerance;
1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_under_shoot_limit = this_frame_target - recode_tolerance;
1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // For very small rate targets where the fractional adjustment
1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // may be tiny make sure there is at least a minimum range.
1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_over_shoot_limit += 200;
1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan    *frame_under_shoot_limit -= 200;
1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (*frame_under_shoot_limit < 0)
1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *frame_under_shoot_limit = 0;
1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Clip to maximum allowed rate for a frame.
1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (*frame_over_shoot_limit > cpi->rc.max_frame_bandwidth) {
1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan      *frame_over_shoot_limit = cpi->rc.max_frame_bandwidth;
1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1025233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_set_frame_target(VP9_COMP *cpi, int target) {
1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_COMMON *const cm = &cpi->common;
1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->this_frame_target = target;
1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Target rate per SB64 (including partial SB64s.
1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->sb64_target_rate = ((int64_t)rc->this_frame_target * 64 * 64) /
1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             (cm->width * cm->height);
1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1035233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_alt_ref_frame_stats(VP9_COMP *cpi) {
1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // this frame refreshes means next frames don't unless specified by user
1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cpi->rc.frames_since_golden = 0;
1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTIPLE_ARF
1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!cpi->multi_arf_enabled)
1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Clear the alternate reference update pending flag.
1043233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cpi->rc.source_alt_ref_pending = 0;
1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Set the alternate reference frame active flag
1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cpi->rc.source_alt_ref_active = 1;
1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1049233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void update_golden_frame_stats(VP9_COMP *cpi) {
1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Update the Golden frame usage counts.
1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->refresh_golden_frame) {
1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // this frame refreshes means next frames don't unless specified by user
1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_since_golden = 0;
1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (!rc->source_alt_ref_pending)
1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rc->source_alt_ref_active = 0;
1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Decrement count down till next gf
1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_till_gf_update_due > 0)
1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rc->frames_till_gf_update_due--;
1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!cpi->refresh_alt_ref_frame) {
1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Decrement count down till next gf
1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_till_gf_update_due > 0)
1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rc->frames_till_gf_update_due--;
1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_since_golden++;
1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1073233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *const cm = &cpi->common;
1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cm->last_frame_type = cm->frame_type;
1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Update rate control heuristics
1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->projected_frame_size = (int)(bytes_used << 3);
1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Post encode loop adjustment of Q prediction.
1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_rc_update_rate_correction_factors(
1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF ||
1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);
1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Keep a record of last Q and ambient average Q.
1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME) {
1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->last_q[KEY_FRAME] = cm->base_qindex;
1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->avg_frame_qindex[KEY_FRAME] = ROUND_POWER_OF_TWO(
1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan        3 * rc->avg_frame_qindex[KEY_FRAME] + cm->base_qindex, 2);
1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (!rc->is_src_frame_alt_ref &&
1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) &&
1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan      !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->last_q[2] = cm->base_qindex;
1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->avg_frame_qindex[2] = ROUND_POWER_OF_TWO(
1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan        3 * rc->avg_frame_qindex[2] + cm->base_qindex, 2);
1097233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->last_q[INTER_FRAME] = cm->base_qindex;
1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->avg_frame_qindex[INTER_FRAME] = ROUND_POWER_OF_TWO(
1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        3 * rc->avg_frame_qindex[INTER_FRAME] + cm->base_qindex, 2);
1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->ni_frames++;
1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->avg_q = rc->tot_q / (double)rc->ni_frames;
1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Calculate the average Q for normal inter frames (not key or GFU frames).
1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->ni_tot_qi += cm->base_qindex;
1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames;
1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Keep record of last boosted (KF/KF/ARF) Q value.
1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If the current frame is coded at a lower Q then we also update it.
1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // If all mbs in this group are skipped only update if the Q value is
1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // better than that already stored.
1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // This is used to help set quality in forced key frames to reduce popping
1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if ((cm->base_qindex < rc->last_boosted_qindex) ||
1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ((cpi->static_mb_pct < 100) &&
1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan       ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan        (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->last_boosted_qindex = cm->base_qindex;
1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  update_buffer_level(cpi, rc->projected_frame_size);
1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Rolling monitors of whether we are over or underspending used to help
1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // regulate min and Max Q in two pass.
1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type != KEY_FRAME) {
1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->rolling_target_bits = ROUND_POWER_OF_TWO(
1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->rolling_target_bits * 3 + rc->this_frame_target, 2);
1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->rolling_actual_bits = ROUND_POWER_OF_TWO(
1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2);
1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->long_rolling_target_bits = ROUND_POWER_OF_TWO(
1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->long_rolling_target_bits * 31 + rc->this_frame_target, 5);
1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO(
1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan        rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5);
1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Actual bits spent
1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->total_actual_bits += rc->projected_frame_size;
1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->total_target_bits += (cm->show_frame ? rc->av_per_frame_bandwidth : 0);
1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits;
1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame &&
1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cm->frame_type != KEY_FRAME))
1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Update the alternate reference frame stats as appropriate.
1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    update_alt_ref_frame_stats(cpi);
1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else
1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Update the Golden frame stats as appropriate.
1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    update_golden_frame_stats(cpi);
1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME)
1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_since_key = 0;
1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->show_frame) {
1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_since_key++;
1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_to_key--;
1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1159233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {
1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Update buffer level with zero size, update frame counters, and return.
1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  update_buffer_level(cpi, 0);
1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cpi->common.last_frame_type = cpi->common.frame_type;
1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cpi->rc.frames_since_key++;
1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan  cpi->rc.frames_to_key--;
1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1167233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int test_for_kf_one_pass(VP9_COMP *cpi) {
1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Placeholder function for auto key frame
1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return 0;
1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Use this macro to turn on/off use of alt-refs in one-pass mode.
1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define USE_ALTREF_FOR_ONE_PASS   1
1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1174233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_pframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int af_ratio = 10;
1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *const rc = &cpi->rc;
1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target;
1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if USE_ALTREF_FOR_ONE_PASS
1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  target = (!rc->is_src_frame_alt_ref &&
1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan            (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) ?
1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (rc->av_per_frame_bandwidth * rc->baseline_gf_interval * af_ratio) /
1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (rc->baseline_gf_interval + af_ratio - 1) :
1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (rc->av_per_frame_bandwidth * rc->baseline_gf_interval) /
1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (rc->baseline_gf_interval + af_ratio - 1);
1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else
1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  target = rc->av_per_frame_bandwidth;
1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return vp9_rc_clamp_pframe_target_size(cpi, target);
1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1191233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_iframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan  static const int kf_ratio = 25;
1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target = rc->av_per_frame_bandwidth * kf_ratio;
1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return vp9_rc_clamp_iframe_target_size(cpi, target);
1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1198233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) {
1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *const cm = &cpi->common;
1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target;
1202233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (!cpi->refresh_alt_ref_frame &&
1203233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cm->current_video_frame == 0 ||
1204233d2500723e5594f3e7c70896ffeeef32b9c950ywan       (cm->frame_flags & FRAMEFLAGS_KEY) ||
1205233d2500723e5594f3e7c70896ffeeef32b9c950ywan       rc->frames_to_key == 0 ||
1206233d2500723e5594f3e7c70896ffeeef32b9c950ywan       (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1207233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = KEY_FRAME;
1208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1209233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                rc->frames_to_key == 0;
1210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_to_key = cpi->key_frame_frequency;
1211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->kf_boost = DEFAULT_KF_BOOST;
1212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->source_alt_ref_active = 0;
1213233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = INTER_FRAME;
1215233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1216233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (rc->frames_till_gf_update_due == 0) {
1217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_till_gf_update_due = rc->baseline_gf_interval;
1219233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // NOTE: frames_till_gf_update_due must be <= frames_to_key.
1220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_till_gf_update_due > rc->frames_to_key)
1221233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rc->frames_till_gf_update_due = rc->frames_to_key;
1222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cpi->refresh_golden_frame = 1;
1223233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS;
1224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->gfu_boost = DEFAULT_GF_BOOST;
1225233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1226233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cm->frame_type == KEY_FRAME)
1227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = calc_iframe_target_size_one_pass_vbr(cpi);
1228233d2500723e5594f3e7c70896ffeeef32b9c950ywan  else
1229233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = calc_pframe_target_size_one_pass_vbr(cpi);
1230233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_rc_set_frame_target(cpi, target);
1231233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1232233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1233233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1234233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const VP9_CONFIG *oxcf = &cpi->oxcf;
1235233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
1236233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int64_t diff = oxcf->optimal_buffer_level - rc->buffer_level;
1237233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const int64_t one_pct_bits = 1 + oxcf->optimal_buffer_level / 100;
1238233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int min_frame_target = MAX(rc->av_per_frame_bandwidth >> 4,
1239233d2500723e5594f3e7c70896ffeeef32b9c950ywan                             FRAME_OVERHEAD_BITS);
1240233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target = rc->av_per_frame_bandwidth;
1241233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->svc.number_temporal_layers > 1 &&
1242233d2500723e5594f3e7c70896ffeeef32b9c950ywan      cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1243233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Note that for layers, av_per_frame_bandwidth is the cumulative
1244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // per-frame-bandwidth. For the target size of this frame, use the
1245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // layer average frame size (i.e., non-cumulative per-frame-bw).
1246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int current_temporal_layer = cpi->svc.temporal_layer_id;
1247233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const LAYER_CONTEXT *lc = &cpi->svc.layer_context[current_temporal_layer];
1248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = lc->avg_frame_size;
1249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS);
1250233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1251233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (diff > 0) {
1252233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Lower the target bandwidth for this frame.
1253233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct);
1254233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target -= (target * pct_low) / 200;
1255233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else if (diff < 0) {
1256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    // Increase the target bandwidth for this frame.
1257233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct);
1258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target += (target * pct_high) / 200;
1259233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1260233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return MAX(min_frame_target, target);
1261233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1262233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1263233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1264233d2500723e5594f3e7c70896ffeeef32b9c950ywan  const RATE_CONTROL *rc = &cpi->rc;
1265233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target;
1266233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1267233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if (cpi->common.current_video_frame == 0) {
1268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = ((cpi->oxcf.starting_buffer_level / 2) > INT_MAX)
1269233d2500723e5594f3e7c70896ffeeef32b9c950ywan      ? INT_MAX : (int)(cpi->oxcf.starting_buffer_level / 2);
1270233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const int initial_boost = 32;
1272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
1273233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (rc->frames_since_key < cpi->output_framerate / 2) {
1274233d2500723e5594f3e7c70896ffeeef32b9c950ywan      kf_boost = (int)(kf_boost * rc->frames_since_key /
1275233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       (cpi->output_framerate / 2));
1276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
1277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = ((16 + kf_boost) * rc->av_per_frame_bandwidth) >> 4;
1278233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1279233d2500723e5594f3e7c70896ffeeef32b9c950ywan  return vp9_rc_clamp_iframe_target_size(cpi, target);
1280233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1281233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1282233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_get_svc_params(VP9_COMP *cpi) {
1283233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *const cm = &cpi->common;
1284233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1285233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target = rc->av_per_frame_bandwidth;
1286233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if ((cm->current_video_frame == 0) ||
1287233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cm->frame_flags & FRAMEFLAGS_KEY) ||
1288233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cpi->oxcf.auto_key && (rc->frames_since_key %
1289233d2500723e5594f3e7c70896ffeeef32b9c950ywan                              cpi->key_frame_frequency == 0))) {
1290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = KEY_FRAME;
1291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->source_alt_ref_active = 0;
1292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1293233d2500723e5594f3e7c70896ffeeef32b9c950ywan      target = calc_iframe_target_size_one_pass_cbr(cpi);
1294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
1295233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1296233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = INTER_FRAME;
1297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1298233d2500723e5594f3e7c70896ffeeef32b9c950ywan      target = calc_pframe_target_size_one_pass_cbr(cpi);
1299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
1300233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1301233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_rc_set_frame_target(cpi, target);
1302233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->frames_till_gf_update_due = INT_MAX;
1303233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->baseline_gf_interval = INT_MAX;
1304233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1305233d2500723e5594f3e7c70896ffeeef32b9c950ywan
1306233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) {
1307233d2500723e5594f3e7c70896ffeeef32b9c950ywan  VP9_COMMON *const cm = &cpi->common;
1308233d2500723e5594f3e7c70896ffeeef32b9c950ywan  RATE_CONTROL *const rc = &cpi->rc;
1309233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int target;
1310233d2500723e5594f3e7c70896ffeeef32b9c950ywan  if ((cm->current_video_frame == 0 ||
1311233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cm->frame_flags & FRAMEFLAGS_KEY) ||
1312233d2500723e5594f3e7c70896ffeeef32b9c950ywan      rc->frames_to_key == 0 ||
1313233d2500723e5594f3e7c70896ffeeef32b9c950ywan      (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = KEY_FRAME;
1315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1316233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                rc->frames_to_key == 0;
1317233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->frames_to_key = cpi->key_frame_frequency;
1318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->kf_boost = DEFAULT_KF_BOOST;
1319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rc->source_alt_ref_active = 0;
1320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = calc_iframe_target_size_one_pass_cbr(cpi);
1321233d2500723e5594f3e7c70896ffeeef32b9c950ywan  } else {
1322233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cm->frame_type = INTER_FRAME;
1323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    target = calc_pframe_target_size_one_pass_cbr(cpi);
1324233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
1325233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_rc_set_frame_target(cpi, target);
1326233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Don't use gf_update by default in CBR mode.
1327233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->frames_till_gf_update_due = INT_MAX;
1328233d2500723e5594f3e7c70896ffeeef32b9c950ywan  rc->baseline_gf_interval = INT_MAX;
1329233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
1330