diff options
| author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2005-02-25 17:05:30 +0000 |
|---|---|---|
| committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2005-02-25 17:05:30 +0000 |
| commit | e449d88b3e6b584998f8f38ed61467c35ca74466 (patch) | |
| tree | 307e87242fd5fbf45d7424bb5afad17b9dd34429 /apps/codecs/libwavpack/float.c | |
| parent | 234489a449e13d99b76daff61ff7774226d21a5b (diff) | |
| download | rockbox-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.c | 83 |
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++; + } +} |