diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 3df9a1f801f81956f3a9c78885ab1a3d7e6945b7..ba0fea22c4f674768241ace315d3adcb742b83e9 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -271,8 +271,17 @@ static double calculate_modified_err(VP9_COMP *cpi, const FIRSTPASS_STATS *const stats = &cpi->twopass.total_stats; const double av_err = stats->ssim_weighted_pred_err / stats->count; const double this_err = this_frame->ssim_weighted_pred_err; - return av_err * pow(this_err / DOUBLE_DIVIDE_CHECK(av_err), - this_err > av_err ? POW1 : POW2); + double modified_error; + + modified_error = av_err * pow(this_err / DOUBLE_DIVIDE_CHECK(av_err), + this_err > av_err ? POW1 : POW2); + + if (modified_error < cpi->twopass.modified_error_min) + modified_error = cpi->twopass.modified_error_min; + else if (modified_error > cpi->twopass.modified_error_max) + modified_error = cpi->twopass.modified_error_max; + + return modified_error; } static const double weight_table[256] = { @@ -1077,13 +1086,6 @@ void vp9_init_second_pass(VP9_COMP *cpi) { FIRSTPASS_STATS this_frame; FIRSTPASS_STATS *start_pos; - double lower_bounds_min_rate = FRAME_OVERHEAD_BITS * cpi->oxcf.framerate; - double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * - cpi->oxcf.two_pass_vbrmin_section / 100); - - if (two_pass_min_rate < lower_bounds_min_rate) - two_pass_min_rate = lower_bounds_min_rate; - zero_stats(&cpi->twopass.total_stats); zero_stats(&cpi->twopass.total_left_stats); @@ -1104,8 +1106,6 @@ void vp9_init_second_pass(VP9_COMP *cpi) { cpi->output_framerate = cpi->oxcf.framerate; cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0); - cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * - two_pass_min_rate / 10000000.0); // 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 @@ -1142,9 +1142,16 @@ void vp9_init_second_pass(VP9_COMP *cpi) { // Scan the first pass file and calculate a modified total error based upon // the bias/power function used to allocate bits. { + double av_error = cpi->twopass.total_stats.ssim_weighted_pred_err / + DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.count); + start_pos = cpi->twopass.stats_in; // Note starting "file" position cpi->twopass.modified_error_total = 0.0; + cpi->twopass.modified_error_min = + (av_error * cpi->oxcf.two_pass_vbrmin_section) / 100; + cpi->twopass.modified_error_max = + (av_error * cpi->oxcf.two_pass_vbrmax_section) / 100; while (input_stats(cpi, &this_frame) != EOF) { cpi->twopass.modified_error_total += @@ -2618,14 +2625,4 @@ void vp9_twopass_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { #else cpi->twopass.bits_left -= 8 * bytes_used; #endif - if (!cpi->refresh_alt_ref_frame) { - double lower_bounds_min_rate = FRAME_OVERHEAD_BITS * cpi->oxcf.framerate; - double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * - cpi->oxcf.two_pass_vbrmin_section - / 100); - if (two_pass_min_rate < lower_bounds_min_rate) - two_pass_min_rate = lower_bounds_min_rate; - cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / - cpi->oxcf.framerate); - } } diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index f5b6562da6f6ba76925b7dcb7563b85570322720..d32711c32e0c9123caa5dac76b8264c607034b8b 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -525,6 +525,8 @@ typedef struct VP9_COMP { int64_t bits_left; int64_t clip_bits_total; double avg_iiratio; + double modified_error_min; + double modified_error_max; double modified_error_total; double modified_error_left; double kf_intra_err_min;