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

📄 mpegaudio.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * The simplest mpeg audio layer 2 encoder * Copyright (c) 2000, 2001 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */ /** * @file mpegaudio.c * The simplest mpeg audio layer 2 encoder. */ #include "avcodec.h"#include "mpegaudio.h"/* currently, cannot change these constants (need to modify   quantization stage) */#define FRAC_BITS 15#define WFRAC_BITS  14#define MUL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS)#define FIX(a)   ((int)((a) * (1 << FRAC_BITS)))#define SAMPLES_BUF_SIZE 4096typedef struct MpegAudioContext {    PutBitContext pb;    int nb_channels;    int freq, bit_rate;    int lsf;           /* 1 if mpeg2 low bitrate selected */    int bitrate_index; /* bit rate */    int freq_index;    int frame_size; /* frame size, in bits, without padding */    int64_t nb_samples; /* total number of samples encoded */    /* padding computation */    int frame_frac, frame_frac_incr, do_padding;    short samples_buf[MPA_MAX_CHANNELS][SAMPLES_BUF_SIZE]; /* buffer for filter */    int samples_offset[MPA_MAX_CHANNELS];       /* offset in samples_buf */    int sb_samples[MPA_MAX_CHANNELS][3][12][SBLIMIT];    unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3]; /* scale factors */    /* code to group 3 scale factors */    unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT];           int sblimit; /* number of used subbands */    const unsigned char *alloc_table;} MpegAudioContext;/* define it to use floats in quantization (I don't like floats !) *///#define USE_FLOATS#include "mpegaudiotab.h"static int MPA_encode_init(AVCodecContext *avctx){    MpegAudioContext *s = avctx->priv_data;    int freq = avctx->sample_rate;    int bitrate = avctx->bit_rate;    int channels = avctx->channels;    int i, v, table;    float a;    if (channels > 2)        return -1;    bitrate = bitrate / 1000;    s->nb_channels = channels;    s->freq = freq;    s->bit_rate = bitrate * 1000;    avctx->frame_size = MPA_FRAME_SIZE;    /* encoding freq */    s->lsf = 0;    for(i=0;i<3;i++) {        if (mpa_freq_tab[i] == freq)             break;        if ((mpa_freq_tab[i] / 2) == freq) {            s->lsf = 1;            break;        }    }    if (i == 3)        return -1;    s->freq_index = i;    /* encoding bitrate & frequency */    for(i=0;i<15;i++) {        if (mpa_bitrate_tab[s->lsf][1][i] == bitrate)             break;    }    if (i == 15)        return -1;    s->bitrate_index = i;    /* compute total header size & pad bit */        a = (float)(bitrate * 1000 * MPA_FRAME_SIZE) / (freq * 8.0);    s->frame_size = ((int)a) * 8;    /* frame fractional size to compute padding */    s->frame_frac = 0;    s->frame_frac_incr = (int)((a - floor(a)) * 65536.0);        /* select the right allocation table */    table = l2_select_table(bitrate, s->nb_channels, freq, s->lsf);    /* number of used subbands */    s->sblimit = sblimit_table[table];    s->alloc_table = alloc_tables[table];#ifdef DEBUG    av_log(avctx, AV_LOG_DEBUG, "%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n",            bitrate, freq, s->frame_size, table, s->frame_frac_incr);#endif    for(i=0;i<s->nb_channels;i++)        s->samples_offset[i] = 0;    for(i=0;i<257;i++) {        int v;        v = mpa_enwindow[i];#if WFRAC_BITS != 16        v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);#endif        filter_bank[i] = v;        if ((i & 63) != 0)            v = -v;        if (i != 0)            filter_bank[512 - i] = v;    }    for(i=0;i<64;i++) {        v = (int)(pow(2.0, (3 - i) / 3.0) * (1 << 20));        if (v <= 0)            v = 1;        scale_factor_table[i] = v;#ifdef USE_FLOATS        scale_factor_inv_table[i] = pow(2.0, -(3 - i) / 3.0) / (float)(1 << 20);#else#define P 15        scale_factor_shift[i] = 21 - P - (i / 3);        scale_factor_mult[i] = (1 << P) * pow(2.0, (i % 3) / 3.0);#endif    }    for(i=0;i<128;i++) {        v = i - 64;        if (v <= -3)            v = 0;        else if (v < 0)            v = 1;        else if (v == 0)            v = 2;        else if (v < 3)            v = 3;        else             v = 4;        scale_diff_table[i] = v;    }    for(i=0;i<17;i++) {        v = quant_bits[i];        if (v < 0)             v = -v;        else            v = v * 3;        total_quant_bits[i] = 12 * v;    }    avctx->coded_frame= avcodec_alloc_frame();    avctx->coded_frame->key_frame= 1;    return 0;}/* 32 point floating point IDCT without 1/sqrt(2) coef zero scaling */static void idct32(int *out, int *tab){    int i, j;    int *t, *t1, xr;    const int *xp = costab32;    for(j=31;j>=3;j-=2) tab[j] += tab[j - 2];        t = tab + 30;    t1 = tab + 2;    do {        t[0] += t[-4];        t[1] += t[1 - 4];        t -= 4;    } while (t != t1);    t = tab + 28;    t1 = tab + 4;    do {        t[0] += t[-8];        t[1] += t[1-8];        t[2] += t[2-8];        t[3] += t[3-8];        t -= 8;    } while (t != t1);        t = tab;    t1 = tab + 32;    do {        t[ 3] = -t[ 3];            t[ 6] = -t[ 6];                    t[11] = -t[11];            t[12] = -t[12];            t[13] = -t[13];            t[15] = -t[15];         t += 16;    } while (t != t1);        t = tab;    t1 = tab + 8;    do {        int x1, x2, x3, x4;                x3 = MUL(t[16], FIX(SQRT2*0.5));        x4 = t[0] - x3;        x3 = t[0] + x3;                x2 = MUL(-(t[24] + t[8]), FIX(SQRT2*0.5));        x1 = MUL((t[8] - x2), xp[0]);        x2 = MUL((t[8] + x2), xp[1]);        t[ 0] = x3 + x1;        t[ 8] = x4 - x2;        t[16] = x4 + x2;        t[24] = x3 - x1;        t++;    } while (t != t1);    xp += 2;    t = tab;    t1 = tab + 4;    do {        xr = MUL(t[28],xp[0]);        t[28] = (t[0] - xr);        t[0] = (t[0] + xr);        xr = MUL(t[4],xp[1]);        t[ 4] = (t[24] - xr);        t[24] = (t[24] + xr);                xr = MUL(t[20],xp[2]);        t[20] = (t[8] - xr);        t[ 8] = (t[8] + xr);                    xr = MUL(t[12],xp[3]);        t[12] = (t[16] - xr);        t[16] = (t[16] + xr);        t++;    } while (t != t1);    xp += 4;    for (i = 0; i < 4; i++) {        xr = MUL(tab[30-i*4],xp[0]);        tab[30-i*4] = (tab[i*4] - xr);        tab[   i*4] = (tab[i*4] + xr);                xr = MUL(tab[ 2+i*4],xp[1]);        tab[ 2+i*4] = (tab[28-i*4] - xr);        tab[28-i*4] = (tab[28-i*4] + xr);                xr = MUL(tab[31-i*4],xp[0]);        tab[31-i*4] = (tab[1+i*4] - xr);        tab[ 1+i*4] = (tab[1+i*4] + xr);                xr = MUL(tab[ 3+i*4],xp[1]);        tab[ 3+i*4] = (tab[29-i*4] - xr);        tab[29-i*4] = (tab[29-i*4] + xr);                xp += 2;    }    t = tab + 30;    t1 = tab + 1;    do {        xr = MUL(t1[0], *xp);        t1[0] = (t[0] - xr);        t[0] = (t[0] + xr);        t -= 2;        t1 += 2;        xp++;    } while (t >= tab);    for(i=0;i<32;i++) {        out[i] = tab[bitinv32[i]];    }}#define WSHIFT (WFRAC_BITS + 15 - FRAC_BITS)static void filter(MpegAudioContext *s, int ch, short *samples, int incr){    short *p, *q;    int sum, offset, i, j;    int tmp[64];    int tmp1[32];    int *out;    //    print_pow1(samples, 1152);    offset = s->samples_offset[ch];    out = &s->sb_samples[ch][0][0][0];    for(j=0;j<36;j++) {        /* 32 samples at once */        for(i=0;i<32;i++) {            s->samples_buf[ch][offset + (31 - i)] = samples[0];            samples += incr;        }        /* filter */        p = s->samples_buf[ch] + offset;        q = filter_bank;        /* maxsum = 23169 */        for(i=0;i<64;i++) {            sum = p[0*64] * q[0*64];            sum += p[1*64] * q[1*64];            sum += p[2*64] * q[2*64];            sum += p[3*64] * q[3*64];            sum += p[4*64] * q[4*64];            sum += p[5*64] * q[5*64];            sum += p[6*64] * q[6*64];            sum += p[7*64] * q[7*64];            tmp[i] = sum;            p++;            q++;        }        tmp1[0] = tmp[16] >> WSHIFT;        for( i=1; i<=16; i++ ) tmp1[i] = (tmp[i+16]+tmp[16-i]) >> WSHIFT;        for( i=17; i<=31; i++ ) tmp1[i] = (tmp[i+16]-tmp[80-i]) >> WSHIFT;        idct32(out, tmp1);        /* advance of 32 samples */        offset -= 32;        out += 32;        /* handle the wrap around */        if (offset < 0) {            memmove(s->samples_buf[ch] + SAMPLES_BUF_SIZE - (512 - 32),                     s->samples_buf[ch], (512 - 32) * 2);            offset = SAMPLES_BUF_SIZE - 512;        }    }    s->samples_offset[ch] = offset;    //    print_pow(s->sb_samples, 1152);}static void compute_scale_factors(unsigned char scale_code[SBLIMIT],                                  unsigned char scale_factors[SBLIMIT][3],                                   int sb_samples[3][12][SBLIMIT],                                  int sblimit){    int *p, vmax, v, n, i, j, k, code;    int index, d1, d2;    unsigned char *sf = &scale_factors[0][0];        for(j=0;j<sblimit;j++) {        for(i=0;i<3;i++) {            /* find the max absolute value */            p = &sb_samples[i][0][j];            vmax = abs(*p);            for(k=1;k<12;k++) {                p += SBLIMIT;                v = abs(*p);                if (v > vmax)                    vmax = v;            }            /* compute the scale factor index using log 2 computations */            if (vmax > 0) {                n = av_log2(vmax);                /* n is the position of the MSB of vmax. now                    use at most 2 compares to find the index */                index = (21 - n) * 3 - 3;                if (index >= 0) {                    while (vmax <= scale_factor_table[index+1])                        index++;                } else {                    index = 0; /* very unlikely case of overflow */                }            } else {                index = 62; /* value 63 is not allowed */            }

⌨️ 快捷键说明

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