summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_picklpf.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/encoder/vp9_picklpf.c')
-rw-r--r--vp9/encoder/vp9_picklpf.c33
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
}