summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/metadata.c
diff options
context:
space:
mode:
authorDave Bryant <bryant@rockbox.org>2005-07-04 06:38:00 +0000
committerDave Bryant <bryant@rockbox.org>2005-07-04 06:38:00 +0000
commitdacbc16d5b2c2a113eab6b9295db12795d98e2cc (patch)
tree6040249a9776880f02d478532028f41065a65451 /apps/codecs/libwavpack/metadata.c
parent1d5f07b0a654ca0ee0b6f4785388801ed809af33 (diff)
downloadrockbox-dacbc16d5b2c2a113eab6b9295db12795d98e2cc.zip
rockbox-dacbc16d5b2c2a113eab6b9295db12795d98e2cc.tar.gz
rockbox-dacbc16d5b2c2a113eab6b9295db12795d98e2cc.tar.bz2
rockbox-dacbc16d5b2c2a113eab6b9295db12795d98e2cc.tar.xz
Added lossless encoding to WavPack library. Also made a few changes to
decoding stuff in preparation for future optimization and eliminated all tabs. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7009 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/libwavpack/metadata.c')
-rw-r--r--apps/codecs/libwavpack/metadata.c136
1 files changed, 91 insertions, 45 deletions
diff --git a/apps/codecs/libwavpack/metadata.c b/apps/codecs/libwavpack/metadata.c
index 661b25e..ebc7dcf 100644
--- a/apps/codecs/libwavpack/metadata.c
+++ b/apps/codecs/libwavpack/metadata.c
@@ -12,46 +12,48 @@
#include "wavpack.h"
+#include <string.h>
+
int read_metadata_buff (WavpackContext *wpc, WavpackMetadata *wpmd)
{
uchar tchar;
if (!wpc->infile (&wpmd->id, 1) || !wpc->infile (&tchar, 1))
- return FALSE;
+ return FALSE;
wpmd->byte_length = tchar << 1;
if (wpmd->id & ID_LARGE) {
- wpmd->id &= ~ID_LARGE;
+ wpmd->id &= ~ID_LARGE;
- if (!wpc->infile (&tchar, 1))
- return FALSE;
+ if (!wpc->infile (&tchar, 1))
+ return FALSE;
- wpmd->byte_length += (long) tchar << 9;
+ wpmd->byte_length += (long) tchar << 9;
- if (!wpc->infile (&tchar, 1))
- return FALSE;
+ if (!wpc->infile (&tchar, 1))
+ return FALSE;
- wpmd->byte_length += (long) tchar << 17;
+ wpmd->byte_length += (long) tchar << 17;
}
if (wpmd->id & ID_ODD_SIZE) {
- wpmd->id &= ~ID_ODD_SIZE;
- wpmd->byte_length--;
+ wpmd->id &= ~ID_ODD_SIZE;
+ wpmd->byte_length--;
}
if (wpmd->byte_length && wpmd->byte_length <= (long)sizeof (wpc->read_buffer)) {
- ulong bytes_to_read = wpmd->byte_length + (wpmd->byte_length & 1);
+ ulong bytes_to_read = wpmd->byte_length + (wpmd->byte_length & 1);
- if (wpc->infile (wpc->read_buffer, bytes_to_read) != (long) bytes_to_read) {
- wpmd->data = NULL;
- return FALSE;
- }
+ if (wpc->infile (wpc->read_buffer, bytes_to_read) != (long) bytes_to_read) {
+ wpmd->data = NULL;
+ return FALSE;
+ }
- wpmd->data = wpc->read_buffer;
+ wpmd->data = wpc->read_buffer;
}
else
- wpmd->data = NULL;
+ wpmd->data = NULL;
return TRUE;
}
@@ -61,45 +63,89 @@ int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd)
WavpackStream *wps = &wpc->stream;
switch (wpmd->id) {
- case ID_DUMMY:
- return TRUE;
+ case ID_DUMMY:
+ return TRUE;
+
+ case ID_DECORR_TERMS:
+ return read_decorr_terms (wps, wpmd);
+
+ case ID_DECORR_WEIGHTS:
+ return read_decorr_weights (wps, wpmd);
+
+ case ID_DECORR_SAMPLES:
+ return read_decorr_samples (wps, wpmd);
+
+ case ID_ENTROPY_VARS:
+ return read_entropy_vars (wps, wpmd);
- case ID_DECORR_TERMS:
- return read_decorr_terms (wps, wpmd);
+ case ID_HYBRID_PROFILE:
+ return read_hybrid_profile (wps, wpmd);
- case ID_DECORR_WEIGHTS:
- return read_decorr_weights (wps, wpmd);
+ case ID_FLOAT_INFO:
+ return read_float_info (wps, wpmd);
- case ID_DECORR_SAMPLES:
- return read_decorr_samples (wps, wpmd);
+ case ID_INT32_INFO:
+ return read_int32_info (wps, wpmd);
- case ID_ENTROPY_VARS:
- return read_entropy_vars (wps, wpmd);
+ case ID_CHANNEL_INFO:
+ return read_channel_info (wpc, wpmd);
- case ID_HYBRID_PROFILE:
- return read_hybrid_profile (wps, wpmd);
+ case ID_CONFIG_BLOCK:
+ return read_config_info (wpc, wpmd);
+
+ case ID_WV_BITSTREAM:
+ return init_wv_bitstream (wpc, wpmd);
+
+ case ID_SHAPING_WEIGHTS:
+ case ID_WVC_BITSTREAM:
+ case ID_WVX_BITSTREAM:
+ return TRUE;
+
+ default:
+ return (wpmd->id & ID_OPTIONAL_DATA) ? TRUE : FALSE;
+ }
+}
- case ID_FLOAT_INFO:
- return read_float_info (wps, wpmd);
+int copy_metadata (WavpackMetadata *wpmd, uchar *buffer_start, uchar *buffer_end)
+{
+ ulong mdsize = wpmd->byte_length + (wpmd->byte_length & 1);
+ WavpackHeader *wphdr = (WavpackHeader *) buffer_start;
- case ID_INT32_INFO:
- return read_int32_info (wps, wpmd);
+ if (wpmd->byte_length & 1)
+ ((char *) wpmd->data) [wpmd->byte_length] = 0;
- case ID_CHANNEL_INFO:
- return read_channel_info (wpc, wpmd);
+ mdsize += (wpmd->byte_length > 510) ? 4 : 2;
+ buffer_start += wphdr->ckSize + 8;
- case ID_CONFIG_BLOCK:
- return read_config_info (wpc, wpmd);
+ if (buffer_start + mdsize >= buffer_end)
+ return FALSE;
- case ID_WV_BITSTREAM:
- return init_wv_bitstream (wpc, wpmd);
+ buffer_start [0] = wpmd->id | (wpmd->byte_length & 1 ? ID_ODD_SIZE : 0);
+ buffer_start [1] = (wpmd->byte_length + 1) >> 1;
- case ID_SHAPING_WEIGHTS:
- case ID_WVC_BITSTREAM:
- case ID_WVX_BITSTREAM:
- return TRUE;
+ if (wpmd->byte_length > 510) {
+ buffer_start [0] |= ID_LARGE;
+ buffer_start [2] = (wpmd->byte_length + 1) >> 9;
+ buffer_start [3] = (wpmd->byte_length + 1) >> 17;
+ }
- default:
- return (wpmd->id & ID_OPTIONAL_DATA) ? TRUE : FALSE;
+ if (wpmd->data && wpmd->byte_length) {
+ if (wpmd->byte_length > 510) {
+ buffer_start [0] |= ID_LARGE;
+ buffer_start [2] = (wpmd->byte_length + 1) >> 9;
+ buffer_start [3] = (wpmd->byte_length + 1) >> 17;
+ memcpy (buffer_start + 4, wpmd->data, mdsize - 4);
+ }
+ else
+ memcpy (buffer_start + 2, wpmd->data, mdsize - 2);
}
+
+ wphdr->ckSize += mdsize;
+ return TRUE;
}
+
+void free_metadata (WavpackMetadata *wpmd)
+{
+ wpmd->data = NULL;
+}
+