Commit e54b560e48 for aom
commit e54b560e48ef3fe4bba93f036ecc4f9f93e02cbb
Author: Lin Zheng <linzhen@google.com>
Date: Wed Mar 11 01:08:53 2026 +0000
Gate the VBR changes in 2fed9c3 only when mode!=REALTIME
With this change, we can revert the threshold adjustment in unit test
BasicRateTargetingVBRLagRealtime in 32fa66 too.
Bug: 491358676
Change-Id: Iefd2ed25c4278d59dcaad5470d91a7b9dd5fe806
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 6182f1d781..93d276f3d8 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1537,6 +1537,7 @@ AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, const AV1EncoderConfig *oxcf,
cm->current_frame_id = -1;
cpi->tile_data = NULL;
cpi->last_show_frame_buf = NULL;
+ cpi->ppi->p_rc.rtc_mode = (cpi->oxcf.mode == REALTIME);
realloc_segmentation_maps(cpi);
cpi->refresh_frame.alt_ref_frame = false;
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index b4b2abf071..93ca3e435d 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -604,7 +604,7 @@ static double calc_frame_boost(const PRIMARY_RATE_CONTROL *p_rc,
// (zoom in). The range for this_frame_mv_in_out is -1.0 to +1.0.
if (this_frame_mv_in_out > 0.0) {
frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
- if (!p_rc->accumulate_stats_stage)
+ if (!p_rc->accumulate_stats_stage && !p_rc->rtc_mode)
max_boost += max_boost * (this_frame_mv_in_out * 2.0);
}
// In the extreme case the boost is halved.
@@ -991,6 +991,21 @@ static void allocate_gf_group_bits(GF_GROUP *gf_group,
gf_group->bit_allocation[gf_group_size] = 0;
}
+// Returns true if KF group and GF group both are almost completely static.
+static inline int is_almost_static(double gf_zero_motion, int kf_zero_motion,
+ int is_lap_enabled) {
+ if (is_lap_enabled) {
+ /*
+ * when LAP enabled kf_zero_motion is not reliable, so use strict
+ * constraint on gf_zero_motion.
+ */
+ return (gf_zero_motion >= 0.999);
+ } else {
+ return (gf_zero_motion >= 0.995) &&
+ (kf_zero_motion >= STATIC_KF_GROUP_THRESH);
+ }
+}
+
#define ARF_ABS_ZOOM_THRESH 4.4
static inline int detect_gf_cut(AV1_COMP *cpi, int frame_index, int cur_start,
int flash_detected, int active_max_gf_interval,
@@ -1030,7 +1045,10 @@ static inline int detect_gf_cut(AV1_COMP *cpi, int frame_index, int cur_start,
// If almost totally static, we will not use the the max GF length later,
// so we can continue for more frames.
- if ((frame_index - cur_start) >= active_max_gf_interval + 1) {
+ if ((frame_index - cur_start) >= active_max_gf_interval + 1 &&
+ ((cpi->oxcf.mode != REALTIME) ||
+ !is_almost_static(gf_stats->zero_motion_accumulator,
+ twopass->kf_zeromotion_pct, cpi->ppi->lap_enabled))) {
return 1;
}
return 0;
@@ -2397,50 +2415,53 @@ static void set_gop_bits_boost(AV1_COMP *cpi, int i, int is_intra_only,
const AV1EncoderConfig *const oxcf = &cpi->oxcf;
const RateControlCfg *const rc_cfg = &oxcf->rc_cfg;
- TWO_PASS_FRAME stats_in_backup = cpi->twopass_frame;
- int gfu_boost_sum = 0;
- int gfu_count = 0;
- int accumulate_i = 0;
- p_rc->accumulate_stats_stage = true;
- if (rc->frames_since_key == 0) {
- for (int k = 0; k < MAX_NUM_GF_INTERVALS; k++) {
- if (p_rc->gf_intervals[k] == 0) {
- break;
- }
-
- int new_i = p_rc->gf_intervals[k];
- int ext_len_new = new_i - (k == 0 ? is_intra_only : 0);
- if (use_alt_ref) {
- if (accumulate_i >= rc->frames_to_key) {
+ if (cpi->oxcf.mode != REALTIME) {
+ TWO_PASS_FRAME stats_in_backup = cpi->twopass_frame;
+ int gfu_boost_sum = 0;
+ int gfu_count = 0;
+ int accumulate_i = 0;
+ p_rc->accumulate_stats_stage = true;
+ if (rc->frames_since_key == 0) {
+ for (int k = 0; k < MAX_NUM_GF_INTERVALS; k++) {
+ if (p_rc->gf_intervals[k] == 0) {
break;
}
- const int forward_frames =
- (rc->frames_to_key - accumulate_i - new_i >= ext_len_new)
- ? ext_len_new
- : AOMMAX(0, rc->frames_to_key - accumulate_i - new_i);
- if (k) {
- cpi->twopass_frame.stats_in += new_i;
- if (cpi->twopass_frame.stats_in >=
- twopass->stats_buf_ctx->stats_in_end) {
- cpi->twopass_frame.stats_in = twopass->stats_buf_ctx->stats_in_end;
+
+ int new_i = p_rc->gf_intervals[k];
+ int ext_len_new = new_i - (k == 0 ? is_intra_only : 0);
+ if (use_alt_ref) {
+ if (accumulate_i >= rc->frames_to_key) {
+ break;
+ }
+ const int forward_frames =
+ (rc->frames_to_key - accumulate_i - new_i >= ext_len_new)
+ ? ext_len_new
+ : AOMMAX(0, rc->frames_to_key - accumulate_i - new_i);
+ if (k) {
+ cpi->twopass_frame.stats_in += new_i;
+ if (cpi->twopass_frame.stats_in >=
+ twopass->stats_buf_ctx->stats_in_end) {
+ cpi->twopass_frame.stats_in =
+ twopass->stats_buf_ctx->stats_in_end;
+ }
}
+ reset_fpf_position(&cpi->twopass_frame, cpi->twopass_frame.stats_in);
+ // Calculate the boost for alt ref.
+ int gfu_boost_tmp = av1_calc_arf_boost(
+ twopass, &cpi->twopass_frame, p_rc, frame_info, alt_offset,
+ forward_frames, ext_len_new, &p_rc->num_stats_used_for_gfu_boost,
+ &p_rc->num_stats_required_for_gfu_boost, cpi->ppi->lap_enabled);
+ gfu_boost_sum += gfu_boost_tmp;
}
- reset_fpf_position(&cpi->twopass_frame, cpi->twopass_frame.stats_in);
- // Calculate the boost for alt ref.
- int gfu_boost_tmp = av1_calc_arf_boost(
- twopass, &cpi->twopass_frame, p_rc, frame_info, alt_offset,
- forward_frames, ext_len_new, &p_rc->num_stats_used_for_gfu_boost,
- &p_rc->num_stats_required_for_gfu_boost, cpi->ppi->lap_enabled);
- gfu_boost_sum += gfu_boost_tmp;
+ gfu_count++;
+ accumulate_i += new_i;
}
- gfu_count++;
- accumulate_i += new_i;
+ assert(gfu_count > 0);
+ p_rc->gfu_boost_average = gfu_boost_sum / gfu_count;
}
- assert(gfu_count > 0);
- p_rc->gfu_boost_average = gfu_boost_sum / gfu_count;
+ cpi->twopass_frame = stats_in_backup;
+ p_rc->accumulate_stats_stage = false;
}
- cpi->twopass_frame = stats_in_backup;
- p_rc->accumulate_stats_stage = false;
int ext_len = i - is_intra_only;
if (use_alt_ref) {
@@ -2562,6 +2583,7 @@ static void define_gf_group(AV1_COMP *cpi, EncodeFrameParams *frame_params,
RATE_CONTROL *const rc = &cpi->rc;
PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc;
const AV1EncoderConfig *const oxcf = &cpi->oxcf;
+ TWO_PASS *const twopass = &cpi->ppi->twopass;
FIRSTPASS_STATS next_frame;
const FIRSTPASS_STATS *const start_pos = cpi->twopass_frame.stats_in;
GF_GROUP *gf_group = &cpi->ppi->gf_group;
@@ -2626,8 +2648,12 @@ static void define_gf_group(AV1_COMP *cpi, EncodeFrameParams *frame_params,
int use_alt_ref;
if (can_disable_arf) {
- use_alt_ref = p_rc->use_arf_in_this_kf_group &&
- (i < gf_cfg->lag_in_frames) && (i >= MIN_GF_INTERVAL);
+ use_alt_ref =
+ p_rc->use_arf_in_this_kf_group && (i < gf_cfg->lag_in_frames) &&
+ (i >= MIN_GF_INTERVAL) &&
+ ((cpi->oxcf.mode != REALTIME) ||
+ !is_almost_static(gf_stats.zero_motion_accumulator,
+ twopass->kf_zeromotion_pct, cpi->ppi->lap_enabled));
} else {
use_alt_ref = p_rc->use_arf_in_this_kf_group &&
(i < gf_cfg->lag_in_frames) && (i > 2);
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 6da81c1f03..c22cfdfc92 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -42,6 +42,7 @@
#define USE_UNRESTRICTED_Q_IN_CQ_MODE 0
#define RES_NUM 2
+#define MODE_NUM 2
// Max rate target for 1080P and below encodes under normal circumstances
// (1920 * 1080 / (16 * 16)) * MAX_MB_RATE bits per MB
@@ -70,39 +71,39 @@
} \
} while (0)
-#define ASSIGN_MINQ_TABLE_2(bit_depth, name, res_idx) \
- do { \
- switch (bit_depth) { \
- case AOM_BITS_8: name = name##_8[res_idx]; break; \
- case AOM_BITS_10: name = name##_10[res_idx]; break; \
- case AOM_BITS_12: name = name##_12[res_idx]; break; \
- default: \
- assert(0 && \
- "bit_depth should be AOM_BITS_8, AOM_BITS_10" \
- " or AOM_BITS_12"); \
- name = NULL; \
- } \
+#define ASSIGN_MINQ_TABLE_2(bit_depth, name, res_idx, mode_idx) \
+ do { \
+ switch (bit_depth) { \
+ case AOM_BITS_8: name = name##_8[mode_idx][res_idx]; break; \
+ case AOM_BITS_10: name = name##_10[mode_idx][res_idx]; break; \
+ case AOM_BITS_12: name = name##_12[mode_idx][res_idx]; break; \
+ default: \
+ assert(0 && \
+ "bit_depth should be AOM_BITS_8, AOM_BITS_10" \
+ " or AOM_BITS_12"); \
+ name = NULL; \
+ } \
} while (0)
// Tables relating active max Q to active min Q
-static int kf_low_motion_minq_8[RES_NUM][QINDEX_RANGE];
-static int kf_high_motion_minq_8[RES_NUM][QINDEX_RANGE];
-static int arfgf_low_motion_minq_8[RES_NUM][QINDEX_RANGE];
-static int arfgf_high_motion_minq_8[RES_NUM][QINDEX_RANGE];
-static int inter_minq_8[RES_NUM][QINDEX_RANGE];
+static int kf_low_motion_minq_8[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int kf_high_motion_minq_8[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_low_motion_minq_8[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_high_motion_minq_8[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int inter_minq_8[MODE_NUM][RES_NUM][QINDEX_RANGE];
static int rtc_minq_8[QINDEX_RANGE];
-static int kf_low_motion_minq_10[RES_NUM][QINDEX_RANGE];
-static int kf_high_motion_minq_10[RES_NUM][QINDEX_RANGE];
-static int arfgf_low_motion_minq_10[RES_NUM][QINDEX_RANGE];
-static int arfgf_high_motion_minq_10[RES_NUM][QINDEX_RANGE];
-static int inter_minq_10[RES_NUM][QINDEX_RANGE];
+static int kf_low_motion_minq_10[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int kf_high_motion_minq_10[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_low_motion_minq_10[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_high_motion_minq_10[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int inter_minq_10[MODE_NUM][RES_NUM][QINDEX_RANGE];
static int rtc_minq_10[QINDEX_RANGE];
-static int kf_low_motion_minq_12[RES_NUM][QINDEX_RANGE];
-static int kf_high_motion_minq_12[RES_NUM][QINDEX_RANGE];
-static int arfgf_low_motion_minq_12[RES_NUM][QINDEX_RANGE];
-static int arfgf_high_motion_minq_12[RES_NUM][QINDEX_RANGE];
-static int inter_minq_12[RES_NUM][QINDEX_RANGE];
+static int kf_low_motion_minq_12[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int kf_high_motion_minq_12[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_low_motion_minq_12[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int arfgf_high_motion_minq_12[MODE_NUM][RES_NUM][QINDEX_RANGE];
+static int inter_minq_12[MODE_NUM][RES_NUM][QINDEX_RANGE];
static int rtc_minq_12[QINDEX_RANGE];
static int gf_high_1 = 2875;
@@ -112,6 +113,12 @@ static int gf_low_2 = 100;
static int kf_high = 8000;
static int kf_low = 553;
+
+static int gf_high_rtc = 2400;
+static int gf_low_rtc = 300;
+static int kf_high_rtc = 5000;
+static int kf_low_rtc = 400;
+
// How many times less pixels there are to encode given the current scaling.
// Temporary replacement for rcf_mult and rate_thresh_mult.
static double resize_rate_factor(const FrameDimensionCfg *const frm_dim_cfg,
@@ -134,32 +141,40 @@ static int get_minq_index(double maxq, double x3, double x2, double x1,
return av1_find_qindex(minqtarget, bit_depth, 0, QINDEX_RANGE - 1);
}
-static double x1[RES_NUM][5] = {
- { 0.1771, 0.379, 0.3279, 0.6634, 1.385 },
- { 0.1917, 0.3760, 0.34570, 0.6916, 1.14820 },
+static double x1[MODE_NUM][RES_NUM][5] = {
+ {
+ { 0.1771, 0.379, 0.3279, 0.6634, 1.385 },
+ { 0.1917, 0.3760, 0.34570, 0.6916, 1.14820 },
+ },
+ {
+ { 0.15, 0.45, 0.30, 0.55, 0.90 },
+ { 0.15, 0.45, 0.30, 0.55, 0.90 },
+ },
};
-static void init_minq_luts(int kf_low_m[RES_NUM][QINDEX_RANGE],
- int kf_high_m[RES_NUM][QINDEX_RANGE],
- int arfgf_low[RES_NUM][QINDEX_RANGE],
- int arfgf_high[RES_NUM][QINDEX_RANGE],
- int inter[RES_NUM][QINDEX_RANGE], int *rtc,
+static void init_minq_luts(int kf_low_m[MODE_NUM][RES_NUM][QINDEX_RANGE],
+ int kf_high_m[MODE_NUM][RES_NUM][QINDEX_RANGE],
+ int arfgf_low[MODE_NUM][RES_NUM][QINDEX_RANGE],
+ int arfgf_high[MODE_NUM][RES_NUM][QINDEX_RANGE],
+ int inter[MODE_NUM][RES_NUM][QINDEX_RANGE], int *rtc,
aom_bit_depth_t bit_depth) {
int i;
- for (int res = 0; res < RES_NUM; res++) {
- for (i = 0; i < QINDEX_RANGE; i++) {
- const double maxq = av1_convert_qindex_to_q(i, bit_depth);
- kf_low_m[res][i] =
- get_minq_index(maxq, 0.000001, -0.0004, x1[res][0], bit_depth);
- kf_high_m[res][i] =
- get_minq_index(maxq, 0.0000021, -0.00125, x1[res][1], bit_depth);
- arfgf_low[res][i] =
- get_minq_index(maxq, 0.0000015, -0.0009, x1[res][2], bit_depth);
- arfgf_high[res][i] =
- get_minq_index(maxq, 0.0000021, -0.00125, x1[res][3], bit_depth);
- inter[res][i] =
- get_minq_index(maxq, 0.00000271, -0.00113, x1[res][4], bit_depth);
- rtc[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth);
+ for (int mode = 0; mode < MODE_NUM; mode++) {
+ for (int res = 0; res < RES_NUM; res++) {
+ for (i = 0; i < QINDEX_RANGE; i++) {
+ const double maxq = av1_convert_qindex_to_q(i, bit_depth);
+ kf_low_m[mode][res][i] = get_minq_index(maxq, 0.000001, -0.0004,
+ x1[mode][res][0], bit_depth);
+ kf_high_m[mode][res][i] = get_minq_index(maxq, 0.0000021, -0.00125,
+ x1[mode][res][1], bit_depth);
+ arfgf_low[mode][res][i] = get_minq_index(maxq, 0.0000015, -0.0009,
+ x1[mode][res][2], bit_depth);
+ arfgf_high[mode][res][i] = get_minq_index(maxq, 0.0000021, -0.00125,
+ x1[mode][res][3], bit_depth);
+ inter[mode][res][i] = get_minq_index(maxq, 0.00000271, -0.00113,
+ x1[mode][res][4], bit_depth);
+ rtc[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.70, bit_depth);
+ }
}
}
}
@@ -1158,9 +1173,15 @@ static int get_kf_active_quality(const PRIMARY_RATE_CONTROL *const p_rc, int q,
aom_bit_depth_t bit_depth, const int res_idx) {
int *kf_low_motion_minq;
int *kf_high_motion_minq;
- ASSIGN_MINQ_TABLE_2(bit_depth, kf_low_motion_minq, res_idx > 1);
- ASSIGN_MINQ_TABLE_2(bit_depth, kf_high_motion_minq, res_idx > 1);
- return get_active_quality(q, p_rc->kf_boost, kf_low, kf_high,
+ ASSIGN_MINQ_TABLE_2(bit_depth, kf_low_motion_minq, res_idx > 1,
+ p_rc->rtc_mode);
+ ASSIGN_MINQ_TABLE_2(bit_depth, kf_high_motion_minq, res_idx > 1,
+ p_rc->rtc_mode);
+
+ int kf_low_local = p_rc->rtc_mode ? kf_low_rtc : kf_low;
+ int kf_high_local = p_rc->rtc_mode ? kf_high_rtc : kf_high;
+
+ return get_active_quality(q, p_rc->kf_boost, kf_low_local, kf_high_local,
kf_low_motion_minq, kf_high_motion_minq);
}
@@ -1169,14 +1190,24 @@ static int get_gf_active_quality_no_rc(const PRIMARY_RATE_CONTROL *const p_rc,
const int res_idx) {
int *arfgf_low_motion_minq;
int *arfgf_high_motion_minq;
- ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_low_motion_minq, res_idx > 1);
- ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_high_motion_minq, res_idx > 1);
-
- int gf_low_local =
- (p_rc->gfu_boost_average < gfboost_thresh[res_idx]) ? gf_low_1 : gf_low_2;
- int gf_high_local = (p_rc->gfu_boost_average < gfboost_thresh[res_idx])
- ? gf_high_1
- : gf_high_2;
+ ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_low_motion_minq, res_idx > 1,
+ p_rc->rtc_mode);
+ ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_high_motion_minq, res_idx > 1,
+ p_rc->rtc_mode);
+ int gf_low_local, gf_high_local;
+
+ if (p_rc->rtc_mode == false) {
+ gf_low_local = (p_rc->gfu_boost_average < gfboost_thresh[res_idx])
+ ? gf_low_1
+ : gf_low_2;
+ gf_high_local = (p_rc->gfu_boost_average < gfboost_thresh[res_idx])
+ ? gf_high_1
+ : gf_high_2;
+ } else {
+ gf_low_local = gf_low_rtc;
+ gf_high_local = gf_high_rtc;
+ }
+
return get_active_quality(q, p_rc->gfu_boost, gf_low_local, gf_high_local,
arfgf_low_motion_minq, arfgf_high_motion_minq);
}
@@ -1187,9 +1218,9 @@ static int get_gf_active_quality(const PRIMARY_RATE_CONTROL *const p_rc, int q,
}
static int get_gf_high_motion_quality(int q, aom_bit_depth_t bit_depth,
- const int res_idx) {
+ const int res_idx, bool rtc_mode) {
int *arfgf_high_motion_minq;
- ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_high_motion_minq, res_idx > 1);
+ ASSIGN_MINQ_TABLE_2(bit_depth, arfgf_high_motion_minq, res_idx > 1, rtc_mode);
return arfgf_high_motion_minq[q];
}
@@ -1582,7 +1613,7 @@ static int rc_pick_q_and_bounds_no_stats(const AV1_COMP *cpi, int width,
int active_worst_quality = calc_active_worst_quality_no_stats_vbr(cpi);
int q;
int *inter_minq;
- ASSIGN_MINQ_TABLE_2(bit_depth, inter_minq, res_idx > 1);
+ ASSIGN_MINQ_TABLE_2(bit_depth, inter_minq, res_idx > 1, p_rc->rtc_mode);
if (frame_is_intra_only(cm)) {
if (rc_mode == AOM_Q) {
@@ -2039,7 +2070,7 @@ static int get_active_best_quality(const AV1_COMP *const cpi,
const int res_idx = is_480p_or_larger + is_608p_or_larger;
int *inter_minq;
- ASSIGN_MINQ_TABLE_2(bit_depth, inter_minq, res_idx > 1);
+ ASSIGN_MINQ_TABLE_2(bit_depth, inter_minq, res_idx > 1, p_rc->rtc_mode);
// TODO(jingning): Consider to rework this hack that covers issues incurred
// in lightfield setting.
@@ -2075,7 +2106,8 @@ static int get_active_best_quality(const AV1_COMP *const cpi,
active_best_quality = get_gf_active_quality(p_rc, q, bit_depth, res_idx);
// Constrained quality use slightly lower active best.
if (rc_mode == AOM_CQ) active_best_quality = active_best_quality * 15 / 16;
- const int min_boost = get_gf_high_motion_quality(q, bit_depth, res_idx);
+ const int min_boost =
+ get_gf_high_motion_quality(q, bit_depth, res_idx, p_rc->rtc_mode);
const int boost = min_boost - active_best_quality;
active_best_quality = min_boost - (int)(boost * p_rc->arf_boost_factor);
if (!is_intrl_arf_boost) return active_best_quality;
diff --git a/av1/encoder/ratectrl.h b/av1/encoder/ratectrl.h
index e83b7c0e18..a854304331 100644
--- a/av1/encoder/ratectrl.h
+++ b/av1/encoder/ratectrl.h
@@ -338,6 +338,11 @@ typedef struct {
*/
bool accumulate_stats_stage;
+ /*!
+ * Indicate if it is realtime mode or not
+ */
+ bool rtc_mode;
+
/*!
* Stores the determined gf group lengths for a set of gf groups
*/
diff --git a/test/datarate_test.cc b/test/datarate_test.cc
index 0969e9fd4f..c777d4a9c0 100644
--- a/test/datarate_test.cc
+++ b/test/datarate_test.cc
@@ -373,16 +373,8 @@ class DatarateTestLarge
ResetModel();
lag_realtime_mode_ = 1;
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
-#if CONFIG_REALTIME_ONLY
- // With CONFIG_REALTIME_ONLY=1, lag_in_frames is set to 0, and along with
- // other factors in that configuration the threshold needs to be lowered
- // after commit 2fed9c389d.
- ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.8)
- << " The datarate for the file is lower than target by too much!";
-#else
ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
<< " The datarate for the file is lower than target by too much!";
-#endif
ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 2.0)
<< " The datarate for the file is greater than target by too much!";
}