FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
mathops.h
Go to the documentation of this file.
1
/*
2
* simple math operations
3
* Copyright (c) 2001, 2002 Fabrice Bellard
4
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
#ifndef AVCODEC_MATHOPS_H
23
#define AVCODEC_MATHOPS_H
24
25
#include <stdint.h>
26
27
#include "
libavutil/common.h
"
28
#include "config.h"
29
30
extern
const
uint32_t
ff_inverse
[257];
31
extern
const
uint8_t
ff_reverse
[256];
32
extern
const
uint8_t
ff_sqrt_tab
[256];
33
34
#if ARCH_ARM
35
# include "
arm/mathops.h
"
36
#elif ARCH_AVR32
37
# include "
avr32/mathops.h
"
38
#elif ARCH_BFIN
39
# include "
bfin/mathops.h
"
40
#elif ARCH_MIPS
41
# include "
mips/mathops.h
"
42
#elif ARCH_PPC
43
# include "
ppc/mathops.h
"
44
#elif ARCH_X86
45
# include "
x86/mathops.h
"
46
#endif
47
48
/* generic implementation */
49
50
#ifndef MUL64
51
# define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
52
#endif
53
54
#ifndef MULL
55
# define MULL(a,b,s) (MUL64(a, b) >> (s))
56
#endif
57
58
#ifndef MULH
59
static
av_always_inline
int
MULH
(
int
a
,
int
b
){
60
return
MUL64
(a, b) >> 32;
61
}
62
#endif
63
64
#ifndef UMULH
65
static
av_always_inline
unsigned
UMULH
(
unsigned
a
,
unsigned
b
){
66
return
((uint64_t)(a) * (uint64_t)(b))>>32;
67
}
68
#endif
69
70
#ifndef MAC64
71
# define MAC64(d, a, b) ((d) += MUL64(a, b))
72
#endif
73
74
#ifndef MLS64
75
# define MLS64(d, a, b) ((d) -= MUL64(a, b))
76
#endif
77
78
/* signed 16x16 -> 32 multiply add accumulate */
79
#ifndef MAC16
80
# define MAC16(rt, ra, rb) rt += (ra) * (rb)
81
#endif
82
83
/* signed 16x16 -> 32 multiply */
84
#ifndef MUL16
85
# define MUL16(ra, rb) ((ra) * (rb))
86
#endif
87
88
#ifndef MLS16
89
# define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
90
#endif
91
92
/* median of 3 */
93
#ifndef mid_pred
94
#define mid_pred mid_pred
95
static
inline
av_const
int
mid_pred
(
int
a
,
int
b
,
int
c
)
96
{
97
#if 0
98
int
t
= (a-
b
)&((a-b)>>31);
99
a-=
t
;
100
b+=
t
;
101
b-= (b-
c
)&((b-c)>>31);
102
b+= (a-
b
)&((a-b)>>31);
103
104
return
b
;
105
#else
106
if
(a>b){
107
if
(c>b){
108
if
(c>a) b=
a
;
109
else
b=
c
;
110
}
111
}
else
{
112
if
(b>c){
113
if
(c>a) b=
c
;
114
else
b=
a
;
115
}
116
}
117
return
b
;
118
#endif
119
}
120
#endif
121
122
#ifndef sign_extend
123
static
inline
av_const
int
sign_extend
(
int
val
,
unsigned
bits
)
124
{
125
unsigned
shift
= 8 *
sizeof
(int) - bits;
126
union
{
unsigned
u
;
int
s
; }
v
= { (unsigned) val << shift };
127
return
v
.s >>
shift
;
128
}
129
#endif
130
131
#ifndef zero_extend
132
static
inline
av_const
unsigned
zero_extend
(
unsigned
val,
unsigned
bits)
133
{
134
return
(val << ((8 *
sizeof
(
int
)) - bits)) >> ((8 *
sizeof
(int)) -
bits
);
135
}
136
#endif
137
138
#ifndef COPY3_IF_LT
139
#define COPY3_IF_LT(x, y, a, b, c, d)\
140
if ((y) < (x)) {\
141
(x) = (y);\
142
(a) = (b);\
143
(c) = (d);\
144
}
145
#endif
146
147
#ifndef MASK_ABS
148
#define MASK_ABS(mask, level) do { \
149
mask = level >> 31; \
150
level = (level ^ mask) - mask; \
151
} while (0)
152
#endif
153
154
#ifndef NEG_SSR32
155
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
156
#endif
157
158
#ifndef NEG_USR32
159
# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
160
#endif
161
162
#if HAVE_BIGENDIAN
163
# ifndef PACK_2U8
164
# define PACK_2U8(a,b) (((a) << 8) | (b))
165
# endif
166
# ifndef PACK_4U8
167
# define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
168
# endif
169
# ifndef PACK_2U16
170
# define PACK_2U16(a,b) (((a) << 16) | (b))
171
# endif
172
#else
173
# ifndef PACK_2U8
174
# define PACK_2U8(a,b) (((b) << 8) | (a))
175
# endif
176
# ifndef PACK_4U2
177
# define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
178
# endif
179
# ifndef PACK_2U16
180
# define PACK_2U16(a,b) (((b) << 16) | (a))
181
# endif
182
#endif
183
184
#ifndef PACK_2S8
185
# define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
186
#endif
187
#ifndef PACK_4S8
188
# define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
189
#endif
190
#ifndef PACK_2S16
191
# define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
192
#endif
193
194
#ifndef FASTDIV
195
# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
196
#endif
/* FASTDIV */
197
198
#ifndef MOD_UNLIKELY
199
# define MOD_UNLIKELY(modulus, dividend, divisor, prev_dividend) \
200
do { \
201
if ((prev_dividend) == 0 || (dividend) - (prev_dividend) != (divisor)) \
202
(modulus) = (dividend) % (divisor); \
203
(prev_dividend) = (dividend); \
204
} while (0)
205
#endif
206
207
static
inline
av_const
unsigned
int
ff_sqrt
(
unsigned
int
a
)
208
{
209
unsigned
int
b
;
210
211
if
(a < 255)
return
(
ff_sqrt_tab
[a + 1] - 1) >> 4;
212
else
if
(a < (1 << 12)) b =
ff_sqrt_tab
[a >> 4] >> 2;
213
#if !CONFIG_SMALL
214
else
if
(a < (1 << 14)) b =
ff_sqrt_tab
[a >> 6] >> 1;
215
else
if
(a < (1 << 16)) b =
ff_sqrt_tab
[a >> 8] ;
216
#endif
217
else
{
218
int
s
=
av_log2_16bit
(a >> 16) >> 1;
219
unsigned
int
c
= a >> (s + 2);
220
b =
ff_sqrt_tab
[c >> (s + 8)];
221
b =
FASTDIV
(c,b) + (b <<
s
);
222
}
223
224
return
b - (a < b *
b
);
225
}
226
227
static
inline
int8_t
ff_u8_to_s8
(
uint8_t
a
)
228
{
229
union
{
230
uint8_t
u8;
231
int8_t s8;
232
}
b
;
233
b
.u8 =
a
;
234
return
b
.s8;
235
}
236
237
#endif
/* AVCODEC_MATHOPS_H */
Generated on Sun Mar 23 2014 23:49:51 for FFmpeg by
1.8.2