[FFmpeg-devel] [PATCH] avutil: Move av_rint64_clip_* to internal.h
James Almer
jamrial at gmail.com
Sun Nov 15 03:01:55 CET 2015
On 11/14/2015 10:48 PM, Michael Niedermayer wrote:
> From: Michael Niedermayer <michael at niedermayer.cc>
>
> This should avoid build failures on VS2012
> Feel free to changes this to a different solution
>
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
> libavutil/common.h | 39 ---------------------------------------
> libavutil/internal.h | 40 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 40 insertions(+), 39 deletions(-)
>
> diff --git a/libavutil/common.h b/libavutil/common.h
> index 813fb37..6f0f582 100644
> --- a/libavutil/common.h
> +++ b/libavutil/common.h
> @@ -298,42 +298,6 @@ static av_always_inline av_const double av_clipd_c(double a, double amin, double
> else return a;
> }
>
> -/**
> - * Clip and convert a double value into the long long amin-amax range.
> - * This function is needed because conversion of floating point to integers when
> - * it does not fit in the integer's representation does not necessarily saturate
> - * correctly (usually converted to a cvttsd2si on x86) which saturates numbers
> - * > INT64_MAX to INT64_MIN. The standard marks such conversions as undefined
> - * behavior, allowing this sort of mathematically bogus conversions. This provides
> - * a safe alternative that is slower obviously but assures safety and better
> - * mathematical behavior.
> - * @param a value to clip
> - * @param amin minimum value of the clip range
> - * @param amax maximum value of the clip range
> - * @return clipped value
> - */
> -static av_always_inline av_const int64_t av_rint64_clip_c(double a, int64_t amin, int64_t amax)
> -{
> - int64_t res;
> -#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
> - if (amin > amax) abort();
> -#endif
> - // INT64_MAX+1,INT64_MIN are exactly representable as IEEE doubles
> - // do range checks first
> - if (a >= 9223372036854775808.0)
> - return amax;
> - if (a <= -9223372036854775808.0)
> - return amin;
> -
> - // safe to call llrint and clip accordingly
> - res = llrint(a);
> - if (res > amax)
> - return amax;
> - if (res < amin)
> - return amin;
> - return res;
> -}
> -
> /** Compute ceil(log2(x)).
> * @param x value used to compute ceil(log2(x))
> * @return computed ceiling of log2(x)
> @@ -547,9 +511,6 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x)
> #ifndef av_clipd
> # define av_clipd av_clipd_c
> #endif
> -#ifndef av_rint64_clip
> -# define av_rint64_clip av_rint64_clip_c
> -#endif
> #ifndef av_popcount
> # define av_popcount av_popcount_c
> #endif
> diff --git a/libavutil/internal.h b/libavutil/internal.h
> index 5c2cd99..cb0c8cd 100644
> --- a/libavutil/internal.h
> +++ b/libavutil/internal.h
> @@ -257,6 +257,46 @@ void avpriv_request_sample(void *avc,
> #endif
>
> /**
> + * Clip and convert a double value into the long long amin-amax range.
> + * This function is needed because conversion of floating point to integers when
> + * it does not fit in the integer's representation does not necessarily saturate
> + * correctly (usually converted to a cvttsd2si on x86) which saturates numbers
> + * > INT64_MAX to INT64_MIN. The standard marks such conversions as undefined
> + * behavior, allowing this sort of mathematically bogus conversions. This provides
> + * a safe alternative that is slower obviously but assures safety and better
> + * mathematical behavior.
> + * @param a value to clip
> + * @param amin minimum value of the clip range
> + * @param amax maximum value of the clip range
> + * @return clipped value
> + */
> +static av_always_inline av_const int64_t av_rint64_clip_c(double a, int64_t amin, int64_t amax)
IMO rename it to avpriv_rint64_clip() or even ff_rint64_clip() since it's inlined
and not public/exported.
> +{
> + int64_t res;
> +#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
> + if (amin > amax) abort();
> +#endif
> + // INT64_MAX+1,INT64_MIN are exactly representable as IEEE doubles
> + // do range checks first
> + if (a >= 9223372036854775808.0)
> + return amax;
> + if (a <= -9223372036854775808.0)
> + return amin;
> +
> + // safe to call llrint and clip accordingly
> + res = llrint(a);
> + if (res > amax)
> + return amax;
> + if (res < amin)
> + return amin;
> + return res;
> +}
> +
> +#ifndef av_rint64_clip
> +# define av_rint64_clip av_rint64_clip_c
> +#endif
No need for this chunk.
> +
> +/**
> * A wrapper for open() setting O_CLOEXEC.
> */
> av_warn_unused_result
>
In any case should be ok.
More information about the ffmpeg-devel
mailing list