summaryrefslogtreecommitdiff
path: root/apps/codecs/libwavpack/unpack.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libwavpack/unpack.c')
-rw-r--r--apps/codecs/libwavpack/unpack.c463
1 files changed, 343 insertions, 120 deletions
diff --git a/apps/codecs/libwavpack/unpack.c b/apps/codecs/libwavpack/unpack.c
index cc31b8808e..ae473787a7 100644
--- a/apps/codecs/libwavpack/unpack.c
+++ b/apps/codecs/libwavpack/unpack.c
@@ -18,20 +18,34 @@
18#include <string.h> 18#include <string.h>
19#include <math.h> 19#include <math.h>
20 20
21static void strcpy_loc (char *dst, char *src) { while (*src) *dst++ = *src++; *dst = 0; }
22
21#define LOSSY_MUTE 23#define LOSSY_MUTE
22 24
23//////////////////////////////// local macros ///////////////////////////////// 25//////////////////////////////// local macros /////////////////////////////////
24 26
27// these macros implement the weight application and update operations
28// that are at the heart of the decorrelation loops
29
25#define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10) 30#define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10)
26 31
27#define apply_weight_f(weight, sample) (((((sample & 0xffff) * weight) >> 9) + \ 32#define apply_weight_f(weight, sample) (((((sample & 0xffff) * weight) >> 9) + \
28 (((sample & ~0xffff) >> 9) * weight) + 1) >> 1) 33 (((sample & ~0xffff) >> 9) * weight) + 1) >> 1)
29 34
35#if 1 // PERFCOND
30#define apply_weight(weight, sample) (sample != (short) sample ? \ 36#define apply_weight(weight, sample) (sample != (short) sample ? \
31 apply_weight_f (weight, sample) : apply_weight_i (weight, sample)) 37 apply_weight_f (weight, sample) : apply_weight_i (weight, sample))
38#else
39#define apply_weight(weight, sample) ((int32_t)((weight * (int64_t) sample + 512) >> 10))
40#endif
32 41
42#if 1 // PERFCOND
33#define update_weight(weight, delta, source, result) \ 43#define update_weight(weight, delta, source, result) \
34 if (source && result) weight -= ((((source ^ result) >> 30) & 2) - 1) * delta; 44 if (source && result) weight -= ((((source ^ result) >> 30) & 2) - 1) * delta;
45#else
46#define update_weight(weight, delta, source, result) \
47 if (source && result) (source ^ result) < 0 ? (weight -= delta) : (weight += delta);
48#endif
35 49
36#define update_weight_clip(weight, delta, source, result) \ 50#define update_weight_clip(weight, delta, source, result) \
37 if (source && result && ((source ^ result) < 0 ? (weight -= delta) < -1024 : (weight += delta) > 1024)) \ 51 if (source && result && ((source ^ result) < 0 ? (weight -= delta) < -1024 : (weight += delta) > 1024)) \
@@ -61,7 +75,7 @@ int unpack_init (WavpackContext *wpc)
61 75
62 while (read_metadata_buff (wpc, &wpmd)) { 76 while (read_metadata_buff (wpc, &wpmd)) {
63 if (!process_metadata (wpc, &wpmd)) { 77 if (!process_metadata (wpc, &wpmd)) {
64 /*strcpy (wpc->error_message, "invalid metadata!");*/ 78 strcpy_loc (wpc->error_message, "invalid metadata!");
65 return FALSE; 79 return FALSE;
66 } 80 }
67 81
@@ -70,7 +84,7 @@ int unpack_init (WavpackContext *wpc)
70 } 84 }
71 85
72 if (wps->wphdr.block_samples && !bs_is_open (&wps->wvbits)) { 86 if (wps->wphdr.block_samples && !bs_is_open (&wps->wvbits)) {
73 /*strcpy (wpc->error_message, "invalid WavPack file!");*/ 87 strcpy_loc (wpc->error_message, "invalid WavPack file!");
74 return FALSE; 88 return FALSE;
75 } 89 }
76 90
@@ -301,6 +315,9 @@ int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd)
301// samples unpacked, which can be less than the number requested if an error 315// samples unpacked, which can be less than the number requested if an error
302// occurs or the end of the block is reached. 316// occurs or the end of the block is reached.
303 317
318static void decorr_mono_pass (struct decorr_pass *dpp, long *buffer, long sample_count);
319static void decorr_stereo_pass (struct decorr_pass *dpp, long *buffer, long sample_count);
320static void decorr_stereo_pass_cont (struct decorr_pass *dpp, long *buffer, long sample_count);
304static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count); 321static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count);
305 322
306long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count) 323long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
@@ -309,8 +326,8 @@ long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
309 ulong flags = wps->wphdr.flags, crc = wps->crc, i; 326 ulong flags = wps->wphdr.flags, crc = wps->crc, i;
310 long mute_limit = (1L << ((flags & MAG_MASK) >> MAG_LSB)) + 2; 327 long mute_limit = (1L << ((flags & MAG_MASK) >> MAG_LSB)) + 2;
311 struct decorr_pass *dpp; 328 struct decorr_pass *dpp;
312 long read_word, *bptr; 329 long *bptr, *eptr;
313 int tcount, m = 0; 330 int tcount;
314 331
315 if (wps->sample_index + sample_count > wps->wphdr.block_index + wps->wphdr.block_samples) 332 if (wps->sample_index + sample_count > wps->wphdr.block_index + wps->wphdr.block_samples)
316 sample_count = wps->wphdr.block_index + wps->wphdr.block_samples - wps->sample_index; 333 sample_count = wps->wphdr.block_index + wps->wphdr.block_samples - wps->sample_index;
@@ -326,121 +343,59 @@ long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
326 343
327 ///////////////////// handle version 4 mono data ///////////////////////// 344 ///////////////////// handle version 4 mono data /////////////////////////
328 345
329 if (flags & MONO_FLAG) 346 if (flags & MONO_FLAG) {
330 for (bptr = buffer, i = 0; i < sample_count; ++i) { 347 eptr = buffer + sample_count;
331 if ((read_word = get_word (wps, 0)) == WORD_EOF) 348 i = get_words (wps, 1, sample_count, buffer);
332 break;
333
334 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) {
335 long sam, temp;
336 int k;
337
338 if (dpp->term > MAX_TERM) {
339 if (dpp->term & 1)
340 sam = 2 * dpp->samples_A [0] - dpp->samples_A [1];
341 else
342 sam = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
343 349
344 dpp->samples_A [1] = dpp->samples_A [0]; 350 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
345 k = 0; 351 decorr_mono_pass (dpp, buffer, sample_count);
346 }
347 else {
348 sam = dpp->samples_A [m];
349 k = (m + dpp->term) & (MAX_TERM - 1);
350 }
351
352 temp = apply_weight (dpp->weight_A, sam) + read_word;
353 update_weight (dpp->weight_A, dpp->delta, sam, read_word);
354 dpp->samples_A [k] = read_word = temp;
355 }
356 352
357 if (labs (read_word) > mute_limit) 353 for (bptr = buffer; bptr < eptr; ++bptr) {
354 if (labs (bptr [0]) > mute_limit) {
355 i = bptr - buffer;
358 break; 356 break;
357 }
359 358
360 m = (m + 1) & (MAX_TERM - 1); 359 crc = crc * 3 + bptr [0];
361 crc = crc * 3 + read_word;
362 *bptr++ = read_word;
363 } 360 }
361 }
364 362
365 //////////////////// handle version 4 stereo data //////////////////////// 363 //////////////////// handle version 4 stereo data ////////////////////////
366 364
367 else 365 else {
368 for (bptr = buffer, i = 0; i < sample_count; ++i) { 366 eptr = buffer + (sample_count * 2);
369 long left, right, left2, right2; 367 i = get_words (wps, 2, sample_count, buffer);
370
371 if ((left = get_word (wps, 0)) == WORD_EOF ||
372 (right = get_word (wps, 1)) == WORD_EOF)
373 break;
374 368
369 if (sample_count < 16)
375 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) 370 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
376 if (dpp->term > 0) { 371 decorr_stereo_pass (dpp, buffer, sample_count);
377 long sam_A, sam_B; 372 else
378 int k; 373 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) {
379 374 decorr_stereo_pass (dpp, buffer, 8);
380 if (dpp->term > MAX_TERM) { 375 decorr_stereo_pass_cont (dpp, buffer + 16, sample_count - 8);
381 if (dpp->term & 1) { 376 }
382 sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
383 sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1];
384 }
385 else {
386 sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
387 sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
388 }
389
390 dpp->samples_A [1] = dpp->samples_A [0];
391 dpp->samples_B [1] = dpp->samples_B [0];
392 k = 0;
393 }
394 else {
395 sam_A = dpp->samples_A [m];
396 sam_B = dpp->samples_B [m];
397 k = (m + dpp->term) & (MAX_TERM - 1);
398 }
399
400 left2 = apply_weight (dpp->weight_A, sam_A) + left;
401 right2 = apply_weight (dpp->weight_B, sam_B) + right;
402
403 update_weight (dpp->weight_A, dpp->delta, sam_A, left);
404 update_weight (dpp->weight_B, dpp->delta, sam_B, right);
405
406 dpp->samples_A [k] = left = left2;
407 dpp->samples_B [k] = right = right2;
408 }
409 else if (dpp->term == -1) {
410 left2 = left + apply_weight (dpp->weight_A, dpp->samples_A [0]);
411 update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], left);
412 left = left2;
413 right2 = right + apply_weight (dpp->weight_B, left2);
414 update_weight_clip (dpp->weight_B, dpp->delta, left2, right);
415 dpp->samples_A [0] = right = right2;
416 }
417 else {
418 right2 = right + apply_weight (dpp->weight_B, dpp->samples_B [0]);
419 update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], right);
420 right = right2;
421
422 if (dpp->term == -3) {
423 right2 = dpp->samples_A [0];
424 dpp->samples_A [0] = right;
425 }
426
427 left2 = left + apply_weight (dpp->weight_A, right2);
428 update_weight_clip (dpp->weight_A, dpp->delta, right2, left);
429 dpp->samples_B [0] = left = left2;
430 }
431 377
432 m = (m + 1) & (MAX_TERM - 1); 378 if (flags & JOINT_STEREO)
379 for (bptr = buffer; bptr < eptr; bptr += 2) {
380 bptr [0] += (bptr [1] -= (bptr [0] >> 1));
433 381
434 if (flags & JOINT_STEREO) 382 if (labs (bptr [0]) > mute_limit || labs (bptr [1]) > mute_limit) {
435 left += (right -= (left >> 1)); 383 i = (bptr - buffer) / 2;
384 break;
385 }
436 386
437 if (labs (left) > mute_limit || labs (right) > mute_limit) 387 crc = (crc * 3 + bptr [0]) * 3 + bptr [1];
438 break; 388 }
389 else
390 for (bptr = buffer; bptr < eptr; bptr += 2) {
391 if (labs (bptr [0]) > mute_limit || labs (bptr [1]) > mute_limit) {
392 i = (bptr - buffer) / 2;
393 break;
394 }
439 395
440 crc = (crc * 3 + left) * 3 + right; 396 crc = (crc * 3 + bptr [0]) * 3 + bptr [1];
441 *bptr++ = left; 397 }
442 *bptr++ = right; 398 }
443 }
444 399
445 if (i != sample_count) { 400 if (i != sample_count) {
446 memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8)); 401 memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8));
@@ -448,17 +403,6 @@ long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
448 i = sample_count; 403 i = sample_count;
449 } 404 }
450 405
451 while (m--)
452 for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++)
453 if (dpp->term > 0 && dpp->term <= MAX_TERM) {
454 long temp = dpp->samples_A [0];
455 memcpy (dpp->samples_A, dpp->samples_A + 1, sizeof (dpp->samples_A) - sizeof (dpp->samples_A [0]));
456 dpp->samples_A [MAX_TERM - 1] = temp;
457 temp = dpp->samples_B [0];
458 memcpy (dpp->samples_B, dpp->samples_B + 1, sizeof (dpp->samples_B) - sizeof (dpp->samples_B [0]));
459 dpp->samples_B [MAX_TERM - 1] = temp;
460 }
461
462 fixup_samples (wps, buffer, i); 406 fixup_samples (wps, buffer, i);
463 407
464 if (flags & FLOAT_DATA) 408 if (flags & FLOAT_DATA)
@@ -471,6 +415,286 @@ long unpack_samples (WavpackContext *wpc, long *buffer, ulong sample_count)
471 return i; 415 return i;
472} 416}
473 417
418static void decorr_stereo_pass (struct decorr_pass *dpp, long *buffer, long sample_count)
419{
420 long delta = dpp->delta, weight_A = dpp->weight_A, weight_B = dpp->weight_B;
421 long *bptr, *eptr = buffer + (sample_count * 2), sam_A, sam_B;
422 int m, k;
423
424 switch (dpp->term) {
425
426 case 17:
427 for (bptr = buffer; bptr < eptr; bptr += 2) {
428 sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
429 dpp->samples_A [1] = dpp->samples_A [0];
430 dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0];
431 update_weight (weight_A, delta, sam_A, bptr [0]);
432 bptr [0] = dpp->samples_A [0];
433
434 sam_A = 2 * dpp->samples_B [0] - dpp->samples_B [1];
435 dpp->samples_B [1] = dpp->samples_B [0];
436 dpp->samples_B [0] = apply_weight (weight_B, sam_A) + bptr [1];
437 update_weight (weight_B, delta, sam_A, bptr [1]);
438 bptr [1] = dpp->samples_B [0];
439 }
440
441 break;
442
443 case 18:
444 for (bptr = buffer; bptr < eptr; bptr += 2) {
445 sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
446 dpp->samples_A [1] = dpp->samples_A [0];
447 dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0];
448 update_weight (weight_A, delta, sam_A, bptr [0]);
449 bptr [0] = dpp->samples_A [0];
450
451 sam_A = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1;
452 dpp->samples_B [1] = dpp->samples_B [0];
453 dpp->samples_B [0] = apply_weight (weight_B, sam_A) + bptr [1];
454 update_weight (weight_B, delta, sam_A, bptr [1]);
455 bptr [1] = dpp->samples_B [0];
456 }
457
458 break;
459
460 default:
461 for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr += 2) {
462 sam_A = dpp->samples_A [m];
463 dpp->samples_A [k] = apply_weight (weight_A, sam_A) + bptr [0];
464 update_weight (weight_A, delta, sam_A, bptr [0]);
465 bptr [0] = dpp->samples_A [k];
466
467 sam_A = dpp->samples_B [m];
468 dpp->samples_B [k] = apply_weight (weight_B, sam_A) + bptr [1];
469 update_weight (weight_B, delta, sam_A, bptr [1]);
470 bptr [1] = dpp->samples_B [k];
471
472 m = (m + 1) & (MAX_TERM - 1);
473 k = (k + 1) & (MAX_TERM - 1);
474 }
475
476 if (m) {
477 long temp_samples [MAX_TERM];
478
479 memcpy (temp_samples, dpp->samples_A, sizeof (dpp->samples_A));
480
481 for (k = 0; k < MAX_TERM; k++, m++)
482 dpp->samples_A [k] = temp_samples [m & (MAX_TERM - 1)];
483
484 memcpy (temp_samples, dpp->samples_B, sizeof (dpp->samples_B));
485
486 for (k = 0; k < MAX_TERM; k++, m++)
487 dpp->samples_B [k] = temp_samples [m & (MAX_TERM - 1)];
488 }
489
490 break;
491
492 case -1:
493 for (bptr = buffer; bptr < eptr; bptr += 2) {
494 sam_A = bptr [0] + apply_weight (weight_A, dpp->samples_A [0]);
495 update_weight_clip (weight_A, delta, dpp->samples_A [0], bptr [0]);
496 bptr [0] = sam_A;
497 dpp->samples_A [0] = bptr [1] + apply_weight (weight_B, sam_A);
498 update_weight_clip (weight_B, delta, sam_A, bptr [1]);
499 bptr [1] = dpp->samples_A [0];
500 }
501
502 break;
503
504 case -2:
505 for (bptr = buffer; bptr < eptr; bptr += 2) {
506 sam_B = bptr [1] + apply_weight (weight_B, dpp->samples_B [0]);
507 update_weight_clip (weight_B, delta, dpp->samples_B [0], bptr [1]);
508 bptr [1] = sam_B;
509 dpp->samples_B [0] = bptr [0] + apply_weight (weight_A, sam_B);
510 update_weight_clip (weight_A, delta, sam_B, bptr [0]);
511 bptr [0] = dpp->samples_B [0];
512 }
513
514 break;
515
516 case -3:
517 for (bptr = buffer; bptr < eptr; bptr += 2) {
518 sam_A = bptr [0] + apply_weight (weight_A, dpp->samples_A [0]);
519 update_weight_clip (weight_A, delta, dpp->samples_A [0], bptr [0]);
520 sam_B = bptr [1] + apply_weight (weight_B, dpp->samples_B [0]);
521 update_weight_clip (weight_B, delta, dpp->samples_B [0], bptr [1]);
522 bptr [0] = dpp->samples_B [0] = sam_A;
523 bptr [1] = dpp->samples_A [0] = sam_B;
524 }
525
526 break;
527 }
528
529 dpp->weight_A = weight_A;
530 dpp->weight_B = weight_B;
531}
532
533static void decorr_stereo_pass_cont (struct decorr_pass *dpp, long *buffer, long sample_count)
534{
535 long delta = dpp->delta, weight_A = dpp->weight_A, weight_B = dpp->weight_B;
536 long *bptr, *tptr, *eptr = buffer + (sample_count * 2), sam_A, sam_B;
537 int k;
538
539 switch (dpp->term) {
540
541 case 17:
542 for (bptr = buffer; bptr < eptr; bptr += 2) {
543 sam_A = 2 * bptr [-2] - bptr [-4];
544 bptr [0] = apply_weight (weight_A, sam_A) + (sam_B = bptr [0]);
545 update_weight (weight_A, delta, sam_A, sam_B);
546
547 sam_A = 2 * bptr [-1] - bptr [-3];
548 bptr [1] = apply_weight (weight_B, sam_A) + (sam_B = bptr [1]);
549 update_weight (weight_B, delta, sam_A, sam_B);
550 }
551
552 dpp->samples_B [0] = bptr [-1];
553 dpp->samples_A [0] = bptr [-2];
554 dpp->samples_B [1] = bptr [-3];
555 dpp->samples_A [1] = bptr [-4];
556 break;
557
558 case 18:
559 for (bptr = buffer; bptr < eptr; bptr += 2) {
560 sam_A = (3 * bptr [-2] - bptr [-4]) >> 1;
561 bptr [0] = apply_weight (weight_A, sam_A) + (sam_B = bptr [0]);
562 update_weight (weight_A, delta, sam_A, sam_B);
563
564 sam_A = (3 * bptr [-1] - bptr [-3]) >> 1;
565 bptr [1] = apply_weight (weight_B, sam_A) + (sam_B = bptr [1]);
566 update_weight (weight_B, delta, sam_A, sam_B);
567 }
568
569 dpp->samples_B [0] = bptr [-1];
570 dpp->samples_A [0] = bptr [-2];
571 dpp->samples_B [1] = bptr [-3];
572 dpp->samples_A [1] = bptr [-4];
573 break;
574
575 default:
576 for (bptr = buffer, tptr = buffer - (dpp->term * 2); bptr < eptr; bptr += 2, tptr += 2) {
577 bptr [0] = apply_weight (weight_A, tptr [0]) + (sam_A = bptr [0]);
578 update_weight (weight_A, delta, tptr [0], sam_A);
579
580 bptr [1] = apply_weight (weight_B, tptr [1]) + (sam_A = bptr [1]);
581 update_weight (weight_B, delta, tptr [1], sam_A);
582 }
583
584 k = dpp->term;
585 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-1];
586 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-2];
587 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-3];
588 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-4];
589 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-5];
590 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-6];
591 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-7];
592 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-8];
593 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-9];
594 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-10];
595 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-11];
596 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-12];
597 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-13];
598 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-14];
599 dpp->samples_B [--k & (MAX_TERM - 1)] = bptr [-15];
600 dpp->samples_A [ k & (MAX_TERM - 1)] = bptr [-16];
601 break;
602
603 case -1:
604 for (bptr = buffer; bptr < eptr; bptr += 2) {
605 bptr [0] = apply_weight (weight_A, bptr [-1]) + (sam_A = bptr [0]);
606 update_weight_clip (weight_A, delta, bptr [-1], sam_A);
607 bptr [1] = apply_weight (weight_B, bptr [0]) + (sam_A = bptr [1]);
608 update_weight_clip (weight_B, delta, bptr [0], sam_A);
609 }
610
611 dpp->samples_A [0] = bptr [-1];
612 break;
613
614 case -2:
615 for (bptr = buffer; bptr < eptr; bptr += 2) {
616 bptr [1] = apply_weight (weight_B, bptr [-2]) + (sam_A = bptr [1]);
617 update_weight_clip (weight_B, delta, bptr [-2], sam_A);
618 bptr [0] = apply_weight (weight_A, bptr [1]) + (sam_A = bptr [0]);
619 update_weight_clip (weight_A, delta, bptr [1], sam_A);
620 }
621
622 dpp->samples_B [0] = bptr [-2];
623 break;
624
625 case -3:
626 for (bptr = buffer; bptr < eptr; bptr += 2) {
627 bptr [0] = apply_weight (weight_A, bptr [-1]) + (sam_A = bptr [0]);
628 update_weight_clip (weight_A, delta, bptr [-1], sam_A);
629 bptr [1] = apply_weight (weight_B, bptr [-2]) + (sam_A = bptr [1]);
630 update_weight_clip (weight_B, delta, bptr [-2], sam_A);
631 }
632
633 dpp->samples_A [0] = bptr [-1];
634 dpp->samples_B [0] = bptr [-2];
635 break;
636 }
637
638 dpp->weight_A = weight_A;
639 dpp->weight_B = weight_B;
640}
641
642static void decorr_mono_pass (struct decorr_pass *dpp, long *buffer, long sample_count)
643{
644 long delta = dpp->delta, weight_A = dpp->weight_A;
645 long *bptr, *eptr = buffer + sample_count, sam_A;
646 int m, k;
647
648 switch (dpp->term) {
649
650 case 17:
651 for (bptr = buffer; bptr < eptr; bptr++) {
652 sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1];
653 dpp->samples_A [1] = dpp->samples_A [0];
654 dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0];
655 update_weight (weight_A, delta, sam_A, bptr [0]);
656 bptr [0] = dpp->samples_A [0];
657 }
658
659 break;
660
661 case 18:
662 for (bptr = buffer; bptr < eptr; bptr++) {
663 sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1;
664 dpp->samples_A [1] = dpp->samples_A [0];
665 dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0];
666 update_weight (weight_A, delta, sam_A, bptr [0]);
667 bptr [0] = dpp->samples_A [0];
668 }
669
670 break;
671
672 default:
673 for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr++) {
674 sam_A = dpp->samples_A [m];
675 dpp->samples_A [k] = apply_weight (weight_A, sam_A) + bptr [0];
676 update_weight (weight_A, delta, sam_A, bptr [0]);
677 bptr [0] = dpp->samples_A [k];
678 m = (m + 1) & (MAX_TERM - 1);
679 k = (k + 1) & (MAX_TERM - 1);
680 }
681
682 if (m) {
683 long temp_samples [MAX_TERM];
684
685 memcpy (temp_samples, dpp->samples_A, sizeof (dpp->samples_A));
686
687 for (k = 0; k < MAX_TERM; k++, m++)
688 dpp->samples_A [k] = temp_samples [m & (MAX_TERM - 1)];
689 }
690
691 break;
692 }
693
694 dpp->weight_A = weight_A;
695}
696
697
474// This is a helper function for unpack_samples() that applies several final 698// This is a helper function for unpack_samples() that applies several final
475// operations. First, if the data is 32-bit float data, then that conversion 699// operations. First, if the data is 32-bit float data, then that conversion
476// is done in the float.c module (whether lossy or lossless) and we return. 700// is done in the float.c module (whether lossy or lossless) and we return.
@@ -513,7 +737,6 @@ static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count)
513 737
514 if (flags & HYBRID_FLAG) { 738 if (flags & HYBRID_FLAG) {
515 long min_value, max_value, min_shifted, max_shifted; 739 long min_value, max_value, min_shifted, max_shifted;
516 min_value = max_value = min_shifted = max_shifted = 0;
517 740
518 switch (flags & BYTES_STORED) { 741 switch (flags & BYTES_STORED) {
519 case 0: 742 case 0:
@@ -532,9 +755,9 @@ static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count)
532 break; 755 break;
533 756
534 case 3: 757 case 3:
535 // 0x80000000 is the same as 2147483648 758 default:
536 min_shifted = (min_value = -0x80000000 >> shift) << shift; 759 min_shifted = (min_value = (long) 0x80000000 >> shift) << shift;
537 max_shifted = (max_value = 0x80000000 >> shift) << shift; 760 max_shifted = (max_value = (long) 0x7FFFFFFF >> shift) << shift;
538 break; 761 break;
539 } 762 }
540 763