Enable passes=3 and pass=3.
Change oxcf->pass to use the enum properly.
Added AOM_RC_SECOND_PASS and AOM_RC_THIRD_PASS to the enum.
A new "passes" member is added to the encoder extra configs,
which can be controlled by the key & value API.
Currently the third pass is identical to the second pass.
Change-Id: I4f7280bc86b715c34c1001387e5284a85c4a8d7c
diff --git a/aom/aom_encoder.h b/aom/aom_encoder.h
index 3ecca0f..3a4afa0 100644
--- a/aom/aom_encoder.h
+++ b/aom/aom_encoder.h
@@ -155,11 +155,19 @@
int den; /**< fraction denominator */
} aom_rational_t; /**< alias for struct aom_rational */
-/*!\brief Multi-pass Encoding Pass */
+/*!\brief Multi-pass Encoding Pass
+ *
+ * AOM_RC_LAST_PASS is kept for backward compatibility.
+ * If passes is not given and pass==2, the codec will assume passes=2.
+ * For new code, it is recommended to use AOM_RC_SECOND_PASS and set
+ * the "passes" member to 2 via the key & val API for two-pass encoding.
+ */
enum aom_enc_pass {
- AOM_RC_ONE_PASS, /**< Single pass mode */
- AOM_RC_FIRST_PASS, /**< First pass of multi-pass mode */
- AOM_RC_LAST_PASS /**< Final pass of multi-pass mode */
+ AOM_RC_ONE_PASS = 0, /**< Single pass mode */
+ AOM_RC_FIRST_PASS = 1, /**< First pass of multi-pass mode */
+ AOM_RC_SECOND_PASS = 2, /**< Second pass of multi-pass mode */
+ AOM_RC_THIRD_PASS = 3, /**< Third pass of multi-pass mode */
+ AOM_RC_LAST_PASS = 2, /**< Final pass of two-pass mode */
};
/*!\brief Rate control mode */
diff --git a/apps/aomenc.c b/apps/aomenc.c
index c09c3ca..286b6b5 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -430,6 +430,7 @@
};
const arg_def_t *av1_key_val_args[] = {
+ &g_av1_codec_arg_defs.passes,
NULL,
};
@@ -596,12 +597,12 @@
} else if (arg_match(&arg, &g_av1_codec_arg_defs.passes, argi)) {
global->passes = arg_parse_uint(&arg);
- if (global->passes < 1 || global->passes > 2)
+ if (global->passes < 1 || global->passes > 3)
die("Error: Invalid number of passes (%d)\n", global->passes);
} else if (arg_match(&arg, &g_av1_codec_arg_defs.pass_arg, argi)) {
global->pass = arg_parse_uint(&arg);
- if (global->pass < 1 || global->pass > 2)
+ if (global->pass < 1 || global->pass > 3)
die("Error: Invalid pass selected (%d)\n", global->pass);
} else if (arg_match(&arg,
&g_av1_codec_arg_defs.input_chroma_sample_position,
@@ -1148,6 +1149,21 @@
config->cfg.kf_max_dist = 0;
}
}
+
+ // set the passes field using key & val API
+ if (config->arg_key_val_cnt >= ARG_KEY_VAL_CNT_MAX) {
+ die("Not enough buffer for the key & value API.");
+ }
+ config->arg_key_vals[config->arg_key_val_cnt][0] = "passes";
+ switch (global->passes) {
+ case 0: config->arg_key_vals[config->arg_key_val_cnt][1] = "0"; break;
+ case 1: config->arg_key_vals[config->arg_key_val_cnt][1] = "1"; break;
+ case 2: config->arg_key_vals[config->arg_key_val_cnt][1] = "2"; break;
+ case 3: config->arg_key_vals[config->arg_key_val_cnt][1] = "3"; break;
+ default: die("Invalid value of --passes.");
+ }
+ config->arg_key_val_cnt++;
+
return eos_mark_found;
}
@@ -1402,9 +1418,17 @@
fatal("Failed to open statistics store");
}
- stream->config.cfg.g_pass = global->passes == 2
- ? pass ? AOM_RC_LAST_PASS : AOM_RC_FIRST_PASS
- : AOM_RC_ONE_PASS;
+ if (global->passes == 1) {
+ stream->config.cfg.g_pass = AOM_RC_ONE_PASS;
+ } else {
+ switch (pass) {
+ case 0: stream->config.cfg.g_pass = AOM_RC_FIRST_PASS; break;
+ case 1: stream->config.cfg.g_pass = AOM_RC_SECOND_PASS; break;
+ case 2: stream->config.cfg.g_pass = AOM_RC_THIRD_PASS; break;
+ default: fatal("Failed to set pass");
+ }
+ }
+
if (pass) {
stream->config.cfg.rc_twopass_stats_in = stats_get(&stream->stats);
}
@@ -2109,7 +2133,10 @@
/* Ensure that --passes and --pass are consistent. If --pass is set and
* --passes=2, ensure --fpf was set.
*/
- if (global.pass && global.passes == 2) {
+ // TODO(bohanli): with passes == 3 and pass == 3, we could use either
+ // fpf or second pass bitstream. This should be updated when that option
+ // is added.
+ if (global.pass && global.passes >= 2) {
FOREACH_STREAM(stream, streams) {
if (!stream->config.stats_fn)
die("Stream %d: Must specify --fpf when --pass=%d"
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
index 9116706..ee04a01 100644
--- a/av1/arg_defs.c
+++ b/av1/arg_defs.c
@@ -145,8 +145,8 @@
.use_i422 = ARG_DEF(NULL, "i422", 0, "Input file is I422"),
.use_i444 = ARG_DEF(NULL, "i444", 0, "Input file is I444"),
.codecarg = ARG_DEF(NULL, "codec", 1, "Codec to use"),
- .passes = ARG_DEF("p", "passes", 1, "Number of passes (1/2)"),
- .pass_arg = ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2)"),
+ .passes = ARG_DEF("p", "passes", 1, "Number of passes (1/2/3)"),
+ .pass_arg = ARG_DEF(NULL, "pass", 1, "Pass to execute (1/2/3)"),
.fpf_name = ARG_DEF(NULL, "fpf", 1, "First pass statistics file name"),
.limit = ARG_DEF(NULL, "limit", 1, "Stop encoding after n input frames"),
.skip = ARG_DEF(NULL, "skip", 1, "Skip the first n input frames"),
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 204f2d8..0b6cb92 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -159,6 +159,9 @@
COST_UPDATE_TYPE dv_cost_upd_freq;
unsigned int ext_tile_debug;
unsigned int sb_multipass_unit_test;
+ // Total number of passes. If this number is -1, then we assume passes = 1 or
+ // 2 (passes = 1 if pass == AOM_RC_ONE_PASS and passes = 2 otherwise).
+ int passes;
};
#if CONFIG_REALTIME_ONLY
@@ -303,6 +306,7 @@
COST_UPD_OFF, // dv_cost_upd_freq
0, // ext_tile_debug
0, // sb_multipass_unit_test
+ -1, // passes
};
#else
static struct av1_extracfg default_extra_cfg = {
@@ -434,6 +438,7 @@
COST_UPD_SB, // dv_cost_upd_freq
0, // ext_tile_debug
0, // sb_multipass_unit_test
+ -1, // passes
};
#endif
@@ -542,7 +547,7 @@
RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100);
RANGE_CHECK(cfg, kf_mode, AOM_KF_DISABLED, AOM_KF_AUTO);
RANGE_CHECK_HI(cfg, rc_dropframe_thresh, 100);
- RANGE_CHECK(cfg, g_pass, AOM_RC_ONE_PASS, AOM_RC_LAST_PASS);
+ RANGE_CHECK(cfg, g_pass, AOM_RC_ONE_PASS, AOM_RC_THIRD_PASS);
if (cfg->g_pass == AOM_RC_ONE_PASS) {
RANGE_CHECK_HI(cfg, g_lag_in_frames, MAX_TOTAL_BUFFERS);
} else {
@@ -612,7 +617,7 @@
RANGE_CHECK(cfg, g_input_bit_depth, 8, 12);
RANGE_CHECK(extra_cfg, content, AOM_CONTENT_DEFAULT, AOM_CONTENT_INVALID - 1);
- if (cfg->g_pass == AOM_RC_LAST_PASS) {
+ if (cfg->g_pass >= AOM_RC_SECOND_PASS) {
const size_t packet_sz = sizeof(FIRSTPASS_STATS);
const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);
const FIRSTPASS_STATS *stats;
@@ -633,6 +638,15 @@
ERROR("rc_twopass_stats_in missing EOS stats packet");
}
+ if (extra_cfg->passes != -1 && cfg->g_pass == AOM_RC_ONE_PASS &&
+ extra_cfg->passes != 1) {
+ ERROR("One pass encoding but passes != 1.");
+ }
+
+ if (extra_cfg->passes != -1 && (int)cfg->g_pass > extra_cfg->passes) {
+ ERROR("Current pass is larger than total number of passes.");
+ }
+
if (cfg->g_profile <= (unsigned int)PROFILE_1 &&
cfg->g_bit_depth > AOM_BITS_10) {
ERROR("Codec bit-depth 12 not supported in profile < 2");
@@ -929,7 +943,7 @@
input_cfg->input_bit_depth = cfg->g_input_bit_depth;
// guess a frame rate if out of whack, use 30
input_cfg->init_framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num;
- if (cfg->g_pass == AOM_RC_LAST_PASS) {
+ if (cfg->g_pass >= AOM_RC_SECOND_PASS) {
const size_t packet_sz = sizeof(FIRSTPASS_STATS);
const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz);
input_cfg->limit = n_packets - 1;
@@ -974,10 +988,17 @@
dec_model_cfg->display_model_info_present_flag = 1;
}
- switch (cfg->g_pass) {
- case AOM_RC_ONE_PASS: oxcf->pass = 0; break;
- case AOM_RC_FIRST_PASS: oxcf->pass = 1; break;
- case AOM_RC_LAST_PASS: oxcf->pass = 2; break;
+ oxcf->pass = cfg->g_pass;
+ // For backward compatibility, assume that if extra_cfg->passes==-1, then
+ // passes = 1 or 2.
+ if (extra_cfg->passes == -1) {
+ if (cfg->g_pass == AOM_RC_ONE_PASS) {
+ oxcf->passes = 1;
+ } else {
+ oxcf->passes = 2;
+ }
+ } else {
+ oxcf->passes = extra_cfg->passes;
}
// Set Rate Control configuration.
@@ -2295,8 +2316,8 @@
reduce_ratio(&priv->timestamp_ratio);
set_encoder_config(&priv->oxcf, &priv->cfg, &priv->extra_cfg);
- if (priv->oxcf.rc_cfg.mode != AOM_CBR && priv->oxcf.pass == 0 &&
- priv->oxcf.mode == GOOD) {
+ if (priv->oxcf.rc_cfg.mode != AOM_CBR &&
+ priv->oxcf.pass == AOM_RC_ONE_PASS && priv->oxcf.mode == GOOD) {
// Enable look ahead - enabled for AOM_Q, AOM_CQ, AOM_VBR
*num_lap_buffers =
AOMMIN((int)priv->cfg.g_lag_in_frames,
@@ -2454,7 +2475,8 @@
AV1_COMP *cpi_lap = ppi->cpi_lap;
if (cpi == NULL) return AOM_CODEC_INVALID_PARAM;
- if (cpi->ppi->lap_enabled && cpi_lap == NULL && cpi->oxcf.pass == 0)
+ if (cpi->ppi->lap_enabled && cpi_lap == NULL &&
+ cpi->oxcf.pass == AOM_RC_ONE_PASS)
return AOM_CODEC_INVALID_PARAM;
if (img != NULL) {
@@ -2641,7 +2663,7 @@
int has_no_show_keyframe = 0;
int num_workers = 0;
- if (cpi->oxcf.pass == 1) {
+ if (cpi->oxcf.pass == AOM_RC_FIRST_PASS) {
#if !CONFIG_REALTIME_ONLY
num_workers = ppi->p_mt_info.num_mod_workers[MOD_FP] =
av1_fp_compute_num_enc_workers(cpi);
@@ -2652,13 +2674,13 @@
}
if ((num_workers > 1) && (cpi->mt_info.num_workers == 0)) {
av1_create_workers(ppi, num_workers);
- av1_init_tile_thread_data(ppi, cpi->oxcf.pass == 1);
+ av1_init_tile_thread_data(ppi, cpi->oxcf.pass == AOM_RC_FIRST_PASS);
#if CONFIG_FRAME_PARALLEL_ENCODE
for (int i = 0; i < ppi->num_fp_contexts; i++) {
av1_init_frame_mt(ppi, ppi->parallel_cpi[i]);
#if CONFIG_MULTITHREAD
av1_init_mt_sync(ppi->parallel_cpi[i],
- ppi->parallel_cpi[i]->oxcf.pass == 1);
+ ppi->parallel_cpi[i]->oxcf.pass == AOM_RC_FIRST_PASS);
#endif // CONFIG_MULTITHREAD
}
#else
@@ -3531,6 +3553,9 @@
&g_av1_codec_arg_defs.input_chroma_subsampling_y,
argv, err_string)) {
extra_cfg.chroma_subsampling_y = arg_parse_uint_helper(&arg, err_string);
+ } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.passes, argv,
+ err_string)) {
+ extra_cfg.passes = arg_parse_int_helper(&arg, err_string);
} else {
match = 0;
snprintf(err_string, ARG_ERR_MSG_MAX_LEN, "Cannot find aom option %s",
diff --git a/av1/encoder/av1_noise_estimate.c b/av1/encoder/av1_noise_estimate.c
index 8b2fc38..0a0e302 100644
--- a/av1/encoder/av1_noise_estimate.c
+++ b/av1/encoder/av1_noise_estimate.c
@@ -73,7 +73,7 @@
// Enabled for 1 pass CBR, speed >=5, and if resolution is same as original.
// Not enabled for SVC mode and screen_content_mode.
// Not enabled for low resolutions.
- if (cpi->oxcf.pass == 0 && cpi->oxcf.rc_cfg.mode == AOM_CBR &&
+ if (cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->oxcf.rc_cfg.mode == AOM_CBR &&
cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ && cpi->oxcf.speed >= 5 &&
resize_pending == 0 && !cpi->ppi->use_svc &&
cpi->oxcf.tune_cfg.content != AOM_CONTENT_SCREEN &&
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index a505eff..c79598b 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -1490,7 +1490,8 @@
if (!av1_lookahead_peek(cpi->ppi->lookahead, 0, cpi->compressor_stage)) {
#if !CONFIG_REALTIME_ONLY
- if (flush && oxcf->pass == 1 && !cpi->ppi->twopass.first_pass_done) {
+ if (flush && oxcf->pass == AOM_RC_FIRST_PASS &&
+ !cpi->ppi->twopass.first_pass_done) {
av1_end_first_pass(cpi); /* get last stats packet */
cpi->ppi->twopass.first_pass_done = 1;
}
@@ -1557,7 +1558,8 @@
if (source == NULL) { // If no source was found, we can't encode a frame.
#if !CONFIG_REALTIME_ONLY
- if (flush && oxcf->pass == 1 && !cpi->ppi->twopass.first_pass_done) {
+ if (flush && oxcf->pass == AOM_RC_FIRST_PASS &&
+ !cpi->ppi->twopass.first_pass_done) {
av1_end_first_pass(cpi); /* get last stats packet */
cpi->ppi->twopass.first_pass_done = 1;
}
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index c965ebb..8e786b1 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1177,7 +1177,7 @@
sizeof(*ppi->tpl_sb_rdmult_scaling_factors)));
#if !CONFIG_REALTIME_ONLY
- if (oxcf->pass != 1) {
+ if (oxcf->pass != AOM_RC_FIRST_PASS) {
av1_setup_tpl_buffers(ppi, &mi_params, oxcf->frm_dim_cfg.width,
oxcf->frm_dim_cfg.height, 0,
oxcf->gf_cfg.lag_in_frames);
@@ -1272,9 +1272,10 @@
CommonModeInfoParams *const mi_params = &cm->mi_params;
mi_params->free_mi = enc_free_mi;
mi_params->setup_mi = enc_setup_mi;
- mi_params->set_mb_mi = (oxcf->pass == 1 || cpi->compressor_stage == LAP_STAGE)
- ? stat_stage_set_mb_mi
- : enc_set_mb_mi;
+ mi_params->set_mb_mi =
+ (oxcf->pass == AOM_RC_FIRST_PASS || cpi->compressor_stage == LAP_STAGE)
+ ? stat_stage_set_mb_mi
+ : enc_set_mb_mi;
mi_params->mi_alloc_bsize = BLOCK_4X4;
@@ -3703,7 +3704,8 @@
#if !CONFIG_REALTIME_ONLY
av1_first_pass(cpi, frame_input->ts_duration);
#endif
- } else if (cpi->oxcf.pass == 0 || cpi->oxcf.pass == 2) {
+ } else if (cpi->oxcf.pass == AOM_RC_ONE_PASS ||
+ cpi->oxcf.pass >= AOM_RC_SECOND_PASS) {
if (encode_frame_to_data_rate(cpi, &frame_results->size, dest) !=
AOM_CODEC_OK) {
return AOM_CODEC_ERROR;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 138e5c1..9fd1bd2 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -950,14 +950,17 @@
/*!\endcond */
/*!
* Indicates the current encoder pass :
- * 0 = 1 Pass encode,
- * 1 = First pass of two pass,
- * 2 = Second pass of two pass.
- *
+ * AOM_RC_ONE_PASS = One pass encode,
+ * AOM_RC_FIRST_PASS = First pass of multiple-pass
+ * AOM_RC_SECOND_PASS = Second pass of multiple-pass
+ * AOM_RC_THIRD_PASS = Third pass of multiple-pass
*/
enum aom_enc_pass pass;
/*!\cond */
+ // Total number of encoding passes.
+ int passes;
+
// Indicates if the encoding is GOOD or REALTIME.
MODE mode;
@@ -3372,19 +3375,20 @@
// Check if statistics generation stage
static INLINE int is_stat_generation_stage(const AV1_COMP *const cpi) {
assert(IMPLIES(cpi->compressor_stage == LAP_STAGE,
- cpi->oxcf.pass == 0 && cpi->ppi->lap_enabled));
- return (cpi->oxcf.pass == 1 || (cpi->compressor_stage == LAP_STAGE));
+ cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi->lap_enabled));
+ return (cpi->oxcf.pass == AOM_RC_FIRST_PASS ||
+ (cpi->compressor_stage == LAP_STAGE));
}
// Check if statistics consumption stage
static INLINE int is_stat_consumption_stage_twopass(const AV1_COMP *const cpi) {
- return (cpi->oxcf.pass == 2);
+ return (cpi->oxcf.pass >= AOM_RC_SECOND_PASS);
}
// Check if statistics consumption stage
static INLINE int is_stat_consumption_stage(const AV1_COMP *const cpi) {
return (is_stat_consumption_stage_twopass(cpi) ||
- (cpi->oxcf.pass == 0 && (cpi->compressor_stage == ENCODE_STAGE) &&
- cpi->ppi->lap_enabled));
+ (cpi->oxcf.pass == AOM_RC_ONE_PASS &&
+ (cpi->compressor_stage == ENCODE_STAGE) && cpi->ppi->lap_enabled));
}
/*!\endcond */
@@ -3399,7 +3403,7 @@
static INLINE int has_no_stats_stage(const AV1_COMP *const cpi) {
assert(
IMPLIES(!cpi->ppi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE));
- return (cpi->oxcf.pass == 0 && !cpi->ppi->lap_enabled);
+ return (cpi->oxcf.pass == AOM_RC_ONE_PASS && !cpi->ppi->lap_enabled);
}
/*!\cond */
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 44ca4df..a978754 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -2209,7 +2209,7 @@
// For single-pass encode, using no. of workers as per tf block size was not
// found to improve speed. Hence the thread assignment for single-pass encode
// is kept based on compute_num_enc_workers().
- if (cpi->oxcf.pass != 2)
+ if (cpi->oxcf.pass < AOM_RC_SECOND_PASS)
return (compute_num_enc_workers(cpi, cpi->oxcf.max_threads));
if (cpi->oxcf.max_threads <= 1) return 1;
@@ -2251,7 +2251,7 @@
int num_mod_workers = 0;
switch (mod_name) {
case MOD_FP:
- if (cpi->oxcf.pass == 2)
+ if (cpi->oxcf.pass >= AOM_RC_SECOND_PASS)
num_mod_workers = 0;
else
num_mod_workers = compute_num_enc_workers(cpi, cpi->oxcf.max_threads);
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index 662b42c..5ec1def 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -974,8 +974,9 @@
/*In the case of two pass, first pass uses it as a circular buffer,
* when LAP is enabled it is used as a linear buffer*/
twopass->stats_buf_ctx->stats_in_end++;
- if ((cpi->oxcf.pass == 1) && (twopass->stats_buf_ctx->stats_in_end >=
- twopass->stats_buf_ctx->stats_in_buf_end)) {
+ if ((cpi->oxcf.pass == AOM_RC_FIRST_PASS) &&
+ (twopass->stats_buf_ctx->stats_in_end >=
+ twopass->stats_buf_ctx->stats_in_buf_end)) {
twopass->stats_buf_ctx->stats_in_end =
twopass->stats_buf_ctx->stats_in_start;
}
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index d3135ca..f3d690b 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -439,7 +439,7 @@
cfl_store_block(xd, mbmi->bsize, mbmi->tx_size);
}
if (!dry_run) {
- if (cpi->oxcf.pass == 0 && cpi->svc.temporal_layer_id == 0 &&
+ if (cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->svc.temporal_layer_id == 0 &&
cpi->sf.rt_sf.use_temporal_noise_estimate &&
(!cpi->ppi->use_svc ||
(cpi->ppi->use_svc &&
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index e3639f7..292c6ba 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -2118,8 +2118,9 @@
(int)av1_lookahead_depth(cpi->ppi->lookahead, cpi->compressor_stage);
if (lookahead_size <
av1_lookahead_pop_sz(cpi->ppi->lookahead, cpi->compressor_stage)) {
- assert(IMPLIES(cpi->oxcf.pass != 0 && cpi->ppi->frames_left > 0,
- lookahead_size == cpi->ppi->frames_left));
+ assert(
+ IMPLIES(cpi->oxcf.pass != AOM_RC_ONE_PASS && cpi->ppi->frames_left > 0,
+ lookahead_size == cpi->ppi->frames_left));
cpi->rc.frames_to_key = AOMMIN(cpi->rc.frames_to_key, lookahead_size);
} else if (cpi->ppi->frames_left > 0) {
// Correct frames to key based on limit
@@ -3658,7 +3659,8 @@
if (update_type == ARF_UPDATE || update_type == INTNL_ARF_UPDATE) {
// Do the firstpass stats indicate that this frame is skippable for the
// partition search?
- if (cpi->sf.part_sf.allow_partition_search_skip && oxcf->pass == 2) {
+ if (cpi->sf.part_sf.allow_partition_search_skip &&
+ oxcf->pass >= AOM_RC_SECOND_PASS) {
cpi->partition_search_skippable_frame = is_skippable_frame(cpi);
}
const FIRSTPASS_STATS *const this_frame_ptr = read_frame_stats(
@@ -3885,7 +3887,8 @@
// Do the firstpass stats indicate that this frame is skippable for the
// partition search?
- if (cpi->sf.part_sf.allow_partition_search_skip && oxcf->pass == 2) {
+ if (cpi->sf.part_sf.allow_partition_search_skip &&
+ oxcf->pass >= AOM_RC_SECOND_PASS) {
cpi->partition_search_skippable_frame = is_skippable_frame(cpi);
}
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index c24c822..18e1399 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -309,7 +309,7 @@
const RateControlCfg *const rc_cfg = &oxcf->rc_cfg;
int i;
- if (pass == 0 && rc_cfg->mode == AOM_CBR) {
+ if (pass == AOM_RC_ONE_PASS && rc_cfg->mode == AOM_CBR) {
rc->avg_frame_qindex[KEY_FRAME] = rc_cfg->worst_allowed_q;
rc->avg_frame_qindex[INTER_FRAME] = rc_cfg->worst_allowed_q;
} else {
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 916a818..93e05da 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1873,7 +1873,7 @@
sf->rd_sf.optimize_coefficients = NO_TRELLIS_OPT;
// No recode or trellis for 1 pass.
- if (oxcf->pass == 0 && has_no_stats_stage(cpi))
+ if (oxcf->pass == AOM_RC_ONE_PASS && has_no_stats_stage(cpi))
sf->hl_sf.recode_loop = DISALLOW_RECODE;
MotionVectorSearchParams *const mv_search_params = &cpi->mv_search_params;