From f0c07be6491c850f948e2029f27f06437d128f3a Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 18 Oct 2012 17:59:13 +0100 Subject: [PATCH 1/4] celp_math: rename ff_log2 to ff_log2_q15 This name is more descriptive as the function returns a fixed-point value with 15 fraction bits. Signed-off-by: Mans Rullgard --- libavcodec/acelp_pitch_delay.c | 2 +- libavcodec/celp_math.c | 2 +- libavcodec/celp_math.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/acelp_pitch_delay.c b/libavcodec/acelp_pitch_delay.c index c091301474..a9668fac70 100644 --- a/libavcodec/acelp_pitch_delay.c +++ b/libavcodec/acelp_pitch_delay.c @@ -86,7 +86,7 @@ void ff_acelp_update_past_gain( if(erasure) quant_energy[0] = FFMAX(avg_gain >> log2_ma_pred_order, -10240) - 4096; // -10 and -4 in (5.10) else - quant_energy[0] = (6165 * ((ff_log2(gain_corr_factor) >> 2) - (13 << 13))) >> 13; + quant_energy[0] = (6165 * ((ff_log2_q15(gain_corr_factor) >> 2) - (13 << 13))) >> 13; } int16_t ff_acelp_decode_gain_code( diff --git a/libavcodec/celp_math.c b/libavcodec/celp_math.c index c3d12e982e..a9ebef697c 100644 --- a/libavcodec/celp_math.c +++ b/libavcodec/celp_math.c @@ -67,7 +67,7 @@ static const uint16_t tab_log2[33] = 26457, 27294, 28116, 28924, 29719, 30500, 31269, 32025, 32769, }; -int ff_log2(uint32_t value) +int ff_log2_q15(uint32_t value) { uint8_t power_int; uint8_t frac_x0; diff --git a/libavcodec/celp_math.h b/libavcodec/celp_math.h index 2fad31258e..ed3f8c0fe2 100644 --- a/libavcodec/celp_math.h +++ b/libavcodec/celp_math.h @@ -40,7 +40,7 @@ int ff_exp2(uint16_t power); * * @return value of (1<<15) * log2(value) */ -int ff_log2(uint32_t value); +int ff_log2_q15(uint32_t value); /** * Shift value left or right depending on sign of offset parameter. From 8c0a3d5fe035f2d19b5815f142e145cfbedf28b3 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 18 Oct 2012 18:15:38 +0100 Subject: [PATCH 2/4] avutil: remove inline av_log2 from public API This removes inline av_log2 and av_log2_16bit from the public API, instead exporting them as regular functions. In-tree code still gets the inline and otherwise optimised variants. Signed-off-by: Mans Rullgard --- libavutil/Makefile | 1 + libavutil/common.h | 43 +++++++------------------------------- libavutil/intmath.h | 51 ++++++++++++++++++++++++++++++++++++++++----- libavutil/log2.c | 34 ++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 40 deletions(-) create mode 100644 libavutil/log2.c diff --git a/libavutil/Makefile b/libavutil/Makefile index a85d3ae153..227a57efc2 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -69,6 +69,7 @@ OBJS = adler32.o \ lfg.o \ lls.o \ log.o \ + log2.o \ log2_tab.o \ lzo.o \ mathematics.o \ diff --git a/libavutil/common.h b/libavutil/common.h index c0e0fc5130..34658635a7 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -62,40 +62,11 @@ #define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1)) /* misc math functions */ -extern const uint8_t ff_log2_tab[256]; #if FF_API_AV_REVERSE extern attribute_deprecated const uint8_t av_reverse[256]; #endif -static av_always_inline av_const int av_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; -} - -static av_always_inline av_const int av_log2_16bit_c(unsigned int v) -{ - int n = 0; - if (v & 0xff00) { - v >>= 8; - n += 8; - } - n += ff_log2_tab[v]; - - return n; -} - #ifdef HAVE_AV_CONFIG_H # include "config.h" # include "intmath.h" @@ -104,6 +75,14 @@ static av_always_inline av_const int av_log2_16bit_c(unsigned int v) /* Pull in unguarded fallback defines at the end of this file. */ #include "common.h" +#ifndef av_log2 +av_const int av_log2(unsigned v); +#endif + +#ifndef av_log2_16bit +av_const int av_log2_16bit(unsigned v); +#endif + /** * Clip a signed integer value into the amin-amax range. * @param a value to clip @@ -385,12 +364,6 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x) * to ensure they are immediately available in intmath.h. */ -#ifndef av_log2 -# define av_log2 av_log2_c -#endif -#ifndef av_log2_16bit -# define av_log2_16bit av_log2_16bit_c -#endif #ifndef av_ceil_log2 # define av_ceil_log2 av_ceil_log2_c #endif 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 + #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 + /** * @} */ diff --git a/libavutil/log2.c b/libavutil/log2.c new file mode 100644 index 0000000000..18c1b40aaa --- /dev/null +++ b/libavutil/log2.c @@ -0,0 +1,34 @@ +/* + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "intmath.h" + +/* undef these to get the function prototypes from common.h */ +#undef av_log2 +#undef av_log2_16bit +#include "common.h" + +int av_log2(unsigned v) +{ + return ff_log2(v); +} + +int av_log2_16bit(unsigned v) +{ + return ff_log2_16bit(v); +} From def8c94699877d015154a03d43e2b8f479cd89a0 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Fri, 19 Oct 2012 23:34:02 +0200 Subject: [PATCH 3/4] avutil: make some tables visible again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These tables are used for instance by older versions of libavcodec and need to remain visible until the next SONAME bump. Signed-off-by: Martin Storsjö --- libavutil/libavutil.v | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavutil/libavutil.v b/libavutil/libavutil.v index e9f04cba65..c955347bc3 100644 --- a/libavutil/libavutil.v +++ b/libavutil/libavutil.v @@ -1,4 +1,4 @@ LIBAVUTIL_$MAJOR { - global: av*; + global: av*; ff_*_tab; local: *; }; From d15c21e5fa3961f10026da1a3080a3aa3cf4cec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sat, 20 Oct 2012 13:32:01 +0300 Subject: [PATCH 4/4] avutil: Add a copy of ff_sqrt_tab back into avutil to restore ABI compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Earlier versions of for instance of libavcodec expect this symbol to be present in libavutil. This commit can be reverted after the next major bump. New shared builds of avcodec will link to the internal copy of the table within that library, so those builds won't rely on this table being present in avutil any longer either. Signed-off-by: Martin Storsjö --- libavcodec/Makefile | 1 + libavcodec/mathtables.c | 11 ----------- libavcodec/sqrt_tab.c | 30 ++++++++++++++++++++++++++++++ libavutil/Makefile | 1 + libavutil/sqrt_tab.c | 1 + 5 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 libavcodec/sqrt_tab.c create mode 100644 libavutil/sqrt_tab.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index e1787dd9e7..7b76ab2476 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -30,6 +30,7 @@ OBJS = allcodecs.o \ resample.o \ resample2.o \ simple_idct.o \ + sqrt_tab.o \ utils.o \ # parts needed for many different codecs diff --git a/libavcodec/mathtables.c b/libavcodec/mathtables.c index 141aa78f1b..12877b2e76 100644 --- a/libavcodec/mathtables.c +++ b/libavcodec/mathtables.c @@ -56,17 +56,6 @@ const uint32_t ff_inverse[257]={ 16777216 }; -const uint8_t ff_sqrt_tab[256]={ - 0, 16, 23, 28, 32, 36, 40, 43, 46, 48, 51, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90, - 91, 92, 94, 95, 96, 98, 99,100,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127, -128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,151,152,153,154,155,156,156, -157,158,159,160,160,161,162,163,164,164,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181, -182,182,183,184,184,185,186,186,187,188,188,189,190,190,191,192,192,193,194,194,195,196,196,197,198,198,199,200,200,201,202,202, -203,204,204,205,205,206,207,207,208,208,209,210,210,211,212,212,213,213,214,215,215,216,216,217,218,218,219,219,220,220,221,222, -222,223,223,224,224,225,226,226,227,227,228,228,229,230,230,231,231,232,232,233,233,234,235,235,236,236,237,237,238,238,239,239, -240,240,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,255 -}; - const uint8_t ff_reverse[256] = { 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0, 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8, diff --git a/libavcodec/sqrt_tab.c b/libavcodec/sqrt_tab.c new file mode 100644 index 0000000000..3f18d914e5 --- /dev/null +++ b/libavcodec/sqrt_tab.c @@ -0,0 +1,30 @@ +/* + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +const uint8_t ff_sqrt_tab[256]={ + 0, 16, 23, 28, 32, 36, 40, 43, 46, 48, 51, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90, + 91, 92, 94, 95, 96, 98, 99,100,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127, +128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,151,152,153,154,155,156,156, +157,158,159,160,160,161,162,163,164,164,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181, +182,182,183,184,184,185,186,186,187,188,188,189,190,190,191,192,192,193,194,194,195,196,196,197,198,198,199,200,200,201,202,202, +203,204,204,205,205,206,207,207,208,208,209,210,210,211,212,212,213,213,214,215,215,216,216,217,218,218,219,219,220,220,221,222, +222,223,223,224,224,225,226,226,227,227,228,228,229,230,230,231,231,232,232,233,233,234,235,235,236,236,237,237,238,238,239,239, +240,240,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,255 +}; diff --git a/libavutil/Makefile b/libavutil/Makefile index 227a57efc2..3451a7c679 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -84,6 +84,7 @@ OBJS = adler32.o \ rc4.o \ samplefmt.o \ sha.o \ + sqrt_tab.o \ time.o \ tree.o \ utils.o \ diff --git a/libavutil/sqrt_tab.c b/libavutil/sqrt_tab.c new file mode 100644 index 0000000000..e3d978b569 --- /dev/null +++ b/libavutil/sqrt_tab.c @@ -0,0 +1 @@ +#include "libavcodec/sqrt_tab.c"