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