summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-03-08 22:39:15 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-03-08 22:39:15 +0000
commit56023837ae7d49dcd3fdd32295ddf62fb89e6cbe (patch)
tree9f0ed4c6089fce85126c31d88e535bdd72331806
parent1abda91faa7efa110628b7513f777b78c9a5c8f3 (diff)
downloadrockbox-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
-rw-r--r--apps/metadata/mpc.c21
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;