From dacbc16d5b2c2a113eab6b9295db12795d98e2cc Mon Sep 17 00:00:00 2001 From: Dave Bryant Date: Mon, 4 Jul 2005 06:38:00 +0000 Subject: 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 --- apps/codecs/libwavpack/metadata.c | 136 +++++++++++++++++++++++++------------- 1 file changed, 91 insertions(+), 45 deletions(-) (limited to 'apps/codecs/libwavpack/metadata.c') diff --git a/apps/codecs/libwavpack/metadata.c b/apps/codecs/libwavpack/metadata.c index 661b25edc8..ebc7dcf99d 100644 --- a/apps/codecs/libwavpack/metadata.c +++ b/apps/codecs/libwavpack/metadata.c @@ -12,46 +12,48 @@ #include "wavpack.h" +#include + 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; +} + -- cgit v1.2.3