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.zip
rockbox-e449d88b3e6b584998f8f38ed61467c35ca74466.tar.gz
rockbox-e449d88b3e6b584998f8f38ed61467c35ca74466.tar.bz2
rockbox-e449d88b3e6b584998f8f38ed61467c35ca74466.tar.xz
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 0000000..3e678e8
--- /dev/null
+++ b/apps/codecs/libwavpack/float.c
@@ -0,0 +1,83 @@
+////////////////////////////////////////////////////////////////////////////
+// **** WAVPACK **** //
+// Hybrid Lossless Wavefile Compressor //
+// Copyright (c) 1998 - 2004 Conifer Software. //
+// All Rights Reserved. //
+// Distributed under the BSD Software License (see license.txt) //
+////////////////////////////////////////////////////////////////////////////
+
+// float.c
+
+#include "wavpack.h"
+
+int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd)
+{
+ int bytecnt = wpmd->byte_length;
+ char *byteptr = wpmd->data;
+
+ if (bytecnt != 4)
+ return FALSE;
+
+ wps->float_flags = *byteptr++;
+ wps->float_shift = *byteptr++;
+ wps->float_max_exp = *byteptr++;
+ wps->float_norm_exp = *byteptr;
+ return TRUE;
+}
+
+void float_values (WavpackStream *wps, long *values, long num_values)
+{
+ while (num_values--) {
+ int shift_count = 0, exp = wps->float_max_exp;
+ f32 outval = { 0, 0, 0 };
+
+ if (*values) {
+ *values <<= wps->float_shift;
+
+ if (*values < 0) {
+ *values = -*values;
+ outval.sign = 1;
+ }
+
+ if (*values == 0x1000000)
+ outval.exponent = 255;
+ else {
+ if (exp)
+ while (!(*values & 0x800000) && --exp) {
+ shift_count++;
+ *values <<= 1;
+ }
+
+ if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES))
+ *values |= ((1 << shift_count) - 1);
+
+ outval.mantissa = *values;
+ outval.exponent = exp;
+ }
+ }
+
+ * (f32 *) values++ = outval;
+ }
+}
+
+void float_normalize (long *values, long num_values, int delta_exp)
+{
+ f32 *fvalues = (f32 *) values, fzero = { 0, 0, 0 };
+ int exp;
+
+ if (!delta_exp)
+ return;
+
+ while (num_values--) {
+ if ((exp = fvalues->exponent) == 0 || exp + delta_exp <= 0)
+ *fvalues = fzero;
+ else if (exp == 255 || (exp += delta_exp) >= 255) {
+ fvalues->exponent = 255;
+ fvalues->mantissa = 0;
+ }
+ else
+ fvalues->exponent = exp;
+
+ fvalues++;
+ }
+}