summaryrefslogtreecommitdiff
path: root/vp8
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2011-12-14 16:28:13 -0800
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2011-12-14 16:28:13 -0800
commit72f459c77f4998d9e044b1b7adbc7c332cc886b2 (patch)
treeb452bbdd318766f95fd7b660488cddd2b4896443 /vp8
parent4f8f360098c2213b5936aaf03d1818c4e56126b0 (diff)
parent51c4f9e6b13592467a63a5703757a3a32f7b2acd (diff)
downloadlibvpx-72f459c77f4998d9e044b1b7adbc7c332cc886b2.tar
libvpx-72f459c77f4998d9e044b1b7adbc7c332cc886b2.tar.gz
libvpx-72f459c77f4998d9e044b1b7adbc7c332cc886b2.tar.bz2
libvpx-72f459c77f4998d9e044b1b7adbc7c332cc886b2.zip
Merge "Avoid multiple test for same lvl in auto filter lvl pick"
Diffstat (limited to 'vp8')
-rw-r--r--vp8/encoder/picklpf.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/vp8/encoder/picklpf.c b/vp8/encoder/picklpf.c
index e97a56086..8fa4f1e5b 100644
--- a/vp8/encoder/picklpf.c
+++ b/vp8/encoder/picklpf.c
@@ -289,8 +289,12 @@ void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
int Bias = 0; // Bias against raising loop filter and in favor of lowering it
+ int ss_err[MAX_LOOP_FILTER];
+
YV12_BUFFER_CONFIG * saved_frame = cm->frame_to_show;
+ vpx_memset(ss_err, 0, sizeof(ss_err));
+
/* Replace unfiltered frame buffer with a new one */
cm->frame_to_show = &cpi->pick_lf_lvl_frame;
@@ -320,6 +324,9 @@ void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
best_err = vp8_calc_ss_err(sd, cm->frame_to_show,
IF_RTCD(&cpi->rtcd.variance));
+
+ ss_err[filt_mid] = best_err;
+
filt_best = filt_mid;
while (filter_step > 0)
@@ -335,13 +342,19 @@ void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
if ((filt_direction <= 0) && (filt_low != filt_mid))
{
- // Get Low filter error score
- vp8_yv12_copy_y_ptr(saved_frame, cm->frame_to_show);
- vp8cx_set_alt_lf_level(cpi, filt_low);
- vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_low);
-
- filt_err = vp8_calc_ss_err(sd, cm->frame_to_show,
- IF_RTCD(&cpi->rtcd.variance));
+ if(ss_err[filt_low] == 0)
+ {
+ // Get Low filter error score
+ vp8_yv12_copy_y_ptr(saved_frame, cm->frame_to_show);
+ vp8cx_set_alt_lf_level(cpi, filt_low);
+ vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_low);
+
+ filt_err = vp8_calc_ss_err(sd, cm->frame_to_show,
+ IF_RTCD(&cpi->rtcd.variance));
+ ss_err[filt_low] = filt_err;
+ }
+ else
+ filt_err = ss_err[filt_low];
// If value is close to the best so far then bias towards a lower loop filter value.
if ((filt_err - Bias) < best_err)
@@ -357,12 +370,18 @@ void vp8cx_pick_filter_level(YV12_BUFFER_CONFIG *sd, VP8_COMP *cpi)
// Now look at filt_high
if ((filt_direction >= 0) && (filt_high != filt_mid))
{
- vp8_yv12_copy_y_ptr(saved_frame, cm->frame_to_show);
- vp8cx_set_alt_lf_level(cpi, filt_high);
- vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_high);
+ if(ss_err[filt_high] == 0)
+ {
+ vp8_yv12_copy_y_ptr(saved_frame, cm->frame_to_show);
+ vp8cx_set_alt_lf_level(cpi, filt_high);
+ vp8_loop_filter_frame_yonly(cm, &cpi->mb.e_mbd, filt_high);
- filt_err = vp8_calc_ss_err(sd, cm->frame_to_show,
- IF_RTCD(&cpi->rtcd.variance));
+ filt_err = vp8_calc_ss_err(sd, cm->frame_to_show,
+ IF_RTCD(&cpi->rtcd.variance));
+ ss_err[filt_high] = filt_err;
+ }
+ else
+ filt_err = ss_err[filt_high];
// Was it better than the previous best?
if (filt_err < (best_err - Bias))