diff options
author | Thom Johansen <thomj@rockbox.org> | 2007-12-04 20:48:40 +0000 |
---|---|---|
committer | Thom Johansen <thomj@rockbox.org> | 2007-12-04 20:48:40 +0000 |
commit | 5915736dd5f88ba644189b4f25df56c7c3cb855d (patch) | |
tree | 6fe09041d2784e9e37ba1f87990310d94559ae8b /apps | |
parent | b911ee822ac5b628f2d21d3839fd3d4cd2e35398 (diff) | |
download | rockbox-5915736dd5f88ba644189b4f25df56c7c3cb855d.tar.gz rockbox-5915736dd5f88ba644189b4f25df56c7c3cb855d.zip |
Put A52/AC3 metadata parser in its own file. Cosmetic changes in metadata.c. Remove some unneeded headers from MPC metadata parser.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15874 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/SOURCES | 1 | ||||
-rw-r--r-- | apps/metadata.c | 78 | ||||
-rw-r--r-- | apps/metadata/a52.c | 98 | ||||
-rw-r--r-- | apps/metadata/metadata_parsers.h | 1 | ||||
-rw-r--r-- | apps/metadata/mpc.c | 5 |
5 files changed, 109 insertions, 74 deletions
diff --git a/apps/SOURCES b/apps/SOURCES index 597eb48b23..9b29605a83 100644 --- a/apps/SOURCES +++ b/apps/SOURCES | |||
@@ -126,6 +126,7 @@ metadata/spc.c | |||
126 | metadata/vorbis.c | 126 | metadata/vorbis.c |
127 | metadata/wave.c | 127 | metadata/wave.c |
128 | metadata/wavpack.c | 128 | metadata/wavpack.c |
129 | metadata/a52.c | ||
129 | #endif | 130 | #endif |
130 | #ifdef HAVE_TAGCACHE | 131 | #ifdef HAVE_TAGCACHE |
131 | tagcache.c | 132 | tagcache.c |
diff --git a/apps/metadata.c b/apps/metadata.c index 0d69cb1645..556350bfb6 100644 --- a/apps/metadata.c +++ b/apps/metadata.c | |||
@@ -36,24 +36,6 @@ | |||
36 | #include "metadata/metadata_common.h" | 36 | #include "metadata/metadata_common.h" |
37 | #include "metadata/metadata_parsers.h" | 37 | #include "metadata/metadata_parsers.h" |
38 | 38 | ||
39 | static const unsigned short a52_bitrates[] = | ||
40 | { | ||
41 | 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, | ||
42 | 192, 224, 256, 320, 384, 448, 512, 576, 640 | ||
43 | }; | ||
44 | |||
45 | /* Only store frame sizes for 44.1KHz - others are simply multiples | ||
46 | of the bitrate */ | ||
47 | static const unsigned short a52_441framesizes[] = | ||
48 | { | ||
49 | 69 * 2, 70 * 2, 87 * 2, 88 * 2, 104 * 2, 105 * 2, 121 * 2, | ||
50 | 122 * 2, 139 * 2, 140 * 2, 174 * 2, 175 * 2, 208 * 2, 209 * 2, | ||
51 | 243 * 2, 244 * 2, 278 * 2, 279 * 2, 348 * 2, 349 * 2, 417 * 2, | ||
52 | 418 * 2, 487 * 2, 488 * 2, 557 * 2, 558 * 2, 696 * 2, 697 * 2, | ||
53 | 835 * 2, 836 * 2, 975 * 2, 976 * 2, 1114 * 2, 1115 * 2, 1253 * 2, | ||
54 | 1254 * 2, 1393 * 2, 1394 * 2 | ||
55 | }; | ||
56 | |||
57 | #endif /* CONFIG_CODEC == SWCODEC */ | 39 | #endif /* CONFIG_CODEC == SWCODEC */ |
58 | 40 | ||
59 | 41 | ||
@@ -100,8 +82,6 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) | |||
100 | { | 82 | { |
101 | #if CONFIG_CODEC == SWCODEC | 83 | #if CONFIG_CODEC == SWCODEC |
102 | unsigned char* buf; | 84 | unsigned char* buf; |
103 | unsigned long totalsamples; | ||
104 | int i; | ||
105 | #endif | 85 | #endif |
106 | 86 | ||
107 | /* Clear the mp3entry to avoid having bogus pointers appear */ | 87 | /* Clear the mp3entry to avoid having bogus pointers appear */ |
@@ -179,64 +159,19 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) | |||
179 | 159 | ||
180 | case AFMT_WAVPACK: | 160 | case AFMT_WAVPACK: |
181 | if (!get_wavpack_metadata(fd, id3)) | 161 | if (!get_wavpack_metadata(fd, id3)) |
162 | { | ||
182 | return false; | 163 | return false; |
164 | } | ||
183 | 165 | ||
184 | read_ape_tags(fd, id3); /* use any apetag info we find */ | 166 | read_ape_tags(fd, id3); /* use any apetag info we find */ |
185 | break; | 167 | break; |
186 | 168 | ||
187 | case AFMT_A52: | 169 | case AFMT_A52: |
188 | /* Use the trackname part of the id3 structure as a temporary buffer */ | 170 | if (!get_a52_metadata(fd, id3)) |
189 | buf = (unsigned char *)id3->path; | ||
190 | |||
191 | if ((lseek(fd, 0, SEEK_SET) < 0) || (read(fd, buf, 5) < 5)) | ||
192 | { | ||
193 | return false; | ||
194 | } | ||
195 | |||
196 | if ((buf[0] != 0x0b) || (buf[1] != 0x77)) | ||
197 | { | ||
198 | logf("%s is not an A52/AC3 file\n",trackname); | ||
199 | return false; | ||
200 | } | ||
201 | |||
202 | i = buf[4] & 0x3e; | ||
203 | |||
204 | if (i > 36) | ||
205 | { | ||
206 | logf("A52: Invalid frmsizecod: %d\n",i); | ||
207 | return false; | ||
208 | } | ||
209 | |||
210 | id3->bitrate = a52_bitrates[i >> 1]; | ||
211 | id3->vbr = false; | ||
212 | id3->filesize = filesize(fd); | ||
213 | |||
214 | switch (buf[4] & 0xc0) | ||
215 | { | 171 | { |
216 | case 0x00: | ||
217 | id3->frequency = 48000; | ||
218 | id3->bytesperframe=id3->bitrate * 2 * 2; | ||
219 | break; | ||
220 | |||
221 | case 0x40: | ||
222 | id3->frequency = 44100; | ||
223 | id3->bytesperframe = a52_441framesizes[i]; | ||
224 | break; | ||
225 | |||
226 | case 0x80: | ||
227 | id3->frequency = 32000; | ||
228 | id3->bytesperframe = id3->bitrate * 3 * 2; | ||
229 | break; | ||
230 | |||
231 | default: | ||
232 | logf("A52: Invalid samplerate code: 0x%02x\n", buf[4] & 0xc0); | ||
233 | return false; | 172 | return false; |
234 | break; | ||
235 | } | 173 | } |
236 | 174 | ||
237 | /* One A52 frame contains 6 blocks, each containing 256 samples */ | ||
238 | totalsamples = id3->filesize / id3->bytesperframe * 6 * 256; | ||
239 | id3->length = totalsamples / id3->frequency * 1000; | ||
240 | break; | 175 | break; |
241 | 176 | ||
242 | case AFMT_ALAC: | 177 | case AFMT_ALAC: |
@@ -264,15 +199,17 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) | |||
264 | return false; | 199 | return false; |
265 | } | 200 | } |
266 | break; | 201 | break; |
202 | |||
267 | case AFMT_SPC: | 203 | case AFMT_SPC: |
268 | if(!get_spc_metadata(fd, id3)) | 204 | if (!get_spc_metadata(fd, id3)) |
269 | { | 205 | { |
270 | DEBUGF("get_spc_metadata error\n"); | 206 | DEBUGF("get_spc_metadata error\n"); |
207 | return false; | ||
271 | } | 208 | } |
272 | |||
273 | id3->filesize = filesize(fd); | 209 | id3->filesize = filesize(fd); |
274 | id3->genre_string = id3_get_num_genre(36); | 210 | id3->genre_string = id3_get_num_genre(36); |
275 | break; | 211 | break; |
212 | |||
276 | case AFMT_ADX: | 213 | case AFMT_ADX: |
277 | if (!get_adx_metadata(fd, id3)) | 214 | if (!get_adx_metadata(fd, id3)) |
278 | { | 215 | { |
@@ -281,6 +218,7 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) | |||
281 | } | 218 | } |
282 | 219 | ||
283 | break; | 220 | break; |
221 | |||
284 | case AFMT_NSF: | 222 | case AFMT_NSF: |
285 | buf = (unsigned char *)id3->path; | 223 | buf = (unsigned char *)id3->path; |
286 | if ((lseek(fd, 0, SEEK_SET) < 0) || ((read(fd, buf, 8)) < 8)) | 224 | if ((lseek(fd, 0, SEEK_SET) < 0) || ((read(fd, buf, 8)) < 8)) |
diff --git a/apps/metadata/a52.c b/apps/metadata/a52.c new file mode 100644 index 0000000000..0ed85d37ed --- /dev/null +++ b/apps/metadata/a52.c | |||
@@ -0,0 +1,98 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id: metadata.c 15859 2007-11-30 18:48:07Z lostlogic $ | ||
9 | * | ||
10 | * Copyright (C) 2005 Magnus Holmgren | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include "id3.h" | ||
21 | #include "logf.h" | ||
22 | |||
23 | static const unsigned short a52_bitrates[] = | ||
24 | { | ||
25 | 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, | ||
26 | 192, 224, 256, 320, 384, 448, 512, 576, 640 | ||
27 | }; | ||
28 | |||
29 | /* Only store frame sizes for 44.1KHz - others are simply multiples | ||
30 | of the bitrate */ | ||
31 | static const unsigned short a52_441framesizes[] = | ||
32 | { | ||
33 | 69 * 2, 70 * 2, 87 * 2, 88 * 2, 104 * 2, 105 * 2, 121 * 2, | ||
34 | 122 * 2, 139 * 2, 140 * 2, 174 * 2, 175 * 2, 208 * 2, 209 * 2, | ||
35 | 243 * 2, 244 * 2, 278 * 2, 279 * 2, 348 * 2, 349 * 2, 417 * 2, | ||
36 | 418 * 2, 487 * 2, 488 * 2, 557 * 2, 558 * 2, 696 * 2, 697 * 2, | ||
37 | 835 * 2, 836 * 2, 975 * 2, 976 * 2, 1114 * 2, 1115 * 2, 1253 * 2, | ||
38 | 1254 * 2, 1393 * 2, 1394 * 2 | ||
39 | }; | ||
40 | |||
41 | bool get_a52_metadata(int fd, struct mp3entry *id3) | ||
42 | { | ||
43 | /* Use the trackname part of the id3 structure as a temporary buffer */ | ||
44 | unsigned char* buf = (unsigned char *)id3->path; | ||
45 | unsigned long totalsamples; | ||
46 | int i; | ||
47 | |||
48 | if ((lseek(fd, 0, SEEK_SET) < 0) || (read(fd, buf, 5) < 5)) | ||
49 | { | ||
50 | return false; | ||
51 | } | ||
52 | |||
53 | if ((buf[0] != 0x0b) || (buf[1] != 0x77)) | ||
54 | { | ||
55 | logf("%s is not an A52/AC3 file\n",trackname); | ||
56 | return false; | ||
57 | } | ||
58 | |||
59 | i = buf[4] & 0x3e; | ||
60 | |||
61 | if (i > 36) | ||
62 | { | ||
63 | logf("A52: Invalid frmsizecod: %d\n",i); | ||
64 | return false; | ||
65 | } | ||
66 | |||
67 | id3->bitrate = a52_bitrates[i >> 1]; | ||
68 | id3->vbr = false; | ||
69 | id3->filesize = filesize(fd); | ||
70 | |||
71 | switch (buf[4] & 0xc0) | ||
72 | { | ||
73 | case 0x00: | ||
74 | id3->frequency = 48000; | ||
75 | id3->bytesperframe=id3->bitrate * 2 * 2; | ||
76 | break; | ||
77 | |||
78 | case 0x40: | ||
79 | id3->frequency = 44100; | ||
80 | id3->bytesperframe = a52_441framesizes[i]; | ||
81 | break; | ||
82 | |||
83 | case 0x80: | ||
84 | id3->frequency = 32000; | ||
85 | id3->bytesperframe = id3->bitrate * 3 * 2; | ||
86 | break; | ||
87 | |||
88 | default: | ||
89 | logf("A52: Invalid samplerate code: 0x%02x\n", buf[4] & 0xc0); | ||
90 | return false; | ||
91 | break; | ||
92 | } | ||
93 | |||
94 | /* One A52 frame contains 6 blocks, each containing 256 samples */ | ||
95 | totalsamples = id3->filesize / id3->bytesperframe * 6 * 256; | ||
96 | id3->length = totalsamples / id3->frequency * 1000; | ||
97 | return true; | ||
98 | } | ||
diff --git a/apps/metadata/metadata_parsers.h b/apps/metadata/metadata_parsers.h index 315305b0df..5fbdf6f756 100644 --- a/apps/metadata/metadata_parsers.h +++ b/apps/metadata/metadata_parsers.h | |||
@@ -30,4 +30,5 @@ bool get_speex_metadata(int fd, struct mp3entry* id3); | |||
30 | bool get_vorbis_metadata(int fd, struct mp3entry* id3); | 30 | bool get_vorbis_metadata(int fd, struct mp3entry* id3); |
31 | bool get_wave_metadata(int fd, struct mp3entry* id3); | 31 | bool get_wave_metadata(int fd, struct mp3entry* id3); |
32 | bool get_wavpack_metadata(int fd, struct mp3entry* id3); | 32 | bool get_wavpack_metadata(int fd, struct mp3entry* id3); |
33 | bool get_a52_metadata(int fd, struct mp3entry* id3); | ||
33 | bool get_asf_metadata(int fd, struct mp3entry* id3); | 34 | bool get_asf_metadata(int fd, struct mp3entry* id3); |
diff --git a/apps/metadata/mpc.c b/apps/metadata/mpc.c index 186ff29c35..298f8faa40 100644 --- a/apps/metadata/mpc.c +++ b/apps/metadata/mpc.c | |||
@@ -16,12 +16,9 @@ | |||
16 | * KIND, either express or implied. | 16 | * KIND, either express or implied. |
17 | * | 17 | * |
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include <stdio.h> | 19 | |
20 | #include <string.h> | 20 | #include <string.h> |
21 | #include <stdlib.h> | ||
22 | #include <ctype.h> | ||
23 | #include <inttypes.h> | 21 | #include <inttypes.h> |
24 | |||
25 | #include "system.h" | 22 | #include "system.h" |
26 | #include "id3.h" | 23 | #include "id3.h" |
27 | #include "metadata_common.h" | 24 | #include "metadata_common.h" |