mirror of
https://github.com/asterisk/asterisk.git
synced 2025-12-12 01:52:38 +00:00
Version 0.1.1 from FTP
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@134 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
83
codecs/mp3anal.h
Executable file
83
codecs/mp3anal.h
Executable file
@@ -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 <markster@linux-support.net>
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user