ffmpeg / libavutil / intfloat_readwrite.c @ 9be50e39
History  View  Annotate  Download (2.86 KB)
1 
/*


2 
* portable IEEE float/double read/write functions

3 
*

4 
* Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>

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 021101301 USA

21 
*/

22  
23 
/**

24 
* @file intfloat_readwrite.c

25 
* Portable IEEE float/double read/write functions.

26 
*/

27  
28 
#include "common.h" 
29 
#include "intfloat_readwrite.h" 
30  
31 
double av_int2dbl(int64_t v){

32 
if(v+v > 0xFFEULL<<52) 
33 
return 0.0/0.0; 
34 
return ldexp(((v&((1LL<<52)1)) + (1LL<<52)) * (v>>631), (v>>52&0x7FF)1075); 
35 
} 
36  
37 
float av_int2flt(int32_t v){

38 
if(v+v > 0xFF000000U) 
39 
return 0.0/0.0; 
40 
return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>311), (v>>23&0xFF)150); 
41 
} 
42  
43 
double av_ext2dbl(const AVExtFloat ext){ 
44 
uint64_t m = 0;

45 
int e, i;

46  
47 
for (i = 0; i < 8; i++) 
48 
m = (m<<8) + ext.mantissa[i];

49 
e = (((int)ext.exponent[0]&0x7f)<<8)  ext.exponent[1]; 
50 
if (e == 0x7fff && m) 
51 
return 0.0/0.0; 
52 
e = 16383 + 63; /* In IEEE 80 bits, the whole (i.e. 1.xxxx) 
53 
* mantissa bit is written as opposed to the

54 
* single and double precision formats */

55 
if (ext.exponent[0]&0x80) 
56 
m= m; 
57 
return ldexp(m, e);

58 
} 
59  
60 
int64_t av_dbl2int(double d){

61 
int e;

62 
if ( !d) return 0; 
63 
else if(dd) return 0x7FF0000000000000LL + ((int64_t)(d<0)<<63) + (d!=d); 
64 
d= frexp(d, &e); 
65 
return (int64_t)(d<0)<<63  (e+1022LL)<<52  (int64_t)((fabs(d)0.5)*(1LL<<53)); 
66 
} 
67  
68 
int32_t av_flt2int(float d){

69 
int e;

70 
if ( !d) return 0; 
71 
else if(dd) return 0x7F800000 + ((d<0)<<31) + (d!=d); 
72 
d= frexp(d, &e); 
73 
return (d<0)<<31  (e+126)<<23  (int64_t)((fabs(d)0.5)*(1<<24)); 
74 
} 
75  
76 
AVExtFloat av_dbl2ext(double d){

77 
struct AVExtFloat ext= {{0}}; 
78 
int e, i; double f; uint64_t m; 
79  
80 
f = fabs(frexp(d, &e)); 
81 
if (f >= 0.5 && f < 1) { 
82 
e += 16382;

83 
ext.exponent[0] = e>>8; 
84 
ext.exponent[1] = e;

85 
m = (uint64_t)ldexp(f, 64);

86 
for (i=0; i < 8; i++) 
87 
ext.mantissa[i] = m>>(56(i<<3)); 
88 
} else if (f != 0.0) { 
89 
ext.exponent[0] = 0x7f; ext.exponent[1] = 0xff; 
90 
if (f != 1/0.0) 
91 
ext.mantissa[0] = ~0; 
92 
} 
93 
if (d < 0) 
94 
ext.exponent[0] = 0x80; 
95 
return ext;

96 
} 
97 