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>
pull/374/head
Mark Reid 3 years ago committed by James Almer
parent a7dfa6b446
commit c3502f4f75
  1. 12
      libavutil/common.h
  2. 8
      libavutil/x86/intmath.h

@ -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.
* If a is nan or -inf amin will be returned.
* If a is +inf amax will be returned.
* @param a value to clip
* @param amin minimum 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 (amin > amax) abort();
#endif
if (a < amin) return amin;
else if (a > amax) return amax;
else return a;
return FFMIN(FFMAX(a, amin), amax);
}
/**
* 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 amin minimum 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 (amin > amax) abort();
#endif
if (a < amin) return amin;
else if (a > amax) return amax;
else return a;
return FFMIN(FFMAX(a, amin), amax);
}
/** Compute ceil(log2(x)).

@ -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 (amin > amax) abort();
#endif
__asm__ ("minsd %2, %0 \n\t"
"maxsd %1, %0 \n\t"
__asm__ ("maxsd %1, %0 \n\t"
"minsd %2, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax));
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 (amin > amax) abort();
#endif
__asm__ ("minss %2, %0 \n\t"
"maxss %1, %0 \n\t"
__asm__ ("maxss %1, %0 \n\t"
"minss %2, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax));
return a;
}

Loading…
Cancel
Save