libavcodec/mathops.h
99aed7c8
 /*
  * simple math operations
406792e7
  * Copyright (c) 2001, 2002 Fabrice Bellard
99aed7c8
  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
  *
b78e7197
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
99aed7c8
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
b78e7197
  * version 2.1 of the License, or (at your option) any later version.
99aed7c8
  *
b78e7197
  * FFmpeg is distributed in the hope that it will be useful,
99aed7c8
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
b78e7197
  * License along with FFmpeg; if not, write to the Free Software
99aed7c8
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
98790382
 #ifndef AVCODEC_MATHOPS_H
 #define AVCODEC_MATHOPS_H
99aed7c8
 
245976da
 #include "libavutil/common.h"
8d459acc
 #include "config.h"
99545457
 
e20a4f53
 #if   ARCH_ARM
26f6a574
 #   include "arm/mathops.h"
b7904f78
 #elif ARCH_AVR32
 #   include "avr32/mathops.h"
b250f9c6
 #elif ARCH_BFIN
26f6a574
 #   include "bfin/mathops.h"
9d48e28f
 #elif ARCH_MIPS
 #   include "mips/mathops.h"
e20a4f53
 #elif ARCH_PPC
 #   include "ppc/mathops.h"
 #elif ARCH_X86
 #   include "x86/mathops.h"
99aed7c8
 #endif
 
 /* generic implementation */
 
95912731
 #ifndef MUL64
 #   define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
 #endif
 
99aed7c8
 #ifndef MULL
95912731
 #   define MULL(a,b,s) (MUL64(a, b) >> (s))
99aed7c8
 #endif
 
 #ifndef MULH
849f1035
 static av_always_inline int MULH(int a, int b){
95912731
     return MUL64(a, b) >> 32;
99aed7c8
 }
 #endif
 
f2c694af
 #ifndef UMULH
 static av_always_inline unsigned UMULH(unsigned a, unsigned b){
     return ((uint64_t)(a) * (uint64_t)(b))>>32;
 }
 #endif
 
ffa978f1
 #ifndef MAC64
 #   define MAC64(d, a, b) ((d) += MUL64(a, b))
 #endif
 
 #ifndef MLS64
 #   define MLS64(d, a, b) ((d) -= MUL64(a, b))
 #endif
 
99aed7c8
 /* signed 16x16 -> 32 multiply add accumulate */
 #ifndef MAC16
 #   define MAC16(rt, ra, rb) rt += (ra) * (rb)
 #endif
 
 /* signed 16x16 -> 32 multiply */
 #ifndef MUL16
 #   define MUL16(ra, rb) ((ra) * (rb))
 #endif
 
ffa978f1
 #ifndef MLS16
 #   define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
 #endif
 
199436b9
 /* median of 3 */
 #ifndef mid_pred
 #define mid_pred mid_pred
 static inline av_const int mid_pred(int a, int b, int c)
 {
 #if 0
     int t= (a-b)&((a-b)>>31);
     a-=t;
     b+=t;
     b-= (b-c)&((b-c)>>31);
     b+= (a-b)&((a-b)>>31);
 
     return b;
 #else
     if(a>b){
         if(c>b){
             if(c>a) b=a;
             else    b=c;
         }
     }else{
         if(b>c){
             if(c>a) b=c;
             else    b=a;
         }
     }
     return b;
 #endif
 }
 #endif
 
101dfa7d
 #ifndef sign_extend
 static inline av_const int sign_extend(int val, unsigned bits)
 {
f59bb3d8
     unsigned shift = 8 * sizeof(int) - bits;
     union { unsigned u; int s; } v = { (unsigned) val << shift };
     return v.s >> shift;
101dfa7d
 }
 #endif
 
48960b8f
 #ifndef zero_extend
 static inline av_const unsigned zero_extend(unsigned val, unsigned bits)
 {
e969e261
     return (val << ((8 * sizeof(int)) - bits)) >> ((8 * sizeof(int)) - bits);
48960b8f
 }
 #endif
 
5e7dfb7d
 #ifndef COPY3_IF_LT
 #define COPY3_IF_LT(x, y, a, b, c, d)\
 if ((y) < (x)) {\
     (x) = (y);\
     (a) = (b);\
     (c) = (d);\
 }
 #endif
 
5e46be96
 #ifndef NEG_SSR32
 #   define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
 #endif
 
 #ifndef NEG_USR32
 #   define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
 #endif
 
cf60d669
 #if HAVE_BIGENDIAN
 # ifndef PACK_2U8
 #   define PACK_2U8(a,b)     (((a) <<  8) | (b))
b39a2d19
 # endif
cf60d669
 # ifndef PACK_4U8
 #   define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
 # endif
 # ifndef PACK_2U16
 #   define PACK_2U16(a,b)    (((a) << 16) | (b))
 # endif
 #else
 # ifndef PACK_2U8
 #   define PACK_2U8(a,b)     (((b) <<  8) | (a))
 # endif
 # ifndef PACK_4U2
 #   define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
 # endif
 # ifndef PACK_2U16
 #   define PACK_2U16(a,b)    (((b) << 16) | (a))
 # endif
 #endif
 
 #ifndef PACK_2S8
 #   define PACK_2S8(a,b)     PACK_2U8((a)&255, (b)&255)
 #endif
 #ifndef PACK_4S8
 #   define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
 #endif
 #ifndef PACK_2S16
 #   define PACK_2S16(a,b)    PACK_2U16((a)&0xffff, (b)&0xffff)
b39a2d19
 #endif
 
98790382
 #endif /* AVCODEC_MATHOPS_H */