#define IIFACTOR 1.4
#define IIKFACTOR1 1.40
#define IIKFACTOR2 1.5
-#define RMAX 14.0
-#define GF_RMAX 48.0 // 128.0
+#define RMAX 14.0
+#define GF_RMAX 48.0
+#define KF_MB_INTRA_MIN 300
+#define GF_MB_INTRA_MIN 200
#define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001)
#define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
cpi->bits_left -= (long long)(cpi->total_stats->duration * two_pass_min_rate / 10000000.0);
cpi->clip_bits_total = cpi->bits_left;
+ // Calculate a minimum intra value to be used in determining the IIratio
+ // scores used in the second pass. We have this minimum to make sure
+ // that clips that are static but "low complexity" in the intra domain
+ // are still boosted appropriately for KF/GF/ARF
+ cpi->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
+ cpi->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
+
vp8_avg_stats(cpi->total_stats);
// Scan the first pass file and calculate an average Intra / Inter error score ratio for the sequence
// Underlying boost factor is based on inter intra error ratio
r = (boost_factor * (next_frame.intra_error / DOUBLE_DIVIDE_CHECK(next_frame.coded_error)));
+ if (next_frame.intra_error > cpi->gf_intra_err_min)
+ r = (IIKFACTOR2 * next_frame.intra_error /
+ DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+ else
+ r = (IIKFACTOR2 * cpi->gf_intra_err_min /
+ DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+
// Increase boost for frames where new data coming into frame (eg zoom out)
// Slightly reduce boost if there is a net balance of motion out of the frame (zoom in)
// The range for this_frame_mv_in_out is -1.0 to +1.0
if (EOF == vp8_input_stats(cpi, &next_frame))
break;
- r = (IIKFACTOR2 * next_frame.intra_error / DOUBLE_DIVIDE_CHECK(next_frame.coded_error)) ;
+ if (next_frame.intra_error > cpi->kf_intra_err_min)
+ r = (IIKFACTOR2 * next_frame.intra_error /
+ DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
+ else
+ r = (IIKFACTOR2 * cpi->kf_intra_err_min /
+ DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
if (r > RMAX)
r = RMAX;
kf_boost = (int)((double)kf_boost * 100.0) >> 4; // Scale 16 to 100
// Adjustment to boost based on recent average q
- kf_boost = kf_boost * vp8_kf_boost_qadjustment[cpi->ni_av_qi] / 100;
+ //kf_boost = kf_boost * vp8_kf_boost_qadjustment[cpi->ni_av_qi] / 100;
if (kf_boost < 250) // Min KF boost
kf_boost = 250;