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