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

📄 mpegaudio.c

📁 spook是一个linux下开源的流媒体服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
    s->bit_rate = bitrate;    //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)] = be2me_16(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 */            }#if 0            printf("%2d:%d in=%x %x %d\n",                    j, i, vmax, scale_factor_table[index], index);#endif            /* store the scale factor */           // assert(index >=0 && index <= 63);            sf[i] = index;        }        /* compute the transmission factor : look if the scale factors           are close enough to each other */        d1 = scale_diff_table[sf[0] - sf[1] + 64];        d2 = scale_diff_table[sf[1] - sf[2] + 64];                /* handle the 25 cases */        switch(d1 * 5 + d2) {        case 0*5+0:        case 0*5+4:        case 3*5+4:        case 4*5+0:        case 4*5+4:            code = 0;            break;        case 0*5+1:        case 0*5+2:        case 4*5+1:

⌨️ 快捷键说明

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