diff --git a/libavcodec/aacenc_utils.h b/libavcodec/aacenc_utils.h index 07f733746b..bb1dcb4361 100644 --- a/libavcodec/aacenc_utils.h +++ b/libavcodec/aacenc_utils.h @@ -28,7 +28,7 @@ #ifndef AVCODEC_AACENC_UTILS_H #define AVCODEC_AACENC_UTILS_H -#include "libavutil/internal.h" +#include "libavutil/ffmath.h" #include "aac.h" #include "aacenctab.h" #include "aactab.h" diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c index 8643fe7036..0898bafd24 100644 --- a/libavcodec/aacpsy.c +++ b/libavcodec/aacpsy.c @@ -25,8 +25,7 @@ */ #include "libavutil/attributes.h" -#include "libavutil/internal.h" -#include "libavutil/libm.h" +#include "libavutil/ffmath.h" #include "avcodec.h" #include "aactab.h" diff --git a/libavcodec/acelp_pitch_delay.c b/libavcodec/acelp_pitch_delay.c index c2533b1eb1..8ec1ba3a83 100644 --- a/libavcodec/acelp_pitch_delay.c +++ b/libavcodec/acelp_pitch_delay.c @@ -21,9 +21,8 @@ */ #include "libavutil/common.h" +#include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" -#include "libavutil/internal.h" -#include "libavutil/libm.h" #include "libavutil/mathematics.h" #include "avcodec.h" #include "acelp_pitch_delay.h" diff --git a/libavcodec/cngdec.c b/libavcodec/cngdec.c index 0251086042..34f881448d 100644 --- a/libavcodec/cngdec.c +++ b/libavcodec/cngdec.c @@ -22,7 +22,7 @@ #include #include "libavutil/common.h" -#include "libavutil/internal.h" +#include "libavutil/ffmath.h" #include "avcodec.h" #include "celp_filters.h" #include "internal.h" diff --git a/libavcodec/dcaenc.c b/libavcodec/dcaenc.c index 70e92300b6..ab40e37b32 100644 --- a/libavcodec/dcaenc.c +++ b/libavcodec/dcaenc.c @@ -24,7 +24,7 @@ #include "libavutil/avassert.h" #include "libavutil/channel_layout.h" #include "libavutil/common.h" -#include "libavutil/internal.h" +#include "libavutil/ffmath.h" #include "avcodec.h" #include "dca.h" #include "dcadata.h" diff --git a/libavcodec/imc.c b/libavcodec/imc.c index 085ec09565..850bc9de9a 100644 --- a/libavcodec/imc.c +++ b/libavcodec/imc.c @@ -35,9 +35,9 @@ #include #include "libavutil/channel_layout.h" +#include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" #include "libavutil/internal.h" -#include "libavutil/libm.h" #include "avcodec.h" #include "bswapdsp.h" #include "get_bits.h" diff --git a/libavcodec/on2avc.c b/libavcodec/on2avc.c index 62c71ccea5..3064c6fc6a 100644 --- a/libavcodec/on2avc.c +++ b/libavcodec/on2avc.c @@ -21,8 +21,8 @@ */ #include "libavutil/channel_layout.h" +#include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" -#include "libavutil/internal.h" #include "avcodec.h" #include "bytestream.h" #include "fft.h" diff --git a/libavcodec/opus.c b/libavcodec/opus.c index f2b8ecc411..47f2657204 100644 --- a/libavcodec/opus.c +++ b/libavcodec/opus.c @@ -27,7 +27,7 @@ #include #include "libavutil/error.h" -#include "libavutil/internal.h" +#include "libavutil/ffmath.h" #include "opus.h" #include "vorbis.h" diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c index 1a8432376b..7130bf62cc 100644 --- a/libavcodec/wmadec.c +++ b/libavcodec/wmadec.c @@ -34,8 +34,7 @@ */ #include "libavutil/attributes.h" -#include "libavutil/internal.h" -#include "libavutil/libm.h" +#include "libavutil/ffmath.h" #include "avcodec.h" #include "internal.h" diff --git a/libavcodec/wmaenc.c b/libavcodec/wmaenc.c index d0727e69b2..418e9586f6 100644 --- a/libavcodec/wmaenc.c +++ b/libavcodec/wmaenc.c @@ -20,7 +20,7 @@ */ #include "libavutil/attributes.h" -#include "libavutil/internal.h" +#include "libavutil/ffmath.h" #include "avcodec.h" #include "internal.h" diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index 2ea59e9251..2cc1b093fb 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -88,8 +88,8 @@ #include +#include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" -#include "libavutil/internal.h" #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "avcodec.h" diff --git a/libavfilter/af_anequalizer.c b/libavfilter/af_anequalizer.c index a344c77535..24034602fd 100644 --- a/libavfilter/af_anequalizer.c +++ b/libavfilter/af_anequalizer.c @@ -21,6 +21,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/avstring.h" +#include "libavutil/ffmath.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "avfilter.h" diff --git a/libavfilter/af_compand.c b/libavfilter/af_compand.c index b74636409c..0bb719fae5 100644 --- a/libavfilter/af_compand.c +++ b/libavfilter/af_compand.c @@ -29,6 +29,7 @@ #include "libavutil/avassert.h" #include "libavutil/avstring.h" +#include "libavutil/ffmath.h" #include "libavutil/opt.h" #include "libavutil/samplefmt.h" #include "audio.h" diff --git a/libavfilter/af_volume.c b/libavfilter/af_volume.c index 3913e7b261..4d6b91645a 100644 --- a/libavfilter/af_volume.c +++ b/libavfilter/af_volume.c @@ -27,6 +27,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/common.h" #include "libavutil/eval.h" +#include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" #include "libavutil/intreadwrite.h" #include "libavutil/opt.h" diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c index c4b30b4926..59eaedd926 100644 --- a/libavfilter/f_ebur128.c +++ b/libavfilter/f_ebur128.c @@ -33,6 +33,7 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/dict.h" +#include "libavutil/ffmath.h" #include "libavutil/xga_font_data.h" #include "libavutil/opt.h" #include "libavutil/timestamp.h" diff --git a/libavfilter/vaf_spectrumsynth.c b/libavfilter/vaf_spectrumsynth.c index 8d4014eae8..ee394b49e3 100644 --- a/libavfilter/vaf_spectrumsynth.c +++ b/libavfilter/vaf_spectrumsynth.c @@ -27,6 +27,7 @@ #include "libavcodec/avfft.h" #include "libavutil/avassert.h" #include "libavutil/channel_layout.h" +#include "libavutil/ffmath.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "avfilter.h" diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c index a75dd4c37e..f0c0985964 100644 --- a/libavfilter/vsrc_testsrc.c +++ b/libavfilter/vsrc_testsrc.c @@ -37,6 +37,7 @@ #include "libavutil/avassert.h" #include "libavutil/common.h" +#include "libavutil/ffmath.h" #include "libavutil/opt.h" #include "libavutil/imgutils.h" #include "libavutil/intreadwrite.h" diff --git a/libavutil/eval.c b/libavutil/eval.c index 2acbbb47d1..37b8511845 100644 --- a/libavutil/eval.c +++ b/libavutil/eval.c @@ -31,6 +31,7 @@ #include "avutil.h" #include "common.h" #include "eval.h" +#include "ffmath.h" #include "internal.h" #include "log.h" #include "mathematics.h" diff --git a/libavutil/ffmath.h b/libavutil/ffmath.h new file mode 100644 index 0000000000..aad1347f26 --- /dev/null +++ b/libavutil/ffmath.h @@ -0,0 +1,67 @@ +/* + * copyright (c) 2016 Ganesh Ajjanagadde + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * internal math functions header + */ + +#ifndef AVUTIL_FFMATH_H +#define AVUTIL_FFMATH_H + +#include "attributes.h" +#include "libm.h" + +/** + * Compute 10^x for floating point values. Note: this function is by no means + * "correctly rounded", and is meant as a fast, reasonably accurate approximation. + * For instance, maximum relative error for the double precision variant is + * ~ 1e-13 for very small and very large values. + * This is ~2x faster than GNU libm's approach, which is still off by 2ulp on + * some inputs. + * @param x exponent + * @return 10^x + */ +static av_always_inline double ff_exp10(double x) +{ + return exp2(M_LOG2_10 * x); +} + +static av_always_inline float ff_exp10f(float x) +{ + return exp2f(M_LOG2_10 * x); +} + +/** + * Compute x^y for floating point x, y. Note: this function is faster than the + * libm variant due to mainly 2 reasons: + * 1. It does not handle any edge cases. In particular, this is only guaranteed + * to work correctly for x > 0. + * 2. It is not as accurate as a standard nearly "correctly rounded" libm variant. + * @param x base + * @param y exponent + * @return x^y + */ +static av_always_inline float ff_fast_powf(float x, float y) +{ + return expf(logf(x) * y); +} + +#endif /* AVUTIL_FFMATH_H */ diff --git a/libavutil/internal.h b/libavutil/internal.h index 340e18bc5d..61784b5128 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -294,42 +294,6 @@ static av_always_inline av_const int64_t ff_rint64_clip(double a, int64_t amin, return res; } -/** - * Compute 10^x for floating point values. Note: this function is by no means - * "correctly rounded", and is meant as a fast, reasonably accurate approximation. - * For instance, maximum relative error for the double precision variant is - * ~ 1e-13 for very small and very large values. - * This is ~2x faster than GNU libm's approach, which is still off by 2ulp on - * some inputs. - * @param x exponent - * @return 10^x - */ -static av_always_inline double ff_exp10(double x) -{ - return exp2(M_LOG2_10 * x); -} - -static av_always_inline float ff_exp10f(float x) -{ - return exp2f(M_LOG2_10 * x); -} - -/** - * Compute x^y for floating point x, y. Note: this function is faster than the - * libm variant due to mainly 2 reasons: - * 1. It does not handle any edge cases. In particular, this is only guaranteed - * to work correctly for x > 0. - * 2. It is not as accurate as a standard nearly "correctly rounded" libm variant. - * @param x base - * @param y exponent - * @return x^y - */ -static av_always_inline float ff_fast_powf(float x, float y) -{ - return expf(logf(x) * y); -} - - /** * A wrapper for open() setting O_CLOEXEC. */