diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index dc7eb2121a..38f38b7cb3 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -1329,9 +1329,7 @@ static av_always_inline void filter_level_for_mb(VP8Context *s, VP8Macroblock *m filter_level += s->lf_delta.mode[mb->mode]; } -/* Like av_clip for inputs 0 and max, where max is equal to (2^n-1) */ -#define POW2CLIP(x,max) (((x) & ~max) ? (-(x))>>31 & max : (x)); - filter_level = POW2CLIP(filter_level, 63); + filter_level = av_clip_uintp2(filter_level, 6); interior_limit = filter_level; if (s->filter.sharpness) { diff --git a/libavutil/common.h b/libavutil/common.h index e5c1dfdff5..a985fa4804 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -169,6 +169,18 @@ static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) else return a; } +/** + * Clip a signed integer to an unsigned power of two range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) +{ + if (a & ~((1<> 31 & ((1<