summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThom Johansen <thomj@rockbox.org>2007-12-04 20:48:40 +0000
committerThom Johansen <thomj@rockbox.org>2007-12-04 20:48:40 +0000
commit5915736dd5f88ba644189b4f25df56c7c3cb855d (patch)
tree6fe09041d2784e9e37ba1f87990310d94559ae8b
parentb911ee822ac5b628f2d21d3839fd3d4cd2e35398 (diff)
downloadrockbox-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
-rw-r--r--apps/SOURCES1
-rw-r--r--apps/metadata.c78
-rw-r--r--apps/metadata/a52.c98
-rw-r--r--apps/metadata/metadata_parsers.h1
-rw-r--r--apps/metadata/mpc.c5
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
126metadata/vorbis.c 126metadata/vorbis.c
127metadata/wave.c 127metadata/wave.c
128metadata/wavpack.c 128metadata/wavpack.c
129metadata/a52.c
129#endif 130#endif
130#ifdef HAVE_TAGCACHE 131#ifdef HAVE_TAGCACHE
131tagcache.c 132tagcache.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
39static 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 */
47static 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
23static 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 */
31static 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
41bool 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);
30bool get_vorbis_metadata(int fd, struct mp3entry* id3); 30bool get_vorbis_metadata(int fd, struct mp3entry* id3);
31bool get_wave_metadata(int fd, struct mp3entry* id3); 31bool get_wave_metadata(int fd, struct mp3entry* id3);
32bool get_wavpack_metadata(int fd, struct mp3entry* id3); 32bool get_wavpack_metadata(int fd, struct mp3entry* id3);
33bool get_a52_metadata(int fd, struct mp3entry* id3);
33bool get_asf_metadata(int fd, struct mp3entry* id3); 34bool 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"