diff options
Diffstat (limited to 'chromium/third_party/ffmpeg/libavutil')
-rw-r--r-- | chromium/third_party/ffmpeg/libavutil/attributes.h | 6 | ||||
-rw-r--r-- | chromium/third_party/ffmpeg/libavutil/common.h | 46 | ||||
-rw-r--r-- | chromium/third_party/ffmpeg/libavutil/mathematics.c | 2 |
3 files changed, 53 insertions, 1 deletions
diff --git a/chromium/third_party/ffmpeg/libavutil/attributes.h b/chromium/third_party/ffmpeg/libavutil/attributes.h index ced108aa2c7..ab2a1fdd0e1 100644 --- a/chromium/third_party/ffmpeg/libavutil/attributes.h +++ b/chromium/third_party/ffmpeg/libavutil/attributes.h @@ -34,6 +34,12 @@ # define AV_GCC_VERSION_AT_MOST(x,y) 0 #endif +#ifdef __has_builtin +# define AV_HAS_BUILTIN(x) __has_builtin(x) +#else +# define AV_HAS_BUILTIN(x) false +#endif + #ifndef av_always_inline #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_always_inline __attribute__((always_inline)) inline diff --git a/chromium/third_party/ffmpeg/libavutil/common.h b/chromium/third_party/ffmpeg/libavutil/common.h index 142ff9abe7e..2777cea9f9b 100644 --- a/chromium/third_party/ffmpeg/libavutil/common.h +++ b/chromium/third_party/ffmpeg/libavutil/common.h @@ -292,6 +292,46 @@ static av_always_inline int av_sat_dsub32_c(int a, int b) } /** + * Add two signed 64-bit values with saturation. + * + * @param a one value + * @param b another value + * @return sum with signed saturation + */ +static av_always_inline int64_t av_sat_add64_c(int64_t a, int64_t b) { +#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_add_overflow) + int64_t tmp; + return !__builtin_add_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN); +#else + if (b >= 0 && a >= INT64_MAX - b) + return INT64_MAX; + if (b <= 0 && a <= INT64_MIN - b) + return INT64_MIN; + return a + b; +#endif +} + +/** + * Subtract two signed 64-bit values with saturation. + * + * @param a one value + * @param b another value + * @return difference with signed saturation + */ +static av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) { +#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_sub_overflow) + int64_t tmp; + return !__builtin_sub_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN); +#else + if (b <= 0 && a >= INT64_MAX + b) + return INT64_MAX; + if (b >= 0 && a <= INT64_MIN + b) + return INT64_MIN; + return a - b; +#endif +} + +/** * Clip a float value into the amin-amax range. * @param a value to clip * @param amin minimum value of the clip range @@ -545,6 +585,12 @@ static av_always_inline av_const int av_parity_c(uint32_t v) #ifndef av_sat_dsub32 # define av_sat_dsub32 av_sat_dsub32_c #endif +#ifndef av_sat_add64 +# define av_sat_add64 av_sat_add64_c +#endif +#ifndef av_sat_sub64 +# define av_sat_sub64 av_sat_sub64_c +#endif #ifndef av_clipf # define av_clipf av_clipf_c #endif diff --git a/chromium/third_party/ffmpeg/libavutil/mathematics.c b/chromium/third_party/ffmpeg/libavutil/mathematics.c index 0485db7222f..16c6e4db030 100644 --- a/chromium/third_party/ffmpeg/libavutil/mathematics.c +++ b/chromium/third_party/ffmpeg/libavutil/mathematics.c @@ -207,7 +207,7 @@ int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t i int64_t old = av_rescale_q(ts, ts_tb, inc_tb); int64_t old_ts = av_rescale_q(old, inc_tb, ts_tb); - if (old == INT64_MAX) + if (old == INT64_MAX || old == AV_NOPTS_VALUE || old_ts == AV_NOPTS_VALUE) return ts; return av_rescale_q(old + 1, inc_tb, ts_tb) + (ts - old_ts); |