diff options
author | Jason Garrett-Glaser <jason@x264.com> | 2011-02-03 22:48:53 -0800 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-02-06 20:31:44 +0100 |
commit | 9efa368f1953dc100d003c39d191cb5efce849b1 (patch) | |
tree | 8f04184606ae6dd7fd5cef37f7c7dfd323be00f2 | |
parent | bffad70c6658f722cbed4b1f06cca89c9de12cf3 (diff) | |
download | ffmpeg-9efa368f1953dc100d003c39d191cb5efce849b1.tar.gz |
VP8: faster deblock strength calculation
Convert hev_thresh logic to a LUT, simplify mbedge_lim calculation.
(cherry picked from commit 79dec1541bf83fb587aee9a002649ad1fe038990)
-rw-r--r-- | libavcodec/vp8.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 1db57e49ac..dce090f3e0 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -1505,23 +1505,24 @@ static av_always_inline void filter_mb(VP8Context *s, uint8_t *dst[3], VP8Filter int inner_filter = f->inner_filter; int linesize = s->linesize; int uvlinesize = s->uvlinesize; + static const uint8_t hev_thresh_lut[2][64] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2 } + }; if (!filter_level) return; - mbedge_lim = 2*(filter_level+2) + inner_limit; - bedge_lim = 2* filter_level + inner_limit; - hev_thresh = filter_level >= 15; + bedge_lim = 2*filter_level + inner_limit; + mbedge_lim = bedge_lim + 4; - if (s->keyframe) { - if (filter_level >= 40) - hev_thresh = 2; - } else { - if (filter_level >= 40) - hev_thresh = 3; - else if (filter_level >= 20) - hev_thresh = 2; - } + hev_thresh = hev_thresh_lut[s->keyframe][filter_level]; if (mb_x) { s->vp8dsp.vp8_h_loop_filter16y(dst[0], linesize, @@ -1577,8 +1578,8 @@ static av_always_inline void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8Fi if (!filter_level) return; - mbedge_lim = 2*(filter_level+2) + inner_limit; - bedge_lim = 2* filter_level + inner_limit; + bedge_lim = 2*filter_level + inner_limit; + mbedge_lim = bedge_lim + 4; if (mb_x) s->vp8dsp.vp8_h_loop_filter_simple(dst, linesize, mbedge_lim); |