Version 0.1.2 from FTP
[asterisk/asterisk.git] / codecs / mp3anal.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * MP3 Header Analysis Routines.  Thanks to Robert Kaye for the logic!
5  *
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 static int bitrates1[] = { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 };
15 static int bitrates2[] = { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 };
16
17 static int samplerates1[] = { 44100, 48000, 32000 };
18 static int samplerates2[] = { 22050, 24000, 16000 };
19
20 static int outputsamples[] = { 576, 1152 };
21
22 static int mp3_samples(unsigned char *header)
23 {
24         int ver = (header[1] & 0x8) >> 3;
25         return outputsamples[ver];
26 }
27
28 static int mp3_bitrate(unsigned char *header)
29 {
30         int ver = (header[1] & 0x8) >> 3;
31         int br = (header[2] >> 4);
32
33         if (ver > 14) {
34                 ast_log(LOG_WARNING, "Invalid bit rate\n");
35                 return -1;
36         }
37         if (ver)
38                 return bitrates1[br];
39         else {
40                 return bitrates2[br];
41         }
42 }
43
44 static int mp3_samplerate(unsigned char *header)
45 {
46         int ver = (header[1] & 0x8) >> 3;
47         int sr = (header[2] >> 2) & 0x3;
48         
49         if (ver > 2) {
50                 ast_log(LOG_WARNING, "Invalid sample rate\n");
51                 return -1;
52         }
53
54         if (ver)
55                 return samplerates1[sr];
56         else
57                 return samplerates2[sr];
58 }
59
60 static int mp3_padding(unsigned char *header)
61 {
62         return (header[2] >> 1) & 0x1;  
63 }
64
65 static int mp3_badheader(unsigned char *header)
66 {
67         if ((header[0] != 0xFF) || ((header[1] & 0xF0) != 0xF0))
68                 return -1;
69         return 0;
70 }
71
72 static int mp3_framelen(unsigned char *header)
73 {
74         int br = mp3_bitrate(header);
75         int sr = mp3_samplerate(header);
76         int size;
77         
78         if ((br < 0) || (sr < 0))
79                 return -1;
80         size = 144000 * br / sr + mp3_padding(header);
81         return size;
82 }
83