Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
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 Libav.
5
*
6
* Libav 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
* Libav 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 Libav; 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
#include "
config.h
"
26
#include "
attributes.h
"
27
33
extern
const
uint32_t
ff_inverse
[257];
34
35
#if ARCH_ARM
36
# include "
arm/intmath.h
"
37
#elif ARCH_X86
38
# include "
x86/intmath.h
"
39
#endif
40
41
#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
42
43
#ifndef av_log2
44
# define av_log2(x) (31 - __builtin_clz((x)|1))
45
# ifndef av_log2_16bit
46
# define av_log2_16bit av_log2
47
# endif
48
#endif
/* av_log2 */
49
50
#endif
/* AV_GCC_VERSION_AT_LEAST(3,4) */
51
52
#ifndef FASTDIV
53
# if CONFIG_FASTDIV
54
# define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
55
# else
56
# define FASTDIV(a,b) ((a) / (b))
57
# endif
58
#endif
/* FASTDIV */
59
60
#include "
common.h
"
61
62
extern
const
uint8_t
ff_sqrt_tab
[256];
63
64
static
inline
av_const
unsigned
int
ff_sqrt
(
unsigned
int
a)
65
{
66
unsigned
int
b
;
67
68
if
(a < 255)
return
(
ff_sqrt_tab
[a + 1] - 1) >> 4;
69
else
if
(a < (1 << 12)) b =
ff_sqrt_tab
[a >> 4] >> 2;
70
#if !CONFIG_SMALL
71
else
if
(a < (1 << 14)) b =
ff_sqrt_tab
[a >> 6] >> 1;
72
else
if
(a < (1 << 16)) b =
ff_sqrt_tab
[a >> 8] ;
73
#endif
74
else
{
75
int
s = av_log2_16bit(a >> 16) >> 1;
76
unsigned
int
c = a >> (s + 2);
77
b =
ff_sqrt_tab
[c >> (s + 8)];
78
b =
FASTDIV
(c,b) + (b << s);
79
}
80
81
return
b - (a < b *
b
);
82
}
83
87
#endif
/* AVUTIL_INTMATH_H */