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