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
softfloat.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
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_SOFTFLOAT_H
22
#define AVUTIL_SOFTFLOAT_H
23
24
#include <stdint.h>
25
#include "
common.h
"
26
27
#include "
avassert.h
"
28
29
#define MIN_EXP -126
30
#define MAX_EXP 126
31
#define ONE_BITS 29
32
33
typedef
struct
SoftFloat
{
34
int32_t
exp
;
35
int32_t
mant
;
36
}
SoftFloat
;
37
38
static
av_const
SoftFloat
av_normalize_sf
(
SoftFloat
a
){
39
if
(a.
mant
){
40
#if 1
41
while
((a.
mant
+ 0x20000000U)<0x40000000U){
42
a.
mant
+= a.
mant
;
43
a.
exp
-= 1;
44
}
45
#else
46
int
s
=
ONE_BITS
+ 1 -
av_log2
(a.
mant
^ (a.
mant
<<1));
47
a.
exp
-=
s
;
48
a.
mant
<<=
s
;
49
#endif
50
if
(a.
exp
<
MIN_EXP
){
51
a.
exp
=
MIN_EXP
;
52
a.
mant
= 0;
53
}
54
}
else
{
55
a.
exp
=
MIN_EXP
;
56
}
57
return
a
;
58
}
59
60
static
inline
av_const
SoftFloat
av_normalize1_sf
(
SoftFloat
a
){
61
#if 1
62
if
((
int32_t
)(a.
mant
+ 0x40000000U) < 0){
63
a.
exp
++;
64
a.
mant
>>=1;
65
}
66
av_assert2
(a.
mant
< 0x40000000 && a.
mant
> -0x40000000);
67
return
a
;
68
#elif 1
69
int
t= a.
mant
+ 0x40000000 < 0;
70
return
(
SoftFloat
){a.
exp
+t, a.
mant
>>t};
71
#else
72
int
t= (a.
mant
+ 0x40000000
U
)>>31;
73
return
(
SoftFloat
){a.
exp
+t, a.
mant
>>t};
74
#endif
75
}
76
77
/**
78
* @return Will not be more denormalized than a+b. So if either input is
79
* normalized, then the output will not be worse then the other input.
80
* If both are normalized, then the output will be normalized.
81
*/
82
static
inline
av_const
SoftFloat
av_mul_sf
(
SoftFloat
a
,
SoftFloat
b
){
83
a.
exp
+= b.
exp
;
84
av_assert2
((
int32_t
)((a.
mant
* (int64_t)b.
mant
) >>
ONE_BITS
) == (a.
mant
* (int64_t)b.
mant
) >>
ONE_BITS
);
85
a.
mant
= (a.
mant
* (int64_t)b.
mant
) >>
ONE_BITS
;
86
return
av_normalize1_sf
(a);
87
}
88
89
/**
90
* b has to be normalized and not zero.
91
* @return Will not be more denormalized than a.
92
*/
93
static
av_const
SoftFloat
av_div_sf
(
SoftFloat
a
,
SoftFloat
b
){
94
a.
exp
-= b.
exp
+1;
95
a.
mant
= ((int64_t)a.
mant
<<(
ONE_BITS
+1)) / b.
mant
;
96
return
av_normalize1_sf
(a);
97
}
98
99
static
inline
av_const
int
av_cmp_sf
(
SoftFloat
a
,
SoftFloat
b
){
100
int
t= a.
exp
- b.
exp
;
101
if
(t<0)
return
(a.
mant
>> (-t)) - b.
mant
;
102
else
return
a.
mant
- (b.
mant
>> t);
103
}
104
105
static
inline
av_const
SoftFloat
av_add_sf
(
SoftFloat
a
,
SoftFloat
b
){
106
int
t= a.
exp
- b.
exp
;
107
if
(t <-31)
return
b
;
108
else
if
(t < 0)
return
av_normalize1_sf
((
SoftFloat
){b.
exp
, b.
mant
+ (a.
mant
>> (-t))});
109
else
if
(t < 32)
return
av_normalize1_sf
((
SoftFloat
){a.
exp
, a.
mant
+ (b.
mant
>> t )});
110
else
return
a
;
111
}
112
113
static
inline
av_const
SoftFloat
av_sub_sf
(
SoftFloat
a,
SoftFloat
b){
114
return
av_add_sf
(a, (
SoftFloat
){b.
exp
, -b.
mant
});
115
}
116
117
//FIXME sqrt, log, exp, pow, sin, cos
118
119
static
inline
av_const
SoftFloat
av_int2sf
(
int
v
,
int
frac_bits){
120
return
av_normalize_sf
((
SoftFloat
){
ONE_BITS
-frac_bits, v});
121
}
122
123
/**
124
* Rounding is to -inf.
125
*/
126
static
inline
av_const
int
av_sf2int
(
SoftFloat
v
,
int
frac_bits){
127
v.
exp
+= frac_bits -
ONE_BITS
;
128
if
(v.
exp
>= 0)
return
v.
mant
<< v.
exp
;
129
else
return
v.
mant
>>(-v.
exp
);
130
}
131
132
#endif
/* AVUTIL_SOFTFLOAT_H */
Generated on Sun Mar 8 2015 02:35:14 for FFmpeg by
1.8.2