diff options
Diffstat (limited to 'apps/codecs/libwavpack/unpack.c')
-rw-r--r-- | apps/codecs/libwavpack/unpack.c | 50 |
1 files changed, 13 insertions, 37 deletions
diff --git a/apps/codecs/libwavpack/unpack.c b/apps/codecs/libwavpack/unpack.c index a3a689ebb6..8f5c1ee46f 100644 --- a/apps/codecs/libwavpack/unpack.c +++ b/apps/codecs/libwavpack/unpack.c | |||
@@ -675,11 +675,17 @@ static void decorr_mono_pass (struct decorr_pass *dpp, long *buffer, long sample | |||
675 | // it is clipped and shifted in a single operation. Otherwise, if it's | 675 | // it is clipped and shifted in a single operation. Otherwise, if it's |
676 | // lossless then the last step is to apply the final shift (if any). | 676 | // lossless then the last step is to apply the final shift (if any). |
677 | 677 | ||
678 | // This function has been modified for RockBox to return all integer samples | ||
679 | // as 28-bits, and clipping (for lossy mode) has been eliminated because this | ||
680 | // now happens in the dsp module. | ||
681 | |||
678 | static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count) | 682 | static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count) |
679 | { | 683 | { |
680 | ulong flags = wps->wphdr.flags; | 684 | ulong flags = wps->wphdr.flags; |
681 | int shift = (flags & SHIFT_MASK) >> SHIFT_LSB; | 685 | int shift = (flags & SHIFT_MASK) >> SHIFT_LSB; |
682 | 686 | ||
687 | shift += 20 - (flags & BYTES_STORED) * 8; // this provides RockBox with 28-bit data | ||
688 | |||
683 | if (flags & FLOAT_DATA) { | 689 | if (flags & FLOAT_DATA) { |
684 | float_values (wps, buffer, (flags & MONO_FLAG) ? sample_count : sample_count * 2); | 690 | float_values (wps, buffer, (flags & MONO_FLAG) ? sample_count : sample_count * 2); |
685 | return; | 691 | return; |
@@ -689,7 +695,6 @@ static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count) | |||
689 | ulong count = (flags & MONO_FLAG) ? sample_count : sample_count * 2; | 695 | ulong count = (flags & MONO_FLAG) ? sample_count : sample_count * 2; |
690 | int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros; | 696 | int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros; |
691 | int ones = wps->int32_ones, dups = wps->int32_dups; | 697 | int ones = wps->int32_ones, dups = wps->int32_dups; |
692 | // ulong mask = (1 << sent_bits) - 1; | ||
693 | long *dptr = buffer; | 698 | long *dptr = buffer; |
694 | 699 | ||
695 | if (!(flags & HYBRID_FLAG) && !sent_bits && (zeros + ones + dups)) | 700 | if (!(flags & HYBRID_FLAG) && !sent_bits && (zeros + ones + dups)) |
@@ -707,50 +712,21 @@ static void fixup_samples (WavpackStream *wps, long *buffer, ulong sample_count) | |||
707 | shift += zeros + sent_bits + ones + dups; | 712 | shift += zeros + sent_bits + ones + dups; |
708 | } | 713 | } |
709 | 714 | ||
710 | if (flags & HYBRID_FLAG) { | 715 | if (shift > 0) { |
711 | long min_value, max_value, min_shifted, max_shifted; | ||
712 | |||
713 | switch (flags & BYTES_STORED) { | ||
714 | case 0: | ||
715 | min_shifted = (min_value = -128 >> shift) << shift; | ||
716 | max_shifted = (max_value = 127 >> shift) << shift; | ||
717 | break; | ||
718 | |||
719 | case 1: | ||
720 | min_shifted = (min_value = -32768 >> shift) << shift; | ||
721 | max_shifted = (max_value = 32767 >> shift) << shift; | ||
722 | break; | ||
723 | |||
724 | case 2: | ||
725 | min_shifted = (min_value = -8388608 >> shift) << shift; | ||
726 | max_shifted = (max_value = 8388607 >> shift) << shift; | ||
727 | break; | ||
728 | |||
729 | case 3: | ||
730 | default: | ||
731 | min_shifted = (min_value = (long) 0x80000000 >> shift) << shift; | ||
732 | max_shifted = (max_value = (long) 0x7FFFFFFF >> shift) << shift; | ||
733 | break; | ||
734 | } | ||
735 | |||
736 | if (!(flags & MONO_FLAG)) | 716 | if (!(flags & MONO_FLAG)) |
737 | sample_count *= 2; | 717 | sample_count *= 2; |
738 | 718 | ||
739 | while (sample_count--) { | 719 | while (sample_count--) |
740 | if (*buffer < min_value) | 720 | *buffer++ <<= shift; |
741 | *buffer++ = min_shifted; | ||
742 | else if (*buffer > max_value) | ||
743 | *buffer++ = max_shifted; | ||
744 | else | ||
745 | *buffer++ <<= shift; | ||
746 | } | ||
747 | } | 721 | } |
748 | else if (shift) { | 722 | else if (shift < 0) { |
723 | shift = -shift; | ||
724 | |||
749 | if (!(flags & MONO_FLAG)) | 725 | if (!(flags & MONO_FLAG)) |
750 | sample_count *= 2; | 726 | sample_count *= 2; |
751 | 727 | ||
752 | while (sample_count--) | 728 | while (sample_count--) |
753 | *buffer++ <<= shift; | 729 | *buffer++ >>= shift; |
754 | } | 730 | } |
755 | } | 731 | } |
756 | 732 | ||