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
libavutil
intmath.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2010 Mans Rullgard <mans@mansr.com>
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef AVUTIL_INTMATH_H
22
#define AVUTIL_INTMATH_H
23
24
#include <stdint.h>
25
26
#include "config.h"
27
#include "
attributes.h
"
28
29
#if ARCH_ARM
30
# include "
arm/intmath.h
"
31
#endif
32
33
/**
34
* @addtogroup lavu_internal
35
* @{
36
*/
37
38
#if HAVE_FAST_CLZ
39
#if AV_GCC_VERSION_AT_LEAST(3,4)
40
#ifndef ff_log2
41
# define ff_log2(x) (31 - __builtin_clz((x)|1))
42
# ifndef ff_log2_16bit
43
# define ff_log2_16bit av_log2
44
# endif
45
#endif
/* ff_log2 */
46
#elif defined( __INTEL_COMPILER )
47
#ifndef ff_log2
48
# define ff_log2(x) (_bit_scan_reverse(x|1))
49
# ifndef ff_log2_16bit
50
# define ff_log2_16bit av_log2
51
# endif
52
#endif
/* ff_log2 */
53
#endif
54
#endif
/* AV_GCC_VERSION_AT_LEAST(3,4) */
55
56
extern
const
uint8_t
ff_log2_tab
[256];
57
58
#ifndef ff_log2
59
#define ff_log2 ff_log2_c
60
#if !defined( _MSC_VER )
61
static
av_always_inline
av_const
int
ff_log2_c
(
unsigned
int
v
)
62
{
63
int
n
= 0;
64
if
(v & 0xffff0000) {
65
v >>= 16;
66
n += 16;
67
}
68
if
(v & 0xff00) {
69
v >>= 8;
70
n += 8;
71
}
72
n +=
ff_log2_tab
[
v
];
73
74
return
n
;
75
}
76
#else
77
static
av_always_inline
av_const
int
ff_log2_c
(
unsigned
int
v
)
78
{
79
unsigned
long
n
;
80
_BitScanReverse(&n, v|1);
81
return
n
;
82
}
83
#define ff_log2_16bit av_log2
84
#endif
85
#endif
86
87
#ifndef ff_log2_16bit
88
#define ff_log2_16bit ff_log2_16bit_c
89
static
av_always_inline
av_const
int
ff_log2_16bit_c
(
unsigned
int
v
)
90
{
91
int
n
= 0;
92
if
(v & 0xff00) {
93
v >>= 8;
94
n += 8;
95
}
96
n +=
ff_log2_tab
[
v
];
97
98
return
n
;
99
}
100
#endif
101
102
#define av_log2 ff_log2
103
#define av_log2_16bit ff_log2_16bit
104
105
/**
106
* @}
107
*/
108
109
/**
110
* @addtogroup lavu_math
111
* @{
112
*/
113
114
#if HAVE_FAST_CLZ
115
#if AV_GCC_VERSION_AT_LEAST(3,4)
116
#ifndef ff_ctz
117
#define ff_ctz(v) __builtin_ctz(v)
118
#endif
119
#elif defined( __INTEL_COMPILER )
120
#ifndef ff_ctz
121
#define ff_ctz(v) _bit_scan_forward(v)
122
#endif
123
#endif
124
#endif
125
126
#ifndef ff_ctz
127
#define ff_ctz ff_ctz_c
128
#if !defined( _MSC_VER )
129
static
av_always_inline
av_const
int
ff_ctz_c
(
int
v
)
130
{
131
int
c
;
132
133
if
(v & 0x1)
134
return
0;
135
136
c = 1;
137
if
(!(v & 0xffff)) {
138
v >>= 16;
139
c += 16;
140
}
141
if
(!(v & 0xff)) {
142
v >>= 8;
143
c += 8;
144
}
145
if
(!(v & 0xf)) {
146
v >>= 4;
147
c += 4;
148
}
149
if
(!(v & 0x3)) {
150
v >>= 2;
151
c += 2;
152
}
153
c -= v & 0x1;
154
155
return
c
;
156
}
157
#else
158
static
av_always_inline
av_const
int
ff_ctz_c
(
int
v
)
159
{
160
unsigned
long
c
;
161
_BitScanForward(&c, v);
162
return
c
;
163
}
164
#endif
165
#endif
166
167
/**
168
* Trailing zero bit count.
169
*
170
* @param v input value. If v is 0, the result is undefined.
171
* @return the number of trailing 0-bits
172
*/
173
int
av_ctz
(
int
v
);
174
175
/**
176
* @}
177
*/
178
#endif
/* AVUTIL_INTMATH_H */
Generated on Fri Dec 5 2014 04:42:15 for FFmpeg by
1.8.2