Remove brightness weighting in two pass.
This code dates from the ancient past and applied an error score weighting based on pixel brightness. This not seem to be providing any benefit metrics wise and could be making some visual issues in dark frames worse. The field is left in place in the FIRSTPASS_STATS data structure in this patch, pending changes to unit tests that use a pre-defined first pass file. Change-Id: Id50f04205230234858e7548ce523f11acaf3567d
This commit is contained in:
parent
debd048531
commit
f085d128f7
@ -169,7 +169,6 @@ static void zero_stats(FIRSTPASS_STATS *section) {
|
||||
section->intra_error = 0.0;
|
||||
section->coded_error = 0.0;
|
||||
section->sr_coded_error = 0.0;
|
||||
section->ssim_weighted_pred_err = 0.0;
|
||||
section->pcnt_inter = 0.0;
|
||||
section->pcnt_motion = 0.0;
|
||||
section->pcnt_second_ref = 0.0;
|
||||
@ -194,7 +193,6 @@ static void accumulate_stats(FIRSTPASS_STATS *section,
|
||||
section->intra_error += frame->intra_error;
|
||||
section->coded_error += frame->coded_error;
|
||||
section->sr_coded_error += frame->sr_coded_error;
|
||||
section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
|
||||
section->pcnt_inter += frame->pcnt_inter;
|
||||
section->pcnt_motion += frame->pcnt_motion;
|
||||
section->pcnt_second_ref += frame->pcnt_second_ref;
|
||||
@ -217,7 +215,6 @@ static void subtract_stats(FIRSTPASS_STATS *section,
|
||||
section->intra_error -= frame->intra_error;
|
||||
section->coded_error -= frame->coded_error;
|
||||
section->sr_coded_error -= frame->sr_coded_error;
|
||||
section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
|
||||
section->pcnt_inter -= frame->pcnt_inter;
|
||||
section->pcnt_motion -= frame->pcnt_motion;
|
||||
section->pcnt_second_ref -= frame->pcnt_second_ref;
|
||||
@ -241,7 +238,6 @@ static void avg_stats(FIRSTPASS_STATS *section) {
|
||||
section->intra_error /= section->count;
|
||||
section->coded_error /= section->count;
|
||||
section->sr_coded_error /= section->count;
|
||||
section->ssim_weighted_pred_err /= section->count;
|
||||
section->pcnt_inter /= section->count;
|
||||
section->pcnt_second_ref /= section->count;
|
||||
section->pcnt_neutral /= section->count;
|
||||
@ -262,71 +258,14 @@ static double calculate_modified_err(const TWO_PASS *twopass,
|
||||
const VP9EncoderConfig *oxcf,
|
||||
const FIRSTPASS_STATS *this_frame) {
|
||||
const FIRSTPASS_STATS *const stats = &twopass->total_stats;
|
||||
const double av_err = stats->ssim_weighted_pred_err / stats->count;
|
||||
const double av_err = stats->coded_error / stats->count;
|
||||
const double modified_error = av_err *
|
||||
pow(this_frame->ssim_weighted_pred_err / DOUBLE_DIVIDE_CHECK(av_err),
|
||||
pow(this_frame->coded_error / DOUBLE_DIVIDE_CHECK(av_err),
|
||||
oxcf->two_pass_vbrbias / 100.0);
|
||||
return fclamp(modified_error,
|
||||
twopass->modified_error_min, twopass->modified_error_max);
|
||||
}
|
||||
|
||||
static const double weight_table[256] = {
|
||||
0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
|
||||
0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
|
||||
0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
|
||||
0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
|
||||
0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.031250, 0.062500,
|
||||
0.093750, 0.125000, 0.156250, 0.187500, 0.218750, 0.250000, 0.281250,
|
||||
0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, 0.500000,
|
||||
0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750,
|
||||
0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500,
|
||||
0.968750, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
|
||||
1.000000, 1.000000, 1.000000, 1.000000
|
||||
};
|
||||
|
||||
static double simple_weight(const YV12_BUFFER_CONFIG *buf) {
|
||||
int i, j;
|
||||
double sum = 0.0;
|
||||
const int w = buf->y_crop_width;
|
||||
const int h = buf->y_crop_height;
|
||||
const uint8_t *row = buf->y_buffer;
|
||||
|
||||
for (i = 0; i < h; ++i) {
|
||||
const uint8_t *pixel = row;
|
||||
for (j = 0; j < w; ++j)
|
||||
sum += weight_table[*pixel++];
|
||||
row += buf->y_stride;
|
||||
}
|
||||
|
||||
return MAX(0.1, sum / (w * h));
|
||||
}
|
||||
|
||||
// This function returns the maximum target rate per frame.
|
||||
static int frame_max_bits(const RATE_CONTROL *rc,
|
||||
const VP9EncoderConfig *oxcf) {
|
||||
@ -796,7 +735,6 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
||||
fps.intra_error = (double)(intra_error >> 8);
|
||||
fps.coded_error = (double)(coded_error >> 8);
|
||||
fps.sr_coded_error = (double)(sr_coded_error >> 8);
|
||||
fps.ssim_weighted_pred_err = fps.coded_error * simple_weight(cpi->Source);
|
||||
fps.count = 1.0;
|
||||
fps.pcnt_inter = (double)intercount / cm->MBs;
|
||||
fps.pcnt_second_ref = (double)second_ref_count / cm->MBs;
|
||||
@ -1002,8 +940,8 @@ 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.
|
||||
{
|
||||
const double avg_error = stats->ssim_weighted_pred_err /
|
||||
DOUBLE_DIVIDE_CHECK(stats->count);
|
||||
const double avg_error = stats->coded_error /
|
||||
DOUBLE_DIVIDE_CHECK(stats->count);
|
||||
const FIRSTPASS_STATS *s = twopass->stats_in;
|
||||
double modified_error_total = 0.0;
|
||||
twopass->modified_error_min = (avg_error *
|
||||
@ -1523,6 +1461,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
|
||||
FIRSTPASS_STATS next_frame;
|
||||
const FIRSTPASS_STATS *const start_pos = twopass->stats_in;
|
||||
int i;
|
||||
|
||||
double boost_score = 0.0;
|
||||
double old_boost_score = 0.0;
|
||||
double gf_group_err = 0.0;
|
||||
|
Loading…
Reference in New Issue
Block a user