~ubuntu-branches/ubuntu/karmic/asterisk/karmic

« back to all changes in this revision

Viewing changes to codecs/mp3anal.h

  • Committer: Bazaar Package Importer
  • Author(s): Mark Purcell
  • Date: 2002-04-27 21:19:32 UTC
  • Revision ID: james.westby@ubuntu.com-20020427211932-kqaertc4bg7ss5mc
Tags: upstream-0.1.11
ImportĀ upstreamĀ versionĀ 0.1.11

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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