summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/float.c
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2005-02-25 17:05:30 +0000
committerChristian Gmeiner <christian.gmeiner@gmail.com>2005-02-25 17:05:30 +0000
commite449d88b3e6b584998f8f38ed61467c35ca74466 (patch)
tree307e87242fd5fbf45d7424bb5afad17b9dd34429 /apps/codecs/libwavpack/float.c
parent234489a449e13d99b76daff61ff7774226d21a5b (diff)
downloadrockbox-e449d88b3e6b584998f8f38ed61467c35ca74466.tar.gz
rockbox-e449d88b3e6b584998f8f38ed61467c35ca74466.zip
Initial import of libwavpack
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6056 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libwavpack/float.c')
-rw-r--r--apps/codecs/libwavpack/float.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/apps/codecs/libwavpack/float.c b/apps/codecs/libwavpack/float.c
new file mode 100644
index 0000000000..3e678e824d
--- /dev/null
+++ b/apps/codecs/libwavpack/float.c
@@ -0,0 +1,83 @@
1////////////////////////////////////////////////////////////////////////////
2// **** WAVPACK **** //
3// Hybrid Lossless Wavefile Compressor //
4// Copyright (c) 1998 - 2004 Conifer Software. //
5// All Rights Reserved. //
6// Distributed under the BSD Software License (see license.txt) //
7////////////////////////////////////////////////////////////////////////////
8
9// float.c
10
11#include "wavpack.h"
12
13int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd)
14{
15 int bytecnt = wpmd->byte_length;
16 char *byteptr = wpmd->data;
17
18 if (bytecnt != 4)
19 return FALSE;
20
21 wps->float_flags = *byteptr++;
22 wps->float_shift = *byteptr++;
23 wps->float_max_exp = *byteptr++;
24 wps->float_norm_exp = *byteptr;
25 return TRUE;
26}
27
28void float_values (WavpackStream *wps, long *values, long num_values)
29{
30 while (num_values--) {
31 int shift_count = 0, exp = wps->float_max_exp;
32 f32 outval = { 0, 0, 0 };
33
34 if (*values) {
35 *values <<= wps->float_shift;
36
37 if (*values < 0) {
38 *values = -*values;
39 outval.sign = 1;
40 }
41
42 if (*values == 0x1000000)
43 outval.exponent = 255;
44 else {
45 if (exp)
46 while (!(*values & 0x800000) && --exp) {
47 shift_count++;
48 *values <<= 1;
49 }
50
51 if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES))
52 *values |= ((1 << shift_count) - 1);
53
54 outval.mantissa = *values;
55 outval.exponent = exp;
56 }
57 }
58
59 * (f32 *) values++ = outval;
60 }
61}
62
63void float_normalize (long *values, long num_values, int delta_exp)
64{
65 f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 };
66 int exp;
67
68 if (!delta_exp)
69 return;
70
71 while (num_values--) {
72 if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0)
73 *fvalues = fzero;
74 else if (exp == 255 || (exp += delta_exp) >= 255) {
75 fvalues->exponent = 255;
76 fvalues->mantissa = 0;
77 }
78 else
79 fvalues->exponent = exp;
80
81 fvalues++;
82 }
83}