diff options
author | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-03-08 22:39:15 +0000 |
---|---|---|
committer | Andree Buschmann <AndreeBuschmann@t-online.de> | 2010-03-08 22:39:15 +0000 |
commit | 56023837ae7d49dcd3fdd32295ddf62fb89e6cbe (patch) | |
tree | 9f0ed4c6089fce85126c31d88e535bdd72331806 /apps | |
parent | 1abda91faa7efa110628b7513f777b78c9a5c8f3 (diff) | |
download | rockbox-56023837ae7d49dcd3fdd32295ddf62fb89e6cbe.tar.gz rockbox-56023837ae7d49dcd3fdd32295ddf62fb89e6cbe.zip |
Fix musepack sv8 metadata parser. Thanks to Magnus Holmgren for spotting.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25076 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/metadata/mpc.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c index 8db7993364..a8cd128828 100644 --- a/apps/metadata/mpc.c +++ b/apps/metadata/mpc.c | |||
@@ -132,14 +132,18 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3) | |||
132 | if (!memcmp(sv8_header, "SH", 2)) { /* Stream Header ID */ | 132 | if (!memcmp(sv8_header, "SH", 2)) { /* Stream Header ID */ |
133 | int32_t k = 0; | 133 | int32_t k = 0; |
134 | uint32_t streamversion; | 134 | uint32_t streamversion; |
135 | uint64_t size = 0; | 135 | uint64_t size = 0; /* tag size */ |
136 | uint64_t dummy = 0; /* used to dummy read data from header */ | ||
136 | 137 | ||
137 | /* 4 bytes 'MPCK' + 4 bytes crc + 2 'SH' */ | 138 | /* 4 bytes 'MPCK' + 2 'SH' */ |
138 | lseek(fd, 10, SEEK_SET); | 139 | lseek(fd, 6, SEEK_SET); |
139 | if (read(fd, sv8_header, 32) != 32) return false; | 140 | if (read(fd, sv8_header, 32) != 32) return false; |
140 | 141 | ||
141 | /* dummy read the correct amount of bits within the header data. */ | 142 | /* Read the size of 'SH'-tag */ |
142 | size = sv8_header[k++]; | 143 | k = sv8_get_size(sv8_header, k, &size); |
144 | |||
145 | /* Skip crc32 */ | ||
146 | k += 4; | ||
143 | 147 | ||
144 | /* Read stream version */ | 148 | /* Read stream version */ |
145 | streamversion = sv8_header[k++]; | 149 | streamversion = sv8_header[k++]; |
@@ -149,7 +153,7 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3) | |||
149 | k = sv8_get_size(sv8_header, k, &samples); | 153 | k = sv8_get_size(sv8_header, k, &samples); |
150 | 154 | ||
151 | /* Number of leading zero-samples */ | 155 | /* Number of leading zero-samples */ |
152 | k = sv8_get_size(sv8_header, k, &size); | 156 | k = sv8_get_size(sv8_header, k, &dummy); |
153 | 157 | ||
154 | /* Sampling frequency */ | 158 | /* Sampling frequency */ |
155 | id3->frequency = sfreqs[(sv8_header[k++] >> 5) & 0x0003]; | 159 | id3->frequency = sfreqs[(sv8_header[k++] >> 5) & 0x0003]; |
@@ -157,6 +161,9 @@ bool get_musepack_metadata(int fd, struct mp3entry *id3) | |||
157 | /* Number of channels */ | 161 | /* Number of channels */ |
158 | id3->channels = (sv8_header[k++] >> 4) + 1; | 162 | id3->channels = (sv8_header[k++] >> 4) + 1; |
159 | 163 | ||
164 | /* Skip to next tag: k = size -2 */ | ||
165 | k = size - 2; | ||
166 | |||
160 | if (!memcmp(sv8_header+k, "RG", 2)) { /* Replay Gain ID */ | 167 | if (!memcmp(sv8_header+k, "RG", 2)) { /* Replay Gain ID */ |
161 | long peak, gain; | 168 | long peak, gain; |
162 | int bufused = 0; | 169 | int bufused = 0; |