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
#define MAX_NEG_CROP 1024
31
32
extern
const
uint32_t
ff_inverse
[257];
33
extern
const
uint8_t
ff_reverse
[256];
34
extern
const
uint8_t
ff_sqrt_tab
[256];
35
extern
const
uint8_t
ff_crop_tab
[256 + 2 *
MAX_NEG_CROP
];
36
extern
const
uint8_t
ff_zigzag_direct
[64];
37
38
#if ARCH_ARM
39
# include "
arm/mathops.h
"
40
#elif ARCH_AVR32
41
# include "
avr32/mathops.h
"
42
#elif ARCH_MIPS
43
# include "
mips/mathops.h
"
44
#elif ARCH_PPC
45
# include "
ppc/mathops.h
"
46
#elif ARCH_X86
47
# include "
x86/mathops.h
"
48
#endif
49
50
/* generic implementation */
51
52
#ifndef MUL64
53
# define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
54
#endif
55
56
#ifndef MULL
57
# define MULL(a,b,s) (MUL64(a, b) >> (s))
58
#endif
59
60
#ifndef MULH
61
static
av_always_inline
int
MULH
(
int
a
,
int
b
){
62
return
MUL64
(a, b) >> 32;
63
}
64
#endif
65
66
#ifndef UMULH
67
static
av_always_inline
unsigned
UMULH
(
unsigned
a
,
unsigned
b
){
68
return
((uint64_t)(a) * (uint64_t)(b))>>32;
69
}
70
#endif
71
72
#ifndef MAC64
73
# define MAC64(d, a, b) ((d) += MUL64(a, b))
74
#endif
75
76
#ifndef MLS64
77
# define MLS64(d, a, b) ((d) -= MUL64(a, b))
78
#endif
79
80
/* signed 16x16 -> 32 multiply add accumulate */
81
#ifndef MAC16
82
# define MAC16(rt, ra, rb) rt += (ra) * (rb)
83
#endif
84
85
/* signed 16x16 -> 32 multiply */
86
#ifndef MUL16
87
# define MUL16(ra, rb) ((ra) * (rb))
88
#endif
89
90
#ifndef MLS16
91
# define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
92
#endif
93
94
/* median of 3 */
95
#ifndef mid_pred
96
#define mid_pred mid_pred
97
static
inline
av_const
int
mid_pred
(
int
a
,
int
b
,
int
c
)
98
{
99
#if 0
100
int
t= (a-
b
)&((a-b)>>31);
101
a-=t;
102
b+=t;
103
b-= (b-
c
)&((b-c)>>31);
104
b+= (a-
b
)&((a-b)>>31);
105
106
return
b
;
107
#else
108
if
(a>b){
109
if
(c>b){
110
if
(c>a) b=
a
;
111
else
b=
c
;
112
}
113
}
else
{
114
if
(b>c){
115
if
(c>a) b=
c
;
116
else
b=
a
;
117
}
118
}
119
return
b
;
120
#endif
121
}
122
#endif
123
124
#ifndef median4
125
#define median4 median4
126
static
inline
av_const
int
median4
(
int
a
,
int
b
,
int
c
,
int
d)
127
{
128
if
(a < b) {
129
if
(c < d)
return
(
FFMIN
(b, d) +
FFMAX
(a, c)) / 2;
130
else
return
(
FFMIN
(b, c) +
FFMAX
(a, d)) / 2;
131
}
else
{
132
if
(c < d)
return
(
FFMIN
(a, d) +
FFMAX
(b, c)) / 2;
133
else
return
(
FFMIN
(a, c) +
FFMAX
(b, d)) / 2;
134
}
135
}
136
#endif
137
138
#ifndef sign_extend
139
static
inline
av_const
int
sign_extend
(
int
val
,
unsigned
bits
)
140
{
141
unsigned
shift
= 8 *
sizeof
(int) - bits;
142
union
{
unsigned
u
;
int
s
; }
v
= { (unsigned) val << shift };
143
return
v
.s >>
shift
;
144
}
145
#endif
146
147
#ifndef zero_extend
148
static
inline
av_const
unsigned
zero_extend
(
unsigned
val,
unsigned
bits)
149
{
150
return
(val << ((8 *
sizeof
(
int
)) - bits)) >> ((8 *
sizeof
(int)) -
bits
);
151
}
152
#endif
153
154
#ifndef COPY3_IF_LT
155
#define COPY3_IF_LT(x, y, a, b, c, d)\
156
if ((y) < (x)) {\
157
(x) = (y);\
158
(a) = (b);\
159
(c) = (d);\
160
}
161
#endif
162
163
#ifndef MASK_ABS
164
#define MASK_ABS(mask, level) do { \
165
mask = level >> 31; \
166
level = (level ^ mask) - mask; \
167
} while (0)
168
#endif
169
170
#ifndef NEG_SSR32
171
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
172
#endif
173
174
#ifndef NEG_USR32
175
# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
176
#endif
177
178
#if HAVE_BIGENDIAN
179
# ifndef PACK_2U8
180
# define PACK_2U8(a,b) (((a) << 8) | (b))
181
# endif
182
# ifndef PACK_4U8
183
# define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
184
# endif
185
# ifndef PACK_2U16
186
# define PACK_2U16(a,b) (((a) << 16) | (b))
187
# endif
188
#else
189
# ifndef PACK_2U8
190
# define PACK_2U8(a,b) (((b) << 8) | (a))
191
# endif
192
# ifndef PACK_4U2
193
# define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
194
# endif
195
# ifndef PACK_2U16
196
# define PACK_2U16(a,b) (((b) << 16) | (a))
197
# endif
198
#endif
199
200
#ifndef PACK_2S8
201
# define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
202
#endif
203
#ifndef PACK_4S8
204
# define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
205
#endif
206
#ifndef PACK_2S16
207
# define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
208
#endif
209
210
#ifndef FASTDIV
211
# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
212
#endif
/* FASTDIV */
213
214
static
inline
av_const
unsigned
int
ff_sqrt
(
unsigned
int
a
)
215
{
216
unsigned
int
b
;
217
218
if
(a < 255)
return
(
ff_sqrt_tab
[a + 1] - 1) >> 4;
219
else
if
(a < (1 << 12)) b =
ff_sqrt_tab
[a >> 4] >> 2;
220
#if !CONFIG_SMALL
221
else
if
(a < (1 << 14)) b =
ff_sqrt_tab
[a >> 6] >> 1;
222
else
if
(a < (1 << 16)) b =
ff_sqrt_tab
[a >> 8] ;
223
#endif
224
else
{
225
int
s
=
av_log2_16bit
(a >> 16) >> 1;
226
unsigned
int
c
= a >> (s + 2);
227
b =
ff_sqrt_tab
[c >> (s + 8)];
228
b =
FASTDIV
(c,b) + (b <<
s
);
229
}
230
231
return
b - (a < b *
b
);
232
}
233
234
static
inline
int8_t
ff_u8_to_s8
(
uint8_t
a
)
235
{
236
union
{
237
uint8_t
u8;
238
int8_t s8;
239
}
b
;
240
b
.u8 =
a
;
241
return
b
.s8;
242
}
243
244
#endif
/* AVCODEC_MATHOPS_H */
Generated on Sun Mar 8 2015 02:34:48 for FFmpeg by
1.8.2