summaryrefslogtreecommitdiff
path: root/libavutil/intmath.h
diff options
context:
space:
mode:
Diffstat (limited to 'libavutil/intmath.h')
-rw-r--r--libavutil/intmath.h51
1 files changed, 46 insertions, 5 deletions
diff --git a/libavutil/intmath.h b/libavutil/intmath.h
index 0ad30123e8..b4b87e6059 100644
--- a/libavutil/intmath.h
+++ b/libavutil/intmath.h
@@ -21,6 +21,8 @@
#ifndef AVUTIL_INTMATH_H
#define AVUTIL_INTMATH_H
+#include <stdint.h>
+
#include "config.h"
#include "attributes.h"
@@ -31,15 +33,54 @@
#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
-#ifndef av_log2
-# define av_log2(x) (31 - __builtin_clz((x)|1))
-# ifndef av_log2_16bit
-# define av_log2_16bit av_log2
+#ifndef ff_log2
+# define ff_log2(x) (31 - __builtin_clz((x)|1))
+# ifndef ff_log2_16bit
+# define ff_log2_16bit av_log2
# endif
-#endif /* av_log2 */
+#endif /* ff_log2 */
#endif /* AV_GCC_VERSION_AT_LEAST(3,4) */
+extern const uint8_t ff_log2_tab[256];
+
+#ifndef ff_log2
+#define ff_log2 ff_log2_c
+static av_always_inline av_const int ff_log2_c(unsigned int v)
+{
+ int n = 0;
+ if (v & 0xffff0000) {
+ v >>= 16;
+ n += 16;
+ }
+ if (v & 0xff00) {
+ v >>= 8;
+ n += 8;
+ }
+ n += ff_log2_tab[v];
+
+ return n;
+}
+#endif
+
+#ifndef ff_log2_16bit
+#define ff_log2_16bit ff_log2_16bit_c
+static av_always_inline av_const int ff_log2_16bit_c(unsigned int v)
+{
+ int n = 0;
+ if (v & 0xff00) {
+ v >>= 8;
+ n += 8;
+ }
+ n += ff_log2_tab[v];
+
+ return n;
+}
+#endif
+
+#define av_log2 ff_log2
+#define av_log2_16bit ff_log2_16bit
+
/**
* @}
*/