summaryrefslogtreecommitdiff
path: root/apps/metadata/a52.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/metadata/a52.c')
-rw-r--r--apps/metadata/a52.c98
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
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}