ffmpeg / libavutil / intfloat_readwrite.c @ 324e7ee2
History  View  Annotate  Download (2.85 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

25 
* portable IEEE float/double read/write functions

26 
*/

27  
28 
#include <stdint.h> 
29 
#include <math.h> 
30 
#include "intfloat_readwrite.h" 
31  
32 
double av_int2dbl(int64_t v){

33 
if(v+v > 0xFFEULL<<52) 
34 
return NAN;

35 
return ldexp(((v&((1LL<<52)1)) + (1LL<<52)) * (v>>631), (v>>52&0x7FF)1075); 
36 
} 
37  
38 
float av_int2flt(int32_t v){

39 
if(v+v > 0xFF000000U) 
40 
return NAN;

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

46 
int e, i;

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

50 
e = (((int)ext.exponent[0]&0x7f)<<8)  ext.exponent[1]; 
51 
if (e == 0x7fff && m) 
52 
return NAN;

53 
e = 16383 + 63; /* In IEEE 80 bits, the whole (i.e. 1.xxxx) 
54 
* mantissa bit is written as opposed to the

55 
* single and double precision formats. */

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

59 
} 
60  
61 
int64_t av_dbl2int(double d){

62 
int e;

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

70 
int e;

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

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

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

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

87 
for (i=0; i < 8; i++) 
88 
ext.mantissa[i] = m>>(56(i<<3)); 
89 
} else if (f != 0.0) { 
90 
ext.exponent[0] = 0x7f; ext.exponent[1] = 0xff; 
91 
if (f != INFINITY)

92 
ext.mantissa[0] = ~0; 
93 
} 
94 
if (d < 0) 
95 
ext.exponent[0] = 0x80; 
96 
return ext;

97 
} 
98 