Commit 289be521 authored by Paul Wilkins's avatar Paul Wilkins Committed by On2 (Google) Code Review

Merge "Experimental change to two pass prediction decay calculation." into experimental

parents e9818bb6 f63894f6
......@@ -50,11 +50,11 @@ extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi);
extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
extern void vp8_alloc_compressor_data(VP8_COMP *cpi);
#define IIFACTOR 9.375
#define IIKFACTOR1 8.75
#define IIKFACTOR2 9.375
#define RMAX 87.5
#define GF_RMAX 300.0
#define IIFACTOR 12.5
#define IIKFACTOR1 12.5
#define IIKFACTOR2 12.5
#define RMAX 96.0
#define GF_RMAX 96.0
#define ERR_DIVISOR 150.0
#define KF_MB_INTRA_MIN 300
......@@ -1033,7 +1033,7 @@ static int estimate_max_q(VP8_COMP *cpi,
// Error per MB based correction factor
err_correction_factor =
calc_correction_factor(cpi, fpstats, err_per_mb,
ERR_DIVISOR, 0.36, 0.90, Q) *
ERR_DIVISOR, 0.40, 0.90, Q) *
speed_correction *
cpi->twopass.est_max_qcorrection_factor *
cpi->twopass.section_max_qfactor;
......@@ -1137,14 +1137,15 @@ static int estimate_cq( VP8_COMP *cpi,
// Error per MB based correction factor
err_correction_factor =
calc_correction_factor(cpi, fpstats, err_per_mb,
100.0, 0.36, 0.90, Q);
100.0, 0.40, 0.90, Q) *
speed_correction * clip_iifactor;
bits_per_mb_at_this_q =
vp8_bits_per_mb(INTER_FRAME, Q) + overhead_bits_per_mb;
bits_per_mb_at_this_q =
(int)( .5 + err_correction_factor *
speed_correction *
clip_iifactor *
(double)bits_per_mb_at_this_q);
// Mode and motion overhead
......@@ -1258,33 +1259,29 @@ void vp8_end_second_pass(VP8_COMP *cpi)
static double get_prediction_decay_rate(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
{
double prediction_decay_rate;
double second_ref_decay;
double motion_decay;
double motion_pct = next_frame->pcnt_motion;
double mb_sr_err_diff;
// Initial basis is the % mbs inter coded
prediction_decay_rate = next_frame->pcnt_inter;
// High % motion -> somewhat higher decay rate
motion_decay = (1.0 - (motion_pct / 20.0));
if (motion_decay < prediction_decay_rate)
prediction_decay_rate = motion_decay;
// Adjustment to decay rate based on speed of motion
{
double this_mv_rabs;
double this_mv_cabs;
double distance_factor;
this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct);
this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct);
distance_factor = sqrt((this_mv_rabs * this_mv_rabs) +
(this_mv_cabs * this_mv_cabs)) / 250.0;
distance_factor = ((distance_factor > 1.0)
? 0.0 : (1.0 - distance_factor));
if (distance_factor < prediction_decay_rate)
prediction_decay_rate = distance_factor;
}
prediction_decay_rate = pow(next_frame->pcnt_inter, 0.5);
// Look at the observed drop in prediction quality between the last frame
// and the GF buffer (which contains an older frame).
mb_sr_err_diff =
(next_frame->sr_coded_error - next_frame->coded_error) /
(cpi->common.MBs);
second_ref_decay = 1.0 - (mb_sr_err_diff / 512.0);
second_ref_decay = pow( second_ref_decay, 0.5 );
if ( second_ref_decay < prediction_decay_rate )
prediction_decay_rate = second_ref_decay;
if ( prediction_decay_rate < 0.85 )
prediction_decay_rate = 0.85;
else if ( prediction_decay_rate > 1.0 )
prediction_decay_rate = 1.0;
return prediction_decay_rate;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment