From dfde8a34e5419ac99265e3ecc2e82f378674128a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 26 Oct 2012 14:48:40 -0400 Subject: lavu: add av_ctz() for trailing zero bit count --- libavutil/intmath.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'libavutil/intmath.h') diff --git a/libavutil/intmath.h b/libavutil/intmath.h index 2cb313240b..a5ee6525ee 100644 --- a/libavutil/intmath.h +++ b/libavutil/intmath.h @@ -85,6 +85,61 @@ static av_always_inline av_const int ff_log2_16bit_c(unsigned int v) #define av_log2 ff_log2 #define av_log2_16bit ff_log2_16bit +/** + * @} + */ + +/** + * @addtogroup lavu_math + * @{ + */ + +#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4) +#ifndef ff_ctz +#define ff_ctz(v) __builtin_ctz(v) +#endif +#endif + +#ifndef ff_ctz +#define ff_ctz ff_ctz_c +static av_always_inline av_const int ff_ctz_c(int v) +{ + int c; + + if (v & 0x1) + return 0; + + c = 1; + if (!(v & 0xffff)) { + v >>= 16; + c += 16; + } + if (!(v & 0xff)) { + v >>= 8; + c += 8; + } + if (!(v & 0xf)) { + v >>= 4; + c += 4; + } + if (!(v & 0x3)) { + v >>= 2; + c += 2; + } + c -= v & 0x1; + + return c; +} +#endif + +/** + * Trailing zero bit count. + * + * @param v input value. If v is 0, the result is undefined. + * @return the number of trailing 0-bits + */ +int av_ctz(int v); + /** * @} */ -- cgit v1.2.3