diff options
author | Peter Meerwald <pmeerw@pmeerw.net> | 2015-02-20 01:35:33 +0100 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2015-02-21 00:54:40 +0100 |
commit | bf07d813f6c88b5a76980f321cf7272d799c4216 (patch) | |
tree | 66ce339793e2f781c08155fb45c44c4e6ac5d896 | |
parent | 3fe26bb60858951710a42065c8183cce100d632a (diff) | |
download | ffmpeg-bf07d813f6c88b5a76980f321cf7272d799c4216.tar.gz |
libavutil: Add av_clip_intp2
there already is a function, av_clip_uintp2() that clips a signed integer
to an unsigned power-of-two range, i.e. 0,2^p-1
this patch adds a function av_clip_intp2() that clips a signed integer
to a signed power-of-two range, i.e. -(2^p),(2^p-1)
the new function can be used as a special case for av_clip(), e.g.
av_clip(x, -8192, 8191) can be rewritten as av_clip_intp2(x, 13)
there are ARM instructions, usat and ssat resp., which map nicely to these
functions (see next patch)
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
-rw-r--r-- | libavutil/common.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/libavutil/common.h b/libavutil/common.h index eb40e12990..3265f9cca4 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -153,6 +153,20 @@ static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) } /** + * Clip a signed integer into the -(2^p),(2^p-1) range. + * @param a value to clip + * @param p bit position to clip at + * @return clipped value + */ +static av_always_inline av_const int av_clip_intp2_c(int a, int p) +{ + if ((a + (1 << p)) & ~((1 << (p + 1)) - 1)) + return (a >> 31) ^ ((1 << p) - 1); + 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 @@ -386,6 +400,9 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) #ifndef av_clipl_int32 # define av_clipl_int32 av_clipl_int32_c #endif +#ifndef av_clip_intp2 +# define av_clip_intp2 av_clip_intp2_c +#endif #ifndef av_clip_uintp2 # define av_clip_uintp2 av_clip_uintp2_c #endif |