Fix for loop filter selection procedure

Fixed best error reported by loop filter selection, this value is used
during loop restoration to pick best mode. Baseline remains unchanged,
change in BDRate for loop restoration experiment:
-0.628 -> -0.625 for lowres,
-1.262 -> -1.283 for highres.

Change-Id: I69ef1608bc232b250ac46f59e31fdbed1a999dcd
This commit is contained in:
Aamir Anis 2016-07-08 14:36:36 -07:00
Родитель 985dd03ff7
Коммит 8575709f97
2 изменённых файлов: 18 добавлений и 9 удалений

Просмотреть файл

@ -120,11 +120,11 @@ int vp10_search_filter_level(const YV12_BUFFER_CONFIG *sd, VP10_COMP *cpi,
}
// If value is close to the best so far then bias towards a lower loop
// filter value.
if ((ss_err[filt_low] - bias) < best_err) {
if (ss_err[filt_low] < (best_err + bias)) {
// Was it actually better than the previous best?
if (ss_err[filt_low] < best_err)
if (ss_err[filt_low] < best_err) {
best_err = ss_err[filt_low];
}
filt_best = filt_low;
}
}
@ -134,7 +134,8 @@ int vp10_search_filter_level(const YV12_BUFFER_CONFIG *sd, VP10_COMP *cpi,
if (ss_err[filt_high] < 0) {
ss_err[filt_high] = try_filter_frame(sd, cpi, filt_high, partial_frame);
}
// Was it better than the previous best?
// If value is significantly better than previous best, bias added against
// raising filter value
if (ss_err[filt_high] < (best_err - bias)) {
best_err = ss_err[filt_high];
filt_best = filt_high;
@ -150,6 +151,10 @@ int vp10_search_filter_level(const YV12_BUFFER_CONFIG *sd, VP10_COMP *cpi,
filt_mid = filt_best;
}
}
// Update best error
best_err = ss_err[filt_best];
if (best_cost_ret)
*best_cost_ret = RDCOST_DBL(x->rdmult, x->rddiv, 0, best_err);
return filt_best;

Просмотреть файл

@ -146,17 +146,16 @@ static int search_filter_bilateral_level(const YV12_BUFFER_CONFIG *sd,
if (filt_direction <= 0 && filt_low != filt_mid) {
// Get Low filter error score
if (ss_err[filt_low] < 0) {
bilateral_lev = search_bilateral_level(sd, cpi, filt_low,
partial_frame, &ss_err[filt_low]);
bilateral_lev = search_bilateral_level(
sd, cpi, filt_low, partial_frame, &ss_err[filt_low]);
}
// If value is close to the best so far then bias towards a lower loop
// filter value.
if ((ss_err[filt_low] - bias) < best_err) {
if (ss_err[filt_low] < (best_err + bias)) {
// Was it actually better than the previous best?
if (ss_err[filt_low] < best_err) {
best_err = ss_err[filt_low];
}
filt_best = filt_low;
restoration_best = bilateral_lev;
}
@ -168,7 +167,8 @@ static int search_filter_bilateral_level(const YV12_BUFFER_CONFIG *sd,
bilateral_lev = search_bilateral_level(
sd, cpi, filt_high, partial_frame, &ss_err[filt_high]);
}
// Was it better than the previous best?
// If value is significantly better than previous best, bias added against
// raising filter value
if (ss_err[filt_high] < (best_err - bias)) {
best_err = ss_err[filt_high];
filt_best = filt_high;
@ -185,6 +185,10 @@ static int search_filter_bilateral_level(const YV12_BUFFER_CONFIG *sd,
filt_mid = filt_best;
}
}
// Update best error
best_err = ss_err[filt_best];
*restoration_level = restoration_best;
if (best_cost_ret) *best_cost_ret = best_err;
return filt_best;