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 Sun Sep 14 2014 18:55:52 for FFmpeg by
1.8.2