/* * Copyright (c) 2010 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
// Max rate per frame for 1080P and below encodes if no level requirement given. // For larger formats limit to MAX_MB_RATE bits per MB // 4Mbits is derived from the level requirement for level 4 (1080P 30) which // requires that HW can sustain a rate of 16Mbits over a 4 frame group. // If a lower level requirement is specified then this may over ride this value. #define MAX_MB_RATE 250 #define MAXRATE_1080P 4000000
#if CONFIG_VP9_HIGHBITDEPTH #define ASSIGN_MINQ_TABLE(bit_depth, name) \ do { \ switch (bit_depth) { \ case VPX_BITS_8: name = name##_8; break; \ case VPX_BITS_10: name = name##_10; break; \ default: \
assert(bit_depth == VPX_BITS_12); \
name = name##_12; \ break; \
} \
} while (0) #else #define ASSIGN_MINQ_TABLE(bit_depth, name) \ do { \
(void)bit_depth; \
name = name##_8; \
} while (0) #endif
// Tables relating active max Q to active min Q staticint kf_low_motion_minq_8[QINDEX_RANGE]; staticint kf_high_motion_minq_8[QINDEX_RANGE]; staticint arfgf_low_motion_minq_8[QINDEX_RANGE]; staticint arfgf_high_motion_minq_8[QINDEX_RANGE]; staticint inter_minq_8[QINDEX_RANGE]; staticint rtc_minq_8[QINDEX_RANGE];
// Functions to compute the active minq lookup table entries based on a // formulaic approach to facilitate easier adjustment of the Q tables. // The formulae were derived from computing a 3rd order polynomial best // fit to the original data (after plotting real maxq vs minq (not q index)) staticint get_minq_index(double maxq, double x3, double x2, double x1,
vpx_bit_depth_t bit_depth) { int i; constdouble minqtarget = VPXMIN(((x3 * maxq + x2) * maxq + x1) * maxq, maxq);
// Special case handling to deal with the step from q2.0 // down to lossless mode represented by q 1.0. if (minqtarget <= 2.0) return 0;
for (i = 0; i < QINDEX_RANGE; i++) { if (minqtarget <= vp9_convert_qindex_to_q(i, bit_depth)) return i;
}
// These functions use formulaic calculations to make playing with the // quantizer tables easier. If necessary they can be replaced by lookup // tables if and when things settle down in the experimental bitstream double vp9_convert_qindex_to_q(int qindex, vpx_bit_depth_t bit_depth) { // Convert the index to a real Q value (scaled down to match old Q values) #if CONFIG_VP9_HIGHBITDEPTH switch (bit_depth) { case VPX_BITS_8: return vp9_ac_quant(qindex, 0, bit_depth) / 4.0; case VPX_BITS_10: return vp9_ac_quant(qindex, 0, bit_depth) / 16.0; default:
assert(bit_depth == VPX_BITS_12); return vp9_ac_quant(qindex, 0, bit_depth) / 64.0;
} #else return vp9_ac_quant(qindex, 0, bit_depth) / 4.0; #endif
}
int vp9_convert_q_to_qindex(double q_val, vpx_bit_depth_t bit_depth) { int i;
for (i = 0; i < QINDEX_RANGE; ++i) if (vp9_convert_qindex_to_q(i, bit_depth) >= q_val) break;
if (i == QINDEX_RANGE) i--;
return i;
}
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex, double correction_factor, vpx_bit_depth_t bit_depth) { constdouble q = vp9_convert_qindex_to_q(qindex, bit_depth); int enumerator = frame_type == KEY_FRAME ? 2700000 : 1800000;
int vp9_estimate_bits_at_q(FRAME_TYPE frame_type, int q, int mbs, double correction_factor,
vpx_bit_depth_t bit_depth) { constint bpm =
(int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor, bit_depth)); return VPXMAX(FRAME_OVERHEAD_BITS,
(int)(((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS));
}
int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { const RATE_CONTROL *rc = &cpi->rc; const VP9EncoderConfig *oxcf = &cpi->oxcf;
constint min_frame_target =
VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5); if (target < min_frame_target) target = min_frame_target; if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { // If there is an active ARF at this location use the minimum // bits on this frame even if it is a constructed arf. // The active maximum quantizer insures that an appropriate // number of bits will be spent if needed for constructed ARFs.
target = min_frame_target;
}
// Clip the frame target to the maximum allowed value. if (target > rc->max_frame_bandwidth) target = rc->max_frame_bandwidth;
if (oxcf->rc_max_inter_bitrate_pct) { const int64_t max_rate =
(int64_t)rc->avg_frame_bandwidth * oxcf->rc_max_inter_bitrate_pct / 100; // target is of type int and VPXMIN cannot evaluate to larger than target
target = (int)VPXMIN(target, max_rate);
} return target;
}
// TODO(marpan/jianj): bits_off_target and buffer_level are used in the same // way for CBR mode, for the buffering updates below. Look into removing one // of these (i.e., bits_off_target). // Update the buffer level before encoding with the per-frame-bandwidth, void vp9_update_buffer_level_preencode(VP9_COMP *cpi) {
RATE_CONTROL *const rc = &cpi->rc;
rc->bits_off_target += rc->avg_frame_bandwidth; // Clip the buffer level to the maximum specified buffer size.
rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
rc->buffer_level = rc->bits_off_target;
}
// Update the buffer level before encoding with the per-frame-bandwidth // for SVC. The current and all upper temporal layers are updated, needed // for the layered rate control which involves cumulative buffer levels for // the temporal layers. Allow for using the timestamp(pts) delta for the // framerate when the set_ref_frame_config is used. void vp9_update_buffer_level_svc_preencode(VP9_COMP *cpi) {
SVC *const svc = &cpi->svc; int i; // Set this to 1 to use timestamp delta for "framerate" under // ref_frame_config usage. int use_timestamp = 1; const int64_t ts_delta =
svc->time_stamp_superframe - svc->time_stamp_prev[svc->spatial_layer_id]; for (i = svc->temporal_layer_id; i < svc->number_temporal_layers; ++i) { constint layer =
LAYER_IDS_TO_IDX(svc->spatial_layer_id, i, svc->number_temporal_layers);
LAYER_CONTEXT *const lc = &svc->layer_context[layer];
RATE_CONTROL *const lrc = &lc->rc; if (use_timestamp && cpi->svc.use_set_ref_frame_config &&
svc->number_temporal_layers == 1 && ts_delta > 0 &&
svc->current_superframe > 0) { // TODO(marpan): This may need to be modified for temporal layers. constdouble framerate_pts = 10000000.0 / ts_delta;
lrc->bits_off_target += saturate_cast_double_to_int(
round(lc->target_bandwidth / framerate_pts));
} else {
lrc->bits_off_target += saturate_cast_double_to_int(
round(lc->target_bandwidth / lc->framerate));
} // Clip buffer level to maximum buffer size for the layer.
lrc->bits_off_target =
VPXMIN(lrc->bits_off_target, lrc->maximum_buffer_size);
lrc->buffer_level = lrc->bits_off_target; if (i == svc->temporal_layer_id) {
cpi->rc.bits_off_target = lrc->bits_off_target;
cpi->rc.buffer_level = lrc->buffer_level;
}
}
}
// Update the buffer level for higher temporal layers, given the encoded current // temporal layer. staticvoid update_layer_buffer_level_postencode(SVC *svc, int encoded_frame_size) { int i = 0; constint current_temporal_layer = svc->temporal_layer_id; for (i = current_temporal_layer + 1; i < svc->number_temporal_layers; ++i) { constint layer =
LAYER_IDS_TO_IDX(svc->spatial_layer_id, i, svc->number_temporal_layers);
LAYER_CONTEXT *lc = &svc->layer_context[layer];
RATE_CONTROL *lrc = &lc->rc;
lrc->bits_off_target -= encoded_frame_size; // Clip buffer level to maximum buffer size for the layer.
lrc->bits_off_target =
VPXMIN(lrc->bits_off_target, lrc->maximum_buffer_size);
lrc->buffer_level = lrc->bits_off_target;
}
}
// Update the buffer level after encoding with encoded frame size. staticvoid update_buffer_level_postencode(VP9_COMP *cpi, int encoded_frame_size) {
RATE_CONTROL *const rc = &cpi->rc;
rc->bits_off_target -= encoded_frame_size; // Clip the buffer level to the maximum specified buffer size.
rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size); // For screen-content mode, and if frame-dropper is off, don't let buffer // level go below threshold, given here as -rc->maximum_ buffer_size. if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
cpi->oxcf.drop_frames_water_mark == 0)
rc->bits_off_target = VPXMAX(rc->bits_off_target, -rc->maximum_buffer_size);
rc->buffer_level = rc->bits_off_target;
if (is_one_pass_svc(cpi)) {
update_layer_buffer_level_postencode(&cpi->svc, encoded_frame_size);
}
}
int vp9_rc_get_default_min_gf_interval(int width, int height, double framerate) { // Assume we do not need any constraint lower than 4K 20 fps staticconstdouble factor_safe = 3840 * 2160 * 20.0; constdouble factor = width * height * framerate; constint default_interval =
clamp((int)round(framerate * 0.125), MIN_GF_INTERVAL, MAX_GF_INTERVAL);
int vp9_rc_get_default_max_gf_interval(double framerate, int min_gf_interval) { int interval = VPXMIN(MAX_GF_INTERVAL, (int)round(framerate * 0.75));
interval += (interval & 0x01); // Round to even value return VPXMAX(interval, min_gf_interval);
}
void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) { int i;
staticint check_buffer_above_thresh(VP9_COMP *cpi, int drop_mark) {
SVC *svc = &cpi->svc; if (!cpi->use_svc || cpi->svc.framedrop_mode != FULL_SUPERFRAME_DROP) {
RATE_CONTROL *const rc = &cpi->rc; return (rc->buffer_level > drop_mark);
} else { int i; // For SVC in the FULL_SUPERFRAME_DROP): the condition on // buffer (if its above threshold, so no drop) is checked on current and // upper spatial layers. If any spatial layer is not above threshold then // we return 0. for (i = svc->spatial_layer_id; i < svc->number_spatial_layers; ++i) { constint layer = LAYER_IDS_TO_IDX(i, svc->temporal_layer_id,
svc->number_temporal_layers);
LAYER_CONTEXT *lc = &svc->layer_context[layer];
RATE_CONTROL *lrc = &lc->rc; // Exclude check for layer whose bitrate is 0. if (lc->target_bandwidth > 0) { constint drop_mark_layer = (int)(cpi->svc.framedrop_thresh[i] *
lrc->optimal_buffer_level / 100); if (!(lrc->buffer_level > drop_mark_layer)) return 0;
}
} return 1;
}
}
staticint check_buffer_below_thresh(VP9_COMP *cpi, int drop_mark) {
SVC *svc = &cpi->svc; if (!cpi->use_svc || cpi->svc.framedrop_mode == LAYER_DROP) {
RATE_CONTROL *const rc = &cpi->rc; return (rc->buffer_level <= drop_mark);
} else { int i; // For SVC in the constrained framedrop mode (svc->framedrop_mode = // CONSTRAINED_LAYER_DROP or FULL_SUPERFRAME_DROP): the condition on // buffer (if its below threshold, so drop frame) is checked on current // and upper spatial layers. For FULL_SUPERFRAME_DROP mode if any // spatial layer is <= threshold, then we return 1 (drop). for (i = svc->spatial_layer_id; i < svc->number_spatial_layers; ++i) { constint layer = LAYER_IDS_TO_IDX(i, svc->temporal_layer_id,
svc->number_temporal_layers);
LAYER_CONTEXT *lc = &svc->layer_context[layer];
RATE_CONTROL *lrc = &lc->rc; // Exclude check for layer whose bitrate is 0. if (lc->target_bandwidth > 0) { constint drop_mark_layer = (int)(cpi->svc.framedrop_thresh[i] *
lrc->optimal_buffer_level / 100); if (cpi->svc.framedrop_mode == FULL_SUPERFRAME_DROP) { if (lrc->buffer_level <= drop_mark_layer) return 1;
} else { if (!(lrc->buffer_level <= drop_mark_layer)) return 0;
}
}
} if (cpi->svc.framedrop_mode == FULL_SUPERFRAME_DROP) return 0; else return 1;
}
}
int vp9_test_drop(VP9_COMP *cpi) { const VP9EncoderConfig *oxcf = &cpi->oxcf;
RATE_CONTROL *const rc = &cpi->rc;
SVC *svc = &cpi->svc; int drop_frames_water_mark = oxcf->drop_frames_water_mark; if (cpi->use_svc) { // If we have dropped max_consec_drop frames, then we don't // drop this spatial layer, and reset counter to 0. if (svc->drop_count[svc->spatial_layer_id] == svc->max_consec_drop) {
svc->drop_count[svc->spatial_layer_id] = 0; return 0;
} else {
drop_frames_water_mark = svc->framedrop_thresh[svc->spatial_layer_id];
}
} if (!drop_frames_water_mark ||
(svc->spatial_layer_id > 0 &&
svc->framedrop_mode == FULL_SUPERFRAME_DROP)) { return 0;
} else { if ((rc->buffer_level < 0 && svc->framedrop_mode != FULL_SUPERFRAME_DROP) ||
(check_buffer_below_thresh(cpi, -1) &&
svc->framedrop_mode == FULL_SUPERFRAME_DROP)) { // Always drop if buffer is below 0. return 1;
} else { // If buffer is below drop_mark, for now just drop every other frame // (starting with the next frame) until it increases back over drop_mark. int drop_mark =
(int)(drop_frames_water_mark * rc->optimal_buffer_level / 100); if (check_buffer_above_thresh(cpi, drop_mark) &&
(rc->decimation_factor > 0)) {
--rc->decimation_factor;
} elseif (check_buffer_below_thresh(cpi, drop_mark) &&
rc->decimation_factor == 0) {
rc->decimation_factor = 1;
} if (rc->decimation_factor > 0) { if (rc->decimation_count > 0) {
--rc->decimation_count; return 1;
} else {
rc->decimation_count = rc->decimation_factor; return 0;
}
} else {
rc->decimation_count = 0; return 0;
}
}
}
}
// For now we drop if new buffer level (given the encoded frame size) goes // below 0. if (new_buffer_level < 0) {
*size = 0;
vp9_rc_postencode_update_drop_frame(cpi); // Update flag to use for next frame. if (cpi->rc.high_source_sad ||
(cpi->use_svc && cpi->svc.high_source_sad_superframe))
cpi->rc.last_post_encode_dropped_scene_change = 1; // Force max_q on next fame.
cpi->rc.force_max_q = 1;
cpi->rc.avg_frame_qindex[INTER_FRAME] = cpi->rc.worst_quality;
cpi->last_frame_dropped = 1;
cpi->ext_refresh_frame_flags_pending = 0; if (cpi->use_svc) {
SVC *svc = &cpi->svc; int sl = 0; int tl = 0;
svc->last_layer_dropped[svc->spatial_layer_id] = 1;
svc->drop_spatial_layer[svc->spatial_layer_id] = 1;
svc->drop_count[svc->spatial_layer_id]++;
svc->skip_enhancement_layer = 1; // Postencode drop is only checked on base spatial layer, // for now if max-q is set on base we force it on all layers. for (sl = 0; sl < svc->number_spatial_layers; ++sl) { for (tl = 0; tl < svc->number_temporal_layers; ++tl) { constint layer =
LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers);
LAYER_CONTEXT *lc = &svc->layer_context[layer];
RATE_CONTROL *lrc = &lc->rc;
lrc->force_max_q = 1;
lrc->avg_frame_qindex[INTER_FRAME] = cpi->rc.worst_quality;
}
}
} return 1;
}
int vp9_rc_drop_frame(VP9_COMP *cpi) {
SVC *svc = &cpi->svc; int svc_prev_layer_dropped = 0; // In the constrained or full_superframe framedrop mode for svc // (framedrop_mode != (LAYER_DROP && CONSTRAINED_FROM_ABOVE)), // if the previous spatial layer was dropped, drop the current spatial layer. if (cpi->use_svc && svc->spatial_layer_id > 0 &&
svc->drop_spatial_layer[svc->spatial_layer_id - 1])
svc_prev_layer_dropped = 1; if ((svc_prev_layer_dropped && svc->framedrop_mode != LAYER_DROP &&
svc->framedrop_mode != CONSTRAINED_FROM_ABOVE_DROP) ||
svc->force_drop_constrained_from_above[svc->spatial_layer_id] ||
vp9_test_drop(cpi)) {
vp9_rc_postencode_update_drop_frame(cpi);
cpi->ext_refresh_frame_flags_pending = 0;
cpi->last_frame_dropped = 1; if (cpi->use_svc) {
svc->last_layer_dropped[svc->spatial_layer_id] = 1;
svc->drop_spatial_layer[svc->spatial_layer_id] = 1;
svc->drop_count[svc->spatial_layer_id]++;
svc->skip_enhancement_layer = 1; if (svc->framedrop_mode == LAYER_DROP ||
(svc->framedrop_mode == CONSTRAINED_FROM_ABOVE_DROP &&
svc->force_drop_constrained_from_above[svc->number_spatial_layers -
1] == 0) ||
svc->drop_spatial_layer[0] == 0) { // For the case of constrained drop mode where full superframe is // dropped, we don't increment the svc frame counters. // In particular temporal layer counter (which is incremented in // vp9_inc_frame_in_layer()) won't be incremented, so on a dropped // frame we try the same temporal_layer_id on next incoming frame. // This is to avoid an issue with temporal alignment with full // superframe dropping.
vp9_inc_frame_in_layer(cpi);
} if (svc->spatial_layer_id == svc->number_spatial_layers - 1) { int i; int all_layers_drop = 1; for (i = 0; i < svc->spatial_layer_id; i++) { if (svc->drop_spatial_layer[i] == 0) {
all_layers_drop = 0; break;
}
} if (all_layers_drop == 1) svc->skip_enhancement_layer = 0;
}
} return 1;
} return 0;
}
staticint adjust_q_cbr(const VP9_COMP *cpi, int q) { // This makes sure q is between oscillating Qs to prevent resonance. if (!cpi->rc.reset_high_source_sad &&
(!cpi->oxcf.gf_cbr_boost_pct ||
!(cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)) &&
(cpi->rc.rc_1_frame * cpi->rc.rc_2_frame == -1) &&
cpi->rc.q_1_frame != cpi->rc.q_2_frame) { int qclamp = clamp(q, VPXMIN(cpi->rc.q_1_frame, cpi->rc.q_2_frame),
VPXMAX(cpi->rc.q_1_frame, cpi->rc.q_2_frame)); // If the previous frame had overshoot and the current q needs to increase // above the clamped value, reduce the clamp for faster reaction to // overshoot. if (cpi->rc.rc_1_frame == -1 && q > qclamp)
q = (q + qclamp) >> 1; else
q = qclamp;
} if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
vp9_cyclic_refresh_limit_q(cpi, &q); return VPXMAX(VPXMIN(q, cpi->rc.worst_quality), cpi->rc.best_quality);
}
// Do not update the rate factors for arf overlay frames. if (cpi->rc.is_src_frame_alt_ref) return;
// Clear down mmx registers to allow floating point in what follows
vpx_clear_system_state();
// Work out how big we would have expected the frame to be at this Q given // the current correction factor. // Stay in double to avoid int overflow when values are large if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cpi->common.seg.enabled) {
projected_size_based_on_q =
vp9_cyclic_refresh_estimate_bits_at_q(cpi, rate_correction_factor);
} else {
FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type;
projected_size_based_on_q =
vp9_estimate_bits_at_q(frame_type, cm->base_qindex, cm->MBs,
rate_correction_factor, cm->bit_depth);
} // Work out a size correction factor. if (projected_size_based_on_q > FRAME_OVERHEAD_BITS)
correction_factor = (int)((100 * (int64_t)cpi->rc.projected_frame_size) /
projected_size_based_on_q);
// Do not use damped adjustment for the first frame of each frame type if (!cpi->rc.damped_adjustment[rf_lvl]) {
adjustment_limit = 1.0;
cpi->rc.damped_adjustment[rf_lvl] = 1;
} else { // More heavily damped adjustment used if we have been oscillating either // side of target.
adjustment_limit =
0.25 + 0.5 * VPXMIN(1, fabs(log10(0.01 * correction_factor)));
}
// Turn off oscilation detection in the case of massive overshoot. if (cpi->rc.rc_1_frame == -1 && cpi->rc.rc_2_frame == 1 &&
correction_factor > 1000) {
cpi->rc.rc_2_frame = 0;
}
if (correction_factor > 102) { // We are not already at the worst allowable quality
correction_factor =
(int)(100 + ((correction_factor - 100) * adjustment_limit));
rate_correction_factor = (rate_correction_factor * correction_factor) / 100; // Keep rate_correction_factor within limits if (rate_correction_factor > MAX_BPB_FACTOR)
rate_correction_factor = MAX_BPB_FACTOR;
} elseif (correction_factor < 99) { // We are not already at the best allowable quality
correction_factor =
(int)(100 - ((100 - correction_factor) * adjustment_limit));
rate_correction_factor = (rate_correction_factor * correction_factor) / 100;
// Keep rate_correction_factor within limits if (rate_correction_factor < MIN_BPB_FACTOR)
rate_correction_factor = MIN_BPB_FACTOR;
}
int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame, int active_best_quality, int active_worst_quality) { const VP9_COMMON *const cm = &cpi->common;
CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; int q = active_worst_quality; int last_error = INT_MAX; int i, target_bits_per_mb, bits_per_mb_at_this_q; constdouble correction_factor = get_rate_correction_factor(cpi);
// Calculate required scaling factor based on target frame size and size of // frame produced using previous Q.
target_bits_per_mb =
(int)(((uint64_t)target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs);
i = active_best_quality;
do { if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cr->apply_cyclic_refresh &&
(!cpi->oxcf.gf_cbr_boost_pct || !cpi->refresh_golden_frame)) {
bits_per_mb_at_this_q =
(int)vp9_cyclic_refresh_rc_bits_per_mb(cpi, i, correction_factor);
} else {
FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type;
bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(
frame_type, i, correction_factor, cm->bit_depth);
}
if (bits_per_mb_at_this_q <= target_bits_per_mb) { if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
q = i; else
q = i - 1;
// Adjust active_worst_quality level based on buffer level. staticint calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { // Adjust active_worst_quality: If buffer is above the optimal/target level, // bring active_worst_quality down depending on fullness of buffer. // If buffer is below the optimal level, let the active_worst_quality go from // ambient Q (at buffer = optimal level) to worst_quality level // (at buffer = critical level). const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *rc = &cpi->rc; // Buffer level below which we push active_worst to worst_quality.
int64_t critical_level = rc->optimal_buffer_level >> 3;
int64_t buff_lvl_step = 0; int adjustment = 0; int active_worst_quality; int ambient_qp; unsignedint num_frames_weight_key = 5 * cpi->svc.number_temporal_layers; if (frame_is_intra_only(cm) || rc->reset_high_source_sad || rc->force_max_q) return rc->worst_quality; // For ambient_qp we use minimum of avg_frame_qindex[KEY_FRAME/INTER_FRAME] // for the first few frames following key frame. These are both initialized // to worst_quality and updated with (3/4, 1/4) average in postencode_update. // So for first few frames following key, the qp of that key frame is weighted // into the active_worst_quality setting.
ambient_qp = (cm->current_video_frame < num_frames_weight_key)
? VPXMIN(rc->avg_frame_qindex[INTER_FRAME],
rc->avg_frame_qindex[KEY_FRAME])
: rc->avg_frame_qindex[INTER_FRAME];
active_worst_quality = VPXMIN(rc->worst_quality, (ambient_qp * 5) >> 2); // For SVC if the current base spatial layer was key frame, use the QP from // that base layer for ambient_qp. if (cpi->use_svc && cpi->svc.spatial_layer_id > 0) { int layer = LAYER_IDS_TO_IDX(0, cpi->svc.temporal_layer_id,
cpi->svc.number_temporal_layers); const LAYER_CONTEXT *lc = &cpi->svc.layer_context[layer]; if (lc->is_key_frame) { const RATE_CONTROL *lrc = &lc->rc;
ambient_qp = VPXMIN(ambient_qp, lrc->last_q[KEY_FRAME]);
active_worst_quality = VPXMIN(rc->worst_quality, (ambient_qp * 9) >> 3);
}
} if (rc->buffer_level > rc->optimal_buffer_level) { // Adjust down. // Maximum limit for down adjustment ~30%; make it lower for screen content. int max_adjustment_down = active_worst_quality / 3; if (cpi->oxcf.content == VP9E_CONTENT_SCREEN)
max_adjustment_down = active_worst_quality >> 3; if (max_adjustment_down) {
buff_lvl_step = ((rc->maximum_buffer_size - rc->optimal_buffer_level) /
max_adjustment_down); if (buff_lvl_step)
adjustment = (int)((rc->buffer_level - rc->optimal_buffer_level) /
buff_lvl_step);
active_worst_quality -= adjustment;
}
} elseif (rc->buffer_level > critical_level) { // Adjust up from ambient Q. if (critical_level) {
buff_lvl_step = (rc->optimal_buffer_level - critical_level); if (buff_lvl_step) {
adjustment = (int)((rc->worst_quality - ambient_qp) *
(rc->optimal_buffer_level - rc->buffer_level) /
buff_lvl_step);
}
active_worst_quality = ambient_qp + adjustment;
}
} else { // Set to worst_quality if buffer is below critical level.
active_worst_quality = rc->worst_quality;
} return active_worst_quality;
}
staticint rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, int *bottom_index, int *top_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; int active_best_quality; int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi); int q; int *rtc_minq;
ASSIGN_MINQ_TABLE(cm->bit_depth, rtc_minq);
if (frame_is_intra_only(cm)) {
active_best_quality = rc->best_quality; // Handle the special case for key frames forced when we have reached // the maximum key frame interval. Here force the Q to a range // based on the ambient Q to reduce the risk of popping. if (rc->this_key_frame_forced) { int qindex = rc->last_boosted_qindex; double last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); int delta_qindex = vp9_compute_qdelta(
rc, last_boosted_q, (last_boosted_q * 0.75), cm->bit_depth);
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
} elseif (cm->current_video_frame > 0) { // not first frame of one pass and kf_boost is set double q_adj_factor = 1.0; double q_val;
// Allow somewhat lower kf minq with small image formats. if ((cm->width * cm->height) <= (352 * 288)) {
q_adj_factor -= 0.25;
}
// Convert the adjustment factor to a qindex delta // on active_best_quality.
q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth);
active_best_quality +=
vp9_compute_qdelta(rc, q_val, q_val * q_adj_factor, cm->bit_depth);
}
} elseif (!rc->is_src_frame_alt_ref && !cpi->use_svc &&
cpi->oxcf.gf_cbr_boost_pct &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { // Use the lower of active_worst_quality and recent // average Q as basis for GF/ARF best Q limit unless last frame was // a key frame. if (rc->frames_since_key > 1 &&
rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
q = rc->avg_frame_qindex[INTER_FRAME];
} else {
q = active_worst_quality;
}
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
} else { // Use the lower of active_worst_quality and recent/average Q. if (cm->current_video_frame > 1) { if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality)
active_best_quality = rtc_minq[rc->avg_frame_qindex[INTER_FRAME]]; else
active_best_quality = rtc_minq[active_worst_quality];
} else { if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality)
active_best_quality = rtc_minq[rc->avg_frame_qindex[KEY_FRAME]]; else
active_best_quality = rtc_minq[active_worst_quality];
}
}
// Clip the active best and worst quality values to limits
active_best_quality =
clamp(active_best_quality, rc->best_quality, rc->worst_quality);
active_worst_quality =
clamp(active_worst_quality, active_best_quality, rc->worst_quality);
// Special case code to try and match quality with forced key frames if (frame_is_intra_only(cm) && rc->this_key_frame_forced) {
q = rc->last_boosted_qindex;
} else {
q = vp9_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality,
active_worst_quality); if (q > *top_index) { // Special case when we are targeting the max allowed rate if (rc->this_frame_target >= rc->max_frame_bandwidth)
*top_index = q; else
q = *top_index;
}
}
staticint rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, int *bottom_index, int *top_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; const VP9EncoderConfig *const oxcf = &cpi->oxcf; constint cq_level = get_active_cq_level_one_pass(rc, oxcf); int active_best_quality; int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); int q; int *inter_minq;
ASSIGN_MINQ_TABLE(cm->bit_depth, inter_minq);
if (frame_is_intra_only(cm)) { if (oxcf->rc_mode == VPX_Q) { int qindex = cq_level; double qstart = vp9_convert_qindex_to_q(qindex, cm->bit_depth); int delta_qindex =
vp9_compute_qdelta(rc, qstart, qstart * 0.25, cm->bit_depth);
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
} elseif (rc->this_key_frame_forced) { // Handle the special case for key frames forced when we have reached // the maximum key frame interval. Here force the Q to a range // based on the ambient Q to reduce the risk of popping. int qindex = rc->last_boosted_qindex; double last_boosted_q = vp9_convert_qindex_to_q(qindex, cm->bit_depth); int delta_qindex = vp9_compute_qdelta(
rc, last_boosted_q, last_boosted_q * 0.75, cm->bit_depth);
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
} else { // not first frame of one pass and kf_boost is set double q_adj_factor = 1.0; double q_val;
// Allow somewhat lower kf minq with small image formats. if ((cm->width * cm->height) <= (352 * 288)) {
q_adj_factor -= 0.25;
}
// Convert the adjustment factor to a qindex delta // on active_best_quality.
q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth);
active_best_quality +=
vp9_compute_qdelta(rc, q_val, q_val * q_adj_factor, cm->bit_depth);
}
} elseif (!rc->is_src_frame_alt_ref &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { // Use the lower of active_worst_quality and recent // average Q as basis for GF/ARF best Q limit unless last frame was // a key frame. if (rc->frames_since_key > 1) { if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
q = rc->avg_frame_qindex[INTER_FRAME];
} else {
q = active_worst_quality;
}
} else {
q = rc->avg_frame_qindex[KEY_FRAME];
} // For constrained quality don't allow Q less than the cq level if (oxcf->rc_mode == VPX_CQ) { if (q < cq_level) q = cq_level;
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
// Constrained quality use slightly lower active best.
active_best_quality = active_best_quality * 15 / 16;
} elseif (oxcf->rc_mode == VPX_Q) { int qindex = cq_level; double qstart = vp9_convert_qindex_to_q(qindex, cm->bit_depth); int delta_qindex; if (cpi->refresh_alt_ref_frame)
delta_qindex =
vp9_compute_qdelta(rc, qstart, qstart * 0.40, cm->bit_depth); else
delta_qindex =
vp9_compute_qdelta(rc, qstart, qstart * 0.50, cm->bit_depth);
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
} else {
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
}
} else { if (oxcf->rc_mode == VPX_Q) { int qindex = cq_level; double qstart = vp9_convert_qindex_to_q(qindex, cm->bit_depth); double delta_rate[FIXED_GF_INTERVAL] = { 0.50, 1.0, 0.85, 1.0,
0.70, 1.0, 0.85, 1.0 }; int delta_qindex = vp9_compute_qdelta(
rc, qstart,
qstart * delta_rate[cm->current_video_frame % FIXED_GF_INTERVAL],
cm->bit_depth);
active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality);
} else { // Use the min of the average Q and active_worst_quality as basis for // active_best. if (cm->current_video_frame > 1) {
q = VPXMIN(rc->avg_frame_qindex[INTER_FRAME], active_worst_quality);
active_best_quality = inter_minq[q];
} else {
active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
} // For the constrained quality mode we don't want // q to fall below the cq level. if ((oxcf->rc_mode == VPX_CQ) && (active_best_quality < cq_level)) {
active_best_quality = cq_level;
}
}
}
// Clip the active best and worst quality values to limits
active_best_quality =
clamp(active_best_quality, rc->best_quality, rc->worst_quality);
active_worst_quality =
clamp(active_worst_quality, active_best_quality, rc->worst_quality);
if (oxcf->rc_mode == VPX_Q) {
q = active_best_quality; // Special case code to try and match quality with forced key frames
} elseif ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
q = rc->last_boosted_qindex;
} else {
q = vp9_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality,
active_worst_quality);
// For no lookahead: if buffer_level indicates overshoot, then avoid going // to very low QP. This reduces overshoot observed in Issue: 376707227. // Note the buffer_level is updated for every encoded frame as: // buffer_level - starting_buffer_level += (avg_frame_bandwidth - // encoded_frame_size). So normalizing this with framerate and #encoded // frames (current_video_frame) gives the difference/error between target // and encoding bitrate. The additional avg_frame_bandwidth term is to // compensate for the pre-encoded buffer update (in // vp9_rc_get_one_pass_vbr_params). constint qp_thresh = 32; const int64_t bitrate_err =
(int64_t)(cpi->framerate *
(rc->buffer_level - rc->starting_buffer_level -
rc->avg_frame_bandwidth) /
(cm->current_video_frame + 1)); // Threshold may be tuned, but for now condition this on low QP. if (cpi->oxcf.lag_in_frames == 0 && bitrate_err / 1000 < -10 &&
qp_thresh < rc->worst_quality &&
(q < qp_thresh || *top_index < qp_thresh)) {
q = qp_thresh;
*top_index = VPXMAX(*top_index, q);
}
if (q > *top_index) { // Special case when we are targeting the max allowed rate if (rc->this_frame_target >= rc->max_frame_bandwidth)
*top_index = q; else
q = *top_index;
}
}
int vp9_frame_type_qdelta(const VP9_COMP *cpi, int rf_level, int q) { staticconstdouble rate_factor_deltas[RATE_FACTOR_LEVELS] = {
1.00, // INTER_NORMAL
1.00, // INTER_HIGH
1.50, // GF_ARF_LOW
1.75, // GF_ARF_STD
2.00, // KF_STD
}; const VP9_COMMON *const cm = &cpi->common;
int qdelta = vp9_compute_qdelta_by_rate(
&cpi->rc, cm->frame_type, q, rate_factor_deltas[rf_level], cm->bit_depth); return qdelta;
}
#define STATIC_MOTION_THRESH 95
staticvoid pick_kf_q_bound_two_pass(const VP9_COMP *cpi, int *bottom_index, int *top_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; int active_best_quality; int active_worst_quality = cpi->twopass.active_worst_quality;
if (rc->this_key_frame_forced) { // Handle the special case for key frames forced when we have reached // the maximum key frame interval. Here force the Q to a range // based on the ambient Q to reduce the risk of popping. double last_boosted_q; int delta_qindex; int qindex;
// Don't allow the active min to be lossless (q0) unlesss the max q // already indicates lossless.
active_best_quality =
VPXMIN(active_worst_quality, VPXMAX(1, active_best_quality));
// Allow somewhat lower kf minq with small image formats. if ((cm->width * cm->height) <= (352 * 288)) {
q_adj_factor -= 0.25;
}
// Make a further adjustment based on the kf zero motion measure.
q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
// Convert the adjustment factor to a qindex delta // on active_best_quality.
q_val = vp9_convert_qindex_to_q(active_best_quality, cm->bit_depth);
active_best_quality +=
vp9_compute_qdelta(rc, q_val, q_val * q_adj_factor, cm->bit_depth);
}
*top_index = active_worst_quality;
*bottom_index = active_best_quality;
}
staticint rc_constant_q(const VP9_COMP *cpi, int *bottom_index, int *top_index, int gf_group_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; const VP9EncoderConfig *const oxcf = &cpi->oxcf; const GF_GROUP *gf_group = &cpi->twopass.gf_group; constint is_intra_frame = frame_is_intra_only(cm);
// ARF / GF qp decision if (!is_intra_frame && !rc->is_src_frame_alt_ref &&
cpi->refresh_alt_ref_frame) {
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
// Modify best quality for second level arfs. For mode VPX_Q this // becomes the baseline frame q. if (gf_group->rf_level[gf_group_index] == GF_ARF_LOW) { constint layer_depth = gf_group->layer_depth[gf_group_index]; // linearly fit the frame q depending on the layer depth index from // the base layer ARF.
active_best_quality = ((layer_depth - 1) * cq_level +
active_best_quality + layer_depth / 2) /
layer_depth;
}
}
int vp9_rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, int *bottom_index, int *top_index, int gf_group_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; const VP9EncoderConfig *const oxcf = &cpi->oxcf; const GF_GROUP *gf_group = &cpi->twopass.gf_group; constint cq_level = get_active_cq_level_two_pass(&cpi->twopass, rc, oxcf); int active_best_quality; int active_worst_quality = cpi->twopass.active_worst_quality; int q; int *inter_minq; int arf_active_best_quality_hl; int *arfgf_high_motion_minq, *arfgf_low_motion_minq; constint boost_frame =
!rc->is_src_frame_alt_ref &&
(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
ASSIGN_MINQ_TABLE(cm->bit_depth, inter_minq);
if (oxcf->rc_mode == VPX_Q) return rc_constant_q(cpi, bottom_index, top_index, gf_group_index);
if (frame_is_intra_only(cm)) {
pick_kf_q_bound_two_pass(cpi, &active_best_quality, &active_worst_quality);
} elseif (boost_frame) { // Use the lower of active_worst_quality and recent // average Q as basis for GF/ARF best Q limit unless last frame was // a key frame. if (rc->frames_since_key > 1 &&
rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
q = rc->avg_frame_qindex[INTER_FRAME];
} else {
q = active_worst_quality;
} // For constrained quality don't allow Q less than the cq level if (oxcf->rc_mode == VPX_CQ) { if (q < cq_level) q = cq_level;
}
active_best_quality = get_gf_active_quality(cpi, q, cm->bit_depth);
arf_active_best_quality_hl = active_best_quality;
// Modify best quality for second level arfs. For mode VPX_Q this // becomes the baseline frame q. if (gf_group->rf_level[gf_group_index] == GF_ARF_LOW) { constint layer_depth = gf_group->layer_depth[gf_group_index]; // linearly fit the frame q depending on the layer depth index from // the base layer ARF.
active_best_quality =
((layer_depth - 1) * q + active_best_quality + layer_depth / 2) /
layer_depth;
}
} else {
active_best_quality = inter_minq[active_worst_quality];
// For the constrained quality mode we don't want // q to fall below the cq level. if ((oxcf->rc_mode == VPX_CQ) && (active_best_quality < cq_level)) {
active_best_quality = cq_level;
}
}
// Extension to max or min Q if undershoot or overshoot is outside // the permitted range. if (frame_is_intra_only(cm) || boost_frame) { constint layer_depth = gf_group->layer_depth[gf_group_index];
active_best_quality -=
(cpi->twopass.extend_minq + cpi->twopass.extend_minq_fast);
active_worst_quality += (cpi->twopass.extend_maxq / 2);
// For normal frames do not allow an active minq lower than the q used for // the last boosted frame.
active_best_quality =
VPXMAX(active_best_quality,
cpi->twopass.last_qindex_of_arf_layer[max_layer_depth - 1]);
}
if (frame_is_intra_only(cm) && rc->this_key_frame_forced) { // If static since last kf use better of last boosted and last kf q. if (cpi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) {
q = VPXMIN(rc->last_kf_qindex, rc->last_boosted_qindex);
} else {
q = rc->last_boosted_qindex;
}
} elseif (frame_is_intra_only(cm) && !rc->this_key_frame_forced) {
q = active_best_quality;
} else {
q = vp9_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality,
active_worst_quality); if (q > active_worst_quality) { // Special case when we are targeting the max allowed rate. if (rc->this_frame_target >= rc->max_frame_bandwidth)
active_worst_quality = q; else
q = active_worst_quality;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.