diff options
Diffstat (limited to 'vp9/encoder/vp9_picklpf.c')
-rw-r--r-- | vp9/encoder/vp9_picklpf.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c index d80ea02c1..645d66b25 100644 --- a/vp9/encoder/vp9_picklpf.c +++ b/vp9/encoder/vp9_picklpf.c @@ -9,6 +9,7 @@ */ #include <assert.h> +#include <limits.h> #include "vp9/common/vp9_onyxc_int.h" #include "vp9/encoder/vp9_onyx_int.h" #include "vp9/encoder/vp9_picklpf.h" @@ -267,7 +268,7 @@ void vp9_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi) { // Get baseline error score vp9_set_alt_lf_level(cpi, filt_mid); - vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_mid, 1); + vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_mid, 1, 0); best_err = vp9_calc_ss_err(sd, cm->frame_to_show); filt_best = filt_mid; @@ -292,7 +293,7 @@ void vp9_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi) { if ((filt_direction <= 0) && (filt_low != filt_mid)) { // Get Low filter error score vp9_set_alt_lf_level(cpi, filt_low); - vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_low, 1); + vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_low, 1, 0); filt_err = vp9_calc_ss_err(sd, cm->frame_to_show); @@ -312,7 +313,7 @@ void vp9_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi) { // Now look at filt_high if ((filt_direction >= 0) && (filt_high != filt_mid)) { vp9_set_alt_lf_level(cpi, filt_high); - vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_high, 1); + vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_high, 1, 0); filt_err = vp9_calc_ss_err(sd, cm->frame_to_show); @@ -337,4 +338,30 @@ void vp9_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi) { } cm->filter_level = filt_best; + +#if CONFIG_LOOP_DERING + /* Decide whether to turn on deringing filter */ + { // NOLINT + int best_dering = 0; + int this_dering; + int last_err_diff = INT_MAX; + + for (this_dering = 1; this_dering <= 16; this_dering++) { + vp9_set_alt_lf_level(cpi, filt_best); + vp9_loop_filter_frame(cm, &cpi->mb.e_mbd, filt_high, 1, this_dering); + filt_err = vp9_calc_ss_err(sd, cm->frame_to_show); + vp8_yv12_copy_y(&cpi->last_frame_uf, cm->frame_to_show); + if (filt_err < best_err) { + best_err = filt_err; + best_dering = this_dering; + last_err_diff = INT_MAX; + } else { + if (filt_err - best_err > last_err_diff) + break; + last_err_diff = filt_err - best_err; + } + } + cm->dering_enabled = best_dering; + } +#endif } |