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