summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Bryant <bryant@rockbox.org>2006-04-22 21:32:16 +0000
committerDave Bryant <bryant@rockbox.org>2006-04-22 21:32:16 +0000
commit736df4b43bac64e64607efd427543e7678acfed1 (patch)
tree6ff3129ca4f36db3af0d186e70d8312121e673b6
parent83ce56846a65ce14b2410d07da8fcc4790e0b6f7 (diff)
downloadrockbox-736df4b43bac64e64607efd427543e7678acfed1.tar.gz
rockbox-736df4b43bac64e64607efd427543e7678acfed1.zip
Revert the previous commit because it seemed to break the 4G Gray Sim,
although I can't figure out why or how, and I can't reproduce problem here... git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9766 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/libwavpack/unpack.c33
-rw-r--r--apps/codecs/libwavpack/wavpack.h13
-rw-r--r--apps/codecs/libwavpack/words.c20
-rw-r--r--apps/codecs/libwavpack/wputils.c14
4 files changed, 29 insertions, 51 deletions
diff --git a/apps/codecs/libwavpack/unpack.c b/apps/codecs/libwavpack/unpack.c
index 5bb4467440..dcc9bf5bf9 100644
--- a/apps/codecs/libwavpack/unpack.c
+++ b/apps/codecs/libwavpack/unpack.c
@@ -128,7 +128,7 @@ int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd)
128 signed char *byteptr = wpmd->data; 128 signed char *byteptr = wpmd->data;
129 struct decorr_pass *dpp; 129 struct decorr_pass *dpp;
130 130
131 if (!(wps->wphdr.flags & MONO_DATA)) 131 if (!(wps->wphdr.flags & MONO_FLAG))
132 termcnt /= 2; 132 termcnt /= 2;
133 133
134 if (termcnt > wps->num_terms) 134 if (termcnt > wps->num_terms)
@@ -140,7 +140,7 @@ int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd)
140 while (--dpp >= wps->decorr_passes && termcnt--) { 140 while (--dpp >= wps->decorr_passes && termcnt--) {
141 dpp->weight_A = restore_weight (*byteptr++); 141 dpp->weight_A = restore_weight (*byteptr++);
142 142
143 if (!(wps->wphdr.flags & MONO_DATA)) 143 if (!(wps->wphdr.flags & MONO_FLAG))
144 dpp->weight_B = restore_weight (*byteptr++); 144 dpp->weight_B = restore_weight (*byteptr++);
145 } 145 }
146 146
@@ -170,7 +170,7 @@ int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd)
170 if (wps->wphdr.version == 0x402 && (wps->wphdr.flags & HYBRID_FLAG)) { 170 if (wps->wphdr.version == 0x402 && (wps->wphdr.flags & HYBRID_FLAG)) {
171 byteptr += 2; 171 byteptr += 2;
172 172
173 if (!(wps->wphdr.flags & MONO_DATA)) 173 if (!(wps->wphdr.flags & MONO_FLAG))
174 byteptr += 2; 174 byteptr += 2;
175 } 175 }
176 176
@@ -180,7 +180,7 @@ int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd)
180 dpp->samples_A [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8))); 180 dpp->samples_A [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8)));
181 byteptr += 4; 181 byteptr += 4;
182 182
183 if (!(wps->wphdr.flags & MONO_DATA)) { 183 if (!(wps->wphdr.flags & MONO_FLAG)) {
184 dpp->samples_B [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); 184 dpp->samples_B [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
185 dpp->samples_B [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8))); 185 dpp->samples_B [1] = exp2s ((short)(byteptr [2] + (byteptr [3] << 8)));
186 byteptr += 4; 186 byteptr += 4;
@@ -198,7 +198,7 @@ int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd)
198 dpp->samples_A [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); 198 dpp->samples_A [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
199 byteptr += 2; 199 byteptr += 2;
200 200
201 if (!(wps->wphdr.flags & MONO_DATA)) { 201 if (!(wps->wphdr.flags & MONO_FLAG)) {
202 dpp->samples_B [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); 202 dpp->samples_B [m] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
203 byteptr += 2; 203 byteptr += 2;
204 } 204 }
@@ -322,7 +322,7 @@ int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_co
322 322
323 ///////////////////// handle version 4 mono data ///////////////////////// 323 ///////////////////// handle version 4 mono data /////////////////////////
324 324
325 if (flags & MONO_DATA) { 325 if (flags & MONO_FLAG) {
326 eptr = buffer + sample_count; 326 eptr = buffer + sample_count;
327 i = get_words (buffer, sample_count, flags, &wps->w, &wps->wvbits); 327 i = get_words (buffer, sample_count, flags, &wps->w, &wps->wvbits);
328 328
@@ -394,20 +394,9 @@ int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_co
394 fixup_samples (wps, buffer, i); 394 fixup_samples (wps, buffer, i);
395 395
396 if (flags & FLOAT_DATA) 396 if (flags & FLOAT_DATA)
397 float_normalize (buffer, (flags & MONO_DATA) ? i : i * 2, 397 float_normalize (buffer, (flags & MONO_FLAG) ? i : i * 2,
398 127 - wps->float_norm_exp + wpc->norm_offset); 398 127 - wps->float_norm_exp + wpc->norm_offset);
399 399
400 if (flags & FALSE_STEREO) {
401 int32_t *dptr = buffer + i * 2;
402 int32_t *sptr = buffer + i;
403 int32_t c = i;
404
405 while (c--) {
406 *--dptr = *--sptr;
407 *--dptr = *sptr;
408 }
409 }
410
411 wps->sample_index += i; 400 wps->sample_index += i;
412 wps->crc = crc; 401 wps->crc = crc;
413 402
@@ -706,12 +695,12 @@ static void fixup_samples (WavpackStream *wps, int32_t *buffer, uint32_t sample_
706 shift += 21 - (flags & BYTES_STORED) * 8; // this provides RockBox with 28-bit (+sign) 695 shift += 21 - (flags & BYTES_STORED) * 8; // this provides RockBox with 28-bit (+sign)
707 696
708 if (flags & FLOAT_DATA) { 697 if (flags & FLOAT_DATA) {
709 float_values (wps, buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2); 698 float_values (wps, buffer, (flags & MONO_FLAG) ? sample_count : sample_count * 2);
710 return; 699 return;
711 } 700 }
712 701
713 if (flags & INT32_DATA) { 702 if (flags & INT32_DATA) {
714 uint32_t count = (flags & MONO_DATA) ? sample_count : sample_count * 2; 703 uint32_t count = (flags & MONO_FLAG) ? sample_count : sample_count * 2;
715 int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros; 704 int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros;
716 int ones = wps->int32_ones, dups = wps->int32_dups; 705 int ones = wps->int32_ones, dups = wps->int32_dups;
717 int32_t *dptr = buffer; 706 int32_t *dptr = buffer;
@@ -732,7 +721,7 @@ static void fixup_samples (WavpackStream *wps, int32_t *buffer, uint32_t sample_
732 } 721 }
733 722
734 if (shift > 0) { 723 if (shift > 0) {
735 if (!(flags & MONO_DATA)) 724 if (!(flags & MONO_FLAG))
736 sample_count *= 2; 725 sample_count *= 2;
737 726
738 while (sample_count--) 727 while (sample_count--)
@@ -741,7 +730,7 @@ static void fixup_samples (WavpackStream *wps, int32_t *buffer, uint32_t sample_
741 else if (shift < 0) { 730 else if (shift < 0) {
742 shift = -shift; 731 shift = -shift;
743 732
744 if (!(flags & MONO_DATA)) 733 if (!(flags & MONO_FLAG))
745 sample_count *= 2; 734 sample_count *= 2;
746 735
747 while (sample_count--) 736 while (sample_count--)
diff --git a/apps/codecs/libwavpack/wavpack.h b/apps/codecs/libwavpack/wavpack.h
index 3128328e49..593af7831d 100644
--- a/apps/codecs/libwavpack/wavpack.h
+++ b/apps/codecs/libwavpack/wavpack.h
@@ -76,19 +76,11 @@ typedef struct {
76#define SRATE_LSB 23 76#define SRATE_LSB 23
77#define SRATE_MASK (0xfL << SRATE_LSB) 77#define SRATE_MASK (0xfL << SRATE_LSB)
78 78
79#define FALSE_STEREO 0x40000000 // block is stereo, but data is mono
80
81#define IGNORED_FLAGS 0x18000000 // reserved, but ignore if encountered 79#define IGNORED_FLAGS 0x18000000 // reserved, but ignore if encountered
82#define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping 80#define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping
83#define UNKNOWN_FLAGS 0x80000000 // also reserved, but refuse decode if 81#define UNKNOWN_FLAGS 0xC0000000 // also reserved, but refuse decode if
84 // encountered 82 // encountered
85 83
86#define MONO_DATA (MONO_FLAG | FALSE_STEREO)
87
88#define MIN_STREAM_VERS 0x402 // lowest stream version we'll decode
89#define MAX_STREAM_VERS 0x410 // highest stream version we'll decode
90#define CUR_STREAM_VERS 0x403 // stream version we are writing now
91
92//////////////////////////// WavPack Metadata ///////////////////////////////// 84//////////////////////////// WavPack Metadata /////////////////////////////////
93 85
94// This is an internal representation of metadata. 86// This is an internal representation of metadata.
@@ -434,6 +426,5 @@ void WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount);
434int WavpackStartBlock (WavpackContext *wpc, uchar *begin, uchar *end); 426int WavpackStartBlock (WavpackContext *wpc, uchar *begin, uchar *end);
435int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count); 427int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count);
436uint32_t WavpackFinishBlock (WavpackContext *wpc); 428uint32_t WavpackFinishBlock (WavpackContext *wpc);
437void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block); 429
438void *WavpackGetWrapperLocation (void *first_block);
439 430
diff --git a/apps/codecs/libwavpack/words.c b/apps/codecs/libwavpack/words.c
index c7a8047d03..ccbd77f8f9 100644
--- a/apps/codecs/libwavpack/words.c
+++ b/apps/codecs/libwavpack/words.c
@@ -151,14 +151,14 @@ int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd)
151{ 151{
152 uchar *byteptr = wpmd->data; 152 uchar *byteptr = wpmd->data;
153 153
154 if (wpmd->byte_length != ((wps->wphdr.flags & MONO_DATA) ? 6 : 12)) 154 if (wpmd->byte_length != ((wps->wphdr.flags & MONO_FLAG) ? 6 : 12))
155 return FALSE; 155 return FALSE;
156 156
157 wps->w.c [0].median [0] = exp2s (byteptr [0] + (byteptr [1] << 8)); 157 wps->w.c [0].median [0] = exp2s (byteptr [0] + (byteptr [1] << 8));
158 wps->w.c [0].median [1] = exp2s (byteptr [2] + (byteptr [3] << 8)); 158 wps->w.c [0].median [1] = exp2s (byteptr [2] + (byteptr [3] << 8));
159 wps->w.c [0].median [2] = exp2s (byteptr [4] + (byteptr [5] << 8)); 159 wps->w.c [0].median [2] = exp2s (byteptr [4] + (byteptr [5] << 8));
160 160
161 if (!(wps->wphdr.flags & MONO_DATA)) { 161 if (!(wps->wphdr.flags & MONO_FLAG)) {
162 wps->w.c [1].median [0] = exp2s (byteptr [6] + (byteptr [7] << 8)); 162 wps->w.c [1].median [0] = exp2s (byteptr [6] + (byteptr [7] << 8));
163 wps->w.c [1].median [1] = exp2s (byteptr [8] + (byteptr [9] << 8)); 163 wps->w.c [1].median [1] = exp2s (byteptr [8] + (byteptr [9] << 8));
164 wps->w.c [1].median [2] = exp2s (byteptr [10] + (byteptr [11] << 8)); 164 wps->w.c [1].median [2] = exp2s (byteptr [10] + (byteptr [11] << 8));
@@ -215,7 +215,7 @@ int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd)
215 wps->w.c [0].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8)); 215 wps->w.c [0].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8));
216 byteptr += 2; 216 byteptr += 2;
217 217
218 if (!(wps->wphdr.flags & MONO_DATA)) { 218 if (!(wps->wphdr.flags & MONO_FLAG)) {
219 wps->w.c [1].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8)); 219 wps->w.c [1].slow_level = exp2s (byteptr [0] + (byteptr [1] << 8));
220 byteptr += 2; 220 byteptr += 2;
221 } 221 }
@@ -224,7 +224,7 @@ int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd)
224 wps->w.bitrate_acc [0] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; 224 wps->w.bitrate_acc [0] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16;
225 byteptr += 2; 225 byteptr += 2;
226 226
227 if (!(wps->wphdr.flags & MONO_DATA)) { 227 if (!(wps->wphdr.flags & MONO_FLAG)) {
228 wps->w.bitrate_acc [1] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; 228 wps->w.bitrate_acc [1] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16;
229 byteptr += 2; 229 byteptr += 2;
230 } 230 }
@@ -233,7 +233,7 @@ int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd)
233 wps->w.bitrate_delta [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); 233 wps->w.bitrate_delta [0] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
234 byteptr += 2; 234 byteptr += 2;
235 235
236 if (!(wps->wphdr.flags & MONO_DATA)) { 236 if (!(wps->wphdr.flags & MONO_FLAG)) {
237 wps->w.bitrate_delta [1] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8))); 237 wps->w.bitrate_delta [1] = exp2s ((short)(byteptr [0] + (byteptr [1] << 8)));
238 byteptr += 2; 238 byteptr += 2;
239 } 239 }
@@ -257,7 +257,7 @@ void update_error_limit (struct words_data *w, uint32_t flags)
257{ 257{
258 int bitrate_0 = (w->bitrate_acc [0] += w->bitrate_delta [0]) >> 16; 258 int bitrate_0 = (w->bitrate_acc [0] += w->bitrate_delta [0]) >> 16;
259 259
260 if (flags & MONO_DATA) { 260 if (flags & MONO_FLAG) {
261 if (flags & HYBRID_BITRATE) { 261 if (flags & HYBRID_BITRATE) {
262 int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS; 262 int slow_log_0 = (w->c [0].slow_level + SLO) >> SLS;
263 263
@@ -326,13 +326,13 @@ int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags,
326 register struct entropy_data *c = w->c; 326 register struct entropy_data *c = w->c;
327 int csamples; 327 int csamples;
328 328
329 if (!(flags & MONO_DATA)) 329 if (!(flags & MONO_FLAG))
330 nsamples *= 2; 330 nsamples *= 2;
331 331
332 for (csamples = 0; csamples < nsamples; ++csamples) { 332 for (csamples = 0; csamples < nsamples; ++csamples) {
333 uint32_t ones_count, low, mid, high; 333 uint32_t ones_count, low, mid, high;
334 334
335 if (!(flags & MONO_DATA)) 335 if (!(flags & MONO_FLAG))
336 c = w->c + (csamples & 1); 336 c = w->c + (csamples & 1);
337 337
338 if (!(w->c [0].median [0] & ~1) && !w->holding_zero && !w->holding_one && !(w->c [1].median [0] & ~1)) { 338 if (!(w->c [0].median [0] & ~1) && !w->holding_zero && !w->holding_one && !(w->c [1].median [0] & ~1)) {
@@ -435,7 +435,7 @@ int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags,
435 w->holding_zero = ~w->holding_one & 1; 435 w->holding_zero = ~w->holding_one & 1;
436 } 436 }
437 437
438 if ((flags & HYBRID_FLAG) && ((flags & MONO_DATA) || !(csamples & 1))) 438 if ((flags & HYBRID_FLAG) && ((flags & MONO_FLAG) || !(csamples & 1)))
439 update_error_limit (w, flags); 439 update_error_limit (w, flags);
440 440
441 if (ones_count == 0) { 441 if (ones_count == 0) {
@@ -484,7 +484,7 @@ int32_t get_words (int32_t *buffer, int nsamples, uint32_t flags,
484 c->slow_level = c->slow_level - ((c->slow_level + SLO) >> SLS) + mylog2 (mid); 484 c->slow_level = c->slow_level - ((c->slow_level + SLO) >> SLS) + mylog2 (mid);
485 } 485 }
486 486
487 return (flags & MONO_DATA) ? csamples : (csamples / 2); 487 return (flags & MONO_FLAG) ? csamples : (csamples / 2);
488} 488}
489 489
490// Read a single unsigned value from the specified bitstream with a value 490// Read a single unsigned value from the specified bitstream with a value
diff --git a/apps/codecs/libwavpack/wputils.c b/apps/codecs/libwavpack/wputils.c
index 7fabc7ab34..7a6cc44ad4 100644
--- a/apps/codecs/libwavpack/wputils.c
+++ b/apps/codecs/libwavpack/wputils.c
@@ -69,10 +69,9 @@ WavpackContext *WavpackOpenFileInput (read_stream infile, char *error)
69 return NULL; 69 return NULL;
70 } 70 }
71 71
72 if ((wps->wphdr.flags & UNKNOWN_FLAGS) || wps->wphdr.version < MIN_STREAM_VERS || 72 if ((wps->wphdr.flags & UNKNOWN_FLAGS) || wps->wphdr.version < 0x402 || wps->wphdr.version > 0x40f) {
73 wps->wphdr.version > MAX_STREAM_VERS) { 73 strcpy_loc (error, "invalid WavPack file!");
74 strcpy_loc (error, "invalid WavPack file!"); 74 return NULL;
75 return NULL;
76 } 75 }
77 76
78 if (wps->wphdr.block_samples && wps->wphdr.total_samples != (uint32_t) -1) 77 if (wps->wphdr.block_samples && wps->wphdr.total_samples != (uint32_t) -1)
@@ -171,7 +170,7 @@ uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t sa
171 if (bcount == (uint32_t) -1) 170 if (bcount == (uint32_t) -1)
172 break; 171 break;
173 172
174 if (wps->wphdr.version < MIN_STREAM_VERS || wps->wphdr.version > MAX_STREAM_VERS) { 173 if (wps->wphdr.version < 0x402 || wps->wphdr.version > 0x40f) {
175 strcpy_loc (wpc->error_message, "invalid WavPack file!"); 174 strcpy_loc (wpc->error_message, "invalid WavPack file!");
176 break; 175 break;
177 } 176 }
@@ -342,8 +341,7 @@ static uint32_t read_next_header (read_stream infile, WavpackHeader *wphdr)
342 sp = buffer; 341 sp = buffer;
343 342
344 if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' && 343 if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' &&
345 !(*++sp & 1) && sp [2] < 16 && !sp [3] && sp [5] == 4 && 344 !(*++sp & 1) && sp [2] < 16 && !sp [3] && sp [5] == 4 && sp [4] >= 2 && sp [4] <= 0xf) {
346 sp [4] >= (MIN_STREAM_VERS & 0xff) && sp [4] <= (MAX_STREAM_VERS & 0xff)) {
347 memcpy (wphdr, buffer, sizeof (*wphdr)); 345 memcpy (wphdr, buffer, sizeof (*wphdr));
348 little_endian_to_native (wphdr, WavpackHeaderFormat); 346 little_endian_to_native (wphdr, WavpackHeaderFormat);
349 return bytes_skipped; 347 return bytes_skipped;
@@ -454,7 +452,7 @@ int WavpackSetConfiguration (WavpackContext *wpc, WavpackConfig *config, uint32_
454 memcpy (wps->wphdr.ckID, "wvpk", 4); 452 memcpy (wps->wphdr.ckID, "wvpk", 4);
455 wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; 453 wps->wphdr.ckSize = sizeof (WavpackHeader) - 8;
456 wps->wphdr.total_samples = wpc->total_samples; 454 wps->wphdr.total_samples = wpc->total_samples;
457 wps->wphdr.version = CUR_STREAM_VERS; 455 wps->wphdr.version = 0x403;
458 wps->wphdr.flags = flags; 456 wps->wphdr.flags = flags;
459 457
460 pack_init (wpc); 458 pack_init (wpc);