[libav-devel] [PATCH 1/4] libavutil: Add saturating subtraction functions

Luca Barbato lu_zero at gentoo.org
Sun Dec 3 22:40:33 CET 2017


On 03/12/2017 22:33, Andrew D'Addesio wrote:
> Add av_sat_sub32 and av_sat_dsub32 as the subtraction analogues to
> av_sat_add32/av_sat_dadd32.
> 
> Also clarify the formulas for dadd32/dsub32.
> 
> Signed-off-by: Andrew D'Addesio <modchipv12 at gmail.com>
> ---
>   libavutil/arm/intmath.h | 16 ++++++++++++++++
>   libavutil/common.h      | 32 +++++++++++++++++++++++++++++++-
>   2 files changed, 47 insertions(+), 1 deletion(-)
> 
> diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h
> index 2b15ba0..a14337f 100644
> --- a/libavutil/arm/intmath.h
> +++ b/libavutil/arm/intmath.h
> @@ -94,6 +94,22 @@ static av_always_inline int av_sat_dadd32_arm(int a, int b)
>       return r;
>   }
>   
> +#define av_sat_sub32 av_sat_sub32_arm
> +static av_always_inline int av_sat_sub32_arm(int a, int b)
> +{
> +    int r;
> +    __asm__ ("qsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
> +    return r;
> +}
> +
> +#define av_sat_dsub32 av_sat_dsub32_arm
> +static av_always_inline int av_sat_dsub32_arm(int a, int b)
> +{
> +    int r;
> +    __asm__ ("qdsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
> +    return r;
> +}
> +
>   #endif /* HAVE_ARMV6_INLINE */
>   
>   #if HAVE_ASM_MOD_Q
> diff --git a/libavutil/common.h b/libavutil/common.h
> index 3832f10..63ea18d 100644
> --- a/libavutil/common.h
> +++ b/libavutil/common.h
> @@ -210,13 +210,37 @@ static av_always_inline int av_sat_add32_c(int a, int b)
>    *
>    * @param  a first value
>    * @param  b value doubled and added to a
> - * @return sum with signed saturation
> + * @return sum sat(a + sat(2*b)) with signed saturation
>    */
>   static av_always_inline int av_sat_dadd32_c(int a, int b)
>   {
>       return av_sat_add32(a, av_sat_add32(b, b));
>   }
>   
> +/**
> + * Subtract two signed 32-bit values with saturation.
> + *
> + * @param  a one value
> + * @param  b another value
> + * @return difference with signed saturation
> + */
> +static av_always_inline int av_sat_sub32_c(int a, int b)
> +{
> +    return av_clipl_int32((int64_t)a - b);
> +}
> +
> +/**
> + * Subtract a doubled value from another value with saturation at both stages.
> + *
> + * @param  a first value
> + * @param  b value doubled and subtracted from a
> + * @return difference sat(a - sat(2*b)) with signed saturation
> + */
> +static av_always_inline int av_sat_dsub32_c(int a, int b)
> +{
> +    return av_sat_sub32(a, av_sat_add32(b, b));
> +}
> +
>   /**
>    * Clip a float value into the amin-amax range.
>    * @param a value to clip
> @@ -430,6 +454,12 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x)
>   #ifndef av_sat_dadd32
>   #   define av_sat_dadd32    av_sat_dadd32_c
>   #endif
> +#ifndef av_sat_sub32
> +#   define av_sat_sub32     av_sat_sub32_c
> +#endif
> +#ifndef av_sat_dsub32
> +#   define av_sat_dsub32    av_sat_dsub32_c
> +#endif
>   #ifndef av_clipf
>   #   define av_clipf         av_clipf_c
>   #endif
> 

Ok.


More information about the libav-devel mailing list