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 sign_extend
125
static
inline
av_const
int
sign_extend
(
int
val
,
unsigned
bits
)
126
{
127
unsigned
shift
= 8 *
sizeof
(int) - bits;
128
union
{
unsigned
u
;
int
s
; }
v
= { (unsigned) val << shift };
129
return
v
.s >>
shift
;
130
}
131
#endif
132
133
#ifndef zero_extend
134
static
inline
av_const
unsigned
zero_extend
(
unsigned
val,
unsigned
bits)
135
{
136
return
(val << ((8 *
sizeof
(
int
)) - bits)) >> ((8 *
sizeof
(int)) -
bits
);
137
}
138
#endif
139
140
#ifndef COPY3_IF_LT
141
#define COPY3_IF_LT(x, y, a, b, c, d)\
142
if ((y) < (x)) {\
143
(x) = (y);\
144
(a) = (b);\
145
(c) = (d);\
146
}
147
#endif
148
149
#ifndef MASK_ABS
150
#define MASK_ABS(mask, level) do { \
151
mask = level >> 31; \
152
level = (level ^ mask) - mask; \
153
} while (0)
154
#endif
155
156
#ifndef NEG_SSR32
157
# define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
158
#endif
159
160
#ifndef NEG_USR32
161
# define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
162
#endif
163
164
#if HAVE_BIGENDIAN
165
# ifndef PACK_2U8
166
# define PACK_2U8(a,b) (((a) << 8) | (b))
167
# endif
168
# ifndef PACK_4U8
169
# define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
170
# endif
171
# ifndef PACK_2U16
172
# define PACK_2U16(a,b) (((a) << 16) | (b))
173
# endif
174
#else
175
# ifndef PACK_2U8
176
# define PACK_2U8(a,b) (((b) << 8) | (a))
177
# endif
178
# ifndef PACK_4U2
179
# define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
180
# endif
181
# ifndef PACK_2U16
182
# define PACK_2U16(a,b) (((b) << 16) | (a))
183
# endif
184
#endif
185
186
#ifndef PACK_2S8
187
# define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
188
#endif
189
#ifndef PACK_4S8
190
# define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
191
#endif
192
#ifndef PACK_2S16
193
# define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
194
#endif
195
196
#ifndef FASTDIV
197
# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
198
#endif
/* FASTDIV */
199
200
static
inline
av_const
unsigned
int
ff_sqrt
(
unsigned
int
a
)
201
{
202
unsigned
int
b
;
203
204
if
(a < 255)
return
(
ff_sqrt_tab
[a + 1] - 1) >> 4;
205
else
if
(a < (1 << 12)) b =
ff_sqrt_tab
[a >> 4] >> 2;
206
#if !CONFIG_SMALL
207
else
if
(a < (1 << 14)) b =
ff_sqrt_tab
[a >> 6] >> 1;
208
else
if
(a < (1 << 16)) b =
ff_sqrt_tab
[a >> 8] ;
209
#endif
210
else
{
211
int
s
=
av_log2_16bit
(a >> 16) >> 1;
212
unsigned
int
c
= a >> (s + 2);
213
b =
ff_sqrt_tab
[c >> (s + 8)];
214
b =
FASTDIV
(c,b) + (b <<
s
);
215
}
216
217
return
b - (a < b *
b
);
218
}
219
220
static
inline
int8_t
ff_u8_to_s8
(
uint8_t
a
)
221
{
222
union
{
223
uint8_t
u8;
224
int8_t s8;
225
}
b
;
226
b
.u8 =
a
;
227
return
b
.s8;
228
}
229
230
#endif
/* AVCODEC_MATHOPS_H */
Generated on Fri Dec 5 2014 04:41:50 for FFmpeg by
1.8.2