From 201849f9224ef840d3701ae6e92f3b71ab63f47b Mon Sep 17 00:00:00 2001 From: markster Date: Sat, 11 Dec 1999 20:09:45 +0000 Subject: Version 0.1.1 from FTP git-svn-id: http://svn.digium.com/svn/asterisk/trunk@134 f38db490-d61c-443f-a65b-d21fe96a405b --- codecs/mp3anal.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100755 codecs/mp3anal.h (limited to 'codecs/mp3anal.h') diff --git a/codecs/mp3anal.h b/codecs/mp3anal.h new file mode 100755 index 000000000..263e8520c --- /dev/null +++ b/codecs/mp3anal.h @@ -0,0 +1,83 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * MP3 Header Analysis Routines. Thanks to Robert Kaye for the logic! + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +static int bitrates1[] = { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 }; +static int bitrates2[] = { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 }; + +static int samplerates1[] = { 44100, 48000, 32000 }; +static int samplerates2[] = { 22050, 24000, 16000 }; + +static int outputsamples[] = { 576, 1152 }; + +static int mp3_samples(unsigned char *header) +{ + int ver = (header[1] & 0x8) >> 3; + return outputsamples[ver]; +} + +static int mp3_bitrate(unsigned char *header) +{ + int ver = (header[1] & 0x8) >> 3; + int br = (header[2] >> 4); + + if (ver > 14) { + ast_log(LOG_WARNING, "Invalid bit rate\n"); + return -1; + } + if (ver) + return bitrates1[br]; + else { + return bitrates2[br]; + } +} + +static int mp3_samplerate(unsigned char *header) +{ + int ver = (header[1] & 0x8) >> 3; + int sr = (header[2] >> 2) & 0x3; + + if (ver > 2) { + ast_log(LOG_WARNING, "Invalid sample rate\n"); + return -1; + } + + if (ver) + return samplerates1[sr]; + else + return samplerates2[sr]; +} + +static int mp3_padding(unsigned char *header) +{ + return (header[2] >> 1) & 0x1; +} + +static int mp3_badheader(unsigned char *header) +{ + if ((header[0] != 0xFF) || ((header[1] & 0xF0) != 0xF0)) + return -1; + return 0; +} + +static int mp3_framelen(unsigned char *header) +{ + int br = mp3_bitrate(header); + int sr = mp3_samplerate(header); + int size; + + if ((br < 0) || (sr < 0)) + return -1; + size = 144000 * br / sr + mp3_padding(header); + return size; +} + -- cgit v1.2.3