Go to the documentation of this file.
22 #ifndef AVCODEC_MATHOPS_H
23 #define AVCODEC_MATHOPS_H
31 #define MAX_NEG_CROP 1024
53 # define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
57 # define MULL(a,b,s) (MUL64(a, b) >> (s))
68 return ((uint64_t)(
a) * (uint64_t)(
b))>>32;
73 # define MAC64(d, a, b) ((d) += MUL64(a, b))
77 # define MLS64(d, a, b) ((d) -= MUL64(a, b))
82 # define MAC16(rt, ra, rb) rt += (ra) * (rb)
87 # define MUL16(ra, rb) ((ra) * (rb))
91 # define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
96 #define mid_pred mid_pred
115 #define median4 median4
128 #define FF_SIGNBIT(x) ((x) >> CHAR_BIT * sizeof(x) - 1)
134 union {
unsigned u;
int s; } v = { (unsigned)
val <<
shift };
139 #ifndef sign_extend64
151 return (
val << ((8 *
sizeof(
int)) -
bits)) >> ((8 *
sizeof(int)) -
bits);
156 #define COPY3_IF_LT(x, y, a, b, c, d)\
165 #define MASK_ABS(mask, level) do { \
166 mask = level >> 31; \
167 level = (level ^ mask) - mask; \
172 # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
176 # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
181 # define PACK_2U8(a,b) (((a) << 8) | (b))
184 # define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
187 # define PACK_2U16(a,b) (((a) << 16) | (b))
191 # define PACK_2U8(a,b) (((b) << 8) | (a))
194 # define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
197 # define PACK_2U16(a,b) (((b) << 16) | (a))
202 # define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
205 # define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
208 # define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
212 # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
216 #define ff_sqrt ff_sqrt
229 unsigned int c =
a >> (
s + 2);
234 return b - (
a <
b *
b);
#define u(width, name, range_min, range_max)
static int8_t ff_u8_to_s8(uint8_t a)
int av_log2_16bit(unsigned v)
static av_const unsigned zero_extend(unsigned val, unsigned bits)
#define attribute_visibility_hidden
const uint32_t ff_inverse[257]
static double val(void *priv, double ch)
static av_const int64_t sign_extend64(int64_t val, unsigned bits)
static av_always_inline unsigned UMULH(unsigned a, unsigned b)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
const uint8_t ff_sqrt_tab[256]
const uint8_t ff_zigzag_scan[16+1]
static int shift(int a, int b)
static av_always_inline int MULH(int a, int b)
const uint8_t attribute_visibility_hidden ff_crop_tab[256+2 *MAX_NEG_CROP]
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static av_const float ff_sqrf(float a)
const uint8_t ff_zigzag_direct[64]
static av_const int sign_extend(int val, unsigned bits)
const uint8_t ff_log2_run[41]