ratectrl.c (171816B)
1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include <assert.h> 13 #include <limits.h> 14 #include <math.h> 15 #include <stdint.h> 16 #include <stdio.h> 17 #include <stdlib.h> 18 #include <string.h> 19 20 #include "aom_dsp/aom_dsp_common.h" 21 #include "aom_mem/aom_mem.h" 22 #include "aom_ports/mem.h" 23 #include "aom_ports/aom_once.h" 24 25 #include "av1/common/alloccommon.h" 26 #include "av1/encoder/aq_cyclicrefresh.h" 27 #include "av1/common/common.h" 28 #include "av1/common/entropymode.h" 29 #include "av1/common/quant_common.h" 30 #include "av1/common/seg_common.h" 31 32 #include "av1/encoder/encodemv.h" 33 #include "av1/encoder/encoder_utils.h" 34 #include "av1/encoder/encode_strategy.h" 35 #include "av1/encoder/gop_structure.h" 36 #include "av1/encoder/mcomp.h" 37 #include "av1/encoder/random.h" 38 #include "av1/encoder/ratectrl.h" 39 40 #include "config/aom_dsp_rtcd.h" 41 42 #define USE_UNRESTRICTED_Q_IN_CQ_MODE 0 43 44 // Max rate target for 1080P and below encodes under normal circumstances 45 // (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB 46 #define MAX_MB_RATE 250 47 #define MAXRATE_1080P 2025000 48 49 #define MIN_BPB_FACTOR 0.005 50 #define MAX_BPB_FACTOR 50 51 52 #define SUPERRES_QADJ_PER_DENOM_KEYFRAME_SOLO 0 53 #define SUPERRES_QADJ_PER_DENOM_KEYFRAME 2 54 #define SUPERRES_QADJ_PER_DENOM_ARFFRAME 0 55 56 #define FRAME_OVERHEAD_BITS 200 57 #define ASSIGN_MINQ_TABLE(bit_depth, name) \ 58 do { \ 59 switch (bit_depth) { \ 60 case AOM_BITS_8: name = name##_8; break; \ 61 case AOM_BITS_10: name = name##_10; break; \ 62 case AOM_BITS_12: name = name##_12; break; \ 63 default: \ 64 assert(0 && \ 65 "bit_depth should be AOM_BITS_8, AOM_BITS_10" \ 66 " or AOM_BITS_12"); \ 67 name = NULL; \ 68 } \ 69 } while (0) 70 71 // Tables relating active max Q to active min Q 72 static int kf_low_motion_minq_8[QINDEX_RANGE]; 73 static int kf_high_motion_minq_8[QINDEX_RANGE]; 74 static int arfgf_low_motion_minq_8[QINDEX_RANGE]; 75 static int arfgf_high_motion_minq_8[QINDEX_RANGE]; 76 static int inter_minq_8[QINDEX_RANGE]; 77 static int rtc_minq_8[QINDEX_RANGE]; 78 79 static int kf_low_motion_minq_10[QINDEX_RANGE]; 80 static int kf_high_motion_minq_10[QINDEX_RANGE]; 81 static int arfgf_low_motion_minq_10[QINDEX_RANGE]; 82 static int arfgf_high_motion_minq_10[QINDEX_RANGE]; 83 static int inter_minq_10[QINDEX_RANGE]; 84 static int rtc_minq_10[QINDEX_RANGE]; 85 static int kf_low_motion_minq_12[QINDEX_RANGE]; 86 static int kf_high_motion_minq_12[QINDEX_RANGE]; 87 static int arfgf_low_motion_minq_12[QINDEX_RANGE]; 88 static int arfgf_high_motion_minq_12[QINDEX_RANGE]; 89 static int inter_minq_12[QINDEX_RANGE]; 90 static int rtc_minq_12[QINDEX_RANGE]; 91 92 static int gf_high = 2400; 93 static int gf_low = 300; 94 #ifdef STRICT_RC 95 static int kf_high = 3200; 96 #else 97 static int kf_high = 5000; 98 #endif 99 static int kf_low = 400; 100 101 // How many times less pixels there are to encode given the current scaling. 102 // Temporary replacement for rcf_mult and rate_thresh_mult. 103 static double resize_rate_factor(const FrameDimensionCfg *const frm_dim_cfg, 104 int width, int height) { 105 return (double)(frm_dim_cfg->width * frm_dim_cfg->height) / (width * height); 106 } 107 108 // Functions to compute the active minq lookup table entries based on a 109 // formulaic approach to facilitate easier adjustment of the Q tables. 110 // The formulae were derived from computing a 3rd order polynomial best 111 // fit to the original data (after plotting real maxq vs minq (not q index)) 112 static int get_minq_index(double maxq, double x3, double x2, double x1, 113 aom_bit_depth_t bit_depth) { 114 const double minqtarget = AOMMIN(((x3 * maxq + x2) * maxq + x1) * maxq, maxq); 115 116 // Special case handling to deal with the step from q2.0 117 // down to lossless mode represented by q 1.0. 118 if (minqtarget <= 2.0) return 0; 119 120 return av1_find_qindex(minqtarget, bit_depth, 0, QINDEX_RANGE - 1); 121 } 122 123 static void init_minq_luts(int *kf_low_m, int *kf_high_m, int *arfgf_low, 124 int *arfgf_high, int *inter, int *rtc, 125 aom_bit_depth_t bit_depth) { 126 int i; 127 for (i = 0; i < QINDEX_RANGE; i++) { 128 const double maxq = av1_convert_qindex_to_q(i, bit_depth); 129 kf_low_m[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.150, bit_depth); 130 kf_high_m[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.45, bit_depth); 131 arfgf_low[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.30, bit_depth); 132 arfgf_high[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55, bit_depth); 133 inter[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.90, bit_depth); 134 rtc[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth); 135 } 136 } 137 138 static void rc_init_minq_luts(void) { 139 init_minq_luts(kf_low_motion_minq_8, kf_high_motion_minq_8, 140 arfgf_low_motion_minq_8, arfgf_high_motion_minq_8, 141 inter_minq_8, rtc_minq_8, AOM_BITS_8); 142 init_minq_luts(kf_low_motion_minq_10, kf_high_motion_minq_10, 143 arfgf_low_motion_minq_10, arfgf_high_motion_minq_10, 144 inter_minq_10, rtc_minq_10, AOM_BITS_10); 145 init_minq_luts(kf_low_motion_minq_12, kf_high_motion_minq_12, 146 arfgf_low_motion_minq_12, arfgf_high_motion_minq_12, 147 inter_minq_12, rtc_minq_12, AOM_BITS_12); 148 } 149 150 void av1_rc_init_minq_luts(void) { aom_once(rc_init_minq_luts); } 151 152 // These functions use formulaic calculations to make playing with the 153 // quantizer tables easier. If necessary they can be replaced by lookup 154 // tables if and when things settle down in the experimental bitstream 155 double av1_convert_qindex_to_q(int qindex, aom_bit_depth_t bit_depth) { 156 // Convert the index to a real Q value (scaled down to match old Q values) 157 switch (bit_depth) { 158 case AOM_BITS_8: return av1_ac_quant_QTX(qindex, 0, bit_depth) / 4.0; 159 case AOM_BITS_10: return av1_ac_quant_QTX(qindex, 0, bit_depth) / 16.0; 160 case AOM_BITS_12: return av1_ac_quant_QTX(qindex, 0, bit_depth) / 64.0; 161 default: 162 assert(0 && "bit_depth should be AOM_BITS_8, AOM_BITS_10 or AOM_BITS_12"); 163 return -1.0; 164 } 165 } 166 167 int av1_convert_q_to_qindex(double q, aom_bit_depth_t bit_depth) { 168 int qindex = MINQ; 169 170 // Find the first qindex that matches or exceeds q. 171 // Note: this operation can also be done with a binary search, as 172 // av1_convert_qindex_to_q() is monotonically increasing with respect to 173 // increasing qindex. 174 while (qindex < MAXQ && av1_convert_qindex_to_q(qindex, bit_depth) < q) { 175 qindex++; 176 } 177 178 return qindex; 179 } 180 181 // Gets the appropriate bpmb enumerator based on the frame and content type 182 static int get_bpmb_enumerator(FRAME_TYPE frame_type, 183 const int is_screen_content_type) { 184 int enumerator; 185 186 if (is_screen_content_type) { 187 enumerator = (frame_type == KEY_FRAME) ? 1000000 : 750000; 188 } else { 189 enumerator = (frame_type == KEY_FRAME) ? 2000000 : 1500000; 190 } 191 192 return enumerator; 193 } 194 195 static int get_init_ratio(double sse) { return (int)(300000 / sse); } 196 197 // Adjustment based on spatial content and last encoded keyframe. 198 // Allow for increase in enumerator to reduce overshoot. 199 static int adjust_rtc_keyframe(const RATE_CONTROL *rc, int enumerator) { 200 // Don't adjust if most of the image is flat. 201 if (rc->perc_spatial_flat_blocks > 70) return enumerator; 202 if (rc->last_encoded_size_keyframe == 0 || 203 rc->frames_since_scene_change < rc->frames_since_key) { 204 // Very first frame, or if scene change happened after last keyframe. 205 if (rc->frame_spatial_variance > 1000 || 206 (rc->frame_spatial_variance > 500 && rc->perc_spatial_flat_blocks == 0)) 207 return enumerator << 3; 208 else if (rc->frame_spatial_variance > 500 && 209 rc->perc_spatial_flat_blocks < 10) 210 return enumerator << 2; 211 else if (rc->frame_spatial_variance > 400) 212 return enumerator << 1; 213 } else if (rc->frames_since_scene_change >= rc->frames_since_key) { 214 // There was no scene change before previous encoded keyframe, so 215 // use the last_encoded/target_size_keyframe. 216 if (rc->last_encoded_size_keyframe > 4 * rc->last_target_size_keyframe && 217 rc->frame_spatial_variance > 500) 218 return enumerator << 3; 219 else if (rc->last_encoded_size_keyframe > 220 2 * rc->last_target_size_keyframe && 221 rc->frame_spatial_variance > 200) 222 return enumerator << 2; 223 else if (rc->last_encoded_size_keyframe > rc->last_target_size_keyframe) 224 return enumerator << 1; 225 } 226 return enumerator; 227 } 228 229 int av1_rc_bits_per_mb(const AV1_COMP *cpi, FRAME_TYPE frame_type, int qindex, 230 double correction_factor, int accurate_estimate) { 231 const AV1_COMMON *const cm = &cpi->common; 232 const int is_screen_content_type = cpi->is_screen_content_type; 233 const aom_bit_depth_t bit_depth = cm->seq_params->bit_depth; 234 const double q = av1_convert_qindex_to_q(qindex, bit_depth); 235 int enumerator = get_bpmb_enumerator(frame_type, is_screen_content_type); 236 237 assert(correction_factor <= MAX_BPB_FACTOR && 238 correction_factor >= MIN_BPB_FACTOR); 239 240 if (cpi->oxcf.rc_cfg.mode == AOM_CBR && frame_type != KEY_FRAME && 241 accurate_estimate && cpi->rec_sse != UINT64_MAX) { 242 const int mbs = cm->mi_params.MBs; 243 const double sse_sqrt = 244 (double)((int)sqrt((double)(cpi->rec_sse)) << BPER_MB_NORMBITS) / 245 (double)mbs; 246 const int ratio = (cpi->rc.bit_est_ratio == 0) ? get_init_ratio(sse_sqrt) 247 : cpi->rc.bit_est_ratio; 248 // Clamp the enumerator to lower the q fluctuations. 249 enumerator = clamp((int)(ratio * sse_sqrt), 20000, 170000); 250 } else if (cpi->oxcf.rc_cfg.mode == AOM_CBR && frame_type == KEY_FRAME && 251 cpi->sf.rt_sf.rc_adjust_keyframe && bit_depth == 8 && 252 cpi->oxcf.rc_cfg.max_intra_bitrate_pct > 0 && 253 cpi->svc.spatial_layer_id == 0) { 254 enumerator = adjust_rtc_keyframe(&cpi->rc, enumerator); 255 } 256 // q based adjustment to baseline enumerator 257 return (int)(enumerator * correction_factor / q); 258 } 259 260 int av1_estimate_bits_at_q(const AV1_COMP *cpi, int q, 261 double correction_factor) { 262 const AV1_COMMON *const cm = &cpi->common; 263 const FRAME_TYPE frame_type = cm->current_frame.frame_type; 264 const int mbs = cm->mi_params.MBs; 265 const int bpm = 266 (int)(av1_rc_bits_per_mb(cpi, frame_type, q, correction_factor, 267 cpi->sf.hl_sf.accurate_bit_estimate)); 268 return AOMMAX(FRAME_OVERHEAD_BITS, 269 (int)((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS); 270 } 271 272 static int clamp_pframe_target_size(const AV1_COMP *const cpi, int64_t target, 273 FRAME_UPDATE_TYPE frame_update_type) { 274 const RATE_CONTROL *rc = &cpi->rc; 275 const RateControlCfg *const rc_cfg = &cpi->oxcf.rc_cfg; 276 const int min_frame_target = 277 AOMMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5); 278 // Clip the frame target to the minimum setup value. 279 if (frame_update_type == OVERLAY_UPDATE || 280 frame_update_type == INTNL_OVERLAY_UPDATE) { 281 // If there is an active ARF at this location use the minimum 282 // bits on this frame even if it is a constructed arf. 283 // The active maximum quantizer insures that an appropriate 284 // number of bits will be spent if needed for constructed ARFs. 285 target = min_frame_target; 286 } else if (target < min_frame_target) { 287 target = min_frame_target; 288 } 289 290 // Clip the frame target to the maximum allowed value. 291 if (target > rc->max_frame_bandwidth) target = rc->max_frame_bandwidth; 292 if (rc_cfg->max_inter_bitrate_pct) { 293 const int64_t max_rate = 294 (int64_t)rc->avg_frame_bandwidth * rc_cfg->max_inter_bitrate_pct / 100; 295 target = AOMMIN(target, max_rate); 296 } 297 298 return (int)target; 299 } 300 301 static int clamp_iframe_target_size(const AV1_COMP *const cpi, int64_t target) { 302 const RATE_CONTROL *rc = &cpi->rc; 303 const RateControlCfg *const rc_cfg = &cpi->oxcf.rc_cfg; 304 if (rc_cfg->max_intra_bitrate_pct) { 305 const int64_t max_rate = 306 (int64_t)rc->avg_frame_bandwidth * rc_cfg->max_intra_bitrate_pct / 100; 307 target = AOMMIN(target, max_rate); 308 } 309 if (target > rc->max_frame_bandwidth) target = rc->max_frame_bandwidth; 310 return (int)target; 311 } 312 313 // Update the buffer level for higher temporal layers, given the encoded current 314 // temporal layer. 315 static void update_layer_buffer_level(SVC *svc, int encoded_frame_size, 316 bool is_screen) { 317 const int current_temporal_layer = svc->temporal_layer_id; 318 for (int i = current_temporal_layer + 1; i < svc->number_temporal_layers; 319 ++i) { 320 const int layer = 321 LAYER_IDS_TO_IDX(svc->spatial_layer_id, i, svc->number_temporal_layers); 322 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 323 PRIMARY_RATE_CONTROL *lp_rc = &lc->p_rc; 324 lp_rc->bits_off_target += 325 (int)round(lc->target_bandwidth / lc->framerate) - encoded_frame_size; 326 // Clip buffer level to maximum buffer size for the layer. 327 lp_rc->bits_off_target = 328 AOMMIN(lp_rc->bits_off_target, lp_rc->maximum_buffer_size); 329 lp_rc->buffer_level = lp_rc->bits_off_target; 330 331 // For screen-content mode: don't let buffer level go below threshold, 332 // given here as -rc->maximum_ buffer_size, to allow buffer to come back 333 // up sooner after slide change with big overshoot. 334 if (is_screen) { 335 lp_rc->bits_off_target = 336 AOMMAX(lp_rc->bits_off_target, -lp_rc->maximum_buffer_size); 337 lp_rc->buffer_level = lp_rc->bits_off_target; 338 } 339 } 340 } 341 // Update the buffer level: leaky bucket model. 342 static void update_buffer_level(AV1_COMP *cpi, int encoded_frame_size) { 343 const AV1_COMMON *const cm = &cpi->common; 344 RATE_CONTROL *const rc = &cpi->rc; 345 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 346 347 // Non-viewable frames are a special case and are treated as pure overhead. 348 if (!cm->show_frame) 349 p_rc->bits_off_target -= encoded_frame_size; 350 else 351 p_rc->bits_off_target += rc->avg_frame_bandwidth - encoded_frame_size; 352 353 // Clip the buffer level to the maximum specified buffer size. 354 p_rc->bits_off_target = 355 AOMMIN(p_rc->bits_off_target, p_rc->maximum_buffer_size); 356 // For screen-content mode: don't let buffer level go below threshold, 357 // given here as -rc->maximum_ buffer_size, to allow buffer to come back 358 // up sooner after slide change with big overshoot. 359 if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) 360 p_rc->bits_off_target = 361 AOMMAX(p_rc->bits_off_target, -p_rc->maximum_buffer_size); 362 p_rc->buffer_level = p_rc->bits_off_target; 363 364 if (cpi->ppi->use_svc) 365 update_layer_buffer_level(&cpi->svc, encoded_frame_size, 366 cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN); 367 368 #if CONFIG_FPMT_TEST 369 /* The variable temp_buffer_level is introduced for quality 370 * simulation purpose, it retains the value previous to the parallel 371 * encode frames. The variable is updated based on the update flag. 372 * 373 * If there exist show_existing_frames between parallel frames, then to 374 * retain the temp state do not update it. */ 375 int show_existing_between_parallel_frames = 376 (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == 377 INTNL_OVERLAY_UPDATE && 378 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index + 1] == 2); 379 380 if (cpi->do_frame_data_update && !show_existing_between_parallel_frames && 381 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE) { 382 p_rc->temp_buffer_level = p_rc->buffer_level; 383 } 384 #endif 385 } 386 387 int av1_rc_get_default_min_gf_interval(int width, int height, 388 double framerate) { 389 // Assume we do not need any constraint lower than 4K 20 fps 390 static const double factor_safe = 3840 * 2160 * 20.0; 391 const double factor = (double)width * height * framerate; 392 const int default_interval = 393 clamp((int)(framerate * 0.125), MIN_GF_INTERVAL, MAX_GF_INTERVAL); 394 395 if (factor <= factor_safe) 396 return default_interval; 397 else 398 return AOMMAX(default_interval, 399 (int)(MIN_GF_INTERVAL * factor / factor_safe + 0.5)); 400 // Note this logic makes: 401 // 4K24: 5 402 // 4K30: 6 403 // 4K60: 12 404 } 405 406 // Note get_default_max_gf_interval() requires the min_gf_interval to 407 // be passed in to ensure that the max_gf_interval returned is at least as big 408 // as that. 409 static int get_default_max_gf_interval(double framerate, int min_gf_interval) { 410 int interval = AOMMIN(MAX_GF_INTERVAL, (int)(framerate * 0.75)); 411 interval += (interval & 0x01); // Round to even value 412 interval = AOMMAX(MAX_GF_INTERVAL, interval); 413 return AOMMAX(interval, min_gf_interval); 414 } 415 416 void av1_primary_rc_init(const AV1EncoderConfig *oxcf, 417 PRIMARY_RATE_CONTROL *p_rc) { 418 const RateControlCfg *const rc_cfg = &oxcf->rc_cfg; 419 420 int worst_allowed_q = rc_cfg->worst_allowed_q; 421 422 int min_gf_interval = oxcf->gf_cfg.min_gf_interval; 423 int max_gf_interval = oxcf->gf_cfg.max_gf_interval; 424 if (min_gf_interval == 0) 425 min_gf_interval = av1_rc_get_default_min_gf_interval( 426 oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height, 427 oxcf->input_cfg.init_framerate); 428 if (max_gf_interval == 0) 429 max_gf_interval = get_default_max_gf_interval( 430 oxcf->input_cfg.init_framerate, min_gf_interval); 431 p_rc->baseline_gf_interval = (min_gf_interval + max_gf_interval) / 2; 432 p_rc->this_key_frame_forced = 0; 433 p_rc->next_key_frame_forced = 0; 434 p_rc->ni_frames = 0; 435 436 p_rc->tot_q = 0.0; 437 p_rc->total_actual_bits = 0; 438 p_rc->total_target_bits = 0; 439 p_rc->buffer_level = p_rc->starting_buffer_level; 440 441 if (oxcf->target_seq_level_idx[0] < SEQ_LEVELS) { 442 worst_allowed_q = 255; 443 } 444 if (oxcf->pass == AOM_RC_ONE_PASS && rc_cfg->mode == AOM_CBR) { 445 p_rc->avg_frame_qindex[KEY_FRAME] = worst_allowed_q; 446 p_rc->avg_frame_qindex[INTER_FRAME] = worst_allowed_q; 447 } else { 448 p_rc->avg_frame_qindex[KEY_FRAME] = 449 (worst_allowed_q + rc_cfg->best_allowed_q) / 2; 450 p_rc->avg_frame_qindex[INTER_FRAME] = 451 (worst_allowed_q + rc_cfg->best_allowed_q) / 2; 452 } 453 p_rc->avg_q = av1_convert_qindex_to_q(rc_cfg->worst_allowed_q, 454 oxcf->tool_cfg.bit_depth); 455 p_rc->last_q[KEY_FRAME] = rc_cfg->best_allowed_q; 456 p_rc->last_q[INTER_FRAME] = rc_cfg->worst_allowed_q; 457 458 for (int i = 0; i < RATE_FACTOR_LEVELS; ++i) { 459 p_rc->rate_correction_factors[i] = 0.7; 460 } 461 p_rc->rate_correction_factors[KF_STD] = 1.0; 462 p_rc->bits_off_target = p_rc->starting_buffer_level; 463 464 p_rc->rolling_target_bits = AOMMAX( 465 1, (int)(oxcf->rc_cfg.target_bandwidth / oxcf->input_cfg.init_framerate)); 466 p_rc->rolling_actual_bits = AOMMAX( 467 1, (int)(oxcf->rc_cfg.target_bandwidth / oxcf->input_cfg.init_framerate)); 468 } 469 470 void av1_rc_init(const AV1EncoderConfig *oxcf, RATE_CONTROL *rc) { 471 const RateControlCfg *const rc_cfg = &oxcf->rc_cfg; 472 473 rc->frames_since_key = 8; // Sensible default for first frame. 474 rc->frames_to_fwd_kf = oxcf->kf_cfg.fwd_kf_dist; 475 476 rc->frames_till_gf_update_due = 0; 477 rc->ni_av_qi = rc_cfg->worst_allowed_q; 478 rc->ni_tot_qi = 0; 479 480 rc->min_gf_interval = oxcf->gf_cfg.min_gf_interval; 481 rc->max_gf_interval = oxcf->gf_cfg.max_gf_interval; 482 if (rc->min_gf_interval == 0) 483 rc->min_gf_interval = av1_rc_get_default_min_gf_interval( 484 oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height, 485 oxcf->input_cfg.init_framerate); 486 if (rc->max_gf_interval == 0) 487 rc->max_gf_interval = get_default_max_gf_interval( 488 oxcf->input_cfg.init_framerate, rc->min_gf_interval); 489 rc->avg_frame_low_motion = 0; 490 491 rc->resize_state = ORIG; 492 rc->resize_avg_qp = 0; 493 rc->resize_buffer_underflow = 0; 494 rc->resize_count = 0; 495 rc->rtc_external_ratectrl = 0; 496 rc->frame_level_fast_extra_bits = 0; 497 rc->use_external_qp_one_pass = 0; 498 rc->percent_blocks_inactive = 0; 499 rc->force_max_q = 0; 500 rc->postencode_drop = 0; 501 rc->frames_since_scene_change = 0; 502 } 503 504 static bool check_buffer_below_thresh(AV1_COMP *cpi, int64_t buffer_level, 505 int drop_mark) { 506 SVC *svc = &cpi->svc; 507 if (!cpi->ppi->use_svc || cpi->svc.number_spatial_layers == 1 || 508 cpi->svc.framedrop_mode == AOM_LAYER_DROP) { 509 return (buffer_level <= drop_mark); 510 } else { 511 // For SVC in the AOM_FULL_SUPERFRAME_DROP): the condition on 512 // buffer is checked on current and upper spatial layers. 513 for (int i = svc->spatial_layer_id; i < svc->number_spatial_layers; ++i) { 514 const int layer = LAYER_IDS_TO_IDX(i, svc->temporal_layer_id, 515 svc->number_temporal_layers); 516 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 517 PRIMARY_RATE_CONTROL *lrc = &lc->p_rc; 518 // Exclude check for layer whose bitrate is 0. 519 if (lc->target_bandwidth > 0) { 520 const int drop_thresh = cpi->oxcf.rc_cfg.drop_frames_water_mark; 521 const int drop_mark_layer = 522 (int)(drop_thresh * lrc->optimal_buffer_level / 100); 523 if (lrc->buffer_level <= drop_mark_layer) return true; 524 } 525 } 526 return false; 527 } 528 } 529 530 int av1_rc_drop_frame(AV1_COMP *cpi) { 531 const AV1EncoderConfig *oxcf = &cpi->oxcf; 532 RATE_CONTROL *const rc = &cpi->rc; 533 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 534 #if CONFIG_FPMT_TEST 535 const int simulate_parallel_frame = 536 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 537 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 538 int64_t buffer_level = 539 simulate_parallel_frame ? p_rc->temp_buffer_level : p_rc->buffer_level; 540 #else 541 int64_t buffer_level = p_rc->buffer_level; 542 #endif 543 // Never drop on key frame, or for frame whose base layer is key. 544 // If drop_count_consec hits or exceeds max_consec_drop then don't drop. 545 if (cpi->common.current_frame.frame_type == KEY_FRAME || 546 (cpi->ppi->use_svc && 547 cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame) || 548 !oxcf->rc_cfg.drop_frames_water_mark || 549 (rc->max_consec_drop > 0 && 550 rc->drop_count_consec >= rc->max_consec_drop)) { 551 return 0; 552 } else { 553 SVC *svc = &cpi->svc; 554 // In the full_superframe framedrop mode for svc, if the previous spatial 555 // layer was dropped, drop the current spatial layer. 556 if (cpi->ppi->use_svc && svc->spatial_layer_id > 0 && 557 svc->drop_spatial_layer[svc->spatial_layer_id - 1] && 558 svc->framedrop_mode == AOM_FULL_SUPERFRAME_DROP) 559 return 1; 560 // -1 is passed here for drop_mark since we are checking if 561 // buffer goes below 0 (<= -1). 562 if (check_buffer_below_thresh(cpi, buffer_level, -1)) { 563 // Always drop if buffer is below 0. 564 rc->drop_count_consec++; 565 return 1; 566 } else { 567 // If buffer is below drop_mark, for now just drop every other frame 568 // (starting with the next frame) until it increases back over drop_mark. 569 const int drop_mark = (int)(oxcf->rc_cfg.drop_frames_water_mark * 570 p_rc->optimal_buffer_level / 100); 571 const bool buffer_below_thresh = 572 check_buffer_below_thresh(cpi, buffer_level, drop_mark); 573 if (!buffer_below_thresh && rc->decimation_factor > 0) { 574 --rc->decimation_factor; 575 } else if (buffer_below_thresh && rc->decimation_factor == 0) { 576 rc->decimation_factor = 1; 577 } 578 if (rc->decimation_factor > 0) { 579 if (rc->decimation_count > 0) { 580 --rc->decimation_count; 581 rc->drop_count_consec++; 582 return 1; 583 } else { 584 rc->decimation_count = rc->decimation_factor; 585 return 0; 586 } 587 } else { 588 rc->decimation_count = 0; 589 return 0; 590 } 591 } 592 } 593 } 594 595 static int adjust_q_cbr(const AV1_COMP *cpi, int q, int active_worst_quality, 596 int width, int height) { 597 const RATE_CONTROL *const rc = &cpi->rc; 598 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 599 const AV1_COMMON *const cm = &cpi->common; 600 const SVC *const svc = &cpi->svc; 601 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 602 // Flag to indicate previous frame has overshoot, and buffer level 603 // for current frame is low (less than ~half of optimal). For such 604 // (inter) frames, if the source_sad is non-zero, relax the max_delta_up 605 // and clamp applied below. 606 const bool overshoot_buffer_low = 607 cpi->rc.rc_1_frame == -1 && rc->frame_source_sad > 1000 && 608 p_rc->buffer_level < (p_rc->optimal_buffer_level >> 1) && 609 rc->frames_since_key > 4; 610 int max_delta_down; 611 int max_delta_up = overshoot_buffer_low ? 120 : 20; 612 const int change_avg_frame_bandwidth = 613 abs(rc->avg_frame_bandwidth - rc->prev_avg_frame_bandwidth) > 614 0.1 * (rc->avg_frame_bandwidth); 615 616 // Set the maximum adjustment down for Q for this frame. 617 if (cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && 618 cpi->cyclic_refresh->apply_cyclic_refresh) { 619 // For static screen type content limit the Q drop till the start of the 620 // next refresh cycle. 621 if (cpi->is_screen_content_type && 622 (cpi->cyclic_refresh->sb_index > cpi->cyclic_refresh->last_sb_index)) { 623 max_delta_down = clamp(rc->q_1_frame / 32, 1, 8); 624 } else { 625 max_delta_down = clamp(rc->q_1_frame / 8, 1, 16); 626 } 627 if (!cpi->ppi->use_svc && cpi->is_screen_content_type) { 628 // Link max_delta_up to max_delta_down and buffer status. 629 if (p_rc->buffer_level > p_rc->optimal_buffer_level) { 630 max_delta_up = AOMMAX(4, max_delta_down); 631 } else if (!overshoot_buffer_low) { 632 max_delta_up = AOMMAX(8, max_delta_down); 633 } 634 } 635 } else { 636 max_delta_down = cpi->is_screen_content_type 637 ? clamp(rc->q_1_frame / 16, 1, 8) 638 : clamp(rc->q_1_frame / 8, 1, 16); 639 } 640 // For screen static content with stable buffer level: relax the 641 // limit on max_delta_down and apply bias qp, based on buffer fullness. 642 // Only for high speeds levels for now to avoid bdrate regression. 643 if (cpi->sf.rt_sf.rc_faster_convergence_static == 1 && 644 cpi->sf.rt_sf.check_scene_detection && rc->frame_source_sad == 0 && 645 rc->static_since_last_scene_change && 646 p_rc->buffer_level > (p_rc->optimal_buffer_level >> 1) && 647 cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && 648 cpi->cyclic_refresh->counter_encode_maxq_scene_change > 4) { 649 int qp_delta = 32; 650 int qp_bias = 16; 651 if (p_rc->buffer_level > p_rc->optimal_buffer_level) { 652 qp_delta = 60; 653 qp_bias = 32; 654 } 655 if (cpi->rc.rc_1_frame == 1) q = q - qp_bias; 656 max_delta_down = AOMMAX(max_delta_down, qp_delta); 657 max_delta_up = AOMMIN(max_delta_up, 4); 658 } 659 660 // If resolution changes or avg_frame_bandwidth significantly changed, 661 // then set this flag to indicate change in target bits per macroblock. 662 const int change_target_bits_mb = 663 cm->prev_frame && 664 (width != cm->prev_frame->width || height != cm->prev_frame->height || 665 change_avg_frame_bandwidth); 666 // Apply some control/clamp to QP under certain conditions. 667 // Delay the use of the clamping for svc until after num_temporal_layers, 668 // to make they have been set for each temporal layer. 669 // Check for rc->q_1/2_frame > 0 in case they have not been set due to 670 // dropped frames. 671 if (!frame_is_intra_only(cm) && rc->frames_since_key > 1 && 672 rc->q_1_frame > 0 && rc->q_2_frame > 0 && 673 (!cpi->ppi->use_svc || 674 svc->current_superframe > (unsigned int)svc->number_temporal_layers) && 675 !change_target_bits_mb && !cpi->rc.rtc_external_ratectrl && 676 (!cpi->oxcf.rc_cfg.gf_cbr_boost_pct || 677 !(refresh_frame->alt_ref_frame || refresh_frame->golden_frame))) { 678 // If in the previous two frames we have seen both overshoot and undershoot 679 // clamp Q between the two. 680 if (rc->rc_1_frame * rc->rc_2_frame == -1 && 681 rc->q_1_frame != rc->q_2_frame && !overshoot_buffer_low) { 682 int qclamp = clamp(q, AOMMIN(rc->q_1_frame, rc->q_2_frame), 683 AOMMAX(rc->q_1_frame, rc->q_2_frame)); 684 // If the previous frame had overshoot and the current q needs to 685 // increase above the clamped value, reduce the clamp for faster reaction 686 // to overshoot. 687 if (cpi->rc.rc_1_frame == -1 && q > qclamp && rc->frames_since_key > 10) 688 q = (q + qclamp) >> 1; 689 else 690 q = qclamp; 691 } 692 // Adjust Q base on source content change from scene detection. 693 if (cpi->sf.rt_sf.check_scene_detection && rc->prev_avg_source_sad > 0 && 694 rc->frames_since_key > 10 && rc->frame_source_sad > 0 && 695 !cpi->rc.rtc_external_ratectrl) { 696 const int bit_depth = cm->seq_params->bit_depth; 697 double delta = 698 (double)rc->avg_source_sad / (double)rc->prev_avg_source_sad - 1.0; 699 // Push Q downwards if content change is decreasing and buffer level 700 // is stable (at least 1/4-optimal level), so not overshooting. Do so 701 // only for high Q to avoid excess overshoot. 702 // Else reduce decrease in Q from previous frame if content change is 703 // increasing and buffer is below max (so not undershooting). 704 if (delta < 0.0 && 705 p_rc->buffer_level > (p_rc->optimal_buffer_level >> 2) && 706 q > (rc->worst_quality >> 1)) { 707 double q_adj_factor = 1.0 + 0.5 * tanh(4.0 * delta); 708 double q_val = av1_convert_qindex_to_q(q, bit_depth); 709 q += av1_compute_qdelta(rc, q_val, q_val * q_adj_factor, bit_depth); 710 } else if (rc->q_1_frame - q > 0 && delta > 0.1 && 711 p_rc->buffer_level < AOMMIN(p_rc->maximum_buffer_size, 712 p_rc->optimal_buffer_level << 1)) { 713 q = (3 * q + rc->q_1_frame) >> 2; 714 } 715 } 716 // Limit the decrease in Q from previous frame. 717 if (rc->q_1_frame - q > max_delta_down) q = rc->q_1_frame - max_delta_down; 718 // Limit the increase in Q from previous frame. 719 else if (q - rc->q_1_frame > max_delta_up) 720 q = rc->q_1_frame + max_delta_up; 721 } 722 // Adjustment for temporal layers. 723 if (svc->number_temporal_layers > 1 && svc->spatial_layer_id == 0 && 724 !change_target_bits_mb && !cpi->rc.rtc_external_ratectrl && 725 cpi->oxcf.resize_cfg.resize_mode != RESIZE_DYNAMIC) { 726 if (svc->temporal_layer_id > 0) { 727 // Constrain enhancement relative to the previous base TL0. 728 // Get base temporal layer TL0. 729 const int layer = LAYER_IDS_TO_IDX(0, 0, svc->number_temporal_layers); 730 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 731 // lc->rc.avg_frame_bandwidth and lc->p_rc.last_q correspond to the 732 // last TL0 frame. 733 const int last_qindex_tl0 = 734 rc->frames_since_key < svc->number_temporal_layers 735 ? lc->p_rc.last_q[KEY_FRAME] 736 : lc->p_rc.last_q[INTER_FRAME]; 737 if (rc->avg_frame_bandwidth < lc->rc.avg_frame_bandwidth && 738 q < last_qindex_tl0 - 4) 739 q = last_qindex_tl0 - 4; 740 } else if (cpi->svc.temporal_layer_id == 0 && !frame_is_intra_only(cm) && 741 p_rc->buffer_level > (p_rc->optimal_buffer_level >> 2) && 742 rc->frame_source_sad < 100000) { 743 // Push base TL0 Q down if buffer is stable and frame_source_sad 744 // is below threshold. 745 int delta = (svc->number_temporal_layers == 2) ? 4 : 10; 746 q = q - delta; 747 } 748 } 749 // For non-svc (single layer): if resolution has increased push q closer 750 // to the active_worst to avoid excess overshoot. 751 if (!cpi->ppi->use_svc && cm->prev_frame && 752 (width * height > 1.5 * cm->prev_frame->width * cm->prev_frame->height)) 753 q = (q + active_worst_quality) >> 1; 754 // For single layer RPS: Bias Q based on distance of closest reference. 755 if (cpi->ppi->rtc_ref.bias_recovery_frame) { 756 const int min_dist = av1_svc_get_min_ref_dist(cpi); 757 q = q - AOMMIN(min_dist, 20); 758 } 759 return clamp(q, cpi->rc.best_quality, cpi->rc.worst_quality); 760 } 761 762 static const RATE_FACTOR_LEVEL rate_factor_levels[FRAME_UPDATE_TYPES] = { 763 KF_STD, // KF_UPDATE 764 INTER_NORMAL, // LF_UPDATE 765 GF_ARF_STD, // GF_UPDATE 766 GF_ARF_STD, // ARF_UPDATE 767 INTER_NORMAL, // OVERLAY_UPDATE 768 INTER_NORMAL, // INTNL_OVERLAY_UPDATE 769 GF_ARF_LOW, // INTNL_ARF_UPDATE 770 }; 771 772 static RATE_FACTOR_LEVEL get_rate_factor_level(const GF_GROUP *const gf_group, 773 int gf_frame_index) { 774 const FRAME_UPDATE_TYPE update_type = gf_group->update_type[gf_frame_index]; 775 assert(update_type < FRAME_UPDATE_TYPES); 776 return rate_factor_levels[update_type]; 777 } 778 779 /*!\brief Gets a rate vs Q correction factor 780 * 781 * This function returns the current value of a correction factor used to 782 * dynamically adjust the relationship between Q and the expected number 783 * of bits for the frame. 784 * 785 * \ingroup rate_control 786 * \param[in] cpi Top level encoder instance structure 787 * \param[in] width Frame width 788 * \param[in] height Frame height 789 * 790 * \return Returns a correction factor for the current frame 791 */ 792 static double get_rate_correction_factor(const AV1_COMP *cpi, int width, 793 int height) { 794 const RATE_CONTROL *const rc = &cpi->rc; 795 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 796 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 797 double rcf; 798 double rate_correction_factors_kfstd; 799 double rate_correction_factors_gfarfstd; 800 double rate_correction_factors_internormal; 801 802 rate_correction_factors_kfstd = 803 (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) 804 ? rc->frame_level_rate_correction_factors[KF_STD] 805 : p_rc->rate_correction_factors[KF_STD]; 806 rate_correction_factors_gfarfstd = 807 (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) 808 ? rc->frame_level_rate_correction_factors[GF_ARF_STD] 809 : p_rc->rate_correction_factors[GF_ARF_STD]; 810 rate_correction_factors_internormal = 811 (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) 812 ? rc->frame_level_rate_correction_factors[INTER_NORMAL] 813 : p_rc->rate_correction_factors[INTER_NORMAL]; 814 815 if (cpi->common.current_frame.frame_type == KEY_FRAME) { 816 rcf = rate_correction_factors_kfstd; 817 } else if (is_stat_consumption_stage(cpi)) { 818 const RATE_FACTOR_LEVEL rf_lvl = 819 get_rate_factor_level(&cpi->ppi->gf_group, cpi->gf_frame_index); 820 double rate_correction_factors_rflvl = 821 (cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) 822 ? rc->frame_level_rate_correction_factors[rf_lvl] 823 : p_rc->rate_correction_factors[rf_lvl]; 824 rcf = rate_correction_factors_rflvl; 825 } else { 826 if ((refresh_frame->alt_ref_frame || refresh_frame->golden_frame) && 827 !rc->is_src_frame_alt_ref && !cpi->ppi->use_svc && 828 (cpi->oxcf.rc_cfg.mode != AOM_CBR || 829 cpi->oxcf.rc_cfg.gf_cbr_boost_pct > 20)) 830 rcf = rate_correction_factors_gfarfstd; 831 else 832 rcf = rate_correction_factors_internormal; 833 } 834 rcf *= resize_rate_factor(&cpi->oxcf.frm_dim_cfg, width, height); 835 return fclamp(rcf, MIN_BPB_FACTOR, MAX_BPB_FACTOR); 836 } 837 838 /*!\brief Sets a rate vs Q correction factor 839 * 840 * This function updates the current value of a correction factor used to 841 * dynamically adjust the relationship between Q and the expected number 842 * of bits for the frame. 843 * 844 * \ingroup rate_control 845 * \param[in] cpi Top level encoder instance structure 846 * \param[in] is_encode_stage Indicates if recode loop or post-encode 847 * \param[in] factor New correction factor 848 * \param[in] width Frame width 849 * \param[in] height Frame height 850 * 851 * \remark Updates the rate correction factor for the 852 * current frame type in cpi->rc. 853 */ 854 static void set_rate_correction_factor(AV1_COMP *cpi, int is_encode_stage, 855 double factor, int width, int height) { 856 RATE_CONTROL *const rc = &cpi->rc; 857 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 858 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 859 int update_default_rcf = 1; 860 // Normalize RCF to account for the size-dependent scaling factor. 861 factor /= resize_rate_factor(&cpi->oxcf.frm_dim_cfg, width, height); 862 863 factor = fclamp(factor, MIN_BPB_FACTOR, MAX_BPB_FACTOR); 864 865 if (cpi->common.current_frame.frame_type == KEY_FRAME) { 866 p_rc->rate_correction_factors[KF_STD] = factor; 867 } else if (is_stat_consumption_stage(cpi)) { 868 const RATE_FACTOR_LEVEL rf_lvl = 869 get_rate_factor_level(&cpi->ppi->gf_group, cpi->gf_frame_index); 870 if (is_encode_stage && 871 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) { 872 rc->frame_level_rate_correction_factors[rf_lvl] = factor; 873 update_default_rcf = 0; 874 } 875 if (update_default_rcf) p_rc->rate_correction_factors[rf_lvl] = factor; 876 } else { 877 if ((refresh_frame->alt_ref_frame || refresh_frame->golden_frame) && 878 !rc->is_src_frame_alt_ref && !cpi->ppi->use_svc && 879 (cpi->oxcf.rc_cfg.mode != AOM_CBR || 880 cpi->oxcf.rc_cfg.gf_cbr_boost_pct > 20)) { 881 p_rc->rate_correction_factors[GF_ARF_STD] = factor; 882 } else { 883 if (is_encode_stage && 884 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0) { 885 rc->frame_level_rate_correction_factors[INTER_NORMAL] = factor; 886 update_default_rcf = 0; 887 } 888 if (update_default_rcf) 889 p_rc->rate_correction_factors[INTER_NORMAL] = factor; 890 } 891 } 892 } 893 894 void av1_rc_update_rate_correction_factors(AV1_COMP *cpi, int is_encode_stage, 895 int width, int height) { 896 const AV1_COMMON *const cm = &cpi->common; 897 double correction_factor = 1.0; 898 double rate_correction_factor = 899 get_rate_correction_factor(cpi, width, height); 900 double adjustment_limit; 901 int projected_size_based_on_q = 0; 902 int cyclic_refresh_active = 903 cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && cpi->common.seg.enabled; 904 905 // Do not update the rate factors for arf overlay frames. 906 if (cpi->rc.is_src_frame_alt_ref) return; 907 908 // Don't update rate correction factors here on scene changes as 909 // it is already reset in av1_encodedframe_overshoot_cbr(), 910 // but reset variables related to previous frame q and size. 911 // Note that the counter of frames since the last scene change 912 // is only valid when cyclic refresh mode is enabled and that 913 // this break out only applies to scene changes that are not 914 // recorded as INTRA only key frames. 915 // Note that av1_encodedframe_overshoot_cbr() is only entered 916 // if cpi->sf.rt_sf.overshoot_detection_cbr == FAST_DETECTION_MAXQ 917 // and cpi->rc.high_source_sad = 1. 918 if ((cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ) && 919 (cpi->sf.rt_sf.overshoot_detection_cbr == FAST_DETECTION_MAXQ) && 920 cpi->rc.high_source_sad && 921 (cpi->cyclic_refresh->counter_encode_maxq_scene_change == 0) && 922 !frame_is_intra_only(cm) && !cpi->ppi->use_svc) { 923 cpi->rc.q_2_frame = cm->quant_params.base_qindex; 924 cpi->rc.q_1_frame = cm->quant_params.base_qindex; 925 cpi->rc.rc_2_frame = 0; 926 cpi->rc.rc_1_frame = 0; 927 return; 928 } 929 930 // Clear down mmx registers to allow floating point in what follows 931 932 // Work out how big we would have expected the frame to be at this Q given 933 // the current correction factor. 934 // Stay in double to avoid int overflow when values are large 935 if (cyclic_refresh_active) { 936 projected_size_based_on_q = 937 av1_cyclic_refresh_estimate_bits_at_q(cpi, rate_correction_factor); 938 } else { 939 projected_size_based_on_q = av1_estimate_bits_at_q( 940 cpi, cm->quant_params.base_qindex, rate_correction_factor); 941 } 942 // Work out a size correction factor. 943 if (projected_size_based_on_q > FRAME_OVERHEAD_BITS) 944 correction_factor = (double)cpi->rc.projected_frame_size / 945 (double)projected_size_based_on_q; 946 947 // Clamp correction factor to prevent anything too extreme 948 correction_factor = AOMMAX(correction_factor, 0.25); 949 950 cpi->rc.q_2_frame = cpi->rc.q_1_frame; 951 cpi->rc.q_1_frame = cm->quant_params.base_qindex; 952 cpi->rc.rc_2_frame = cpi->rc.rc_1_frame; 953 if (correction_factor > 1.1) 954 cpi->rc.rc_1_frame = -1; 955 else if (correction_factor < 0.9) 956 cpi->rc.rc_1_frame = 1; 957 else 958 cpi->rc.rc_1_frame = 0; 959 960 // Decide how heavily to dampen the adjustment 961 if (correction_factor > 0.0) { 962 if (cpi->is_screen_content_type) { 963 adjustment_limit = 964 0.25 + 0.5 * AOMMIN(0.5, fabs(log10(correction_factor))); 965 } else { 966 adjustment_limit = 967 0.25 + 0.75 * AOMMIN(0.5, fabs(log10(correction_factor))); 968 } 969 } else { 970 adjustment_limit = 0.75; 971 } 972 973 // Adjustment to delta Q and number of blocks updated in cyclic refresh 974 // based on over or under shoot of target in current frame. 975 if (cyclic_refresh_active && cpi->rc.this_frame_target > 0) { 976 CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; 977 if (correction_factor > 1.25) { 978 cr->percent_refresh_adjustment = 979 AOMMAX(cr->percent_refresh_adjustment - 1, -5); 980 cr->rate_ratio_qdelta_adjustment = 981 AOMMAX(cr->rate_ratio_qdelta_adjustment - 0.05, -0.0); 982 } else if (correction_factor < 0.5) { 983 cr->percent_refresh_adjustment = 984 AOMMIN(cr->percent_refresh_adjustment + 1, 5); 985 cr->rate_ratio_qdelta_adjustment = 986 AOMMIN(cr->rate_ratio_qdelta_adjustment + 0.05, 0.25); 987 } 988 } 989 990 if (correction_factor > 1.01) { 991 // We are not already at the worst allowable quality 992 correction_factor = (1.0 + ((correction_factor - 1.0) * adjustment_limit)); 993 rate_correction_factor = rate_correction_factor * correction_factor; 994 // Keep rate_correction_factor within limits 995 if (rate_correction_factor > MAX_BPB_FACTOR) 996 rate_correction_factor = MAX_BPB_FACTOR; 997 } else if (correction_factor < 0.99) { 998 // We are not already at the best allowable quality 999 correction_factor = 1.0 / correction_factor; 1000 correction_factor = (1.0 + ((correction_factor - 1.0) * adjustment_limit)); 1001 correction_factor = 1.0 / correction_factor; 1002 1003 rate_correction_factor = rate_correction_factor * correction_factor; 1004 1005 // Keep rate_correction_factor within limits 1006 if (rate_correction_factor < MIN_BPB_FACTOR) 1007 rate_correction_factor = MIN_BPB_FACTOR; 1008 } 1009 1010 set_rate_correction_factor(cpi, is_encode_stage, rate_correction_factor, 1011 width, height); 1012 } 1013 1014 // Calculate rate for the given 'q'. 1015 static int get_bits_per_mb(const AV1_COMP *cpi, int use_cyclic_refresh, 1016 double correction_factor, int q) { 1017 const AV1_COMMON *const cm = &cpi->common; 1018 return use_cyclic_refresh 1019 ? av1_cyclic_refresh_rc_bits_per_mb(cpi, q, correction_factor) 1020 : av1_rc_bits_per_mb(cpi, cm->current_frame.frame_type, q, 1021 correction_factor, 1022 cpi->sf.hl_sf.accurate_bit_estimate); 1023 } 1024 1025 /*!\brief Searches for a Q index value predicted to give an average macro 1026 * block rate closest to the target value. 1027 * 1028 * Similar to find_qindex_by_rate() function, but returns a q index with a 1029 * rate just above or below the desired rate, depending on which of the two 1030 * rates is closer to the desired rate. 1031 * Also, respects the selected aq_mode when computing the rate. 1032 * 1033 * \ingroup rate_control 1034 * \param[in] desired_bits_per_mb Target bits per mb 1035 * \param[in] cpi Top level encoder instance structure 1036 * \param[in] correction_factor Current Q to rate correction factor 1037 * \param[in] best_qindex Min allowed Q value. 1038 * \param[in] worst_qindex Max allowed Q value. 1039 * 1040 * \return Returns a correction factor for the current frame 1041 */ 1042 static int find_closest_qindex_by_rate(int desired_bits_per_mb, 1043 const AV1_COMP *cpi, 1044 double correction_factor, 1045 int best_qindex, int worst_qindex) { 1046 const int use_cyclic_refresh = cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && 1047 cpi->cyclic_refresh->apply_cyclic_refresh; 1048 1049 // Find 'qindex' based on 'desired_bits_per_mb'. 1050 assert(best_qindex <= worst_qindex); 1051 int low = best_qindex; 1052 int high = worst_qindex; 1053 while (low < high) { 1054 const int mid = (low + high) >> 1; 1055 const int mid_bits_per_mb = 1056 get_bits_per_mb(cpi, use_cyclic_refresh, correction_factor, mid); 1057 if (mid_bits_per_mb > desired_bits_per_mb) { 1058 low = mid + 1; 1059 } else { 1060 high = mid; 1061 } 1062 } 1063 assert(low == high); 1064 1065 // Calculate rate difference of this q index from the desired rate. 1066 const int curr_q = low; 1067 const int curr_bits_per_mb = 1068 get_bits_per_mb(cpi, use_cyclic_refresh, correction_factor, curr_q); 1069 const int curr_bit_diff = (curr_bits_per_mb <= desired_bits_per_mb) 1070 ? desired_bits_per_mb - curr_bits_per_mb 1071 : INT_MAX; 1072 assert((curr_bit_diff != INT_MAX && curr_bit_diff >= 0) || 1073 curr_q == worst_qindex); 1074 1075 // Calculate rate difference for previous q index too. 1076 const int prev_q = curr_q - 1; 1077 int prev_bit_diff; 1078 if (curr_bit_diff == INT_MAX || curr_q == best_qindex) { 1079 prev_bit_diff = INT_MAX; 1080 } else { 1081 const int prev_bits_per_mb = 1082 get_bits_per_mb(cpi, use_cyclic_refresh, correction_factor, prev_q); 1083 assert(prev_bits_per_mb > desired_bits_per_mb); 1084 prev_bit_diff = prev_bits_per_mb - desired_bits_per_mb; 1085 } 1086 1087 // Pick one of the two q indices, depending on which one has rate closer to 1088 // the desired rate. 1089 return (curr_bit_diff <= prev_bit_diff) ? curr_q : prev_q; 1090 } 1091 1092 int av1_rc_regulate_q(const AV1_COMP *cpi, int target_bits_per_frame, 1093 int active_best_quality, int active_worst_quality, 1094 int width, int height) { 1095 const int MBs = av1_get_MBs(width, height); 1096 const double correction_factor = 1097 get_rate_correction_factor(cpi, width, height); 1098 const int target_bits_per_mb = 1099 (int)(((uint64_t)target_bits_per_frame << BPER_MB_NORMBITS) / MBs); 1100 1101 int q = 1102 find_closest_qindex_by_rate(target_bits_per_mb, cpi, correction_factor, 1103 active_best_quality, active_worst_quality); 1104 if (cpi->oxcf.rc_cfg.mode == AOM_CBR && has_no_stats_stage(cpi)) 1105 return adjust_q_cbr(cpi, q, active_worst_quality, width, height); 1106 1107 return q; 1108 } 1109 1110 static int get_active_quality(int q, int gfu_boost, int low, int high, 1111 int *low_motion_minq, int *high_motion_minq) { 1112 if (gfu_boost > high) { 1113 return low_motion_minq[q]; 1114 } else if (gfu_boost < low) { 1115 return high_motion_minq[q]; 1116 } else { 1117 const int gap = high - low; 1118 const int offset = high - gfu_boost; 1119 const int qdiff = high_motion_minq[q] - low_motion_minq[q]; 1120 const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap; 1121 return low_motion_minq[q] + adjustment; 1122 } 1123 } 1124 1125 static int get_kf_active_quality(const PRIMARY_RATE_CONTROL *const p_rc, int q, 1126 aom_bit_depth_t bit_depth) { 1127 int *kf_low_motion_minq; 1128 int *kf_high_motion_minq; 1129 ASSIGN_MINQ_TABLE(bit_depth, kf_low_motion_minq); 1130 ASSIGN_MINQ_TABLE(bit_depth, kf_high_motion_minq); 1131 return get_active_quality(q, p_rc->kf_boost, kf_low, kf_high, 1132 kf_low_motion_minq, kf_high_motion_minq); 1133 } 1134 1135 static int get_gf_active_quality_no_rc(int gfu_boost, int q, 1136 aom_bit_depth_t bit_depth) { 1137 int *arfgf_low_motion_minq; 1138 int *arfgf_high_motion_minq; 1139 ASSIGN_MINQ_TABLE(bit_depth, arfgf_low_motion_minq); 1140 ASSIGN_MINQ_TABLE(bit_depth, arfgf_high_motion_minq); 1141 return get_active_quality(q, gfu_boost, gf_low, gf_high, 1142 arfgf_low_motion_minq, arfgf_high_motion_minq); 1143 } 1144 1145 static int get_gf_active_quality(const PRIMARY_RATE_CONTROL *const p_rc, int q, 1146 aom_bit_depth_t bit_depth) { 1147 return get_gf_active_quality_no_rc(p_rc->gfu_boost, q, bit_depth); 1148 } 1149 1150 static int get_gf_high_motion_quality(int q, aom_bit_depth_t bit_depth) { 1151 int *arfgf_high_motion_minq; 1152 ASSIGN_MINQ_TABLE(bit_depth, arfgf_high_motion_minq); 1153 return arfgf_high_motion_minq[q]; 1154 } 1155 1156 static int calc_active_worst_quality_no_stats_vbr(const AV1_COMP *cpi) { 1157 const RATE_CONTROL *const rc = &cpi->rc; 1158 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1159 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 1160 const unsigned int curr_frame = cpi->common.current_frame.frame_number; 1161 int active_worst_quality; 1162 int last_q_key_frame; 1163 int last_q_inter_frame; 1164 #if CONFIG_FPMT_TEST 1165 const int simulate_parallel_frame = 1166 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1167 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 1168 last_q_key_frame = simulate_parallel_frame ? p_rc->temp_last_q[KEY_FRAME] 1169 : p_rc->last_q[KEY_FRAME]; 1170 last_q_inter_frame = simulate_parallel_frame ? p_rc->temp_last_q[INTER_FRAME] 1171 : p_rc->last_q[INTER_FRAME]; 1172 #else 1173 last_q_key_frame = p_rc->last_q[KEY_FRAME]; 1174 last_q_inter_frame = p_rc->last_q[INTER_FRAME]; 1175 #endif 1176 1177 if (cpi->common.current_frame.frame_type == KEY_FRAME) { 1178 active_worst_quality = 1179 curr_frame == 0 ? rc->worst_quality : last_q_key_frame * 2; 1180 } else { 1181 if (!rc->is_src_frame_alt_ref && 1182 (refresh_frame->golden_frame || refresh_frame->bwd_ref_frame || 1183 refresh_frame->alt_ref_frame)) { 1184 active_worst_quality = 1185 curr_frame == 1 ? last_q_key_frame * 5 / 4 : last_q_inter_frame; 1186 } else { 1187 active_worst_quality = 1188 curr_frame == 1 ? last_q_key_frame * 2 : last_q_inter_frame * 2; 1189 } 1190 } 1191 return AOMMIN(active_worst_quality, rc->worst_quality); 1192 } 1193 1194 // Adjust active_worst_quality level based on buffer level. 1195 static int calc_active_worst_quality_no_stats_cbr(const AV1_COMP *cpi) { 1196 // Adjust active_worst_quality: If buffer is above the optimal/target level, 1197 // bring active_worst_quality down depending on fullness of buffer. 1198 // If buffer is below the optimal level, let the active_worst_quality go from 1199 // ambient Q (at buffer = optimal level) to worst_quality level 1200 // (at buffer = critical level). 1201 const AV1_COMMON *const cm = &cpi->common; 1202 const RATE_CONTROL *rc = &cpi->rc; 1203 const PRIMARY_RATE_CONTROL *p_rc = &cpi->ppi->p_rc; 1204 const SVC *const svc = &cpi->svc; 1205 unsigned int num_frames_weight_key = 5 * cpi->svc.number_temporal_layers; 1206 // Buffer level below which we push active_worst to worst_quality. 1207 int64_t critical_level = p_rc->optimal_buffer_level >> 3; 1208 int64_t buff_lvl_step = 0; 1209 int adjustment = 0; 1210 int active_worst_quality; 1211 int ambient_qp; 1212 if (frame_is_intra_only(cm)) return rc->worst_quality; 1213 // For ambient_qp we use minimum of avg_frame_qindex[KEY_FRAME/INTER_FRAME] 1214 // for the first few frames following key frame. These are both initialized 1215 // to worst_quality and updated with (3/4, 1/4) average in postencode_update. 1216 // So for first few frames following key, the qp of that key frame is weighted 1217 // into the active_worst_quality setting. For SVC the key frame should 1218 // correspond to layer (0, 0), so use that for layer context. 1219 int avg_qindex_key = p_rc->avg_frame_qindex[KEY_FRAME]; 1220 if (svc->number_temporal_layers > 1) { 1221 int layer = LAYER_IDS_TO_IDX(0, 0, svc->number_temporal_layers); 1222 const LAYER_CONTEXT *lc = &svc->layer_context[layer]; 1223 const PRIMARY_RATE_CONTROL *const lp_rc = &lc->p_rc; 1224 avg_qindex_key = 1225 AOMMIN(lp_rc->avg_frame_qindex[KEY_FRAME], lp_rc->last_q[KEY_FRAME]); 1226 } 1227 if (svc->temporal_layer_id > 0 && 1228 rc->frames_since_key < 2 * svc->number_temporal_layers) { 1229 ambient_qp = avg_qindex_key; 1230 } else { 1231 ambient_qp = 1232 (cm->current_frame.frame_number < num_frames_weight_key) 1233 ? AOMMIN(p_rc->avg_frame_qindex[INTER_FRAME], avg_qindex_key) 1234 : p_rc->avg_frame_qindex[INTER_FRAME]; 1235 } 1236 ambient_qp = AOMMIN(rc->worst_quality, ambient_qp); 1237 1238 if (p_rc->buffer_level > p_rc->optimal_buffer_level) { 1239 // Adjust down. 1240 int max_adjustment_down; // Maximum adjustment down for Q 1241 1242 if (cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && !cpi->ppi->use_svc && 1243 (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN)) { 1244 active_worst_quality = AOMMIN(rc->worst_quality, ambient_qp); 1245 max_adjustment_down = AOMMIN(4, active_worst_quality / 16); 1246 } else { 1247 active_worst_quality = AOMMIN(rc->worst_quality, ambient_qp * 5 / 4); 1248 max_adjustment_down = active_worst_quality / 3; 1249 } 1250 1251 if (max_adjustment_down) { 1252 buff_lvl_step = 1253 ((p_rc->maximum_buffer_size - p_rc->optimal_buffer_level) / 1254 max_adjustment_down); 1255 if (buff_lvl_step) 1256 adjustment = (int)((p_rc->buffer_level - p_rc->optimal_buffer_level) / 1257 buff_lvl_step); 1258 active_worst_quality -= adjustment; 1259 } 1260 } else if (p_rc->buffer_level > critical_level) { 1261 // Adjust up from ambient Q. 1262 active_worst_quality = AOMMIN(rc->worst_quality, ambient_qp); 1263 if (critical_level) { 1264 buff_lvl_step = (p_rc->optimal_buffer_level - critical_level); 1265 if (buff_lvl_step) { 1266 adjustment = (int)((rc->worst_quality - ambient_qp) * 1267 (p_rc->optimal_buffer_level - p_rc->buffer_level) / 1268 buff_lvl_step); 1269 } 1270 active_worst_quality += adjustment; 1271 } 1272 } else { 1273 // Set to worst_quality if buffer is below critical level. 1274 active_worst_quality = rc->worst_quality; 1275 } 1276 return active_worst_quality; 1277 } 1278 1279 // Calculate the active_best_quality level. 1280 static int calc_active_best_quality_no_stats_cbr(const AV1_COMP *cpi, 1281 int active_worst_quality, 1282 int width, int height) { 1283 const AV1_COMMON *const cm = &cpi->common; 1284 const RATE_CONTROL *const rc = &cpi->rc; 1285 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1286 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 1287 const CurrentFrame *const current_frame = &cm->current_frame; 1288 int *rtc_minq; 1289 const int bit_depth = cm->seq_params->bit_depth; 1290 int active_best_quality = rc->best_quality; 1291 ASSIGN_MINQ_TABLE(bit_depth, rtc_minq); 1292 1293 if (frame_is_intra_only(cm)) { 1294 // Handle the special case for key frames forced when we have reached 1295 // the maximum key frame interval. Here force the Q to a range 1296 // based on the ambient Q to reduce the risk of popping. 1297 if (p_rc->this_key_frame_forced) { 1298 int qindex = p_rc->last_boosted_qindex; 1299 double last_boosted_q = av1_convert_qindex_to_q(qindex, bit_depth); 1300 int delta_qindex = av1_compute_qdelta(rc, last_boosted_q, 1301 (last_boosted_q * 0.75), bit_depth); 1302 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1303 } else if (current_frame->frame_number > 0) { 1304 // not first frame of one pass and kf_boost is set 1305 double q_adj_factor = 1.0; 1306 double q_val; 1307 active_best_quality = get_kf_active_quality( 1308 p_rc, p_rc->avg_frame_qindex[KEY_FRAME], bit_depth); 1309 // Allow somewhat lower kf minq with small image formats. 1310 if ((width * height) <= (352 * 288)) { 1311 q_adj_factor -= 0.25; 1312 } 1313 // Convert the adjustment factor to a qindex delta 1314 // on active_best_quality. 1315 q_val = av1_convert_qindex_to_q(active_best_quality, bit_depth); 1316 active_best_quality += 1317 av1_compute_qdelta(rc, q_val, q_val * q_adj_factor, bit_depth); 1318 } 1319 } else if (!rc->is_src_frame_alt_ref && !cpi->ppi->use_svc && 1320 cpi->oxcf.rc_cfg.gf_cbr_boost_pct && 1321 (refresh_frame->golden_frame || refresh_frame->alt_ref_frame)) { 1322 // Use the lower of active_worst_quality and recent 1323 // average Q as basis for GF/ARF best Q limit unless last frame was 1324 // a key frame. 1325 int q = active_worst_quality; 1326 if (rc->frames_since_key > 1 && 1327 p_rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { 1328 q = p_rc->avg_frame_qindex[INTER_FRAME]; 1329 } 1330 active_best_quality = get_gf_active_quality(p_rc, q, bit_depth); 1331 } else { 1332 // Use the lower of active_worst_quality and recent/average Q. 1333 FRAME_TYPE frame_type = 1334 (current_frame->frame_number > 1) ? INTER_FRAME : KEY_FRAME; 1335 if (p_rc->avg_frame_qindex[frame_type] < active_worst_quality) 1336 active_best_quality = rtc_minq[p_rc->avg_frame_qindex[frame_type]]; 1337 else 1338 active_best_quality = rtc_minq[active_worst_quality]; 1339 } 1340 return active_best_quality; 1341 } 1342 1343 #if RT_PASSIVE_STRATEGY 1344 static int get_q_passive_strategy(const AV1_COMP *const cpi, 1345 const int q_candidate, const int threshold) { 1346 const AV1_COMMON *const cm = &cpi->common; 1347 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1348 const CurrentFrame *const current_frame = &cm->current_frame; 1349 int sum = 0; 1350 int count = 0; 1351 int i = 1; 1352 while (i < MAX_Q_HISTORY) { 1353 int frame_id = current_frame->frame_number - i; 1354 if (frame_id <= 0) break; 1355 sum += p_rc->q_history[frame_id % MAX_Q_HISTORY]; 1356 ++count; 1357 ++i; 1358 } 1359 if (count > 0) { 1360 const int avg_q = sum / count; 1361 if (abs(avg_q - q_candidate) <= threshold) return avg_q; 1362 } 1363 return q_candidate; 1364 } 1365 #endif // RT_PASSIVE_STRATEGY 1366 1367 /*!\brief Picks q and q bounds given CBR rate control parameters in \c cpi->rc. 1368 * 1369 * Handles the special case when using: 1370 * - Constant bit-rate mode: \c cpi->oxcf.rc_cfg.mode == \ref AOM_CBR, and 1371 * - 1-pass encoding without LAP (look-ahead processing), so 1st pass stats are 1372 * NOT available. 1373 * 1374 * \ingroup rate_control 1375 * \param[in] cpi Top level encoder structure 1376 * \param[in] width Coded frame width 1377 * \param[in] height Coded frame height 1378 * \param[out] bottom_index Bottom bound for q index (best quality) 1379 * \param[out] top_index Top bound for q index (worst quality) 1380 * \return Returns selected q index to be used for encoding this frame. 1381 */ 1382 static int rc_pick_q_and_bounds_no_stats_cbr(const AV1_COMP *cpi, int width, 1383 int height, int *bottom_index, 1384 int *top_index) { 1385 const AV1_COMMON *const cm = &cpi->common; 1386 const RATE_CONTROL *const rc = &cpi->rc; 1387 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1388 const CurrentFrame *const current_frame = &cm->current_frame; 1389 int q; 1390 int active_worst_quality = calc_active_worst_quality_no_stats_cbr(cpi); 1391 int active_best_quality = calc_active_best_quality_no_stats_cbr( 1392 cpi, active_worst_quality, width, height); 1393 assert(has_no_stats_stage(cpi)); 1394 assert(cpi->oxcf.rc_cfg.mode == AOM_CBR); 1395 1396 // Clip the active best and worst quality values to limits 1397 active_best_quality = 1398 clamp(active_best_quality, rc->best_quality, rc->worst_quality); 1399 active_worst_quality = 1400 clamp(active_worst_quality, active_best_quality, rc->worst_quality); 1401 1402 *top_index = active_worst_quality; 1403 *bottom_index = active_best_quality; 1404 1405 // Limit Q range for the adaptive loop. 1406 if (current_frame->frame_type == KEY_FRAME && !p_rc->this_key_frame_forced && 1407 current_frame->frame_number != 0) { 1408 int qdelta = 0; 1409 qdelta = av1_compute_qdelta_by_rate(cpi, current_frame->frame_type, 1410 active_worst_quality, 2.0); 1411 *top_index = active_worst_quality + qdelta; 1412 *top_index = AOMMAX(*top_index, *bottom_index); 1413 } 1414 1415 q = av1_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality, 1416 active_worst_quality, width, height); 1417 #if RT_PASSIVE_STRATEGY 1418 if (current_frame->frame_type != KEY_FRAME && 1419 cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) { 1420 q = get_q_passive_strategy(cpi, q, 50); 1421 } 1422 #endif // RT_PASSIVE_STRATEGY 1423 if (q > *top_index) { 1424 // Special case when we are targeting the max allowed rate 1425 if (rc->this_frame_target >= rc->max_frame_bandwidth) 1426 *top_index = q; 1427 else 1428 q = *top_index; 1429 } 1430 1431 assert(*top_index <= rc->worst_quality && *top_index >= rc->best_quality); 1432 assert(*bottom_index <= rc->worst_quality && 1433 *bottom_index >= rc->best_quality); 1434 assert(q <= rc->worst_quality && q >= rc->best_quality); 1435 return q; 1436 } 1437 1438 static int gf_group_pyramid_level(const GF_GROUP *gf_group, int gf_index) { 1439 return gf_group->layer_depth[gf_index]; 1440 } 1441 1442 static int get_active_cq_level(const RATE_CONTROL *rc, 1443 const PRIMARY_RATE_CONTROL *p_rc, 1444 const AV1EncoderConfig *const oxcf, 1445 int intra_only, aom_superres_mode superres_mode, 1446 int superres_denom) { 1447 const RateControlCfg *const rc_cfg = &oxcf->rc_cfg; 1448 static const double cq_adjust_threshold = 0.1; 1449 int active_cq_level = rc_cfg->cq_level; 1450 if (rc_cfg->mode == AOM_CQ || rc_cfg->mode == AOM_Q) { 1451 if ((superres_mode == AOM_SUPERRES_QTHRESH || 1452 superres_mode == AOM_SUPERRES_AUTO) && 1453 superres_denom != SCALE_NUMERATOR) { 1454 int mult = SUPERRES_QADJ_PER_DENOM_KEYFRAME_SOLO; 1455 if (intra_only && rc->frames_to_key <= 1) { 1456 mult = 0; 1457 } else if (intra_only) { 1458 mult = SUPERRES_QADJ_PER_DENOM_KEYFRAME; 1459 } else { 1460 mult = SUPERRES_QADJ_PER_DENOM_ARFFRAME; 1461 } 1462 active_cq_level = AOMMAX( 1463 active_cq_level - ((superres_denom - SCALE_NUMERATOR) * mult), 0); 1464 } 1465 } 1466 if (rc_cfg->mode == AOM_CQ && p_rc->total_target_bits > 0) { 1467 const double x = (double)p_rc->total_actual_bits / p_rc->total_target_bits; 1468 if (x < cq_adjust_threshold) { 1469 active_cq_level = (int)(active_cq_level * x / cq_adjust_threshold); 1470 } 1471 } 1472 return active_cq_level; 1473 } 1474 1475 /*!\brief Picks q and q bounds given non-CBR rate control params in \c cpi->rc. 1476 * 1477 * Handles the special case when using: 1478 * - Any rate control other than constant bit-rate mode: 1479 * \c cpi->oxcf.rc_cfg.mode != \ref AOM_CBR, and 1480 * - 1-pass encoding without LAP (look-ahead processing), so 1st pass stats are 1481 * NOT available. 1482 * 1483 * \ingroup rate_control 1484 * \param[in] cpi Top level encoder structure 1485 * \param[in] width Coded frame width 1486 * \param[in] height Coded frame height 1487 * \param[out] bottom_index Bottom bound for q index (best quality) 1488 * \param[out] top_index Top bound for q index (worst quality) 1489 * \return Returns selected q index to be used for encoding this frame. 1490 */ 1491 static int rc_pick_q_and_bounds_no_stats(const AV1_COMP *cpi, int width, 1492 int height, int *bottom_index, 1493 int *top_index) { 1494 const AV1_COMMON *const cm = &cpi->common; 1495 const RATE_CONTROL *const rc = &cpi->rc; 1496 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1497 const CurrentFrame *const current_frame = &cm->current_frame; 1498 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 1499 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 1500 const enum aom_rc_mode rc_mode = oxcf->rc_cfg.mode; 1501 1502 assert(has_no_stats_stage(cpi)); 1503 assert(rc_mode == AOM_VBR || 1504 (!USE_UNRESTRICTED_Q_IN_CQ_MODE && rc_mode == AOM_CQ) || 1505 rc_mode == AOM_Q); 1506 1507 const int cq_level = 1508 get_active_cq_level(rc, p_rc, oxcf, frame_is_intra_only(cm), 1509 cpi->superres_mode, cm->superres_scale_denominator); 1510 const int bit_depth = cm->seq_params->bit_depth; 1511 1512 int active_best_quality; 1513 int active_worst_quality = calc_active_worst_quality_no_stats_vbr(cpi); 1514 int q; 1515 int *inter_minq; 1516 ASSIGN_MINQ_TABLE(bit_depth, inter_minq); 1517 1518 if (frame_is_intra_only(cm)) { 1519 if (rc_mode == AOM_Q) { 1520 const int qindex = cq_level; 1521 const double q_val = av1_convert_qindex_to_q(qindex, bit_depth); 1522 const int delta_qindex = 1523 av1_compute_qdelta(rc, q_val, q_val * 0.25, bit_depth); 1524 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1525 } else if (p_rc->this_key_frame_forced) { 1526 #if CONFIG_FPMT_TEST 1527 const int simulate_parallel_frame = 1528 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1529 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 1530 int qindex = simulate_parallel_frame ? p_rc->temp_last_boosted_qindex 1531 : p_rc->last_boosted_qindex; 1532 #else 1533 int qindex = p_rc->last_boosted_qindex; 1534 #endif 1535 const double last_boosted_q = av1_convert_qindex_to_q(qindex, bit_depth); 1536 const int delta_qindex = av1_compute_qdelta( 1537 rc, last_boosted_q, last_boosted_q * 0.75, bit_depth); 1538 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1539 } else { // not first frame of one pass and kf_boost is set 1540 double q_adj_factor = 1.0; 1541 1542 active_best_quality = get_kf_active_quality( 1543 p_rc, p_rc->avg_frame_qindex[KEY_FRAME], bit_depth); 1544 1545 // Allow somewhat lower kf minq with small image formats. 1546 if ((width * height) <= (352 * 288)) { 1547 q_adj_factor -= 0.25; 1548 } 1549 1550 // Convert the adjustment factor to a qindex delta on active_best_quality. 1551 { 1552 const double q_val = 1553 av1_convert_qindex_to_q(active_best_quality, bit_depth); 1554 active_best_quality += 1555 av1_compute_qdelta(rc, q_val, q_val * q_adj_factor, bit_depth); 1556 } 1557 } 1558 } else if (!rc->is_src_frame_alt_ref && 1559 (refresh_frame->golden_frame || refresh_frame->alt_ref_frame)) { 1560 // Use the lower of active_worst_quality and recent 1561 // average Q as basis for GF/ARF best Q limit unless last frame was 1562 // a key frame. 1563 q = (rc->frames_since_key > 1 && 1564 p_rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) 1565 ? p_rc->avg_frame_qindex[INTER_FRAME] 1566 : p_rc->avg_frame_qindex[KEY_FRAME]; 1567 // For constrained quality don't allow Q less than the cq level 1568 if (rc_mode == AOM_CQ) { 1569 if (q < cq_level) q = cq_level; 1570 active_best_quality = get_gf_active_quality(p_rc, q, bit_depth); 1571 // Constrained quality use slightly lower active best. 1572 active_best_quality = active_best_quality * 15 / 16; 1573 } else if (rc_mode == AOM_Q) { 1574 const int qindex = cq_level; 1575 const double q_val = av1_convert_qindex_to_q(qindex, bit_depth); 1576 const int delta_qindex = 1577 (refresh_frame->alt_ref_frame) 1578 ? av1_compute_qdelta(rc, q_val, q_val * 0.40, bit_depth) 1579 : av1_compute_qdelta(rc, q_val, q_val * 0.50, bit_depth); 1580 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1581 } else { 1582 active_best_quality = get_gf_active_quality(p_rc, q, bit_depth); 1583 } 1584 } else { 1585 if (rc_mode == AOM_Q) { 1586 const int qindex = cq_level; 1587 const double q_val = av1_convert_qindex_to_q(qindex, bit_depth); 1588 const double delta_rate[FIXED_GF_INTERVAL] = { 0.50, 1.0, 0.85, 1.0, 1589 0.70, 1.0, 0.85, 1.0 }; 1590 const int delta_qindex = av1_compute_qdelta( 1591 rc, q_val, 1592 q_val * delta_rate[current_frame->frame_number % FIXED_GF_INTERVAL], 1593 bit_depth); 1594 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1595 } else { 1596 // Use the lower of active_worst_quality and recent/average Q. 1597 active_best_quality = 1598 (current_frame->frame_number > 1) 1599 ? inter_minq[p_rc->avg_frame_qindex[INTER_FRAME]] 1600 : inter_minq[p_rc->avg_frame_qindex[KEY_FRAME]]; 1601 // For the constrained quality mode we don't want 1602 // q to fall below the cq level. 1603 if ((rc_mode == AOM_CQ) && (active_best_quality < cq_level)) { 1604 active_best_quality = cq_level; 1605 } 1606 } 1607 } 1608 1609 // Clip the active best and worst quality values to limits 1610 active_best_quality = 1611 clamp(active_best_quality, rc->best_quality, rc->worst_quality); 1612 active_worst_quality = 1613 clamp(active_worst_quality, active_best_quality, rc->worst_quality); 1614 1615 *top_index = active_worst_quality; 1616 *bottom_index = active_best_quality; 1617 1618 // Limit Q range for the adaptive loop. 1619 { 1620 int qdelta = 0; 1621 if (current_frame->frame_type == KEY_FRAME && 1622 !p_rc->this_key_frame_forced && current_frame->frame_number != 0) { 1623 qdelta = av1_compute_qdelta_by_rate(cpi, current_frame->frame_type, 1624 active_worst_quality, 2.0); 1625 } else if (!rc->is_src_frame_alt_ref && 1626 (refresh_frame->golden_frame || refresh_frame->alt_ref_frame)) { 1627 qdelta = av1_compute_qdelta_by_rate(cpi, current_frame->frame_type, 1628 active_worst_quality, 1.75); 1629 } 1630 *top_index = active_worst_quality + qdelta; 1631 *top_index = AOMMAX(*top_index, *bottom_index); 1632 } 1633 1634 if (rc_mode == AOM_Q) { 1635 q = active_best_quality; 1636 // Special case code to try and match quality with forced key frames 1637 } else if ((current_frame->frame_type == KEY_FRAME) && 1638 p_rc->this_key_frame_forced) { 1639 #if CONFIG_FPMT_TEST 1640 const int simulate_parallel_frame = 1641 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1642 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 1643 q = simulate_parallel_frame ? p_rc->temp_last_boosted_qindex 1644 : p_rc->last_boosted_qindex; 1645 #else 1646 q = p_rc->last_boosted_qindex; 1647 #endif 1648 } else { 1649 q = av1_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality, 1650 active_worst_quality, width, height); 1651 if (q > *top_index) { 1652 // Special case when we are targeting the max allowed rate 1653 if (rc->this_frame_target >= rc->max_frame_bandwidth) 1654 *top_index = q; 1655 else 1656 q = *top_index; 1657 } 1658 } 1659 1660 assert(*top_index <= rc->worst_quality && *top_index >= rc->best_quality); 1661 assert(*bottom_index <= rc->worst_quality && 1662 *bottom_index >= rc->best_quality); 1663 assert(q <= rc->worst_quality && q >= rc->best_quality); 1664 return q; 1665 } 1666 1667 static const double arf_layer_deltas[MAX_ARF_LAYERS + 1] = { 2.50, 2.00, 1.75, 1668 1.50, 1.25, 1.15, 1669 1.0 }; 1670 static int frame_type_qdelta(const AV1_COMP *cpi, int q) { 1671 const GF_GROUP *const gf_group = &cpi->ppi->gf_group; 1672 const RATE_FACTOR_LEVEL rf_lvl = 1673 get_rate_factor_level(gf_group, cpi->gf_frame_index); 1674 const FRAME_TYPE frame_type = gf_group->frame_type[cpi->gf_frame_index]; 1675 const int arf_layer = AOMMIN(gf_group->layer_depth[cpi->gf_frame_index], 6); 1676 const double rate_factor = 1677 (rf_lvl == INTER_NORMAL) ? 1.0 : arf_layer_deltas[arf_layer]; 1678 1679 return av1_compute_qdelta_by_rate(cpi, frame_type, q, rate_factor); 1680 } 1681 1682 // This unrestricted Q selection on CQ mode is useful when testing new features, 1683 // but may lead to Q being out of range on current RC restrictions 1684 #if USE_UNRESTRICTED_Q_IN_CQ_MODE 1685 static int rc_pick_q_and_bounds_no_stats_cq(const AV1_COMP *cpi, int width, 1686 int height, int *bottom_index, 1687 int *top_index) { 1688 const AV1_COMMON *const cm = &cpi->common; 1689 const RATE_CONTROL *const rc = &cpi->rc; 1690 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 1691 const int cq_level = 1692 get_active_cq_level(rc, oxcf, frame_is_intra_only(cm), cpi->superres_mode, 1693 cm->superres_scale_denominator); 1694 const int bit_depth = cm->seq_params->bit_depth; 1695 const int q = (int)av1_convert_qindex_to_q(cq_level, bit_depth); 1696 (void)width; 1697 (void)height; 1698 assert(has_no_stats_stage(cpi)); 1699 assert(cpi->oxcf.rc_cfg.mode == AOM_CQ); 1700 1701 *top_index = q; 1702 *bottom_index = q; 1703 1704 return q; 1705 } 1706 #endif // USE_UNRESTRICTED_Q_IN_CQ_MODE 1707 1708 #define STATIC_MOTION_THRESH 95 1709 static void get_intra_q_and_bounds(const AV1_COMP *cpi, int width, int height, 1710 int *active_best, int *active_worst, 1711 int cq_level) { 1712 const AV1_COMMON *const cm = &cpi->common; 1713 const RATE_CONTROL *const rc = &cpi->rc; 1714 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1715 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 1716 int active_best_quality; 1717 int active_worst_quality = *active_worst; 1718 const int bit_depth = cm->seq_params->bit_depth; 1719 1720 if (rc->frames_to_key <= 1 && oxcf->rc_cfg.mode == AOM_Q) { 1721 // If the next frame is also a key frame or the current frame is the 1722 // only frame in the sequence in AOM_Q mode, just use the cq_level 1723 // as q. 1724 active_best_quality = cq_level; 1725 active_worst_quality = cq_level; 1726 } else if (p_rc->this_key_frame_forced) { 1727 // Handle the special case for key frames forced when we have reached 1728 // the maximum key frame interval. Here force the Q to a range 1729 // based on the ambient Q to reduce the risk of popping. 1730 double last_boosted_q; 1731 int delta_qindex; 1732 int qindex; 1733 #if CONFIG_FPMT_TEST 1734 const int simulate_parallel_frame = 1735 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1736 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 1737 int last_boosted_qindex = simulate_parallel_frame 1738 ? p_rc->temp_last_boosted_qindex 1739 : p_rc->last_boosted_qindex; 1740 #else 1741 int last_boosted_qindex = p_rc->last_boosted_qindex; 1742 #endif 1743 if (is_stat_consumption_stage_twopass(cpi) && 1744 cpi->ppi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { 1745 qindex = AOMMIN(p_rc->last_kf_qindex, last_boosted_qindex); 1746 active_best_quality = qindex; 1747 last_boosted_q = av1_convert_qindex_to_q(qindex, bit_depth); 1748 delta_qindex = av1_compute_qdelta(rc, last_boosted_q, 1749 last_boosted_q * 1.25, bit_depth); 1750 active_worst_quality = 1751 AOMMIN(qindex + delta_qindex, active_worst_quality); 1752 } else { 1753 qindex = last_boosted_qindex; 1754 last_boosted_q = av1_convert_qindex_to_q(qindex, bit_depth); 1755 delta_qindex = av1_compute_qdelta(rc, last_boosted_q, 1756 last_boosted_q * 0.50, bit_depth); 1757 active_best_quality = AOMMAX(qindex + delta_qindex, rc->best_quality); 1758 } 1759 } else { 1760 // Not forced keyframe. 1761 double q_adj_factor = 1.0; 1762 double q_val; 1763 1764 // Baseline value derived from active_worst_quality and kf boost. 1765 active_best_quality = 1766 get_kf_active_quality(p_rc, active_worst_quality, bit_depth); 1767 if (cpi->is_screen_content_type) { 1768 active_best_quality /= 2; 1769 } 1770 1771 if (is_stat_consumption_stage_twopass(cpi) && 1772 cpi->ppi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH) { 1773 active_best_quality /= 3; 1774 } 1775 1776 // Allow somewhat lower kf minq with small image formats. 1777 if ((width * height) <= (352 * 288)) { 1778 q_adj_factor -= 0.25; 1779 } 1780 1781 // Make a further adjustment based on the kf zero motion measure. 1782 if (is_stat_consumption_stage_twopass(cpi)) 1783 q_adj_factor += 1784 0.05 - (0.001 * (double)cpi->ppi->twopass.kf_zeromotion_pct); 1785 1786 // Convert the adjustment factor to a qindex delta 1787 // on active_best_quality. 1788 q_val = av1_convert_qindex_to_q(active_best_quality, bit_depth); 1789 active_best_quality += 1790 av1_compute_qdelta(rc, q_val, q_val * q_adj_factor, bit_depth); 1791 1792 // Tweak active_best_quality for AOM_Q mode when superres is on, as this 1793 // will be used directly as 'q' later. 1794 if (oxcf->rc_cfg.mode == AOM_Q && 1795 (cpi->superres_mode == AOM_SUPERRES_QTHRESH || 1796 cpi->superres_mode == AOM_SUPERRES_AUTO) && 1797 cm->superres_scale_denominator != SCALE_NUMERATOR) { 1798 active_best_quality = 1799 AOMMAX(active_best_quality - 1800 ((cm->superres_scale_denominator - SCALE_NUMERATOR) * 1801 SUPERRES_QADJ_PER_DENOM_KEYFRAME), 1802 0); 1803 } 1804 } 1805 *active_best = active_best_quality; 1806 *active_worst = active_worst_quality; 1807 } 1808 1809 static void adjust_active_best_and_worst_quality(const AV1_COMP *cpi, 1810 const int is_intrl_arf_boost, 1811 int *active_worst, 1812 int *active_best) { 1813 const AV1_COMMON *const cm = &cpi->common; 1814 const RATE_CONTROL *const rc = &cpi->rc; 1815 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1816 int active_best_quality = *active_best; 1817 int active_worst_quality = *active_worst; 1818 #if CONFIG_FPMT_TEST 1819 #endif 1820 // Extension to max or min Q if undershoot or overshoot is outside 1821 // the permitted range. 1822 if (cpi->oxcf.rc_cfg.mode != AOM_Q) { 1823 #if CONFIG_FPMT_TEST 1824 const int simulate_parallel_frame = 1825 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1826 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 1827 const int extend_minq = simulate_parallel_frame 1828 ? p_rc->temp_extend_minq 1829 : cpi->ppi->twopass.extend_minq; 1830 const int extend_maxq = simulate_parallel_frame 1831 ? p_rc->temp_extend_maxq 1832 : cpi->ppi->twopass.extend_maxq; 1833 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 1834 if (frame_is_intra_only(cm) || 1835 (!rc->is_src_frame_alt_ref && 1836 (refresh_frame->golden_frame || is_intrl_arf_boost || 1837 refresh_frame->alt_ref_frame))) { 1838 active_best_quality -= extend_minq; 1839 active_worst_quality += (extend_maxq / 2); 1840 } else { 1841 active_best_quality -= extend_minq / 2; 1842 active_worst_quality += extend_maxq; 1843 } 1844 #else 1845 (void)is_intrl_arf_boost; 1846 active_best_quality -= cpi->ppi->twopass.extend_minq / 4; 1847 active_worst_quality += cpi->ppi->twopass.extend_maxq; 1848 #endif 1849 } 1850 1851 #ifndef STRICT_RC 1852 // Static forced key frames Q restrictions dealt with elsewhere. 1853 if (!(frame_is_intra_only(cm)) || !p_rc->this_key_frame_forced || 1854 (cpi->ppi->twopass.last_kfgroup_zeromotion_pct < STATIC_MOTION_THRESH)) { 1855 const int qdelta = frame_type_qdelta(cpi, active_worst_quality); 1856 active_worst_quality = 1857 AOMMAX(active_worst_quality + qdelta, active_best_quality); 1858 } 1859 #endif 1860 1861 // Modify active_best_quality for downscaled normal frames. 1862 if (av1_frame_scaled(cm) && !frame_is_kf_gf_arf(cpi)) { 1863 int qdelta = av1_compute_qdelta_by_rate(cpi, cm->current_frame.frame_type, 1864 active_best_quality, 2.0); 1865 active_best_quality = 1866 AOMMAX(active_best_quality + qdelta, rc->best_quality); 1867 } 1868 1869 active_best_quality = 1870 clamp(active_best_quality, rc->best_quality, rc->worst_quality); 1871 active_worst_quality = 1872 clamp(active_worst_quality, active_best_quality, rc->worst_quality); 1873 1874 *active_best = active_best_quality; 1875 *active_worst = active_worst_quality; 1876 } 1877 1878 /*!\brief Gets a Q value to use for the current frame 1879 * 1880 * 1881 * Selects a Q value from a permitted range that we estimate 1882 * will result in approximately the target number of bits. 1883 * 1884 * \ingroup rate_control 1885 * \param[in] cpi Top level encoder instance structure 1886 * \param[in] width Width of frame 1887 * \param[in] height Height of frame 1888 * \param[in] active_worst_quality Max Q allowed 1889 * \param[in] active_best_quality Min Q allowed 1890 * 1891 * \return The suggested Q for this frame. 1892 */ 1893 static int get_q(const AV1_COMP *cpi, const int width, const int height, 1894 const int active_worst_quality, 1895 const int active_best_quality) { 1896 const AV1_COMMON *const cm = &cpi->common; 1897 const RATE_CONTROL *const rc = &cpi->rc; 1898 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1899 int q; 1900 #if CONFIG_FPMT_TEST 1901 const int simulate_parallel_frame = 1902 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 1903 cpi->ppi->fpmt_unit_test_cfg; 1904 int last_boosted_qindex = simulate_parallel_frame 1905 ? p_rc->temp_last_boosted_qindex 1906 : p_rc->last_boosted_qindex; 1907 #else 1908 int last_boosted_qindex = p_rc->last_boosted_qindex; 1909 #endif 1910 1911 if (cpi->oxcf.rc_cfg.mode == AOM_Q || 1912 (frame_is_intra_only(cm) && !p_rc->this_key_frame_forced && 1913 cpi->ppi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH && 1914 rc->frames_to_key > 1)) { 1915 q = active_best_quality; 1916 // Special case code to try and match quality with forced key frames. 1917 } else if (frame_is_intra_only(cm) && p_rc->this_key_frame_forced) { 1918 // If static since last kf use better of last boosted and last kf q. 1919 if (cpi->ppi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { 1920 q = AOMMIN(p_rc->last_kf_qindex, last_boosted_qindex); 1921 } else { 1922 q = AOMMIN(last_boosted_qindex, 1923 (active_best_quality + active_worst_quality) / 2); 1924 } 1925 q = clamp(q, active_best_quality, active_worst_quality); 1926 } else { 1927 q = av1_rc_regulate_q(cpi, rc->this_frame_target, active_best_quality, 1928 active_worst_quality, width, height); 1929 if (q > active_worst_quality) { 1930 // Special case when we are targeting the max allowed rate. 1931 if (rc->this_frame_target < rc->max_frame_bandwidth) { 1932 q = active_worst_quality; 1933 } 1934 } 1935 q = AOMMAX(q, active_best_quality); 1936 } 1937 return q; 1938 } 1939 1940 // Returns |active_best_quality| for an inter frame. 1941 // The |active_best_quality| depends on different rate control modes: 1942 // VBR, Q, CQ, CBR. 1943 // The returning active_best_quality could further be adjusted in 1944 // adjust_active_best_and_worst_quality(). 1945 static int get_active_best_quality(const AV1_COMP *const cpi, 1946 const int active_worst_quality, 1947 const int cq_level, const int gf_index) { 1948 const AV1_COMMON *const cm = &cpi->common; 1949 const int bit_depth = cm->seq_params->bit_depth; 1950 const RATE_CONTROL *const rc = &cpi->rc; 1951 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 1952 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 1953 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 1954 const GF_GROUP *gf_group = &cpi->ppi->gf_group; 1955 const enum aom_rc_mode rc_mode = oxcf->rc_cfg.mode; 1956 int *inter_minq; 1957 ASSIGN_MINQ_TABLE(bit_depth, inter_minq); 1958 int active_best_quality = 0; 1959 const int is_intrl_arf_boost = 1960 gf_group->update_type[gf_index] == INTNL_ARF_UPDATE; 1961 int is_leaf_frame = 1962 !(gf_group->update_type[gf_index] == ARF_UPDATE || 1963 gf_group->update_type[gf_index] == GF_UPDATE || is_intrl_arf_boost); 1964 1965 // TODO(jingning): Consider to rework this hack that covers issues incurred 1966 // in lightfield setting. 1967 if (cm->tiles.large_scale) { 1968 is_leaf_frame = !(refresh_frame->golden_frame || 1969 refresh_frame->alt_ref_frame || is_intrl_arf_boost); 1970 } 1971 const int is_overlay_frame = rc->is_src_frame_alt_ref; 1972 1973 if (is_leaf_frame || is_overlay_frame) { 1974 if (rc_mode == AOM_Q) return cq_level; 1975 1976 active_best_quality = inter_minq[active_worst_quality]; 1977 // For the constrained quality mode we don't want 1978 // q to fall below the cq level. 1979 if ((rc_mode == AOM_CQ) && (active_best_quality < cq_level)) { 1980 active_best_quality = cq_level; 1981 } 1982 return active_best_quality; 1983 } 1984 1985 // Determine active_best_quality for frames that are not leaf or overlay. 1986 int q = active_worst_quality; 1987 // Use the lower of active_worst_quality and recent 1988 // average Q as basis for GF/ARF best Q limit unless last frame was 1989 // a key frame. 1990 if (rc->frames_since_key > 1 && 1991 p_rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { 1992 q = p_rc->avg_frame_qindex[INTER_FRAME]; 1993 } 1994 if (rc_mode == AOM_CQ && q < cq_level) q = cq_level; 1995 active_best_quality = get_gf_active_quality(p_rc, q, bit_depth); 1996 // Constrained quality use slightly lower active best. 1997 if (rc_mode == AOM_CQ) active_best_quality = active_best_quality * 15 / 16; 1998 const int min_boost = get_gf_high_motion_quality(q, bit_depth); 1999 const int boost = min_boost - active_best_quality; 2000 active_best_quality = min_boost - (int)(boost * p_rc->arf_boost_factor); 2001 if (!is_intrl_arf_boost) return active_best_quality; 2002 2003 if (rc_mode == AOM_Q || rc_mode == AOM_CQ) active_best_quality = p_rc->arf_q; 2004 int this_height = gf_group_pyramid_level(gf_group, gf_index); 2005 while (this_height > 1) { 2006 active_best_quality = (active_best_quality + active_worst_quality + 1) / 2; 2007 --this_height; 2008 } 2009 return active_best_quality; 2010 } 2011 2012 static int rc_pick_q_and_bounds_q_mode(const AV1_COMP *cpi, int width, 2013 int height, int gf_index, 2014 int *bottom_index, int *top_index) { 2015 const AV1_COMMON *const cm = &cpi->common; 2016 const RATE_CONTROL *const rc = &cpi->rc; 2017 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2018 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 2019 const int cq_level = 2020 get_active_cq_level(rc, p_rc, oxcf, frame_is_intra_only(cm), 2021 cpi->superres_mode, cm->superres_scale_denominator); 2022 int active_best_quality = 0; 2023 int active_worst_quality = rc->active_worst_quality; 2024 int q; 2025 2026 if (frame_is_intra_only(cm)) { 2027 get_intra_q_and_bounds(cpi, width, height, &active_best_quality, 2028 &active_worst_quality, cq_level); 2029 } else { 2030 // Active best quality limited by previous layer. 2031 active_best_quality = 2032 get_active_best_quality(cpi, active_worst_quality, cq_level, gf_index); 2033 } 2034 2035 if (cq_level > 0) active_best_quality = AOMMAX(1, active_best_quality); 2036 2037 *top_index = clamp(active_worst_quality, rc->best_quality, rc->worst_quality); 2038 2039 *bottom_index = 2040 clamp(active_best_quality, rc->best_quality, rc->worst_quality); 2041 2042 q = *bottom_index; 2043 2044 assert(*top_index <= rc->worst_quality && *top_index >= rc->best_quality); 2045 assert(*bottom_index <= rc->worst_quality && 2046 *bottom_index >= rc->best_quality); 2047 assert(q <= rc->worst_quality && q >= rc->best_quality); 2048 2049 return q; 2050 } 2051 2052 /*!\brief Picks q and q bounds given rate control parameters in \c cpi->rc. 2053 * 2054 * Handles the general cases not covered by 2055 * \ref rc_pick_q_and_bounds_no_stats_cbr() and 2056 * \ref rc_pick_q_and_bounds_no_stats() 2057 * 2058 * \ingroup rate_control 2059 * \param[in] cpi Top level encoder structure 2060 * \param[in] width Coded frame width 2061 * \param[in] height Coded frame height 2062 * \param[in] gf_index Index of this frame in the golden frame group 2063 * \param[out] bottom_index Bottom bound for q index (best quality) 2064 * \param[out] top_index Top bound for q index (worst quality) 2065 * \return Returns selected q index to be used for encoding this frame. 2066 */ 2067 static int rc_pick_q_and_bounds(const AV1_COMP *cpi, int width, int height, 2068 int gf_index, int *bottom_index, 2069 int *top_index) { 2070 const AV1_COMMON *const cm = &cpi->common; 2071 const RATE_CONTROL *const rc = &cpi->rc; 2072 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2073 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 2074 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 2075 const GF_GROUP *gf_group = &cpi->ppi->gf_group; 2076 assert(IMPLIES(has_no_stats_stage(cpi), 2077 cpi->oxcf.rc_cfg.mode == AOM_Q && 2078 gf_group->update_type[gf_index] != ARF_UPDATE)); 2079 const int cq_level = 2080 get_active_cq_level(rc, p_rc, oxcf, frame_is_intra_only(cm), 2081 cpi->superres_mode, cm->superres_scale_denominator); 2082 2083 if (oxcf->rc_cfg.mode == AOM_Q) { 2084 return rc_pick_q_and_bounds_q_mode(cpi, width, height, gf_index, 2085 bottom_index, top_index); 2086 } 2087 2088 int active_best_quality = 0; 2089 int active_worst_quality = rc->active_worst_quality; 2090 int q; 2091 2092 const int is_intrl_arf_boost = 2093 gf_group->update_type[gf_index] == INTNL_ARF_UPDATE; 2094 2095 if (frame_is_intra_only(cm)) { 2096 get_intra_q_and_bounds(cpi, width, height, &active_best_quality, 2097 &active_worst_quality, cq_level); 2098 #ifdef STRICT_RC 2099 active_best_quality = 0; 2100 #endif 2101 } else { 2102 // Active best quality limited by previous layer. 2103 const int pyramid_level = gf_group_pyramid_level(gf_group, gf_index); 2104 2105 if ((pyramid_level <= 1) || (pyramid_level > MAX_ARF_LAYERS)) { 2106 active_best_quality = get_active_best_quality(cpi, active_worst_quality, 2107 cq_level, gf_index); 2108 } else { 2109 #if CONFIG_FPMT_TEST 2110 const int simulate_parallel_frame = 2111 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 2112 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 2113 int local_active_best_quality = 2114 simulate_parallel_frame 2115 ? p_rc->temp_active_best_quality[pyramid_level - 1] 2116 : p_rc->active_best_quality[pyramid_level - 1]; 2117 active_best_quality = local_active_best_quality + 1; 2118 #else 2119 active_best_quality = p_rc->active_best_quality[pyramid_level - 1] + 1; 2120 #endif 2121 2122 active_best_quality = AOMMIN(active_best_quality, active_worst_quality); 2123 #ifdef STRICT_RC 2124 active_best_quality += (active_worst_quality - active_best_quality) / 16; 2125 #else 2126 active_best_quality += (active_worst_quality - active_best_quality) / 2; 2127 #endif 2128 } 2129 2130 // For alt_ref and GF frames (including internal arf frames) adjust the 2131 // worst allowed quality as well. This insures that even on hard 2132 // sections we don't clamp the Q at the same value for arf frames and 2133 // leaf (non arf) frames. This is important to the TPL model which assumes 2134 // Q drops with each arf level. 2135 if (!(rc->is_src_frame_alt_ref) && 2136 (refresh_frame->golden_frame || refresh_frame->alt_ref_frame || 2137 is_intrl_arf_boost)) { 2138 active_worst_quality = 2139 (active_best_quality + (3 * active_worst_quality) + 2) / 4; 2140 } 2141 } 2142 2143 adjust_active_best_and_worst_quality( 2144 cpi, is_intrl_arf_boost, &active_worst_quality, &active_best_quality); 2145 q = get_q(cpi, width, height, active_worst_quality, active_best_quality); 2146 2147 // Special case when we are targeting the max allowed rate. 2148 if (rc->this_frame_target >= rc->max_frame_bandwidth && 2149 q > active_worst_quality) { 2150 active_worst_quality = q; 2151 } 2152 2153 *top_index = active_worst_quality; 2154 *bottom_index = active_best_quality; 2155 2156 assert(*top_index <= rc->worst_quality && *top_index >= rc->best_quality); 2157 assert(*bottom_index <= rc->worst_quality && 2158 *bottom_index >= rc->best_quality); 2159 assert(q <= rc->worst_quality && q >= rc->best_quality); 2160 2161 return q; 2162 } 2163 2164 static void rc_compute_variance_onepass_rt(AV1_COMP *cpi) { 2165 AV1_COMMON *const cm = &cpi->common; 2166 YV12_BUFFER_CONFIG const *const unscaled_src = cpi->unscaled_source; 2167 if (unscaled_src == NULL) return; 2168 2169 const uint8_t *src_y = unscaled_src->y_buffer; 2170 const int src_ystride = unscaled_src->y_stride; 2171 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_yv12_buf(cm, LAST_FRAME); 2172 const uint8_t *pre_y = yv12->buffers[0]; 2173 const int pre_ystride = yv12->strides[0]; 2174 2175 // TODO(yunqing): support scaled reference frames. 2176 if (cpi->scaled_ref_buf[LAST_FRAME - 1]) return; 2177 2178 for (int i = 0; i < 2; ++i) { 2179 if (unscaled_src->widths[i] != yv12->widths[i] || 2180 unscaled_src->heights[i] != yv12->heights[i]) { 2181 return; 2182 } 2183 } 2184 2185 const int num_mi_cols = cm->mi_params.mi_cols; 2186 const int num_mi_rows = cm->mi_params.mi_rows; 2187 const BLOCK_SIZE bsize = BLOCK_64X64; 2188 int num_samples = 0; 2189 // sse is computed on 64x64 blocks 2190 const int sb_size_by_mb = (cm->seq_params->sb_size == BLOCK_128X128) 2191 ? (cm->seq_params->mib_size >> 1) 2192 : cm->seq_params->mib_size; 2193 const int sb_cols = (num_mi_cols + sb_size_by_mb - 1) / sb_size_by_mb; 2194 const int sb_rows = (num_mi_rows + sb_size_by_mb - 1) / sb_size_by_mb; 2195 2196 uint64_t fsse = 0; 2197 cpi->rec_sse = 0; 2198 2199 for (int sbi_row = 0; sbi_row < sb_rows; ++sbi_row) { 2200 for (int sbi_col = 0; sbi_col < sb_cols; ++sbi_col) { 2201 unsigned int sse; 2202 uint8_t src[64 * 64] = { 0 }; 2203 // Apply 4x4 block averaging/denoising on source frame. 2204 for (int i = 0; i < 64; i += 4) { 2205 for (int j = 0; j < 64; j += 4) { 2206 const unsigned int avg = 2207 aom_avg_4x4(src_y + i * src_ystride + j, src_ystride); 2208 2209 for (int m = 0; m < 4; ++m) { 2210 for (int n = 0; n < 4; ++n) src[i * 64 + j + m * 64 + n] = avg; 2211 } 2212 } 2213 } 2214 2215 cpi->ppi->fn_ptr[bsize].vf(src, 64, pre_y, pre_ystride, &sse); 2216 fsse += sse; 2217 num_samples++; 2218 src_y += 64; 2219 pre_y += 64; 2220 } 2221 src_y += (src_ystride << 6) - (sb_cols << 6); 2222 pre_y += (pre_ystride << 6) - (sb_cols << 6); 2223 } 2224 assert(num_samples > 0); 2225 // Ensure rec_sse > 0 2226 if (num_samples > 0) cpi->rec_sse = fsse > 0 ? fsse : 1; 2227 } 2228 2229 int av1_rc_pick_q_and_bounds(AV1_COMP *cpi, int width, int height, int gf_index, 2230 int *bottom_index, int *top_index) { 2231 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2232 int q; 2233 // TODO(sarahparker) merge no-stats vbr and altref q computation 2234 // with rc_pick_q_and_bounds(). 2235 const GF_GROUP *gf_group = &cpi->ppi->gf_group; 2236 if ((cpi->oxcf.rc_cfg.mode != AOM_Q || 2237 gf_group->update_type[gf_index] == ARF_UPDATE) && 2238 has_no_stats_stage(cpi)) { 2239 if (cpi->oxcf.rc_cfg.mode == AOM_CBR) { 2240 // TODO(yunqing): the results could be used for encoder optimization. 2241 cpi->rec_sse = UINT64_MAX; 2242 if (cpi->sf.hl_sf.accurate_bit_estimate && 2243 cpi->common.current_frame.frame_type != KEY_FRAME) 2244 rc_compute_variance_onepass_rt(cpi); 2245 2246 q = rc_pick_q_and_bounds_no_stats_cbr(cpi, width, height, bottom_index, 2247 top_index); 2248 // preserve copy of active worst quality selected. 2249 cpi->rc.active_worst_quality = *top_index; 2250 2251 #if USE_UNRESTRICTED_Q_IN_CQ_MODE 2252 } else if (cpi->oxcf.rc_cfg.mode == AOM_CQ) { 2253 q = rc_pick_q_and_bounds_no_stats_cq(cpi, width, height, bottom_index, 2254 top_index); 2255 #endif // USE_UNRESTRICTED_Q_IN_CQ_MODE 2256 } else { 2257 q = rc_pick_q_and_bounds_no_stats(cpi, width, height, bottom_index, 2258 top_index); 2259 } 2260 } else { 2261 q = rc_pick_q_and_bounds(cpi, width, height, gf_index, bottom_index, 2262 top_index); 2263 } 2264 if (gf_group->update_type[gf_index] == ARF_UPDATE) p_rc->arf_q = q; 2265 2266 return q; 2267 } 2268 2269 void av1_rc_compute_frame_size_bounds(const AV1_COMP *cpi, int frame_target, 2270 int *frame_under_shoot_limit, 2271 int *frame_over_shoot_limit) { 2272 if (cpi->oxcf.rc_cfg.mode == AOM_Q) { 2273 *frame_under_shoot_limit = 0; 2274 *frame_over_shoot_limit = INT_MAX; 2275 } else { 2276 // For very small rate targets where the fractional adjustment 2277 // may be tiny make sure there is at least a minimum range. 2278 assert(cpi->sf.hl_sf.recode_tolerance <= 100); 2279 const int tolerance = (int)AOMMAX( 2280 100, ((int64_t)cpi->sf.hl_sf.recode_tolerance * frame_target) / 100); 2281 *frame_under_shoot_limit = AOMMAX(frame_target - tolerance, 0); 2282 *frame_over_shoot_limit = (int)AOMMIN((int64_t)frame_target + tolerance, 2283 cpi->rc.max_frame_bandwidth); 2284 } 2285 } 2286 2287 void av1_rc_set_frame_target(AV1_COMP *cpi, int target, int width, int height) { 2288 const AV1_COMMON *const cm = &cpi->common; 2289 RATE_CONTROL *const rc = &cpi->rc; 2290 2291 rc->this_frame_target = target; 2292 2293 // Modify frame size target when down-scaled. 2294 if (av1_frame_scaled(cm) && cpi->oxcf.rc_cfg.mode != AOM_CBR) { 2295 rc->this_frame_target = saturate_cast_double_to_int( 2296 rc->this_frame_target * 2297 resize_rate_factor(&cpi->oxcf.frm_dim_cfg, width, height)); 2298 } 2299 2300 // Target rate per SB64 (including partial SB64s. 2301 const int64_t sb64_target_rate = 2302 ((int64_t)rc->this_frame_target << 12) / (width * height); 2303 rc->sb64_target_rate = (int)AOMMIN(sb64_target_rate, INT_MAX); 2304 } 2305 2306 static void update_alt_ref_frame_stats(AV1_COMP *cpi) { 2307 // this frame refreshes means next frames don't unless specified by user 2308 RATE_CONTROL *const rc = &cpi->rc; 2309 rc->frames_since_golden = 0; 2310 } 2311 2312 static void update_golden_frame_stats(AV1_COMP *cpi) { 2313 RATE_CONTROL *const rc = &cpi->rc; 2314 2315 // Update the Golden frame usage counts. 2316 if (cpi->refresh_frame.golden_frame || rc->is_src_frame_alt_ref) { 2317 rc->frames_since_golden = 0; 2318 } else if (cpi->common.show_frame) { 2319 rc->frames_since_golden++; 2320 } 2321 } 2322 2323 void av1_rc_postencode_update(AV1_COMP *cpi, uint64_t bytes_used) { 2324 const AV1_COMMON *const cm = &cpi->common; 2325 const CurrentFrame *const current_frame = &cm->current_frame; 2326 RATE_CONTROL *const rc = &cpi->rc; 2327 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2328 const GF_GROUP *const gf_group = &cpi->ppi->gf_group; 2329 const RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame; 2330 2331 const int is_intrnl_arf = 2332 gf_group->update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE; 2333 2334 const int qindex = cm->quant_params.base_qindex; 2335 2336 #if RT_PASSIVE_STRATEGY 2337 const int frame_number = current_frame->frame_number % MAX_Q_HISTORY; 2338 p_rc->q_history[frame_number] = qindex; 2339 #endif // RT_PASSIVE_STRATEGY 2340 2341 // Update rate control heuristics 2342 rc->projected_frame_size = (int)(bytes_used << 3); 2343 2344 // Post encode loop adjustment of Q prediction. 2345 av1_rc_update_rate_correction_factors(cpi, 0, cm->width, cm->height); 2346 2347 // Update bit estimation ratio. 2348 if (cpi->oxcf.rc_cfg.mode == AOM_CBR && 2349 cm->current_frame.frame_type != KEY_FRAME && 2350 cpi->sf.hl_sf.accurate_bit_estimate) { 2351 const double q = av1_convert_qindex_to_q(cm->quant_params.base_qindex, 2352 cm->seq_params->bit_depth); 2353 const int this_bit_est_ratio = 2354 (int)(rc->projected_frame_size * q / sqrt((double)cpi->rec_sse)); 2355 cpi->rc.bit_est_ratio = 2356 cpi->rc.bit_est_ratio == 0 2357 ? this_bit_est_ratio 2358 : (7 * cpi->rc.bit_est_ratio + this_bit_est_ratio) / 8; 2359 } 2360 2361 // Keep a record of last Q and ambient average Q. 2362 if (current_frame->frame_type == KEY_FRAME) { 2363 p_rc->last_q[KEY_FRAME] = qindex; 2364 p_rc->avg_frame_qindex[KEY_FRAME] = 2365 ROUND_POWER_OF_TWO(3 * p_rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); 2366 if (cpi->svc.spatial_layer_id == 0) { 2367 rc->last_encoded_size_keyframe = rc->projected_frame_size; 2368 rc->last_target_size_keyframe = rc->this_frame_target; 2369 } 2370 } else { 2371 if ((cpi->ppi->use_svc && cpi->oxcf.rc_cfg.mode == AOM_CBR) || 2372 cpi->rc.rtc_external_ratectrl || 2373 (!rc->is_src_frame_alt_ref && 2374 !(refresh_frame->golden_frame || is_intrnl_arf || 2375 refresh_frame->alt_ref_frame))) { 2376 p_rc->last_q[INTER_FRAME] = qindex; 2377 p_rc->avg_frame_qindex[INTER_FRAME] = ROUND_POWER_OF_TWO( 2378 3 * p_rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); 2379 p_rc->ni_frames++; 2380 p_rc->tot_q += av1_convert_qindex_to_q(qindex, cm->seq_params->bit_depth); 2381 p_rc->avg_q = p_rc->tot_q / p_rc->ni_frames; 2382 // Calculate the average Q for normal inter frames (not key or GFU 2383 // frames). 2384 rc->ni_tot_qi += qindex; 2385 rc->ni_av_qi = rc->ni_tot_qi / p_rc->ni_frames; 2386 } 2387 } 2388 // Keep record of last boosted (KF/GF/ARF) Q value. 2389 // If the current frame is coded at a lower Q then we also update it. 2390 // If all mbs in this group are skipped only update if the Q value is 2391 // better than that already stored. 2392 // This is used to help set quality in forced key frames to reduce popping 2393 if ((qindex < p_rc->last_boosted_qindex) || 2394 (current_frame->frame_type == KEY_FRAME) || 2395 (!p_rc->constrained_gf_group && 2396 (refresh_frame->alt_ref_frame || is_intrnl_arf || 2397 (refresh_frame->golden_frame && !rc->is_src_frame_alt_ref)))) { 2398 p_rc->last_boosted_qindex = qindex; 2399 } 2400 if (current_frame->frame_type == KEY_FRAME) p_rc->last_kf_qindex = qindex; 2401 2402 update_buffer_level(cpi, rc->projected_frame_size); 2403 rc->prev_avg_frame_bandwidth = rc->avg_frame_bandwidth; 2404 2405 // Rolling monitors of whether we are over or underspending used to help 2406 // regulate min and Max Q in two pass. 2407 if (av1_frame_scaled(cm)) 2408 rc->this_frame_target = saturate_cast_double_to_int( 2409 rc->this_frame_target / 2410 resize_rate_factor(&cpi->oxcf.frm_dim_cfg, cm->width, cm->height)); 2411 if (current_frame->frame_type != KEY_FRAME) { 2412 p_rc->rolling_target_bits = (int)ROUND_POWER_OF_TWO_64( 2413 (int64_t)p_rc->rolling_target_bits * 3 + rc->this_frame_target, 2); 2414 p_rc->rolling_actual_bits = (int)ROUND_POWER_OF_TWO_64( 2415 (int64_t)p_rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2); 2416 } 2417 2418 // Actual bits spent 2419 p_rc->total_actual_bits += rc->projected_frame_size; 2420 p_rc->total_target_bits += cm->show_frame ? rc->avg_frame_bandwidth : 0; 2421 2422 if (is_altref_enabled(cpi->oxcf.gf_cfg.lag_in_frames, 2423 cpi->oxcf.gf_cfg.enable_auto_arf) && 2424 refresh_frame->alt_ref_frame && 2425 (current_frame->frame_type != KEY_FRAME && !frame_is_sframe(cm))) 2426 // Update the alternate reference frame stats as appropriate. 2427 update_alt_ref_frame_stats(cpi); 2428 else 2429 // Update the Golden frame stats as appropriate. 2430 update_golden_frame_stats(cpi); 2431 2432 #if CONFIG_FPMT_TEST 2433 /*The variables temp_avg_frame_qindex, temp_last_q, temp_avg_q, 2434 * temp_last_boosted_qindex are introduced only for quality simulation 2435 * purpose, it retains the value previous to the parallel encode frames. The 2436 * variables are updated based on the update flag. 2437 * 2438 * If there exist show_existing_frames between parallel frames, then to 2439 * retain the temp state do not update it. */ 2440 int show_existing_between_parallel_frames = 2441 (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == 2442 INTNL_OVERLAY_UPDATE && 2443 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index + 1] == 2); 2444 2445 if (cpi->do_frame_data_update && !show_existing_between_parallel_frames && 2446 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE) { 2447 for (int i = 0; i < FRAME_TYPES; i++) { 2448 p_rc->temp_last_q[i] = p_rc->last_q[i]; 2449 } 2450 p_rc->temp_avg_q = p_rc->avg_q; 2451 p_rc->temp_last_boosted_qindex = p_rc->last_boosted_qindex; 2452 p_rc->temp_total_actual_bits = p_rc->total_actual_bits; 2453 p_rc->temp_projected_frame_size = rc->projected_frame_size; 2454 for (int i = 0; i < RATE_FACTOR_LEVELS; i++) 2455 p_rc->temp_rate_correction_factors[i] = p_rc->rate_correction_factors[i]; 2456 } 2457 #endif 2458 if (current_frame->frame_type == KEY_FRAME) { 2459 rc->frames_since_key = 0; 2460 rc->frames_since_scene_change = 0; 2461 } 2462 if (cpi->refresh_frame.golden_frame) 2463 rc->frame_num_last_gf_refresh = current_frame->frame_number; 2464 rc->prev_coded_width = cm->width; 2465 rc->prev_coded_height = cm->height; 2466 rc->frame_number_encoded++; 2467 rc->prev_frame_is_dropped = 0; 2468 rc->drop_count_consec = 0; 2469 } 2470 2471 void av1_rc_postencode_update_drop_frame(AV1_COMP *cpi) { 2472 // Update buffer level with zero size, update frame counters, and return. 2473 update_buffer_level(cpi, 0); 2474 cpi->rc.rc_2_frame = 0; 2475 cpi->rc.rc_1_frame = 0; 2476 cpi->rc.prev_avg_frame_bandwidth = cpi->rc.avg_frame_bandwidth; 2477 cpi->rc.prev_coded_width = cpi->common.width; 2478 cpi->rc.prev_coded_height = cpi->common.height; 2479 cpi->rc.prev_frame_is_dropped = 1; 2480 // On a scene/slide change for dropped frame: reset the avg_source_sad to 0, 2481 // otherwise the avg_source_sad can get too large and subsequent frames 2482 // may miss the scene/slide detection. 2483 if (cpi->rc.high_source_sad) cpi->rc.avg_source_sad = 0; 2484 if (cpi->ppi->use_svc && cpi->svc.number_spatial_layers > 1) { 2485 cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = true; 2486 cpi->svc.drop_spatial_layer[cpi->svc.spatial_layer_id] = true; 2487 } 2488 if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) { 2489 cpi->svc.prev_number_spatial_layers = cpi->svc.number_spatial_layers; 2490 } 2491 cpi->svc.prev_number_temporal_layers = cpi->svc.number_temporal_layers; 2492 } 2493 2494 int av1_find_qindex(double desired_q, aom_bit_depth_t bit_depth, 2495 int best_qindex, int worst_qindex) { 2496 assert(best_qindex <= worst_qindex); 2497 int low = best_qindex; 2498 int high = worst_qindex; 2499 while (low < high) { 2500 const int mid = (low + high) >> 1; 2501 const double mid_q = av1_convert_qindex_to_q(mid, bit_depth); 2502 if (mid_q < desired_q) { 2503 low = mid + 1; 2504 } else { 2505 high = mid; 2506 } 2507 } 2508 assert(low == high); 2509 assert(av1_convert_qindex_to_q(low, bit_depth) >= desired_q || 2510 low == worst_qindex); 2511 return low; 2512 } 2513 2514 int av1_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget, 2515 aom_bit_depth_t bit_depth) { 2516 const int start_index = 2517 av1_find_qindex(qstart, bit_depth, rc->best_quality, rc->worst_quality); 2518 const int target_index = 2519 av1_find_qindex(qtarget, bit_depth, rc->best_quality, rc->worst_quality); 2520 return target_index - start_index; 2521 } 2522 2523 // Find q_index for the desired_bits_per_mb, within [best_qindex, worst_qindex], 2524 // assuming 'correction_factor' is 1.0. 2525 // To be precise, 'q_index' is the smallest integer, for which the corresponding 2526 // bits per mb <= desired_bits_per_mb. 2527 // If no such q index is found, returns 'worst_qindex'. 2528 static int find_qindex_by_rate(const AV1_COMP *const cpi, 2529 int desired_bits_per_mb, FRAME_TYPE frame_type, 2530 int best_qindex, int worst_qindex) { 2531 assert(best_qindex <= worst_qindex); 2532 int low = best_qindex; 2533 int high = worst_qindex; 2534 while (low < high) { 2535 const int mid = (low + high) >> 1; 2536 const int mid_bits_per_mb = 2537 av1_rc_bits_per_mb(cpi, frame_type, mid, 1.0, 0); 2538 if (mid_bits_per_mb > desired_bits_per_mb) { 2539 low = mid + 1; 2540 } else { 2541 high = mid; 2542 } 2543 } 2544 assert(low == high); 2545 assert(av1_rc_bits_per_mb(cpi, frame_type, low, 1.0, 0) <= 2546 desired_bits_per_mb || 2547 low == worst_qindex); 2548 return low; 2549 } 2550 2551 int av1_compute_qdelta_by_rate(const AV1_COMP *cpi, FRAME_TYPE frame_type, 2552 int qindex, double rate_target_ratio) { 2553 const RATE_CONTROL *rc = &cpi->rc; 2554 2555 // Look up the current projected bits per block for the base index 2556 const int base_bits_per_mb = 2557 av1_rc_bits_per_mb(cpi, frame_type, qindex, 1.0, 0); 2558 2559 // Find the target bits per mb based on the base value and given ratio. 2560 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb); 2561 2562 const int target_index = find_qindex_by_rate( 2563 cpi, target_bits_per_mb, frame_type, rc->best_quality, rc->worst_quality); 2564 return target_index - qindex; 2565 } 2566 2567 static void set_gf_interval_range(const AV1_COMP *const cpi, 2568 RATE_CONTROL *const rc) { 2569 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 2570 2571 // Special case code for 1 pass fixed Q mode tests 2572 if ((has_no_stats_stage(cpi)) && (oxcf->rc_cfg.mode == AOM_Q)) { 2573 rc->max_gf_interval = oxcf->gf_cfg.max_gf_interval; 2574 rc->min_gf_interval = oxcf->gf_cfg.min_gf_interval; 2575 rc->static_scene_max_gf_interval = rc->min_gf_interval + 1; 2576 } else { 2577 // Set Maximum gf/arf interval 2578 rc->max_gf_interval = oxcf->gf_cfg.max_gf_interval; 2579 rc->min_gf_interval = oxcf->gf_cfg.min_gf_interval; 2580 if (rc->min_gf_interval == 0) 2581 rc->min_gf_interval = av1_rc_get_default_min_gf_interval( 2582 oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height, cpi->framerate); 2583 if (rc->max_gf_interval == 0) 2584 rc->max_gf_interval = 2585 get_default_max_gf_interval(cpi->framerate, rc->min_gf_interval); 2586 /* 2587 * Extended max interval for genuinely static scenes like slide shows. 2588 * The no.of.stats available in the case of LAP is limited, 2589 * hence setting to max_gf_interval. 2590 */ 2591 if (cpi->ppi->lap_enabled) 2592 rc->static_scene_max_gf_interval = rc->max_gf_interval + 1; 2593 else 2594 rc->static_scene_max_gf_interval = MAX_STATIC_GF_GROUP_LENGTH; 2595 2596 if (rc->max_gf_interval > rc->static_scene_max_gf_interval) 2597 rc->max_gf_interval = rc->static_scene_max_gf_interval; 2598 2599 // Clamp min to max 2600 rc->min_gf_interval = AOMMIN(rc->min_gf_interval, rc->max_gf_interval); 2601 } 2602 } 2603 2604 void av1_rc_update_framerate(AV1_COMP *cpi, int width, int height) { 2605 const AV1EncoderConfig *const oxcf = &cpi->oxcf; 2606 RATE_CONTROL *const rc = &cpi->rc; 2607 const int MBs = av1_get_MBs(width, height); 2608 2609 rc->avg_frame_bandwidth = saturate_cast_double_to_int( 2610 round(oxcf->rc_cfg.target_bandwidth / cpi->framerate)); 2611 2612 int64_t vbr_min_bits = 2613 (int64_t)rc->avg_frame_bandwidth * oxcf->rc_cfg.vbrmin_section / 100; 2614 vbr_min_bits = AOMMIN(vbr_min_bits, INT_MAX); 2615 2616 rc->min_frame_bandwidth = AOMMAX((int)vbr_min_bits, FRAME_OVERHEAD_BITS); 2617 2618 // A maximum bitrate for a frame is defined. 2619 // The baseline for this aligns with HW implementations that 2620 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits 2621 // per 16x16 MB (averaged over a frame). However this limit is extended if 2622 // a very high rate is given on the command line or the rate cannot 2623 // be achieved because of a user specified max q (e.g. when the user 2624 // specifies lossless encode. 2625 int64_t vbr_max_bits = 2626 (int64_t)rc->avg_frame_bandwidth * oxcf->rc_cfg.vbrmax_section / 100; 2627 vbr_max_bits = AOMMIN(vbr_max_bits, INT_MAX); 2628 2629 rc->max_frame_bandwidth = 2630 AOMMAX(AOMMAX((MBs * MAX_MB_RATE), MAXRATE_1080P), (int)vbr_max_bits); 2631 2632 set_gf_interval_range(cpi, rc); 2633 } 2634 2635 #define VBR_PCT_ADJUSTMENT_LIMIT 50 2636 // For VBR...adjustment to the frame target based on error from previous frames 2637 static void vbr_rate_correction(AV1_COMP *cpi, int *this_frame_target) { 2638 RATE_CONTROL *const rc = &cpi->rc; 2639 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2640 #if CONFIG_FPMT_TEST 2641 const int simulate_parallel_frame = 2642 cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] > 0 && 2643 cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE; 2644 int64_t vbr_bits_off_target = simulate_parallel_frame 2645 ? cpi->ppi->p_rc.temp_vbr_bits_off_target 2646 : p_rc->vbr_bits_off_target; 2647 #else 2648 int64_t vbr_bits_off_target = p_rc->vbr_bits_off_target; 2649 #endif 2650 int64_t frame_target = *this_frame_target; 2651 2652 const double stats_count = 2653 cpi->ppi->twopass.stats_buf_ctx->total_stats != NULL 2654 ? cpi->ppi->twopass.stats_buf_ctx->total_stats->count 2655 : 0.0; 2656 const int frame_window = 2657 (int)AOMMIN(16, stats_count - cpi->common.current_frame.frame_number); 2658 assert(VBR_PCT_ADJUSTMENT_LIMIT <= 100); 2659 if (frame_window > 0) { 2660 const int64_t max_delta = 2661 AOMMIN(llabs((vbr_bits_off_target / frame_window)), 2662 (frame_target * VBR_PCT_ADJUSTMENT_LIMIT) / 100); 2663 2664 // vbr_bits_off_target > 0 means we have extra bits to spend 2665 // vbr_bits_off_target < 0 we are currently overshooting 2666 frame_target += (vbr_bits_off_target >= 0) ? max_delta : -max_delta; 2667 } 2668 2669 #if CONFIG_FPMT_TEST 2670 int64_t vbr_bits_off_target_fast = 2671 simulate_parallel_frame ? cpi->ppi->p_rc.temp_vbr_bits_off_target_fast 2672 : p_rc->vbr_bits_off_target_fast; 2673 #endif 2674 // Fast redistribution of bits arising from massive local undershoot. 2675 // Don't do it for kf,arf,gf or overlay frames. 2676 if (!frame_is_kf_gf_arf(cpi) && 2677 #if CONFIG_FPMT_TEST 2678 vbr_bits_off_target_fast && 2679 #else 2680 p_rc->vbr_bits_off_target_fast && 2681 #endif 2682 !rc->is_src_frame_alt_ref) { 2683 int64_t one_frame_bits = AOMMAX(rc->avg_frame_bandwidth, frame_target); 2684 int64_t fast_extra_bits; 2685 #if CONFIG_FPMT_TEST 2686 fast_extra_bits = AOMMIN(vbr_bits_off_target_fast, one_frame_bits); 2687 fast_extra_bits = 2688 AOMMIN(fast_extra_bits, 2689 AOMMAX(one_frame_bits / 8, vbr_bits_off_target_fast / 8)); 2690 #else 2691 fast_extra_bits = AOMMIN(p_rc->vbr_bits_off_target_fast, one_frame_bits); 2692 fast_extra_bits = 2693 AOMMIN(fast_extra_bits, 2694 AOMMAX(one_frame_bits / 8, p_rc->vbr_bits_off_target_fast / 8)); 2695 #endif 2696 fast_extra_bits = AOMMIN(fast_extra_bits, INT_MAX); 2697 if (fast_extra_bits > 0) { 2698 // Update frame_target only if additional bits are available from 2699 // local undershoot. 2700 frame_target += fast_extra_bits; 2701 } 2702 // Store the fast_extra_bits of the frame and reduce it from 2703 // vbr_bits_off_target_fast during postencode stage. 2704 rc->frame_level_fast_extra_bits = (int)fast_extra_bits; 2705 // Retaining the condition to update during postencode stage since 2706 // fast_extra_bits are calculated based on vbr_bits_off_target_fast. 2707 cpi->do_update_vbr_bits_off_target_fast = 1; 2708 } 2709 2710 // Clamp the target for the frame to the maximum allowed for one frame. 2711 *this_frame_target = (int)AOMMIN(frame_target, INT_MAX); 2712 } 2713 2714 void av1_set_target_rate(AV1_COMP *cpi, int width, int height) { 2715 RATE_CONTROL *const rc = &cpi->rc; 2716 int target_rate = rc->base_frame_target; 2717 2718 // Correction to rate target based on prior over or under shoot. 2719 if (cpi->oxcf.rc_cfg.mode == AOM_VBR || cpi->oxcf.rc_cfg.mode == AOM_CQ) 2720 vbr_rate_correction(cpi, &target_rate); 2721 av1_rc_set_frame_target(cpi, target_rate, width, height); 2722 } 2723 2724 int av1_calc_pframe_target_size_one_pass_vbr( 2725 const AV1_COMP *const cpi, FRAME_UPDATE_TYPE frame_update_type) { 2726 static const int af_ratio = 10; 2727 const RATE_CONTROL *const rc = &cpi->rc; 2728 const PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2729 int64_t target; 2730 #if USE_ALTREF_FOR_ONE_PASS 2731 if (frame_update_type == KF_UPDATE || frame_update_type == GF_UPDATE || 2732 frame_update_type == ARF_UPDATE) { 2733 target = ((int64_t)rc->avg_frame_bandwidth * p_rc->baseline_gf_interval * 2734 af_ratio) / 2735 (p_rc->baseline_gf_interval + af_ratio - 1); 2736 } else { 2737 target = ((int64_t)rc->avg_frame_bandwidth * p_rc->baseline_gf_interval) / 2738 (p_rc->baseline_gf_interval + af_ratio - 1); 2739 } 2740 #else 2741 target = rc->avg_frame_bandwidth; 2742 #endif 2743 return clamp_pframe_target_size(cpi, target, frame_update_type); 2744 } 2745 2746 int av1_calc_iframe_target_size_one_pass_vbr(const AV1_COMP *const cpi) { 2747 static const int kf_ratio = 25; 2748 const RATE_CONTROL *rc = &cpi->rc; 2749 const int64_t target = (int64_t)rc->avg_frame_bandwidth * kf_ratio; 2750 return clamp_iframe_target_size(cpi, target); 2751 } 2752 2753 int av1_calc_pframe_target_size_one_pass_cbr( 2754 const AV1_COMP *cpi, FRAME_UPDATE_TYPE frame_update_type) { 2755 const AV1EncoderConfig *oxcf = &cpi->oxcf; 2756 const RATE_CONTROL *rc = &cpi->rc; 2757 const PRIMARY_RATE_CONTROL *p_rc = &cpi->ppi->p_rc; 2758 const RateControlCfg *rc_cfg = &oxcf->rc_cfg; 2759 const int64_t diff = p_rc->optimal_buffer_level - p_rc->buffer_level; 2760 const int64_t one_pct_bits = 1 + p_rc->optimal_buffer_level / 100; 2761 int min_frame_target = 2762 AOMMAX(rc->avg_frame_bandwidth >> 4, FRAME_OVERHEAD_BITS); 2763 int64_t target; 2764 2765 if (rc_cfg->gf_cbr_boost_pct) { 2766 const int af_ratio_pct = rc_cfg->gf_cbr_boost_pct + 100; 2767 if (frame_update_type == GF_UPDATE || frame_update_type == OVERLAY_UPDATE) { 2768 target = ((int64_t)rc->avg_frame_bandwidth * p_rc->baseline_gf_interval * 2769 af_ratio_pct) / 2770 (p_rc->baseline_gf_interval * 100 + af_ratio_pct - 100); 2771 } else { 2772 target = ((int64_t)rc->avg_frame_bandwidth * p_rc->baseline_gf_interval * 2773 100) / 2774 (p_rc->baseline_gf_interval * 100 + af_ratio_pct - 100); 2775 } 2776 } else { 2777 target = rc->avg_frame_bandwidth; 2778 } 2779 if (cpi->ppi->use_svc) { 2780 // Note that for layers, avg_frame_bandwidth is the cumulative 2781 // per-frame-bandwidth. For the target size of this frame, use the 2782 // layer average frame size (i.e., non-cumulative per-frame-bw). 2783 int layer = 2784 LAYER_IDS_TO_IDX(cpi->svc.spatial_layer_id, cpi->svc.temporal_layer_id, 2785 cpi->svc.number_temporal_layers); 2786 const LAYER_CONTEXT *lc = &cpi->svc.layer_context[layer]; 2787 target = lc->avg_frame_size; 2788 min_frame_target = AOMMAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS); 2789 } 2790 if (diff > 0) { 2791 // Lower the target bandwidth for this frame. 2792 const int pct_low = 2793 (int)AOMMIN(diff / one_pct_bits, rc_cfg->under_shoot_pct); 2794 target -= (target * pct_low) / 200; 2795 } else if (diff < 0) { 2796 // Increase the target bandwidth for this frame. 2797 const int pct_high = 2798 (int)AOMMIN(-diff / one_pct_bits, rc_cfg->over_shoot_pct); 2799 target += (target * pct_high) / 200; 2800 } 2801 if (rc_cfg->max_inter_bitrate_pct) { 2802 const int64_t max_rate = 2803 (int64_t)rc->avg_frame_bandwidth * rc_cfg->max_inter_bitrate_pct / 100; 2804 target = AOMMIN(target, max_rate); 2805 } 2806 if (target > INT_MAX) target = INT_MAX; 2807 return AOMMAX(min_frame_target, (int)target); 2808 } 2809 2810 int av1_calc_iframe_target_size_one_pass_cbr(const AV1_COMP *cpi) { 2811 const RATE_CONTROL *rc = &cpi->rc; 2812 const PRIMARY_RATE_CONTROL *p_rc = &cpi->ppi->p_rc; 2813 int64_t target; 2814 if (cpi->common.current_frame.frame_number == 0) { 2815 target = ((p_rc->starting_buffer_level / 2) > INT_MAX) 2816 ? INT_MAX 2817 : (int)(p_rc->starting_buffer_level / 2); 2818 if (cpi->svc.number_temporal_layers > 1 && target < (INT_MAX >> 2)) { 2819 target = target << AOMMIN(2, (cpi->svc.number_temporal_layers - 1)); 2820 } 2821 } else { 2822 int kf_boost = 32; 2823 double framerate = cpi->framerate; 2824 2825 kf_boost = AOMMAX(kf_boost, (int)round(2 * framerate - 16)); 2826 if (rc->frames_since_key < framerate / 2) { 2827 kf_boost = (int)(kf_boost * rc->frames_since_key / (framerate / 2)); 2828 } 2829 target = ((int64_t)(16 + kf_boost) * rc->avg_frame_bandwidth) >> 4; 2830 } 2831 return clamp_iframe_target_size(cpi, target); 2832 } 2833 2834 static void set_golden_update(AV1_COMP *const cpi) { 2835 RATE_CONTROL *const rc = &cpi->rc; 2836 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2837 int divisor = 10; 2838 if (cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ) 2839 divisor = cpi->cyclic_refresh->percent_refresh; 2840 2841 // Set minimum gf_interval for GF update to a multiple of the refresh period, 2842 // with some max limit. Depending on past encoding stats, GF flag may be 2843 // reset and update may not occur until next baseline_gf_interval. 2844 const int gf_length_mult[2] = { 8, 4 }; 2845 if (divisor > 0) 2846 p_rc->baseline_gf_interval = 2847 AOMMIN(gf_length_mult[cpi->sf.rt_sf.gf_length_lvl] * (100 / divisor), 2848 MAX_GF_INTERVAL_RT); 2849 else 2850 p_rc->baseline_gf_interval = FIXED_GF_INTERVAL_RT; 2851 if (rc->avg_frame_low_motion && rc->avg_frame_low_motion < 40) 2852 p_rc->baseline_gf_interval = 16; 2853 } 2854 2855 static void set_baseline_gf_interval(AV1_COMP *cpi, FRAME_TYPE frame_type) { 2856 RATE_CONTROL *const rc = &cpi->rc; 2857 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 2858 GF_GROUP *const gf_group = &cpi->ppi->gf_group; 2859 2860 set_golden_update(cpi); 2861 2862 if (p_rc->baseline_gf_interval > rc->frames_to_key && 2863 cpi->oxcf.kf_cfg.auto_key) 2864 p_rc->baseline_gf_interval = rc->frames_to_key; 2865 p_rc->gfu_boost = DEFAULT_GF_BOOST_RT; 2866 p_rc->constrained_gf_group = 2867 (p_rc->baseline_gf_interval >= rc->frames_to_key && 2868 cpi->oxcf.kf_cfg.auto_key) 2869 ? 1 2870 : 0; 2871 rc->frames_till_gf_update_due = p_rc->baseline_gf_interval; 2872 cpi->gf_frame_index = 0; 2873 // SVC does not use GF as periodic boost. 2874 // TODO(marpan): Find better way to disable this for SVC. 2875 if (cpi->ppi->use_svc) { 2876 SVC *const svc = &cpi->svc; 2877 p_rc->baseline_gf_interval = MAX_STATIC_GF_GROUP_LENGTH - 1; 2878 p_rc->gfu_boost = 1; 2879 p_rc->constrained_gf_group = 0; 2880 rc->frames_till_gf_update_due = p_rc->baseline_gf_interval; 2881 for (int layer = 0; 2882 layer < svc->number_spatial_layers * svc->number_temporal_layers; 2883 ++layer) { 2884 LAYER_CONTEXT *const lc = &svc->layer_context[layer]; 2885 lc->p_rc.baseline_gf_interval = p_rc->baseline_gf_interval; 2886 lc->p_rc.gfu_boost = p_rc->gfu_boost; 2887 lc->p_rc.constrained_gf_group = p_rc->constrained_gf_group; 2888 lc->rc.frames_till_gf_update_due = rc->frames_till_gf_update_due; 2889 lc->group_index = 0; 2890 } 2891 } 2892 gf_group->size = p_rc->baseline_gf_interval; 2893 gf_group->update_type[0] = (frame_type == KEY_FRAME) ? KF_UPDATE : GF_UPDATE; 2894 gf_group->refbuf_state[cpi->gf_frame_index] = 2895 (frame_type == KEY_FRAME) ? REFBUF_RESET : REFBUF_UPDATE; 2896 } 2897 2898 void av1_adjust_gf_refresh_qp_one_pass_rt(AV1_COMP *cpi) { 2899 AV1_COMMON *const cm = &cpi->common; 2900 RATE_CONTROL *const rc = &cpi->rc; 2901 RTC_REF *const rtc_ref = &cpi->ppi->rtc_ref; 2902 const int resize_pending = is_frame_resize_pending(cpi); 2903 if (!resize_pending && !rc->high_source_sad) { 2904 // Check if we should disable GF refresh (if period is up), 2905 // or force a GF refresh update (if we are at least halfway through 2906 // period) based on QP. Look into add info on segment deltaq. 2907 PRIMARY_RATE_CONTROL *p_rc = &cpi->ppi->p_rc; 2908 const int avg_qp = p_rc->avg_frame_qindex[INTER_FRAME]; 2909 const int allow_gf_update = 2910 rc->frames_till_gf_update_due <= (p_rc->baseline_gf_interval - 10); 2911 int gf_update_changed = 0; 2912 int thresh = 87; 2913 if ((cm->current_frame.frame_number - cpi->rc.frame_num_last_gf_refresh) < 2914 FIXED_GF_INTERVAL_RT && 2915 rc->frames_till_gf_update_due == 1 && 2916 cm->quant_params.base_qindex > avg_qp) { 2917 // Disable GF refresh since QP is above the running average QP. 2918 rtc_ref->refresh[rtc_ref->gld_idx_1layer] = 0; 2919 gf_update_changed = 1; 2920 cpi->refresh_frame.golden_frame = 0; 2921 } else if (allow_gf_update && 2922 ((cm->quant_params.base_qindex < thresh * avg_qp / 100) || 2923 (rc->avg_frame_low_motion && rc->avg_frame_low_motion < 20))) { 2924 // Force refresh since QP is well below average QP or this is a high 2925 // motion frame. 2926 rtc_ref->refresh[rtc_ref->gld_idx_1layer] = 1; 2927 gf_update_changed = 1; 2928 cpi->refresh_frame.golden_frame = 1; 2929 } 2930 if (gf_update_changed) { 2931 set_baseline_gf_interval(cpi, INTER_FRAME); 2932 int refresh_mask = 0; 2933 for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++) { 2934 int ref_frame_map_idx = rtc_ref->ref_idx[i]; 2935 refresh_mask |= rtc_ref->refresh[ref_frame_map_idx] 2936 << ref_frame_map_idx; 2937 } 2938 cm->current_frame.refresh_frame_flags = refresh_mask; 2939 } 2940 } 2941 } 2942 2943 /*!\brief Setup the reference prediction structure for 1 pass real-time 2944 * 2945 * Set the reference prediction structure for 1 layer. 2946 * Current structure is to use 3 references (LAST, GOLDEN, ALTREF), 2947 * where ALT_REF always behind current by lag_alt frames, and GOLDEN is 2948 * either updated on LAST with period baseline_gf_interval (fixed slot) 2949 * or always behind current by lag_gld (gld_fixed_slot = 0, lag_gld <= 7). 2950 * 2951 * \ingroup rate_control 2952 * \param[in] cpi Top level encoder structure 2953 * \param[in] gf_update Flag to indicate if GF is updated 2954 * 2955 * \remark Nothing is returned. Instead the settings for the prediction 2956 * structure are set in \c cpi-ext_flags; and the buffer slot index 2957 * (for each of 7 references) and refresh flags (for each of the 8 slots) 2958 * are set in \c cpi->svc.ref_idx[] and \c cpi->svc.refresh[]. 2959 */ 2960 void av1_set_rtc_reference_structure_one_layer(AV1_COMP *cpi, int gf_update) { 2961 AV1_COMMON *const cm = &cpi->common; 2962 ExternalFlags *const ext_flags = &cpi->ext_flags; 2963 RATE_CONTROL *const rc = &cpi->rc; 2964 ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags = 2965 &ext_flags->refresh_frame; 2966 RTC_REF *const rtc_ref = &cpi->ppi->rtc_ref; 2967 unsigned int frame_number = (cpi->oxcf.rc_cfg.drop_frames_water_mark) 2968 ? rc->frame_number_encoded 2969 : cm->current_frame.frame_number; 2970 unsigned int lag_alt = 4; 2971 int last_idx = 0; 2972 int last_idx_refresh = 0; 2973 int gld_idx = 0; 2974 int alt_ref_idx = 0; 2975 int last2_idx = 0; 2976 ext_refresh_frame_flags->update_pending = 1; 2977 ext_flags->ref_frame_flags = 0; 2978 ext_refresh_frame_flags->last_frame = 1; 2979 ext_refresh_frame_flags->golden_frame = 0; 2980 ext_refresh_frame_flags->alt_ref_frame = 0; 2981 // Decide altref lag adaptively for rt 2982 if (cpi->sf.rt_sf.sad_based_adp_altref_lag) { 2983 lag_alt = 6; 2984 const uint64_t th_frame_sad[4][3] = { 2985 { 18000, 18000, 18000 }, // HDRES CPU 9 2986 { 25000, 25000, 25000 }, // MIDRES CPU 9 2987 { 40000, 30000, 20000 }, // HDRES CPU 10 2988 { 30000, 25000, 20000 } // MIDRES CPU 10 2989 }; 2990 int th_idx = cpi->sf.rt_sf.sad_based_adp_altref_lag - 1; 2991 assert(th_idx < 4); 2992 if (rc->avg_source_sad > th_frame_sad[th_idx][0]) 2993 lag_alt = 3; 2994 else if (rc->avg_source_sad > th_frame_sad[th_idx][1]) 2995 lag_alt = 4; 2996 else if (rc->avg_source_sad > th_frame_sad[th_idx][2]) 2997 lag_alt = 5; 2998 } 2999 // This defines the reference structure for 1 layer (non-svc) RTC encoding. 3000 // To avoid the internal/default reference structure for non-realtime 3001 // overwriting this behavior, we use the "svc" ref parameters from the 3002 // external control SET_SVC_REF_FRAME_CONFIG. 3003 // TODO(marpan): rename that control and the related internal parameters 3004 // to rtc_ref. 3005 for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) rtc_ref->ref_idx[i] = 7; 3006 for (int i = 0; i < REF_FRAMES; ++i) rtc_ref->refresh[i] = 0; 3007 // Set the reference frame flags. 3008 ext_flags->ref_frame_flags ^= AOM_LAST_FLAG; 3009 if (!cpi->sf.rt_sf.force_only_last_ref) { 3010 ext_flags->ref_frame_flags ^= AOM_ALT_FLAG; 3011 ext_flags->ref_frame_flags ^= AOM_GOLD_FLAG; 3012 if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1]) 3013 ext_flags->ref_frame_flags ^= AOM_LAST2_FLAG; 3014 } 3015 const int sh = 6; 3016 // Moving index slot for last: 0 - (sh - 1). 3017 if (frame_number > 1) last_idx = ((frame_number - 1) % sh); 3018 // Moving index for refresh of last: one ahead for next frame. 3019 last_idx_refresh = (frame_number % sh); 3020 gld_idx = 6; 3021 3022 // Moving index for alt_ref, lag behind LAST by lag_alt frames. 3023 if (frame_number > lag_alt) alt_ref_idx = ((frame_number - lag_alt) % sh); 3024 if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1]) { 3025 // Moving index for LAST2, lag behind LAST by 2 frames. 3026 if (frame_number > 2) last2_idx = ((frame_number - 2) % sh); 3027 } 3028 rtc_ref->ref_idx[0] = last_idx; // LAST 3029 rtc_ref->ref_idx[1] = last_idx_refresh; // LAST2 (for refresh of last). 3030 if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1]) { 3031 rtc_ref->ref_idx[1] = last2_idx; // LAST2 3032 rtc_ref->ref_idx[2] = last_idx_refresh; // LAST3 (for refresh of last). 3033 } 3034 rtc_ref->ref_idx[3] = gld_idx; // GOLDEN 3035 rtc_ref->ref_idx[6] = alt_ref_idx; // ALT_REF 3036 // Refresh this slot, which will become LAST on next frame. 3037 rtc_ref->refresh[last_idx_refresh] = 1; 3038 // Update GOLDEN on period for fixed slot case. 3039 if (gf_update && cm->current_frame.frame_type != KEY_FRAME) { 3040 ext_refresh_frame_flags->golden_frame = 1; 3041 rtc_ref->refresh[gld_idx] = 1; 3042 } 3043 rtc_ref->gld_idx_1layer = gld_idx; 3044 // Set the flag to reduce the number of reference frame buffers used. 3045 // This assumes that slot 7 is never used. 3046 cpi->rt_reduce_num_ref_buffers = 1; 3047 cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[0] < 7); 3048 cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[1] < 7); 3049 cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[3] < 7); 3050 cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[6] < 7); 3051 if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1]) 3052 cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[2] < 7); 3053 } 3054 3055 // Returns whether the 64x64 block is active or inactive: used 3056 // by the scene detection, which is over 64x64 blocks. 3057 static int set_block_is_active(unsigned char *const active_map_4x4, int mi_cols, 3058 int mi_rows, int sbi_col, int sbi_row) { 3059 int num_4x4 = 16; 3060 int r = sbi_row << 4; 3061 int c = sbi_col << 4; 3062 const int row_max = AOMMIN(num_4x4, mi_rows - r); 3063 const int col_max = AOMMIN(num_4x4, mi_cols - c); 3064 // Active map is set for 16x16 blocks, so only need to 3065 // check over16x16, 3066 for (int x = 0; x < row_max; x += 4) { 3067 for (int y = 0; y < col_max; y += 4) { 3068 if (active_map_4x4[(r + x) * mi_cols + (c + y)] == AM_SEGMENT_ID_ACTIVE) 3069 return 1; 3070 } 3071 } 3072 return 0; 3073 } 3074 3075 // Returns the best sad for column or row motion of the superblock. 3076 static unsigned int estimate_scroll_motion( 3077 const AV1_COMP *cpi, uint8_t *src_buf, uint8_t *last_src_buf, 3078 int src_stride, int ref_stride, BLOCK_SIZE bsize, int pos_col, int pos_row, 3079 int *best_intmv_col, int *best_intmv_row, int sw_col, int sw_row) { 3080 const AV1_COMMON *const cm = &cpi->common; 3081 const int bw = block_size_wide[bsize]; 3082 const int bh = block_size_high[bsize]; 3083 const int full_search = 1; 3084 // Keep border a multiple of 16. 3085 const int border = (cpi->oxcf.border_in_pixels >> 4) << 4; 3086 int search_size_width = sw_col; 3087 int search_size_height = sw_row; 3088 // Adjust based on boundary. 3089 if ((pos_col - search_size_width < -border) || 3090 (pos_col + search_size_width > cm->width + border)) 3091 search_size_width = border; 3092 if ((pos_row - search_size_height < -border) || 3093 (pos_row + search_size_height > cm->height + border)) 3094 search_size_height = border; 3095 const uint8_t *ref_buf; 3096 const int row_norm_factor = mi_size_high_log2[bsize] + 1; 3097 const int col_norm_factor = 3 + (bw >> 5); 3098 const int ref_buf_width = (search_size_width << 1) + bw; 3099 const int ref_buf_height = (search_size_height << 1) + bh; 3100 int16_t *hbuf = (int16_t *)aom_malloc(ref_buf_width * sizeof(*hbuf)); 3101 int16_t *vbuf = (int16_t *)aom_malloc(ref_buf_height * sizeof(*vbuf)); 3102 int16_t *src_hbuf = (int16_t *)aom_malloc(bw * sizeof(*src_hbuf)); 3103 int16_t *src_vbuf = (int16_t *)aom_malloc(bh * sizeof(*src_vbuf)); 3104 if (!hbuf || !vbuf || !src_hbuf || !src_vbuf) { 3105 aom_free(hbuf); 3106 aom_free(vbuf); 3107 aom_free(src_hbuf); 3108 aom_free(src_vbuf); 3109 aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR, 3110 "Failed to allocate hbuf, vbuf, src_hbuf, or src_vbuf"); 3111 } 3112 // Set up prediction 1-D reference set for rows. 3113 ref_buf = last_src_buf - search_size_width; 3114 aom_int_pro_row(hbuf, ref_buf, ref_stride, ref_buf_width, bh, 3115 row_norm_factor); 3116 // Set up prediction 1-D reference set for cols 3117 ref_buf = last_src_buf - search_size_height * ref_stride; 3118 aom_int_pro_col(vbuf, ref_buf, ref_stride, bw, ref_buf_height, 3119 col_norm_factor); 3120 // Set up src 1-D reference set 3121 aom_int_pro_row(src_hbuf, src_buf, src_stride, bw, bh, row_norm_factor); 3122 aom_int_pro_col(src_vbuf, src_buf, src_stride, bw, bh, col_norm_factor); 3123 unsigned int best_sad; 3124 int best_sad_col, best_sad_row; 3125 // Find the best match per 1-D search 3126 *best_intmv_col = 3127 av1_vector_match(hbuf, src_hbuf, mi_size_wide_log2[bsize], 3128 search_size_width, full_search, &best_sad_col); 3129 *best_intmv_row = 3130 av1_vector_match(vbuf, src_vbuf, mi_size_high_log2[bsize], 3131 search_size_height, full_search, &best_sad_row); 3132 if (best_sad_col < best_sad_row) { 3133 *best_intmv_row = 0; 3134 best_sad = best_sad_col; 3135 } else { 3136 *best_intmv_col = 0; 3137 best_sad = best_sad_row; 3138 } 3139 aom_free(hbuf); 3140 aom_free(vbuf); 3141 aom_free(src_hbuf); 3142 aom_free(src_vbuf); 3143 return best_sad; 3144 } 3145 3146 /*!\brief Check for scene detection, for 1 pass real-time mode. 3147 * 3148 * Compute average source sad (temporal sad: between current source and 3149 * previous source) over a subset of superblocks. Use this is detect big changes 3150 * in content and set the \c cpi->rc.high_source_sad flag. 3151 * 3152 * \ingroup rate_control 3153 * \param[in] cpi Top level encoder structure 3154 * \param[in] frame_input Current and last input source frames 3155 * 3156 * \remark Nothing is returned. Instead the flag \c cpi->rc.high_source_sad 3157 * is set if scene change is detected, and \c cpi->rc.avg_source_sad is updated. 3158 */ 3159 static void rc_scene_detection_onepass_rt(AV1_COMP *cpi, 3160 const EncodeFrameInput *frame_input) { 3161 AV1_COMMON *const cm = &cpi->common; 3162 RATE_CONTROL *const rc = &cpi->rc; 3163 YV12_BUFFER_CONFIG const *const unscaled_src = frame_input->source; 3164 YV12_BUFFER_CONFIG const *const unscaled_last_src = frame_input->last_source; 3165 uint8_t *src_y; 3166 int src_ystride; 3167 int src_width; 3168 int src_height; 3169 uint8_t *last_src_y; 3170 int last_src_ystride; 3171 int last_src_width; 3172 int last_src_height; 3173 int width = cm->width; 3174 int height = cm->height; 3175 if (cpi->svc.number_spatial_layers > 1) { 3176 width = cpi->oxcf.frm_dim_cfg.width; 3177 height = cpi->oxcf.frm_dim_cfg.height; 3178 } 3179 // Set src_sad_blk_64x64 to NULL also for number_spatial layers > 1, as 3180 // it is never allocated for number_spatial_layers > 1 (see the condition 3181 // under which we allocate cpi->src_sad_blk_64x64 later in this function). 3182 // This is guard against the case where the number_spatial_layers 3183 // is changed dynamically without re-alloc of encoder. 3184 if (width != cm->render_width || height != cm->render_height || 3185 cpi->svc.number_spatial_layers > 1 || unscaled_src == NULL || 3186 unscaled_last_src == NULL) { 3187 aom_free(cpi->src_sad_blk_64x64); 3188 cpi->src_sad_blk_64x64 = NULL; 3189 } 3190 if (unscaled_src == NULL || unscaled_last_src == NULL) return; 3191 src_y = unscaled_src->y_buffer; 3192 src_ystride = unscaled_src->y_stride; 3193 src_width = unscaled_src->y_width; 3194 src_height = unscaled_src->y_height; 3195 last_src_y = unscaled_last_src->y_buffer; 3196 last_src_ystride = unscaled_last_src->y_stride; 3197 last_src_width = unscaled_last_src->y_width; 3198 last_src_height = unscaled_last_src->y_height; 3199 if (src_width != last_src_width || src_height != last_src_height) { 3200 aom_free(cpi->src_sad_blk_64x64); 3201 cpi->src_sad_blk_64x64 = NULL; 3202 return; 3203 } 3204 rc->high_source_sad = 0; 3205 rc->percent_blocks_with_motion = 0; 3206 rc->max_block_source_sad = 0; 3207 rc->prev_avg_source_sad = rc->avg_source_sad; 3208 int num_mi_cols = cm->mi_params.mi_cols; 3209 int num_mi_rows = cm->mi_params.mi_rows; 3210 if (cpi->svc.number_spatial_layers > 1) { 3211 num_mi_cols = cpi->svc.mi_cols_full_resoln; 3212 num_mi_rows = cpi->svc.mi_rows_full_resoln; 3213 } 3214 int num_zero_temp_sad = 0; 3215 uint32_t min_thresh = 3216 (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) ? 8000 : 10000; 3217 if (cpi->sf.rt_sf.higher_thresh_scene_detection) { 3218 min_thresh = cm->width * cm->height <= 320 * 240 && cpi->framerate < 10.0 3219 ? 50000 3220 : 100000; 3221 } 3222 const BLOCK_SIZE bsize = BLOCK_64X64; 3223 // Loop over sub-sample of frame, compute average sad over 64x64 blocks. 3224 uint64_t avg_sad = 0; 3225 uint64_t tmp_sad = 0; 3226 int num_samples = 0; 3227 const int thresh = 3228 ((cm->width * cm->height <= 320 * 240 && cpi->framerate < 10.0) || 3229 (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN)) 3230 ? 5 3231 : 6; 3232 // SAD is computed on 64x64 blocks 3233 const int sb_size_by_mb = (cm->seq_params->sb_size == BLOCK_128X128) 3234 ? (cm->seq_params->mib_size >> 1) 3235 : cm->seq_params->mib_size; 3236 const int sb_cols = (num_mi_cols + sb_size_by_mb - 1) / sb_size_by_mb; 3237 const int sb_rows = (num_mi_rows + sb_size_by_mb - 1) / sb_size_by_mb; 3238 uint64_t sum_sq_thresh = 10000; // sum = sqrt(thresh / 64*64)) ~1.5 3239 int num_low_var_high_sumdiff = 0; 3240 int light_change = 0; 3241 // Flag to check light change or not. 3242 const int check_light_change = 0; 3243 // TODO(marpan): There seems some difference along the bottom border when 3244 // using the source_last_tl0 for last_source (used for temporal layers or 3245 // when previous frame is dropped). 3246 // Remove this border parameter when issue is resolved: difference is that 3247 // non-zero sad exists along bottom border even though source is static. 3248 const int border = 3249 rc->prev_frame_is_dropped || cpi->svc.number_temporal_layers > 1; 3250 // Store blkwise SAD for later use. Disable for spatial layers for now. 3251 if (width == cm->render_width && height == cm->render_height && 3252 cpi->svc.number_spatial_layers == 1) { 3253 if (cpi->src_sad_blk_64x64 == NULL) { 3254 CHECK_MEM_ERROR(cm, cpi->src_sad_blk_64x64, 3255 (uint64_t *)aom_calloc(sb_cols * sb_rows, 3256 sizeof(*cpi->src_sad_blk_64x64))); 3257 } 3258 } 3259 const CommonModeInfoParams *const mi_params = &cpi->common.mi_params; 3260 const int mi_cols = mi_params->mi_cols; 3261 const int mi_rows = mi_params->mi_rows; 3262 unsigned char *const active_map_4x4 = cpi->active_map.map; 3263 // Avoid bottom and right border. 3264 for (int sbi_row = 0; sbi_row < sb_rows - border; ++sbi_row) { 3265 for (int sbi_col = 0; sbi_col < sb_cols; ++sbi_col) { 3266 int block_is_active = 1; 3267 if (cpi->active_map.enabled && rc->percent_blocks_inactive > 0) { 3268 // Fix this to include skip feature via ROI. 3269 block_is_active = set_block_is_active(active_map_4x4, mi_cols, mi_rows, 3270 sbi_col, sbi_row); 3271 } 3272 if (block_is_active) { 3273 tmp_sad = cpi->ppi->fn_ptr[bsize].sdf(src_y, src_ystride, last_src_y, 3274 last_src_ystride); 3275 } else { 3276 tmp_sad = 0; 3277 } 3278 if (cpi->src_sad_blk_64x64 != NULL) 3279 cpi->src_sad_blk_64x64[sbi_col + sbi_row * sb_cols] = tmp_sad; 3280 if (check_light_change) { 3281 unsigned int sse, variance; 3282 variance = cpi->ppi->fn_ptr[bsize].vf(src_y, src_ystride, last_src_y, 3283 last_src_ystride, &sse); 3284 // Note: sse - variance = ((sum * sum) >> 12) 3285 // Detect large lighting change. 3286 if (variance < (sse >> 1) && (sse - variance) > sum_sq_thresh) { 3287 num_low_var_high_sumdiff++; 3288 } 3289 } 3290 avg_sad += tmp_sad; 3291 num_samples++; 3292 if (tmp_sad == 0) num_zero_temp_sad++; 3293 if (tmp_sad > rc->max_block_source_sad) 3294 rc->max_block_source_sad = tmp_sad; 3295 3296 src_y += 64; 3297 last_src_y += 64; 3298 } 3299 src_y += (src_ystride << 6) - (sb_cols << 6); 3300 last_src_y += (last_src_ystride << 6) - (sb_cols << 6); 3301 } 3302 if (check_light_change && num_samples > 0 && 3303 num_low_var_high_sumdiff > (num_samples >> 1)) 3304 light_change = 1; 3305 if (num_samples > 0) avg_sad = avg_sad / num_samples; 3306 // Set high_source_sad flag if we detect very high increase in avg_sad 3307 // between current and previous frame value(s). Use minimum threshold 3308 // for cases where there is small change from content that is completely 3309 // static. 3310 if (!light_change && 3311 avg_sad > 3312 AOMMAX(min_thresh, (unsigned int)(rc->avg_source_sad * thresh)) && 3313 rc->frames_since_key > 1 + cpi->svc.number_spatial_layers && 3314 num_zero_temp_sad < 3 * (num_samples >> 2)) 3315 rc->high_source_sad = 1; 3316 else 3317 rc->high_source_sad = 0; 3318 rc->avg_source_sad = (3 * rc->avg_source_sad + avg_sad) >> 2; 3319 rc->frame_source_sad = avg_sad; 3320 if (num_samples > 0) 3321 rc->percent_blocks_with_motion = 3322 ((num_samples - num_zero_temp_sad) * 100) / num_samples; 3323 if (rc->frame_source_sad > 0) rc->static_since_last_scene_change = 0; 3324 if (rc->high_source_sad) { 3325 cpi->rc.frames_since_scene_change = 0; 3326 rc->static_since_last_scene_change = 1; 3327 } 3328 // Update the high_motion_content_screen_rtc flag on TL0. Avoid the update 3329 // if too many consecutive frame drops occurred. 3330 const int scale = 3331 (unscaled_src->y_width * unscaled_src->y_height > 1920 * 1080) ? 24 : 10; 3332 const uint64_t thresh_high_motion = scale * 64 * 64; 3333 if (cpi->svc.temporal_layer_id == 0 && rc->drop_count_consec < 3) { 3334 cpi->rc.high_motion_content_screen_rtc = 0; 3335 if (cpi->oxcf.speed >= 11 && 3336 cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN && 3337 rc->num_col_blscroll_last_tl0 == 0 && 3338 rc->num_row_blscroll_last_tl0 == 0 && 3339 rc->percent_blocks_with_motion > 40 && 3340 rc->prev_avg_source_sad > thresh_high_motion && 3341 rc->avg_source_sad > thresh_high_motion && 3342 rc->avg_frame_low_motion < 60 && unscaled_src->y_width >= 1280 && 3343 unscaled_src->y_height >= 720) { 3344 cpi->rc.high_motion_content_screen_rtc = 1; 3345 // Compute fast coarse/global motion for 128x128 superblock centered 3346 // at middle of frame, and one to the upper left and one to lower right. 3347 // to determine if motion is scroll. Only test 3 points (pts) for now. 3348 // TODO(marpan): Only allow for 8 bit-depth for now. 3349 if (cm->seq_params->bit_depth == 8) { 3350 int sw_row = (cpi->rc.frame_source_sad > 20000) ? 512 : 192; 3351 int sw_col = (cpi->rc.frame_source_sad > 20000) ? 512 : 160; 3352 if (cm->width * cm->height >= 3840 * 2160 && 3353 cpi->svc.number_temporal_layers > 1) { 3354 sw_row = sw_row << 1; 3355 sw_col = sw_col << 1; 3356 } 3357 const int num_pts = 3358 unscaled_src->y_width * unscaled_src->y_height >= 1920 * 1080 ? 3 3359 : 1; 3360 for (int pts = 0; pts < num_pts; pts++) { 3361 // fac and shift are used to move the center block for the other 3362 // two points (pts). 3363 int fac = 1; 3364 int shift = 1; 3365 if (pts == 1) { 3366 fac = 1; 3367 shift = 2; 3368 } else if (pts == 2) { 3369 fac = 3; 3370 shift = 2; 3371 } 3372 int pos_col = (fac * unscaled_src->y_width >> shift) - 64; 3373 int pos_row = (fac * unscaled_src->y_height >> shift) - 64; 3374 pos_col = AOMMAX(sw_col, 3375 AOMMIN(unscaled_src->y_width - sw_col - 1, pos_col)); 3376 pos_row = AOMMAX( 3377 sw_row, AOMMIN(unscaled_src->y_height - sw_row - 1, pos_row)); 3378 if (pos_col >= 0 && pos_col < unscaled_src->y_width - 64 && 3379 pos_row >= 0 && pos_row < unscaled_src->y_height - 64) { 3380 src_y = unscaled_src->y_buffer + pos_row * src_ystride + pos_col; 3381 last_src_y = unscaled_last_src->y_buffer + 3382 pos_row * last_src_ystride + pos_col; 3383 int best_intmv_col = 0; 3384 int best_intmv_row = 0; 3385 unsigned int y_sad = estimate_scroll_motion( 3386 cpi, src_y, last_src_y, src_ystride, last_src_ystride, 3387 BLOCK_128X128, pos_col, pos_row, &best_intmv_col, 3388 &best_intmv_row, sw_col, sw_row); 3389 unsigned int sad_thresh = 3390 (abs(best_intmv_col) > 150 || abs(best_intmv_row) > 150) ? 300 3391 : 150; 3392 if (y_sad < sad_thresh && 3393 (abs(best_intmv_col) > 16 || abs(best_intmv_row) > 16)) { 3394 cpi->rc.high_motion_content_screen_rtc = 0; 3395 break; 3396 } 3397 } 3398 } 3399 } 3400 } 3401 // Pass the flag value to all layer frames. 3402 if (cpi->svc.number_spatial_layers > 1 || 3403 cpi->svc.number_temporal_layers > 1) { 3404 SVC *svc = &cpi->svc; 3405 for (int sl = 0; sl < svc->number_spatial_layers; ++sl) { 3406 for (int tl = 1; tl < svc->number_temporal_layers; ++tl) { 3407 const int layer = 3408 LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers); 3409 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 3410 RATE_CONTROL *lrc = &lc->rc; 3411 lrc->high_motion_content_screen_rtc = 3412 rc->high_motion_content_screen_rtc; 3413 } 3414 } 3415 } 3416 } 3417 // Scene detection is only on base SLO, and using full/original resolution. 3418 // Pass the state to the upper spatial layers. 3419 if (cpi->svc.number_spatial_layers > 1) { 3420 SVC *svc = &cpi->svc; 3421 for (int sl = 0; sl < svc->number_spatial_layers; ++sl) { 3422 int tl = svc->temporal_layer_id; 3423 const int layer = LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers); 3424 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 3425 RATE_CONTROL *lrc = &lc->rc; 3426 lrc->high_source_sad = rc->high_source_sad; 3427 lrc->frame_source_sad = rc->frame_source_sad; 3428 lrc->avg_source_sad = rc->avg_source_sad; 3429 lrc->percent_blocks_with_motion = rc->percent_blocks_with_motion; 3430 lrc->max_block_source_sad = rc->max_block_source_sad; 3431 } 3432 } 3433 } 3434 3435 // This is used as a reference when computing the source variance. 3436 static const uint8_t AV1_VAR_OFFS[MAX_SB_SIZE] = { 3437 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3438 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3439 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3440 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3441 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3442 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3443 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3444 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 3445 128, 128, 128, 128, 128, 128, 128, 128 3446 }; 3447 3448 /*!\brief Compute spatial activity for frame, 1 pass real-time mode. 3449 * 3450 * Compute average spatial activity/variance for source frame over a 3451 * subset of superblocks. 3452 * 3453 * \ingroup rate_control 3454 * \param[in] cpi Top level encoder structure 3455 * \param[in] src_y Input source buffer for y channel. 3456 * \param[in] src_ystride Input source stride for y channel. 3457 * 3458 * \remark Nothing is returned. Instead the average spatial variance 3459 * computed is stored in flag \c cpi->rc.frame_spatial_variance. 3460 */ 3461 static void rc_spatial_act_onepass_rt(AV1_COMP *cpi, uint8_t *src_y, 3462 int src_ystride) { 3463 AV1_COMMON *const cm = &cpi->common; 3464 int num_mi_cols = cm->mi_params.mi_cols; 3465 int num_mi_rows = cm->mi_params.mi_rows; 3466 const BLOCK_SIZE bsize = BLOCK_64X64; 3467 // Loop over sub-sample of frame, compute average over 64x64 blocks. 3468 uint64_t avg_variance = 0; 3469 int num_samples = 0; 3470 int num_zero_var_blocks = 0; 3471 cpi->rc.perc_spatial_flat_blocks = 0; 3472 const int sb_size_by_mb = (cm->seq_params->sb_size == BLOCK_128X128) 3473 ? (cm->seq_params->mib_size >> 1) 3474 : cm->seq_params->mib_size; 3475 const int sb_cols = (num_mi_cols + sb_size_by_mb - 1) / sb_size_by_mb; 3476 const int sb_rows = (num_mi_rows + sb_size_by_mb - 1) / sb_size_by_mb; 3477 for (int sbi_row = 0; sbi_row < sb_rows; ++sbi_row) { 3478 for (int sbi_col = 0; sbi_col < sb_cols; ++sbi_col) { 3479 unsigned int sse; 3480 const unsigned int var = 3481 cpi->ppi->fn_ptr[bsize].vf(src_y, src_ystride, AV1_VAR_OFFS, 0, &sse); 3482 avg_variance += var; 3483 num_samples++; 3484 if (var == 0) num_zero_var_blocks++; 3485 src_y += 64; 3486 } 3487 src_y += (src_ystride << 6) - (sb_cols << 6); 3488 } 3489 if (num_samples > 0) { 3490 cpi->rc.perc_spatial_flat_blocks = 100 * num_zero_var_blocks / num_samples; 3491 avg_variance = avg_variance / num_samples; 3492 } 3493 cpi->rc.frame_spatial_variance = avg_variance >> 12; 3494 } 3495 3496 /*!\brief Set the GF baseline interval for 1 pass real-time mode. 3497 * 3498 * 3499 * \ingroup rate_control 3500 * \param[in] cpi Top level encoder structure 3501 * \param[in] frame_type frame type 3502 * 3503 * \return Return GF update flag, and update the \c cpi->rc with 3504 * the next GF interval settings. 3505 */ 3506 static int set_gf_interval_update_onepass_rt(AV1_COMP *cpi, 3507 FRAME_TYPE frame_type) { 3508 RATE_CONTROL *const rc = &cpi->rc; 3509 int gf_update = 0; 3510 const int resize_pending = is_frame_resize_pending(cpi); 3511 // GF update based on frames_till_gf_update_due, also 3512 // force update on resize pending frame or for scene change. 3513 if ((resize_pending || rc->high_source_sad || 3514 rc->frames_till_gf_update_due == 0) && 3515 cpi->svc.temporal_layer_id == 0 && cpi->svc.spatial_layer_id == 0) { 3516 set_baseline_gf_interval(cpi, frame_type); 3517 gf_update = 1; 3518 } 3519 return gf_update; 3520 } 3521 3522 static void resize_reset_rc(AV1_COMP *cpi, int resize_width, int resize_height, 3523 int prev_width, int prev_height) { 3524 RATE_CONTROL *const rc = &cpi->rc; 3525 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 3526 SVC *const svc = &cpi->svc; 3527 int target_bits_per_frame; 3528 int active_worst_quality; 3529 int qindex; 3530 double tot_scale_change = (double)(resize_width * resize_height) / 3531 (double)(prev_width * prev_height); 3532 // Disable the skip mv search for svc on resize frame. 3533 svc->skip_mvsearch_last = 0; 3534 svc->skip_mvsearch_gf = 0; 3535 svc->skip_mvsearch_altref = 0; 3536 // Reset buffer level to optimal, update target size. 3537 p_rc->buffer_level = p_rc->optimal_buffer_level; 3538 p_rc->bits_off_target = p_rc->optimal_buffer_level; 3539 rc->this_frame_target = 3540 av1_calc_pframe_target_size_one_pass_cbr(cpi, INTER_FRAME); 3541 target_bits_per_frame = rc->this_frame_target; 3542 if (tot_scale_change > 4.0) 3543 p_rc->avg_frame_qindex[INTER_FRAME] = rc->worst_quality; 3544 else if (tot_scale_change > 1.0) 3545 p_rc->avg_frame_qindex[INTER_FRAME] = 3546 (p_rc->avg_frame_qindex[INTER_FRAME] + rc->worst_quality) >> 1; 3547 active_worst_quality = calc_active_worst_quality_no_stats_cbr(cpi); 3548 qindex = av1_rc_regulate_q(cpi, target_bits_per_frame, rc->best_quality, 3549 active_worst_quality, resize_width, resize_height); 3550 // If resize is down, check if projected q index is close to worst_quality, 3551 // and if so, reduce the rate correction factor (since likely can afford 3552 // lower q for resized frame). 3553 if (tot_scale_change < 1.0 && qindex > 90 * rc->worst_quality / 100) 3554 p_rc->rate_correction_factors[INTER_NORMAL] *= 0.85; 3555 // If resize is back up: check if projected q index is too much above the 3556 // previous index, and if so, reduce the rate correction factor 3557 // (since prefer to keep q for resized frame at least closet to previous q). 3558 // Also check if projected qindex is close to previous qindex, if so 3559 // increase correction factor (to push qindex higher and avoid overshoot). 3560 if (tot_scale_change >= 1.0) { 3561 if (tot_scale_change < 4.0 && 3562 qindex > 130 * p_rc->last_q[INTER_FRAME] / 100) 3563 p_rc->rate_correction_factors[INTER_NORMAL] *= 0.8; 3564 if (qindex <= 120 * p_rc->last_q[INTER_FRAME] / 100) 3565 p_rc->rate_correction_factors[INTER_NORMAL] *= 1.5; 3566 } 3567 if (svc->number_temporal_layers > 1) { 3568 // Apply the same rate control reset to all temporal layers. 3569 for (int tl = 0; tl < svc->number_temporal_layers; tl++) { 3570 LAYER_CONTEXT *lc = NULL; 3571 lc = &svc->layer_context[svc->spatial_layer_id * 3572 svc->number_temporal_layers + 3573 tl]; 3574 lc->rc.resize_state = rc->resize_state; 3575 lc->p_rc.buffer_level = lc->p_rc.optimal_buffer_level; 3576 lc->p_rc.bits_off_target = lc->p_rc.optimal_buffer_level; 3577 lc->p_rc.rate_correction_factors[INTER_NORMAL] = 3578 p_rc->rate_correction_factors[INTER_NORMAL]; 3579 lc->p_rc.avg_frame_qindex[INTER_FRAME] = 3580 p_rc->avg_frame_qindex[INTER_FRAME]; 3581 } 3582 } 3583 } 3584 3585 /*!\brief Check for resize based on Q, for 1 pass real-time mode. 3586 * 3587 * Check if we should resize, based on average QP and content/motion 3588 * complexity from past x frames. 3589 * Only allow for resize at most 1/2 scale down for now, Scaling factor 3590 * for each step may be 3/4 or 1/2. 3591 * 3592 * \ingroup rate_control 3593 * \param[in] cpi Top level encoder structure 3594 * \param[in] one_half_only Only allow 1/2 scaling factor 3595 * 3596 * \remark Return resized width/height in \c cpi->resize_pending_params, 3597 * and update some resize counters in \c rc. 3598 */ 3599 static void dynamic_resize_one_pass_cbr(AV1_COMP *cpi, int one_half_only) { 3600 const AV1_COMMON *const cm = &cpi->common; 3601 RATE_CONTROL *const rc = &cpi->rc; 3602 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 3603 RESIZE_ACTION resize_action = NO_RESIZE; 3604 const int avg_qp_thr1 = 70; 3605 const int avg_qp_thr2 = 50; 3606 // Don't allow for resized frame to go below 160x90, resize in steps of 3/4. 3607 const int min_width = (160 * 4) / 3; 3608 const int min_height = (90 * 4) / 3; 3609 int down_size_on = 1; 3610 // Don't resize on key frame; reset the counters on key frame. 3611 if (cm->current_frame.frame_type == KEY_FRAME) { 3612 rc->resize_avg_qp = 0; 3613 rc->resize_count = 0; 3614 rc->resize_buffer_underflow = 0; 3615 return; 3616 } 3617 // No resizing down if frame size is below some limit. 3618 if ((cm->width * cm->height) < min_width * min_height) down_size_on = 0; 3619 3620 // Resize based on average buffer underflow and QP over some window. 3621 // Ignore samples close to key frame and scene change since QP is usually high 3622 // after key and scene change. 3623 // Need to incorpoate content/motion from scene detection analysis. 3624 if (rc->frames_since_key > cpi->framerate && !rc->high_source_sad) { 3625 const int window = AOMMAX(60, (int)(3 * cpi->framerate)); 3626 rc->resize_avg_qp += p_rc->last_q[INTER_FRAME]; 3627 if (cpi->ppi->p_rc.buffer_level < 3628 (int)(30 * p_rc->optimal_buffer_level / 100)) 3629 ++rc->resize_buffer_underflow; 3630 ++rc->resize_count; 3631 // Check for resize action every "window" frames. 3632 if (rc->resize_count >= window) { 3633 int avg_qp = rc->resize_avg_qp / rc->resize_count; 3634 // Resize down if buffer level has underflowed sufficient amount in past 3635 // window, and we are at original or 3/4 of original resolution. 3636 // Resize back up if average QP is low, and we are currently in a resized 3637 // down state, i.e. 1/2 or 3/4 of original resolution. 3638 // Currently, use a flag to turn 3/4 resizing feature on/off. 3639 if (rc->resize_buffer_underflow > (rc->resize_count >> 2) && 3640 down_size_on) { 3641 if (rc->resize_state == THREE_QUARTER) { 3642 resize_action = DOWN_ONEHALF; 3643 rc->resize_state = ONE_HALF; 3644 } else if (rc->resize_state == ORIG) { 3645 resize_action = one_half_only ? DOWN_ONEHALF : DOWN_THREEFOUR; 3646 rc->resize_state = one_half_only ? ONE_HALF : THREE_QUARTER; 3647 } 3648 } else if (rc->resize_state != ORIG && 3649 avg_qp < avg_qp_thr1 * cpi->rc.worst_quality / 100) { 3650 if (rc->resize_state == THREE_QUARTER || 3651 avg_qp < avg_qp_thr2 * cpi->rc.worst_quality / 100 || 3652 one_half_only) { 3653 resize_action = UP_ORIG; 3654 rc->resize_state = ORIG; 3655 } else if (rc->resize_state == ONE_HALF) { 3656 resize_action = UP_THREEFOUR; 3657 rc->resize_state = THREE_QUARTER; 3658 } 3659 } 3660 // Reset for next window measurement. 3661 rc->resize_avg_qp = 0; 3662 rc->resize_count = 0; 3663 rc->resize_buffer_underflow = 0; 3664 } 3665 } 3666 // If decision is to resize, reset some quantities, and check is we should 3667 // reduce rate correction factor, 3668 if (resize_action != NO_RESIZE) { 3669 int resize_width = cpi->oxcf.frm_dim_cfg.width; 3670 int resize_height = cpi->oxcf.frm_dim_cfg.height; 3671 int resize_scale_num = 1; 3672 int resize_scale_den = 1; 3673 if (resize_action == DOWN_THREEFOUR || resize_action == UP_THREEFOUR) { 3674 resize_scale_num = 3; 3675 resize_scale_den = 4; 3676 } else if (resize_action == DOWN_ONEHALF) { 3677 resize_scale_num = 1; 3678 resize_scale_den = 2; 3679 } 3680 resize_width = resize_width * resize_scale_num / resize_scale_den; 3681 resize_height = resize_height * resize_scale_num / resize_scale_den; 3682 resize_reset_rc(cpi, resize_width, resize_height, cm->width, cm->height); 3683 } 3684 return; 3685 } 3686 3687 static inline int set_key_frame(AV1_COMP *cpi, unsigned int frame_flags) { 3688 RATE_CONTROL *const rc = &cpi->rc; 3689 AV1_COMMON *const cm = &cpi->common; 3690 SVC *const svc = &cpi->svc; 3691 3692 // Very first frame has to be key frame. 3693 if (cm->current_frame.frame_number == 0) return 1; 3694 // Set key frame if forced by frame flags. 3695 if (frame_flags & FRAMEFLAGS_KEY) return 1; 3696 if (!cpi->ppi->use_svc) { 3697 // Non-SVC 3698 if (cpi->oxcf.kf_cfg.auto_key && rc->frames_to_key == 0) return 1; 3699 } else { 3700 // SVC 3701 if (svc->spatial_layer_id == 0 && 3702 (cpi->oxcf.kf_cfg.auto_key && 3703 (cpi->oxcf.kf_cfg.key_freq_max == 0 || 3704 svc->current_superframe % cpi->oxcf.kf_cfg.key_freq_max == 0))) 3705 return 1; 3706 } 3707 3708 return 0; 3709 } 3710 3711 // Set to true if this frame is a recovery frame, for 1 layer RPS, 3712 // and whether we should apply some boost (QP, adjust speed features, etc). 3713 // Recovery frame here means frame whose closest reference is x frames away, 3714 // where x = 4. 3715 // TODO(marpan): Consider adding on/off flag to SVC_REF_FRAME_CONFIG to 3716 // allow more control for applications. 3717 static bool set_flag_rps_bias_recovery_frame(const AV1_COMP *const cpi) { 3718 if (cpi->ppi->rtc_ref.set_ref_frame_config && 3719 cpi->svc.number_temporal_layers == 1 && 3720 cpi->svc.number_spatial_layers == 1 && 3721 cpi->ppi->rtc_ref.reference_was_previous_frame) { 3722 int min_dist = av1_svc_get_min_ref_dist(cpi); 3723 // Only consider boost for this frame if its closest reference is further 3724 // than or equal to x frames away, using x = 4 for now. 3725 if (min_dist != INT_MAX && min_dist >= 4) return true; 3726 } 3727 return false; 3728 } 3729 3730 void av1_get_one_pass_rt_params(AV1_COMP *cpi, FRAME_TYPE *const frame_type, 3731 const EncodeFrameInput *frame_input, 3732 unsigned int frame_flags) { 3733 RATE_CONTROL *const rc = &cpi->rc; 3734 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 3735 AV1_COMMON *const cm = &cpi->common; 3736 GF_GROUP *const gf_group = &cpi->ppi->gf_group; 3737 SVC *const svc = &cpi->svc; 3738 ResizePendingParams *const resize_pending_params = 3739 &cpi->resize_pending_params; 3740 int target; 3741 const int layer = 3742 LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id, 3743 svc->number_temporal_layers); 3744 if (cpi->oxcf.rc_cfg.max_consec_drop_ms > 0) { 3745 double framerate = 3746 cpi->framerate > 1 ? round(cpi->framerate) : cpi->framerate; 3747 rc->max_consec_drop = saturate_cast_double_to_int( 3748 ceil(cpi->oxcf.rc_cfg.max_consec_drop_ms * framerate / 1000)); 3749 } 3750 if (cpi->ppi->use_svc) { 3751 av1_update_temporal_layer_framerate(cpi); 3752 av1_restore_layer_context(cpi); 3753 } 3754 cpi->ppi->rtc_ref.bias_recovery_frame = set_flag_rps_bias_recovery_frame(cpi); 3755 // Set frame type. 3756 if (set_key_frame(cpi, frame_flags)) { 3757 *frame_type = KEY_FRAME; 3758 p_rc->this_key_frame_forced = 3759 cm->current_frame.frame_number != 0 && rc->frames_to_key == 0; 3760 rc->frames_to_key = cpi->oxcf.kf_cfg.key_freq_max; 3761 p_rc->kf_boost = DEFAULT_KF_BOOST_RT; 3762 gf_group->update_type[cpi->gf_frame_index] = KF_UPDATE; 3763 gf_group->frame_type[cpi->gf_frame_index] = KEY_FRAME; 3764 gf_group->refbuf_state[cpi->gf_frame_index] = REFBUF_RESET; 3765 if (cpi->ppi->use_svc) { 3766 if (cm->current_frame.frame_number > 0) 3767 av1_svc_reset_temporal_layers(cpi, 1); 3768 svc->layer_context[layer].is_key_frame = 1; 3769 } 3770 rc->frame_number_encoded = 0; 3771 cpi->ppi->rtc_ref.non_reference_frame = 0; 3772 rc->static_since_last_scene_change = 0; 3773 } else { 3774 *frame_type = INTER_FRAME; 3775 gf_group->update_type[cpi->gf_frame_index] = LF_UPDATE; 3776 gf_group->frame_type[cpi->gf_frame_index] = INTER_FRAME; 3777 gf_group->refbuf_state[cpi->gf_frame_index] = REFBUF_UPDATE; 3778 if (cpi->ppi->use_svc) { 3779 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 3780 lc->is_key_frame = 3781 svc->spatial_layer_id == 0 3782 ? 0 3783 : svc->layer_context[svc->temporal_layer_id].is_key_frame; 3784 } 3785 // If the user is setting the reference structure with 3786 // set_ref_frame_config and did not set any references, set the 3787 // frame type to Intra-only. 3788 if (cpi->ppi->rtc_ref.set_ref_frame_config) { 3789 int no_references_set = 1; 3790 for (int i = 0; i < INTER_REFS_PER_FRAME; i++) { 3791 if (cpi->ppi->rtc_ref.reference[i]) { 3792 no_references_set = 0; 3793 break; 3794 } 3795 } 3796 3797 // Set to intra_only_frame if no references are set. 3798 // The stream can start decoding on INTRA_ONLY_FRAME so long as the 3799 // layer with the intra_only_frame doesn't signal a reference to a slot 3800 // that hasn't been set yet. 3801 if (no_references_set) *frame_type = INTRA_ONLY_FRAME; 3802 } 3803 } 3804 if (cpi->active_map.enabled && cpi->rc.percent_blocks_inactive == 100) { 3805 rc->frame_source_sad = 0; 3806 rc->avg_source_sad = (3 * rc->avg_source_sad + rc->frame_source_sad) >> 2; 3807 rc->percent_blocks_with_motion = 0; 3808 rc->high_source_sad = 0; 3809 } else if (cpi->sf.rt_sf.check_scene_detection && 3810 svc->spatial_layer_id == 0) { 3811 if (rc->prev_coded_width == cm->width && 3812 rc->prev_coded_height == cm->height) { 3813 rc_scene_detection_onepass_rt(cpi, frame_input); 3814 } else { 3815 aom_free(cpi->src_sad_blk_64x64); 3816 cpi->src_sad_blk_64x64 = NULL; 3817 } 3818 } 3819 if (((*frame_type == KEY_FRAME && cpi->sf.rt_sf.rc_adjust_keyframe) || 3820 (cpi->sf.rt_sf.rc_compute_spatial_var_sc && rc->high_source_sad)) && 3821 svc->spatial_layer_id == 0 && cm->seq_params->bit_depth == 8 && 3822 cpi->oxcf.rc_cfg.max_intra_bitrate_pct > 0) 3823 rc_spatial_act_onepass_rt(cpi, frame_input->source->y_buffer, 3824 frame_input->source->y_stride); 3825 // Check for dynamic resize, for single spatial layer for now. 3826 // For temporal layers only check on base temporal layer. 3827 if (cpi->oxcf.resize_cfg.resize_mode == RESIZE_DYNAMIC) { 3828 if (svc->number_spatial_layers == 1 && svc->temporal_layer_id == 0) 3829 dynamic_resize_one_pass_cbr(cpi, /*one_half_only=*/1); 3830 if (rc->resize_state == THREE_QUARTER) { 3831 resize_pending_params->width = (3 + cpi->oxcf.frm_dim_cfg.width * 3) >> 2; 3832 resize_pending_params->height = 3833 (3 + cpi->oxcf.frm_dim_cfg.height * 3) >> 2; 3834 } else if (rc->resize_state == ONE_HALF) { 3835 resize_pending_params->width = (1 + cpi->oxcf.frm_dim_cfg.width) >> 1; 3836 resize_pending_params->height = (1 + cpi->oxcf.frm_dim_cfg.height) >> 1; 3837 } else { 3838 resize_pending_params->width = cpi->oxcf.frm_dim_cfg.width; 3839 resize_pending_params->height = cpi->oxcf.frm_dim_cfg.height; 3840 } 3841 } else if (is_frame_resize_pending(cpi)) { 3842 resize_reset_rc(cpi, resize_pending_params->width, 3843 resize_pending_params->height, cm->width, cm->height); 3844 } 3845 if (svc->temporal_layer_id == 0) { 3846 rc->num_col_blscroll_last_tl0 = 0; 3847 rc->num_row_blscroll_last_tl0 = 0; 3848 } 3849 // Set the GF interval and update flag. 3850 if (!rc->rtc_external_ratectrl) 3851 set_gf_interval_update_onepass_rt(cpi, *frame_type); 3852 // Set target size. 3853 if (cpi->oxcf.rc_cfg.mode == AOM_CBR) { 3854 if (*frame_type == KEY_FRAME || *frame_type == INTRA_ONLY_FRAME) { 3855 target = av1_calc_iframe_target_size_one_pass_cbr(cpi); 3856 } else { 3857 target = av1_calc_pframe_target_size_one_pass_cbr( 3858 cpi, gf_group->update_type[cpi->gf_frame_index]); 3859 } 3860 } else { 3861 if (*frame_type == KEY_FRAME || *frame_type == INTRA_ONLY_FRAME) { 3862 target = av1_calc_iframe_target_size_one_pass_vbr(cpi); 3863 } else { 3864 target = av1_calc_pframe_target_size_one_pass_vbr( 3865 cpi, gf_group->update_type[cpi->gf_frame_index]); 3866 } 3867 } 3868 if (cpi->oxcf.rc_cfg.mode == AOM_Q) 3869 rc->active_worst_quality = cpi->oxcf.rc_cfg.cq_level; 3870 3871 av1_rc_set_frame_target(cpi, target, cm->width, cm->height); 3872 rc->base_frame_target = target; 3873 cm->current_frame.frame_type = *frame_type; 3874 // For fixed mode SVC: if KSVC is enabled remove inter layer 3875 // prediction on spatial enhancement layer frames for frames 3876 // whose base is not KEY frame. 3877 if (cpi->ppi->use_svc && !svc->use_flexible_mode && svc->ksvc_fixed_mode && 3878 svc->number_spatial_layers > 1 && 3879 !svc->layer_context[layer].is_key_frame) { 3880 ExternalFlags *const ext_flags = &cpi->ext_flags; 3881 ext_flags->ref_frame_flags ^= AOM_GOLD_FLAG; 3882 } 3883 } 3884 3885 #define CHECK_INTER_LAYER_PRED(ref_frame) \ 3886 ((cpi->ref_frame_flags & av1_ref_frame_flag_list[ref_frame]) && \ 3887 (av1_check_ref_is_low_spatial_res_super_frame(cpi, ref_frame))) 3888 3889 int av1_encodedframe_overshoot_cbr(AV1_COMP *cpi, int *q) { 3890 AV1_COMMON *const cm = &cpi->common; 3891 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 3892 double rate_correction_factor = 3893 cpi->ppi->p_rc.rate_correction_factors[INTER_NORMAL]; 3894 const int target_size = cpi->rc.avg_frame_bandwidth; 3895 double new_correction_factor; 3896 int target_bits_per_mb; 3897 double q2; 3898 int enumerator; 3899 int inter_layer_pred_on = 0; 3900 int is_screen_content = (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN); 3901 cpi->cyclic_refresh->counter_encode_maxq_scene_change = 0; 3902 if (cpi->svc.spatial_layer_id > 0) { 3903 // For spatial layers: check if inter-layer (spatial) prediction is used 3904 // (check if any reference is being used that is the lower spatial layer), 3905 inter_layer_pred_on = CHECK_INTER_LAYER_PRED(LAST_FRAME) || 3906 CHECK_INTER_LAYER_PRED(GOLDEN_FRAME) || 3907 CHECK_INTER_LAYER_PRED(ALTREF_FRAME); 3908 } 3909 // If inter-layer prediction is on: we expect to pull up the quality from 3910 // the lower spatial layer, so we can use a lower q. 3911 if (cpi->svc.spatial_layer_id > 0 && inter_layer_pred_on) { 3912 *q = (cpi->rc.worst_quality + *q) >> 1; 3913 } else { 3914 // For easy scene changes used lower QP, otherwise set max-q. 3915 // If rt_sf->compute_spatial_var_sc is enabled relax the max-q 3916 // condition based on frame spatial variance. 3917 if (cpi->sf.rt_sf.rc_compute_spatial_var_sc) { 3918 if (cpi->rc.frame_spatial_variance < 100) { 3919 *q = (cpi->rc.worst_quality + *q) >> 1; 3920 } else if (cpi->rc.frame_spatial_variance < 400 || 3921 (cpi->rc.frame_source_sad < 80000 && 3922 cpi->rc.frame_spatial_variance < 1000)) { 3923 *q = (3 * cpi->rc.worst_quality + *q) >> 2; 3924 } else { 3925 *q = cpi->rc.worst_quality; 3926 } 3927 } else { 3928 // Set a larger QP. 3929 const uint64_t sad_thr = 64 * 64 * 32; 3930 if (cm->width * cm->height >= 1280 * 720 && 3931 (p_rc->buffer_level > (p_rc->optimal_buffer_level) >> 1) && 3932 cpi->rc.avg_source_sad < sad_thr) { 3933 *q = (*q + cpi->rc.worst_quality) >> 1; 3934 } else { 3935 *q = (3 * cpi->rc.worst_quality + *q) >> 2; 3936 } 3937 // If we arrive here for screen content: use the max-q set by the user. 3938 if (is_screen_content) *q = cpi->rc.worst_quality; 3939 } 3940 } 3941 // Adjust avg_frame_qindex, buffer_level, and rate correction factors, as 3942 // these parameters will affect QP selection for subsequent frames. If they 3943 // have settled down to a very different (low QP) state, then not adjusting 3944 // them may cause next frame to select low QP and overshoot again. 3945 p_rc->avg_frame_qindex[INTER_FRAME] = *q; 3946 p_rc->buffer_level = p_rc->optimal_buffer_level; 3947 p_rc->bits_off_target = p_rc->optimal_buffer_level; 3948 // Reset rate under/over-shoot flags. 3949 cpi->rc.rc_1_frame = 0; 3950 cpi->rc.rc_2_frame = 0; 3951 // Adjust rate correction factor. 3952 target_bits_per_mb = 3953 (int)(((uint64_t)target_size << BPER_MB_NORMBITS) / cm->mi_params.MBs); 3954 // Reset rate correction factor: for now base it on target_bits_per_mb 3955 // and qp (==max_QP). This comes from the inverse computation of 3956 // av1_rc_bits_per_mb(). 3957 q2 = av1_convert_qindex_to_q(*q, cm->seq_params->bit_depth); 3958 enumerator = get_bpmb_enumerator(INTER_NORMAL, is_screen_content); 3959 new_correction_factor = (double)target_bits_per_mb * q2 / enumerator; 3960 if (new_correction_factor > rate_correction_factor) { 3961 rate_correction_factor = 3962 (new_correction_factor + rate_correction_factor) / 2.0; 3963 if (rate_correction_factor > MAX_BPB_FACTOR) 3964 rate_correction_factor = MAX_BPB_FACTOR; 3965 cpi->ppi->p_rc.rate_correction_factors[INTER_NORMAL] = 3966 rate_correction_factor; 3967 } 3968 // For temporal layers: reset the rate control parameters across all 3969 // temporal layers. Only do it for spatial enhancement layers when 3970 // inter_layer_pred_on is not set (off). 3971 if (cpi->svc.number_temporal_layers > 1 && 3972 (cpi->svc.spatial_layer_id == 0 || inter_layer_pred_on == 0)) { 3973 SVC *svc = &cpi->svc; 3974 for (int tl = 0; tl < svc->number_temporal_layers; ++tl) { 3975 int sl = svc->spatial_layer_id; 3976 const int layer = LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers); 3977 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 3978 RATE_CONTROL *lrc = &lc->rc; 3979 PRIMARY_RATE_CONTROL *lp_rc = &lc->p_rc; 3980 lp_rc->avg_frame_qindex[INTER_FRAME] = *q; 3981 lp_rc->buffer_level = lp_rc->optimal_buffer_level; 3982 lp_rc->bits_off_target = lp_rc->optimal_buffer_level; 3983 lrc->rc_1_frame = 0; 3984 lrc->rc_2_frame = 0; 3985 lp_rc->rate_correction_factors[INTER_NORMAL] = rate_correction_factor; 3986 } 3987 } 3988 return 1; 3989 } 3990 3991 int av1_postencode_drop_cbr(AV1_COMP *cpi, size_t *size) { 3992 PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc; 3993 size_t frame_size = *size << 3; 3994 const int64_t new_buffer_level = 3995 p_rc->buffer_level + cpi->rc.avg_frame_bandwidth - (int64_t)frame_size; 3996 // Drop if new buffer level (given the encoded frame size) goes below a 3997 // threshold and encoded frame size is much larger than per-frame-bandwidth. 3998 // If the frame is already labelled as scene change (high_source_sad = 1) 3999 // or the QP is close to max, then no need to drop. 4000 const int qp_thresh = 3 * (cpi->rc.worst_quality >> 2); 4001 const int64_t buffer_thresh = p_rc->optimal_buffer_level >> 2; 4002 if (!cpi->rc.high_source_sad && new_buffer_level < buffer_thresh && 4003 frame_size > 8 * (unsigned int)cpi->rc.avg_frame_bandwidth && 4004 cpi->common.quant_params.base_qindex < qp_thresh) { 4005 *size = 0; 4006 cpi->is_dropped_frame = true; 4007 restore_all_coding_context(cpi); 4008 av1_rc_postencode_update_drop_frame(cpi); 4009 // Force max_q on next fame. Reset some RC parameters. 4010 cpi->rc.force_max_q = 1; 4011 p_rc->avg_frame_qindex[INTER_FRAME] = cpi->rc.worst_quality; 4012 p_rc->buffer_level = p_rc->optimal_buffer_level; 4013 p_rc->bits_off_target = p_rc->optimal_buffer_level; 4014 cpi->rc.rc_1_frame = 0; 4015 cpi->rc.rc_2_frame = 0; 4016 if (cpi->svc.number_spatial_layers > 1 || 4017 cpi->svc.number_temporal_layers > 1) { 4018 SVC *svc = &cpi->svc; 4019 // Postencode drop is only checked on base spatial layer, 4020 // for now if max-q is set on base we force it on all layers. 4021 for (int sl = 0; sl < svc->number_spatial_layers; ++sl) { 4022 for (int tl = 0; tl < svc->number_temporal_layers; ++tl) { 4023 const int layer = 4024 LAYER_IDS_TO_IDX(sl, tl, svc->number_temporal_layers); 4025 LAYER_CONTEXT *lc = &svc->layer_context[layer]; 4026 RATE_CONTROL *lrc = &lc->rc; 4027 PRIMARY_RATE_CONTROL *lp_rc = &lc->p_rc; 4028 // Force max_q on next fame. Reset some RC parameters. 4029 lrc->force_max_q = 1; 4030 lp_rc->avg_frame_qindex[INTER_FRAME] = cpi->rc.worst_quality; 4031 lp_rc->buffer_level = lp_rc->optimal_buffer_level; 4032 lp_rc->bits_off_target = lp_rc->optimal_buffer_level; 4033 lrc->rc_1_frame = 0; 4034 lrc->rc_2_frame = 0; 4035 } 4036 } 4037 } 4038 return 1; 4039 } 4040 return 0; 4041 }