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