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/metadata/a52.c | |
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/metadata/a52.c')
-rw-r--r-- | apps/metadata/a52.c | 98 |
1 files changed, 98 insertions, 0 deletions
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 | } | ||