1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2010 Mans Rullgard <mans@mansr.com> 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#ifndef AVUTIL_INTMATH_H 22cabdff1aSopenharmony_ci#define AVUTIL_INTMATH_H 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include <stdint.h> 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "config.h" 27cabdff1aSopenharmony_ci#include "attributes.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#if ARCH_ARM 30cabdff1aSopenharmony_ci# include "arm/intmath.h" 31cabdff1aSopenharmony_ci#endif 32cabdff1aSopenharmony_ci#if ARCH_X86 33cabdff1aSopenharmony_ci# include "x86/intmath.h" 34cabdff1aSopenharmony_ci#endif 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#if HAVE_FAST_CLZ 37cabdff1aSopenharmony_ci#if AV_GCC_VERSION_AT_LEAST(3,4) 38cabdff1aSopenharmony_ci#ifndef ff_log2 39cabdff1aSopenharmony_ci# define ff_log2(x) (31 - __builtin_clz((x)|1)) 40cabdff1aSopenharmony_ci# ifndef ff_log2_16bit 41cabdff1aSopenharmony_ci# define ff_log2_16bit av_log2 42cabdff1aSopenharmony_ci# endif 43cabdff1aSopenharmony_ci#endif /* ff_log2 */ 44cabdff1aSopenharmony_ci#endif /* AV_GCC_VERSION_AT_LEAST(3,4) */ 45cabdff1aSopenharmony_ci#endif 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ciextern const uint8_t ff_log2_tab[256]; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#ifndef ff_log2 50cabdff1aSopenharmony_ci#define ff_log2 ff_log2_c 51cabdff1aSopenharmony_cistatic av_always_inline av_const int ff_log2_c(unsigned int v) 52cabdff1aSopenharmony_ci{ 53cabdff1aSopenharmony_ci int n = 0; 54cabdff1aSopenharmony_ci if (v & 0xffff0000) { 55cabdff1aSopenharmony_ci v >>= 16; 56cabdff1aSopenharmony_ci n += 16; 57cabdff1aSopenharmony_ci } 58cabdff1aSopenharmony_ci if (v & 0xff00) { 59cabdff1aSopenharmony_ci v >>= 8; 60cabdff1aSopenharmony_ci n += 8; 61cabdff1aSopenharmony_ci } 62cabdff1aSopenharmony_ci n += ff_log2_tab[v]; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci return n; 65cabdff1aSopenharmony_ci} 66cabdff1aSopenharmony_ci#endif 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci#ifndef ff_log2_16bit 69cabdff1aSopenharmony_ci#define ff_log2_16bit ff_log2_16bit_c 70cabdff1aSopenharmony_cistatic av_always_inline av_const int ff_log2_16bit_c(unsigned int v) 71cabdff1aSopenharmony_ci{ 72cabdff1aSopenharmony_ci int n = 0; 73cabdff1aSopenharmony_ci if (v & 0xff00) { 74cabdff1aSopenharmony_ci v >>= 8; 75cabdff1aSopenharmony_ci n += 8; 76cabdff1aSopenharmony_ci } 77cabdff1aSopenharmony_ci n += ff_log2_tab[v]; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci return n; 80cabdff1aSopenharmony_ci} 81cabdff1aSopenharmony_ci#endif 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci#define av_log2 ff_log2 84cabdff1aSopenharmony_ci#define av_log2_16bit ff_log2_16bit 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci/** 87cabdff1aSopenharmony_ci * @addtogroup lavu_math 88cabdff1aSopenharmony_ci * @{ 89cabdff1aSopenharmony_ci */ 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci#if HAVE_FAST_CLZ 92cabdff1aSopenharmony_ci#if AV_GCC_VERSION_AT_LEAST(3,4) 93cabdff1aSopenharmony_ci#ifndef ff_ctz 94cabdff1aSopenharmony_ci#define ff_ctz(v) __builtin_ctz(v) 95cabdff1aSopenharmony_ci#endif 96cabdff1aSopenharmony_ci#ifndef ff_ctzll 97cabdff1aSopenharmony_ci#define ff_ctzll(v) __builtin_ctzll(v) 98cabdff1aSopenharmony_ci#endif 99cabdff1aSopenharmony_ci#ifndef ff_clz 100cabdff1aSopenharmony_ci#define ff_clz(v) __builtin_clz(v) 101cabdff1aSopenharmony_ci#endif 102cabdff1aSopenharmony_ci#endif 103cabdff1aSopenharmony_ci#endif 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci#ifndef ff_ctz 106cabdff1aSopenharmony_ci#define ff_ctz ff_ctz_c 107cabdff1aSopenharmony_ci/** 108cabdff1aSopenharmony_ci * Trailing zero bit count. 109cabdff1aSopenharmony_ci * 110cabdff1aSopenharmony_ci * @param v input value. If v is 0, the result is undefined. 111cabdff1aSopenharmony_ci * @return the number of trailing 0-bits 112cabdff1aSopenharmony_ci */ 113cabdff1aSopenharmony_ci/* We use the De-Bruijn method outlined in: 114cabdff1aSopenharmony_ci * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 115cabdff1aSopenharmony_cistatic av_always_inline av_const int ff_ctz_c(int v) 116cabdff1aSopenharmony_ci{ 117cabdff1aSopenharmony_ci static const uint8_t debruijn_ctz32[32] = { 118cabdff1aSopenharmony_ci 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 119cabdff1aSopenharmony_ci 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 120cabdff1aSopenharmony_ci }; 121cabdff1aSopenharmony_ci return debruijn_ctz32[(uint32_t)((v & -v) * 0x077CB531U) >> 27]; 122cabdff1aSopenharmony_ci} 123cabdff1aSopenharmony_ci#endif 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci#ifndef ff_ctzll 126cabdff1aSopenharmony_ci#define ff_ctzll ff_ctzll_c 127cabdff1aSopenharmony_ci/* We use the De-Bruijn method outlined in: 128cabdff1aSopenharmony_ci * http://supertech.csail.mit.edu/papers/debruijn.pdf. */ 129cabdff1aSopenharmony_cistatic av_always_inline av_const int ff_ctzll_c(long long v) 130cabdff1aSopenharmony_ci{ 131cabdff1aSopenharmony_ci static const uint8_t debruijn_ctz64[64] = { 132cabdff1aSopenharmony_ci 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, 133cabdff1aSopenharmony_ci 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, 134cabdff1aSopenharmony_ci 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, 135cabdff1aSopenharmony_ci 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12 136cabdff1aSopenharmony_ci }; 137cabdff1aSopenharmony_ci return debruijn_ctz64[(uint64_t)((v & -v) * 0x022FDD63CC95386DU) >> 58]; 138cabdff1aSopenharmony_ci} 139cabdff1aSopenharmony_ci#endif 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci#ifndef ff_clz 142cabdff1aSopenharmony_ci#define ff_clz ff_clz_c 143cabdff1aSopenharmony_cistatic av_always_inline av_const unsigned ff_clz_c(unsigned x) 144cabdff1aSopenharmony_ci{ 145cabdff1aSopenharmony_ci unsigned i = sizeof(x) * 8; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci while (x) { 148cabdff1aSopenharmony_ci x >>= 1; 149cabdff1aSopenharmony_ci i--; 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci return i; 153cabdff1aSopenharmony_ci} 154cabdff1aSopenharmony_ci#endif 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci#if AV_GCC_VERSION_AT_LEAST(3,4) 157cabdff1aSopenharmony_ci#ifndef av_parity 158cabdff1aSopenharmony_ci#define av_parity __builtin_parity 159cabdff1aSopenharmony_ci#endif 160cabdff1aSopenharmony_ci#endif 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci/** 163cabdff1aSopenharmony_ci * @} 164cabdff1aSopenharmony_ci */ 165cabdff1aSopenharmony_ci#endif /* AVUTIL_INTMATH_H */ 166