RANGE_CHECK(cfg, kf_max_total_boost.den, 1, 1000);
RANGE_CHECK(cfg, gf_max_total_boost.den, 1, 1000);
RANGE_CHECK(cfg, gf_frame_max_boost.den, 1, 1000);
- RANGE_CHECK(cfg, zm_power_factor.den, 1, 1000);
+ RANGE_CHECK(cfg, zm_factor.den, 1, 1000);
return VPX_CODEC_OK;
}
{ 0, 1 }, /* kf_max_total_boost */
{ 0, 1 }, /* gf_max_total_boost */
{ 0, 1 }, /* gf_frame_max_boost */
- { 0, 1 }, /* zm_power_factor */
+ { 0, 1 }, /* zm_factor */
} },
};
#define MAX_KF_TOT_BOOST 5400
#endif
-#define ZM_POWER_FACTOR 0.75
+#define DEFAULT_ZM_FACTOR 0.5
#define MINQ_ADJ_LIMIT 48
#define MINQ_ADJ_LIMIT_CQ 20
#define HIGH_UNDERSHOOT_RATIO 2
static double get_prediction_decay_rate(const TWO_PASS *const twopass,
const FIRSTPASS_STATS *frame_stats) {
const double sr_decay_rate = get_sr_decay_rate(twopass, frame_stats);
- const double zero_motion_factor =
- (0.95 * pow((frame_stats->pcnt_inter - frame_stats->pcnt_motion),
- twopass->zm_power_factor));
+ double zero_motion_factor =
+ twopass->zm_factor * DEFAULT_ZM_FACTOR *
+ (frame_stats->pcnt_inter - frame_stats->pcnt_motion);
+
+ // Clamp value to range 0.0 to 1.0
+ // This should happen anyway if input values are sensibly clamped but checked
+ // here just in case.
+ if (zero_motion_factor > 1.0)
+ zero_motion_factor = 1.0;
+ else if (zero_motion_factor < 0.0)
+ zero_motion_factor = 0.0;
return VPXMAX(zero_motion_factor,
(sr_decay_rate + ((1.0 - sr_decay_rate) * zero_motion_factor)));
twopass->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = ZM_POWER_FACTOR;
+ twopass->zm_factor = 1.0;
} else {
// Vizer experimental parameters from training.
// Later these will be set via the command line.
twopass->kf_frame_max_boost_first = 25.5;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 2.93715229184991;
+ twopass->zm_factor = 1.0;
} else if (screen_area <= 320 * 240) {
twopass->active_wq_factor = 55.0;
twopass->base_err_per_mb = 34525.33177195309;
twopass->kf_frame_max_boost_first = 185.0;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 3.5299221493593413;
+ twopass->zm_factor = 1.0;
} else if (screen_area <= 640 * 360) {
twopass->active_wq_factor = 12.5;
twopass->base_err_per_mb = 18823.978018028298;
twopass->kf_frame_max_boost_first = 224.5;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 2.265742666649307;
+ twopass->zm_factor = 1.0;
} else if (screen_area <= 854 * 480) {
twopass->active_wq_factor = 51.5;
twopass->base_err_per_mb = 33718.98307662595;
twopass->kf_frame_max_boost_first = 28.0;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 3.552278528517416;
+ twopass->zm_factor = 1.0;
} else if (screen_area <= 1280 * 720) {
twopass->active_wq_factor = 41.5;
twopass->base_err_per_mb = 29527.46375825401;
twopass->kf_frame_max_boost_first = 53.0;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 2.568627575572356;
+ twopass->zm_factor = 1.0;
} else {
twopass->active_wq_factor = 31.0;
twopass->base_err_per_mb = 34474.723463367416;
twopass->kf_frame_max_boost_first = 419.5;
twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_power_factor = 5.5776463538431935;
+ twopass->zm_factor = 1.0;
}
}
}
RANGE_CHECK(cfg, kf_max_total_boost.den, 1, 1000);
RANGE_CHECK(cfg, gf_max_total_boost.den, 1, 1000);
RANGE_CHECK(cfg, gf_frame_max_boost.den, 1, 1000);
- RANGE_CHECK(cfg, zm_power_factor.den, 1, 1000);
+ RANGE_CHECK(cfg, zm_factor.den, 1, 1000);
return VPX_CODEC_OK;
}
(double)cfg->gf_max_total_boost.den);
cpi->twopass.gf_frame_max_boost =
(double)cfg->gf_frame_max_boost.num / (double)cfg->gf_frame_max_boost.den;
- cpi->twopass.zm_power_factor =
- (double)cfg->zm_power_factor.num / (double)cfg->zm_power_factor.den;
+ cpi->twopass.zm_factor =
+ (double)cfg->zm_factor.num / (double)cfg->zm_factor.den;
return VPX_CODEC_OK;
}
{ 0, 1 }, // kf_max_total_boost
{ 0, 1 }, // gf_max_total_boost
{ 0, 1 }, // gf_frame_max_boost
- { 0, 1 }, // zm_power_factor
+ { 0, 1 }, // zm_factor
} },
};
ARG_DEF(NULL, "gf-max-total-boost", 1, "Golden frame max total boost");
static const arg_def_t gf_frame_max_boost =
ARG_DEF(NULL, "gf-frame-max-boost", 1, "Golden frame max boost");
-static const arg_def_t zm_power_factor =
+static const arg_def_t zm_factor =
ARG_DEF(NULL, "zm-power-factor", 1, "Zero motion power factor");
static const arg_def_t *vizier_rc_args[] = { &active_wq_factor,
&base_err_per_mb,
&kf_max_total_boost,
&gf_max_total_boost,
&gf_frame_max_boost,
- &zm_power_factor,
+ &zm_factor,
NULL };
#endif
config->cfg.gf_max_total_boost = arg_parse_rational(&arg);
} else if (arg_match(&arg, &gf_frame_max_boost, argi)) {
config->cfg.gf_frame_max_boost = arg_parse_rational(&arg);
- } else if (arg_match(&arg, &zm_power_factor, argi)) {
- config->cfg.zm_power_factor = arg_parse_rational(&arg);
+ } else if (arg_match(&arg, &zm_factor, argi)) {
+ config->cfg.zm_factor = arg_parse_rational(&arg);
#endif
#if CONFIG_VP9_HIGHBITDEPTH
} else if (arg_match(&arg, &test16bitinternalarg, argi)) {