1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

libavutil/common: clip nan value to amin

Changes av_clipf to return amin if a is nan.
Before if a is nan av_clipf_c returned nan and
av_clipf_sse would return amax. Now the both
should behave the same.

This works because nan > amin is false.
The max(nan, amin) will be amin.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
Mark Reid 2021-11-14 22:22:20 -08:00 committed by James Almer
parent a7dfa6b446
commit c3502f4f75
2 changed files with 10 additions and 10 deletions

View File

@ -379,6 +379,8 @@ static av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) {
/** /**
* Clip a float value into the amin-amax range. * Clip a float value into the amin-amax range.
* If a is nan or -inf amin will be returned.
* If a is +inf amax will be returned.
* @param a value to clip * @param a value to clip
* @param amin minimum value of the clip range * @param amin minimum value of the clip range
* @param amax maximum value of the clip range * @param amax maximum value of the clip range
@ -389,13 +391,13 @@ static av_always_inline av_const float av_clipf_c(float a, float amin, float ama
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort(); if (amin > amax) abort();
#endif #endif
if (a < amin) return amin; return FFMIN(FFMAX(a, amin), amax);
else if (a > amax) return amax;
else return a;
} }
/** /**
* Clip a double value into the amin-amax range. * Clip a double value into the amin-amax range.
* If a is nan or -inf amin will be returned.
* If a is +inf amax will be returned.
* @param a value to clip * @param a value to clip
* @param amin minimum value of the clip range * @param amin minimum value of the clip range
* @param amax maximum value of the clip range * @param amax maximum value of the clip range
@ -406,9 +408,7 @@ static av_always_inline av_const double av_clipd_c(double a, double amin, double
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort(); if (amin > amax) abort();
#endif #endif
if (a < amin) return amin; return FFMIN(FFMAX(a, amin), amax);
else if (a > amax) return amax;
else return a;
} }
/** Compute ceil(log2(x)). /** Compute ceil(log2(x)).

View File

@ -110,8 +110,8 @@ static av_always_inline av_const double av_clipd_sse2(double a, double amin, dou
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort(); if (amin > amax) abort();
#endif #endif
__asm__ ("minsd %2, %0 \n\t" __asm__ ("maxsd %1, %0 \n\t"
"maxsd %1, %0 \n\t" "minsd %2, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax)); : "+&x"(a) : "xm"(amin), "xm"(amax));
return a; return a;
} }
@ -126,8 +126,8 @@ static av_always_inline av_const float av_clipf_sse(float a, float amin, float a
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort(); if (amin > amax) abort();
#endif #endif
__asm__ ("minss %2, %0 \n\t" __asm__ ("maxss %1, %0 \n\t"
"maxss %1, %0 \n\t" "minss %2, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax)); : "+&x"(a) : "xm"(amin), "xm"(amax));
return a; return a;
} }