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