⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegaudio.c

📁 spook是一个linux下开源的流媒体服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * The simplest mpeg audio layer 2 encoder * Copyright (c) 2000, 2001 Fabrice Bellard. * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * alternative bitstream reader & writer by Michael Niedermayer <michaelni@gmx.at> * * MPEG1 L2 implementation adapted from FFMPEG by Nathan Lutchansky */ #include "mpegaudio.h"const uint16_t mpa_bitrate_tab[2][3][15] = {    { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 },      {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 },      {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } },    { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256},      {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160},      {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}    }};const uint16_t mpa_freq_tab[3] = { 44100, 48000, 32000 };/*******************************************************//* half mpeg encoding window (full precision) */const int32_t mpa_enwindow[257] = {     0,    -1,    -1,    -1,    -1,    -1,    -1,    -2,    -2,    -2,    -2,    -3,    -3,    -4,    -4,    -5,    -5,    -6,    -7,    -7,    -8,    -9,   -10,   -11,   -13,   -14,   -16,   -17,   -19,   -21,   -24,   -26,   -29,   -31,   -35,   -38,   -41,   -45,   -49,   -53,   -58,   -63,   -68,   -73,   -79,   -85,   -91,   -97,  -104,  -111,  -117,  -125,  -132,  -139,  -147,  -154,  -161,  -169,  -176,  -183,  -190,  -196,  -202,  -208,   213,   218,   222,   225,   227,   228,   228,   227,   224,   221,   215,   208,   200,   189,   177,   163,   146,   127,   106,    83,    57,    29,    -2,   -36,   -72,  -111,  -153,  -197,  -244,  -294,  -347,  -401,  -459,  -519,  -581,  -645,  -711,  -779,  -848,  -919,  -991, -1064, -1137, -1210, -1283, -1356, -1428, -1498, -1567, -1634, -1698, -1759, -1817, -1870, -1919, -1962, -2001, -2032, -2057, -2075, -2085, -2087, -2080, -2063,  2037,  2000,  1952,  1893,  1822,  1739,  1644,  1535,  1414,  1280,  1131,   970,   794,   605,   402,   185,   -45,  -288,  -545,  -814, -1095, -1388, -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788, -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134,  6574,  5959,  5288,  4561,  3776,  2935,  2037,  1082,    70,  -998, -2122, -3300, -4533, -5818, -7154, -8540, -9975,-11455,-12980,-14548,-16155,-17799,-19478,-21189,-22929,-24694,-26482,-28289,-30112,-31947,-33791,-35640,-37489,-39336,-41176,-43006,-44821,-46617,-48390,-50137,-51853,-53534,-55178,-56778,-58333,-59838,-61289,-62684,-64019,-65290,-66494,-67629,-68692,-69679,-70590,-71420,-72169,-72835,-73415,-73908,-74313,-74630,-74856,-74992, 75038,};/*******************************************************//* layer 2 tables */const int sblimit_table[5] = { 27 , 30 , 8, 12 , 30 };const int quant_steps[17] = {    3,     5,    7,    9,    15,    31,    63,  127,  255,   511,    1023,  2047, 4095, 8191, 16383,    32767, 65535};/* we use a negative value if grouped */const int quant_bits[17] = {    -5,  -7,  3, -10, 4,      5,  6,  7,  8,  9,    10, 11, 12, 13, 14,    15, 16 };/* encoding tables which give the quantization index. Note how it is   possible to store them efficiently ! */static const unsigned char alloc_table_0[] = { 4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16, };static const unsigned char alloc_table_1[] = { 4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  3,  0,  1,  2,  3,  4,  5, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16,  2,  0,  1, 16, };static const unsigned char alloc_table_2[] = { 4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7, };static const unsigned char alloc_table_3[] = { 4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  4,  0,  1,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7, };static const unsigned char alloc_table_4[] = { 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  3,  0,  1,  3,  4,  5,  6,  7,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3,  2,  0,  1,  3, };const uint8_t ff_sqrt_tab[128]={        0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,        5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,        8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,        9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11};const uint8_t ff_log2_tab[256]={        0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,        5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size){    s->buf = buffer;    s->buf_end = s->buf + buffer_size;#ifdef ALT_BITSTREAM_WRITER    s->index=0;    ((uint32_t*)(s->buf))[0]=0;//    memset(buffer, 0, buffer_size);#else    s->buf_ptr = s->buf;    s->bit_left=32;    s->bit_buf=0;#endif}/* return the number of bits output */int get_bit_count(PutBitContext *s){#ifdef ALT_BITSTREAM_WRITER    return s->index;#else    return (s->buf_ptr - s->buf) * 8 + 32 - s->bit_left;#endif}void align_put_bits(PutBitContext *s){#ifdef ALT_BITSTREAM_WRITER    put_bits(s,(  - s->index) & 7,0);#else    put_bits(s,s->bit_left & 7,0);#endif}/* pad the end of the output stream with zeros */void flush_put_bits(PutBitContext *s){#ifdef ALT_BITSTREAM_WRITER    align_put_bits(s);#else    s->bit_buf<<= s->bit_left;    while (s->bit_left < 32) {        /* XXX: should test end of buffer */        *s->buf_ptr++=s->bit_buf >> 24;        s->bit_buf<<=8;        s->bit_left+=8;    }    s->bit_left=32;    s->bit_buf=0;#endif}void put_string(PutBitContext * pbc, char *s){    while(*s){        put_bits(pbc, 8, *s);        s++;    }    put_bits(pbc, 8, 0);}/* bitrate is in kb/s */int l2_select_table(int bitrate, int nb_channels, int freq, int lsf){    int ch_bitrate, table;        ch_bitrate = bitrate / nb_channels;    if (!lsf) {        if ((freq == 48000 && ch_bitrate >= 56) ||            (ch_bitrate >= 56 && ch_bitrate <= 80))             table = 0;        else if (freq != 48000 && ch_bitrate >= 96)             table = 1;        else if (freq != 32000 && ch_bitrate <= 48)             table = 2;        else             table = 3;    } else {        table = 4;    }    return table;}const unsigned char *alloc_tables[5] = { alloc_table_0, alloc_table_1, alloc_table_2, alloc_table_3, alloc_table_4, };/* define it to use floats in quantization (I don't like floats !) *///#define USE_FLOATSint MPA_encode_init(MpegAudioContext *s, int freq, int bitrate, int channels){    int i, v, table;    float a;    if (channels > 2)        return -1;    bitrate = bitrate / 1000;    s->nb_channels = channels;    s->freq = freq;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -