12#ifndef AOM_AV1_ENCODER_RC_UTILS_H_
13#define AOM_AV1_ENCODER_RC_UTILS_H_
16#include "aom_dsp/psnr.h"
22static AOM_INLINE
void check_reset_rc_flag(AV1_COMP *cpi) {
25 if (cpi->common.current_frame.frame_number >
26 (
unsigned int)cpi->svc.number_spatial_layers) {
27 if (cpi->ppi->use_svc) {
28 av1_svc_check_reset_layer_rc_flag(cpi);
30 if (rc->avg_frame_bandwidth > (3 * rc->prev_avg_frame_bandwidth >> 1) ||
31 rc->avg_frame_bandwidth < (rc->prev_avg_frame_bandwidth >> 1)) {
41static AOM_INLINE
void set_primary_rc_buffer_sizes(
const AV1EncoderConfig *oxcf,
44 const RateControlCfg *
const rc_cfg = &oxcf->rc_cfg;
46 const int64_t bandwidth = rc_cfg->target_bandwidth;
47 const int64_t starting = rc_cfg->starting_buffer_level_ms;
48 const int64_t optimal = rc_cfg->optimal_buffer_level_ms;
49 const int64_t maximum = rc_cfg->maximum_buffer_size_ms;
53 (optimal == 0) ? bandwidth / 8 : optimal * bandwidth / 1000;
55 (maximum == 0) ? bandwidth / 8 : maximum * bandwidth / 1000;
64static AOM_INLINE
void config_target_level(AV1_COMP *
const cpi,
65 AV1_LEVEL target_level,
int tier) {
66 AV1EncoderConfig *
const oxcf = &cpi->oxcf;
67 SequenceHeader *
const seq_params = cpi->common.seq_params;
68 TileConfig *
const tile_cfg = &oxcf->tile_cfg;
69 RateControlCfg *
const rc_cfg = &oxcf->rc_cfg;
72 const BITSTREAM_PROFILE profile = seq_params->profile;
73 const double level_bitrate_limit =
74 av1_get_max_bitrate_for_level(target_level, tier, profile);
75 const int64_t max_bitrate = (int64_t)(level_bitrate_limit * 0.70);
76 rc_cfg->target_bandwidth = AOMMIN(rc_cfg->target_bandwidth, max_bitrate);
78 TWO_PASS *
const twopass = &cpi->ppi->twopass;
81 cpi->ppi->twopass.bits_left =
82 (int64_t)(stats->
duration * rc_cfg->target_bandwidth / 10000000.0);
85 rc_cfg->over_shoot_pct = 0;
88 rc_cfg->worst_allowed_q = 255;
91 int max_tiles, max_tile_cols;
92 av1_get_max_tiles_for_level(target_level, &max_tiles, &max_tile_cols);
93 while (tile_cfg->tile_columns > 0 &&
94 (1 << tile_cfg->tile_columns) > max_tile_cols) {
95 --tile_cfg->tile_columns;
97 const int tile_cols = (1 << tile_cfg->tile_columns);
98 while (tile_cfg->tile_rows > 0 &&
99 tile_cols * (1 << tile_cfg->tile_rows) > max_tiles) {
100 --tile_cfg->tile_rows;
104 const int still_picture = seq_params->still_picture;
105 const double min_cr =
106 av1_get_min_cr_for_level(target_level, tier, still_picture);
107 rc_cfg->min_cr = AOMMAX(rc_cfg->min_cr, (
unsigned int)(min_cr * 100));
110#if !CONFIG_REALTIME_ONLY
129 int low_limit,
int q,
int maxq,
132 const AV1EncoderConfig *
const oxcf = &cpi->oxcf;
133 const int frame_is_kfgfarf = frame_is_kf_gf_arf(cpi);
134 int force_recode = 0;
137 (cpi->sf.hl_sf.recode_loop == ALLOW_RECODE) ||
139 (cpi->sf.hl_sf.recode_loop == ALLOW_RECODE_KFARFGF))) {
144 }
else if (cpi->oxcf.rc_cfg.mode ==
AOM_CQ) {
147 if (q > oxcf->rc_cfg.cq_level &&
156static AOM_INLINE
double av1_get_gfu_boost_projection_factor(
double min_factor,
159 double factor = sqrt((
double)frame_count);
160 factor = AOMMIN(factor, max_factor);
161 factor = AOMMAX(factor, min_factor);
162 factor = (200.0 + 10.0 * factor);
166static AOM_INLINE
int get_gfu_boost_from_r0_lap(
double min_factor,
167 double max_factor,
double r0,
169 double factor = av1_get_gfu_boost_projection_factor(min_factor, max_factor,
171 const int boost = (int)rint(factor / r0);
175static AOM_INLINE
double av1_get_kf_boost_projection_factor(
int frame_count) {
176 double factor = sqrt((
double)frame_count);
177 factor = AOMMIN(factor, 10.0);
178 factor = AOMMAX(factor, 4.0);
179 factor = (75.0 + 14.0 * factor);
183static AOM_INLINE
int get_regulated_q_overshoot(AV1_COMP *
const cpi,
184#
if CONFIG_FRAME_PARALLEL_ENCODE
187 int q_low,
int q_high,
194#
if CONFIG_FRAME_PARALLEL_ENCODE
204 while (q_regulated < q_low && retries < 10) {
206#
if CONFIG_FRAME_PARALLEL_ENCODE
218static AOM_INLINE
int get_regulated_q_undershoot(AV1_COMP *
const cpi,
219#
if CONFIG_FRAME_PARALLEL_ENCODE
222 int q_high,
int top_index,
228#
if CONFIG_FRAME_PARALLEL_ENCODE
236 while (q_regulated > q_high && retries < 10) {
238#
if CONFIG_FRAME_PARALLEL_ENCODE
272 AV1_COMP *
const cpi,
int *
const loop,
int *
const q,
int *
const q_low,
273 int *
const q_high,
const int top_index,
const int bottom_index,
274 int *
const undershoot_seen,
int *
const overshoot_seen,
275 int *
const low_cr_seen,
const int loop_count) {
279 const RateControlCfg *
const rc_cfg = &cpi->oxcf.rc_cfg;
283 if (rc->is_src_frame_alt_ref &&
287 const int min_cr = rc_cfg->min_cr;
289 const double compression_ratio =
291 const double target_cr = min_cr / 100.0;
292 if (compression_ratio < target_cr) {
294 if (*q < rc->worst_quality) {
295 const double cr_ratio = target_cr / compression_ratio;
296 const int projected_q = AOMMAX(*q + 1, (
int)(*q * cr_ratio * cr_ratio));
297 *q = AOMMIN(AOMMIN(projected_q, *q + 32), rc->
worst_quality);
298 *q_low = AOMMAX(*q, *q_low);
299 *q_high = AOMMAX(*q, *q_high);
303 if (*low_cr_seen)
return;
306 if (rc_cfg->mode ==
AOM_Q)
return;
308 const int last_q = *q;
309 int frame_over_shoot_limit = 0, frame_under_shoot_limit = 0;
311 &frame_under_shoot_limit,
312 &frame_over_shoot_limit);
313 if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
316 p_rc->this_key_frame_forced &&
319 const int64_t high_err_target = cpi->ambient_err;
320 const int64_t low_err_target = cpi->ambient_err >> 1;
322#if CONFIG_AV1_HIGHBITDEPTH
324 kf_err = aom_highbd_get_y_sse(cpi->source, &cm->
cur_frame->buf);
326 kf_err = aom_get_y_sse(cpi->source, &cm->
cur_frame->buf);
329 kf_err = aom_get_y_sse(cpi->source, &cm->
cur_frame->buf);
336 if ((kf_err > high_err_target &&
338 (kf_err > low_err_target &&
341 *q_high = AOMMAX(*q - 1, *q_low);
344 *q = (int)((*q * high_err_target) / kf_err);
345 *q = AOMMIN(*q, (*q_high + *q_low) >> 1);
346 }
else if (kf_err < low_err_target &&
350 *q_low = AOMMIN(*q + 1, *q_high);
353 *q = (int)((*q * low_err_target) / kf_err);
354 *q = AOMMIN(*q, (*q_high + *q_low + 1) >> 1);
358 *q = clamp(*q, *q_low, *q_high);
359 *loop = (*q != last_q);
363 if (
recode_loop_test(cpi, frame_over_shoot_limit, frame_under_shoot_limit, *q,
364 AOMMAX(*q_high, top_index), bottom_index)) {
375 const double q_val_high_current =
376 av1_convert_qindex_to_q(*q_high, cm->
seq_params->bit_depth);
377 const double q_val_high_new =
380 *q_high = av1_find_qindex(q_val_high_new, cm->
seq_params->bit_depth,
385 *q_low = AOMMIN(*q + 1, *q_high);
387 if (*undershoot_seen || loop_count > 2 ||
388 (loop_count == 2 && !frame_is_intra_only(cm))) {
390#
if CONFIG_FRAME_PARALLEL_ENCODE
395 *q = (*q_high + *q_low + 1) / 2;
396 }
else if (loop_count == 2 && frame_is_intra_only(cm)) {
397 const int q_mid = (*q_high + *q_low + 1) / 2;
398 const int q_regulated =
399 get_regulated_q_overshoot(cpi,
400#
if CONFIG_FRAME_PARALLEL_ENCODE
403 *q_low, *q_high, top_index, bottom_index);
406 *q = (q_mid + q_regulated + 1) / 2;
409 get_regulated_q_overshoot(cpi,
410#
if CONFIG_FRAME_PARALLEL_ENCODE
413 *q_low, *q_high, top_index, bottom_index);
419 *q_high = AOMMAX(*q - 1, *q_low);
421 if (*overshoot_seen || loop_count > 2 ||
422 (loop_count == 2 && !frame_is_intra_only(cm))) {
424#
if CONFIG_FRAME_PARALLEL_ENCODE
428 *q = (*q_high + *q_low) / 2;
429 }
else if (loop_count == 2 && frame_is_intra_only(cm)) {
430 const int q_mid = (*q_high + *q_low) / 2;
431 const int q_regulated =
432 get_regulated_q_undershoot(cpi,
433#
if CONFIG_FRAME_PARALLEL_ENCODE
436 *q_high, top_index, bottom_index);
439 *q = (q_mid + q_regulated) / 2;
445 if (rc_cfg->mode ==
AOM_CQ && q_regulated < *q_low) {
449 *q = get_regulated_q_undershoot(cpi,
450#
if CONFIG_FRAME_PARALLEL_ENCODE
453 *q_high, top_index, bottom_index);
459 if (rc_cfg->mode ==
AOM_CQ && *q < *q_low) {
464 *undershoot_seen = 1;
468 *q = clamp(*q, *q_low, *q_high);
471 *loop = (*q != last_q);
Declares top-level encoder structures and functions.
@ AOM_CQ
Definition aom_encoder.h:177
@ AOM_Q
Definition aom_encoder.h:178
static int recode_loop_test(AV1_COMP *cpi, int high_limit, int low_limit, int q, int maxq, int minq)
Function to test for conditions that indicate we should loop back and recode a frame.
Definition rc_utils.h:128
static void recode_loop_update_q(AV1_COMP *const cpi, int *const loop, int *const q, int *const q_low, int *const q_high, const int top_index, const int bottom_index, int *const undershoot_seen, int *const overshoot_seen, int *const low_cr_seen, const int loop_count)
Called after encode_with_recode_loop() has just encoded a frame. This function works out whether we u...
Definition rc_utils.h:271
void av1_rc_update_rate_correction_factors(AV1_COMP *cpi, int width, int height)
Updates the rate correction factor linking Q to output bits.
Definition ratectrl.c:624
Top level common structure used by both encoder and decoder.
Definition av1_common_int.h:751
SequenceHeader * seq_params
Definition av1_common_int.h:977
int width
Definition av1_common_int.h:776
RefCntBuffer * cur_frame
Definition av1_common_int.h:833
CurrentFrame current_frame
Definition av1_common_int.h:755
int height
Definition av1_common_int.h:777
The stucture of acummulated frame stats in the first pass.
Definition firstpass.h:41
double duration
Definition firstpass.h:142
Primary Rate Control parameters and status.
Definition ratectrl.h:237
int64_t bits_off_target
Definition ratectrl.h:394
int64_t maximum_buffer_size
Definition ratectrl.h:294
int64_t starting_buffer_level
Definition ratectrl.h:284
int64_t buffer_level
Definition ratectrl.h:373
int64_t optimal_buffer_level
Definition ratectrl.h:289
Rate Control parameters and status.
Definition ratectrl.h:118
int best_quality
Definition ratectrl.h:199
int this_frame_target
Definition ratectrl.h:129
int projected_frame_size
Definition ratectrl.h:134
int worst_quality
Definition ratectrl.h:195
Two pass status and control data.
Definition firstpass.h:412