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

📄 mpegaudiodec.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
    register const MPA_INT *w, *w2, *p;    int j, offset, v;    OUT_INT *samples2;#if FRAC_BITS <= 15    int sum, sum2;#else    int64_t sum, sum2;#endif    dct32(tmp, sb_samples);    offset = *synth_buf_offset;    synth_buf = synth_buf_ptr + offset;    for(j=0;j<32;j++) {        v = tmp[j];#if FRAC_BITS <= 15        /* NOTE: can cause a loss in precision if very high amplitude           sound */        v = av_clip_int16(v);#endif        synth_buf[j] = v;    }    /* copy to avoid wrap */    memcpy(synth_buf + 512, synth_buf, 32 * sizeof(MPA_INT));    samples2 = samples + 31 * incr;    w = window;    w2 = window + 31;    sum = *dither_state;    p = synth_buf + 16;    SUM8(sum, +=, w, p);    p = synth_buf + 48;    SUM8(sum, -=, w + 32, p);    *samples = round_sample(&sum);    samples += incr;    w++;    /* we calculate two samples at the same time to avoid one memory       access per two sample */    for(j=1;j<16;j++) {        sum2 = 0;        p = synth_buf + 16 + j;        SUM8P2(sum, +=, sum2, -=, w, w2, p);        p = synth_buf + 48 - j;        SUM8P2(sum, -=, sum2, -=, w + 32, w2 + 32, p);        *samples = round_sample(&sum);        samples += incr;        sum += sum2;        *samples2 = round_sample(&sum);        samples2 -= incr;        w++;        w2--;    }    p = synth_buf + 32;    SUM8(sum, -=, w + 32, p);    *samples = round_sample(&sum);    *dither_state= sum;    offset = (offset - 32) & 511;    *synth_buf_offset = offset;}#define C3 FIXHR(0.86602540378443864676/2)/* 0.5 / cos(pi*(2*i+1)/36) */static const int icos36[9] = {    FIXR(0.50190991877167369479),    FIXR(0.51763809020504152469), //0    FIXR(0.55168895948124587824),    FIXR(0.61038729438072803416),    FIXR(0.70710678118654752439), //1    FIXR(0.87172339781054900991),    FIXR(1.18310079157624925896),    FIXR(1.93185165257813657349), //2    FIXR(5.73685662283492756461),};/* 0.5 / cos(pi*(2*i+1)/36) */static const int icos36h[9] = {    FIXHR(0.50190991877167369479/2),    FIXHR(0.51763809020504152469/2), //0    FIXHR(0.55168895948124587824/2),    FIXHR(0.61038729438072803416/2),    FIXHR(0.70710678118654752439/2), //1    FIXHR(0.87172339781054900991/2),    FIXHR(1.18310079157624925896/4),    FIXHR(1.93185165257813657349/4), //2//    FIXHR(5.73685662283492756461),};/* 12 points IMDCT. We compute it "by hand" by factorizing obvious   cases. */static void imdct12(int *out, int *in){    int in0, in1, in2, in3, in4, in5, t1, t2;    in0= in[0*3];    in1= in[1*3] + in[0*3];    in2= in[2*3] + in[1*3];    in3= in[3*3] + in[2*3];    in4= in[4*3] + in[3*3];    in5= in[5*3] + in[4*3];    in5 += in3;    in3 += in1;    in2= MULH(2*in2, C3);    in3= MULH(4*in3, C3);    t1 = in0 - in4;    t2 = MULH(2*(in1 - in5), icos36h[4]);    out[ 7]=    out[10]= t1 + t2;    out[ 1]=    out[ 4]= t1 - t2;    in0 += in4>>1;    in4 = in0 + in2;    in5 += 2*in1;    in1 = MULH(in5 + in3, icos36h[1]);    out[ 8]=    out[ 9]= in4 + in1;    out[ 2]=    out[ 3]= in4 - in1;    in0 -= in2;    in5 = MULH(2*(in5 - in3), icos36h[7]);    out[ 0]=    out[ 5]= in0 - in5;    out[ 6]=    out[11]= in0 + in5;}/* cos(pi*i/18) */#define C1 FIXHR(0.98480775301220805936/2)#define C2 FIXHR(0.93969262078590838405/2)#define C3 FIXHR(0.86602540378443864676/2)#define C4 FIXHR(0.76604444311897803520/2)#define C5 FIXHR(0.64278760968653932632/2)#define C6 FIXHR(0.5/2)#define C7 FIXHR(0.34202014332566873304/2)#define C8 FIXHR(0.17364817766693034885/2)/* using Lee like decomposition followed by hand coded 9 points DCT */static void imdct36(int *out, int *buf, int *in, int *win){    int i, j, t0, t1, t2, t3, s0, s1, s2, s3;    int tmp[18], *tmp1, *in1;    for(i=17;i>=1;i--)        in[i] += in[i-1];    for(i=17;i>=3;i-=2)        in[i] += in[i-2];    for(j=0;j<2;j++) {        tmp1 = tmp + j;        in1 = in + j;#if 0//more accurate but slower        int64_t t0, t1, t2, t3;        t2 = in1[2*4] + in1[2*8] - in1[2*2];        t3 = (in1[2*0] + (int64_t)(in1[2*6]>>1))<<32;        t1 = in1[2*0] - in1[2*6];        tmp1[ 6] = t1 - (t2>>1);        tmp1[16] = t1 + t2;        t0 = MUL64(2*(in1[2*2] + in1[2*4]),    C2);        t1 = MUL64(   in1[2*4] - in1[2*8] , -2*C8);        t2 = MUL64(2*(in1[2*2] + in1[2*8]),   -C4);        tmp1[10] = (t3 - t0 - t2) >> 32;        tmp1[ 2] = (t3 + t0 + t1) >> 32;        tmp1[14] = (t3 + t2 - t1) >> 32;        tmp1[ 4] = MULH(2*(in1[2*5] + in1[2*7] - in1[2*1]), -C3);        t2 = MUL64(2*(in1[2*1] + in1[2*5]),    C1);        t3 = MUL64(   in1[2*5] - in1[2*7] , -2*C7);        t0 = MUL64(2*in1[2*3], C3);        t1 = MUL64(2*(in1[2*1] + in1[2*7]),   -C5);        tmp1[ 0] = (t2 + t3 + t0) >> 32;        tmp1[12] = (t2 + t1 - t0) >> 32;        tmp1[ 8] = (t3 - t1 - t0) >> 32;#else        t2 = in1[2*4] + in1[2*8] - in1[2*2];        t3 = in1[2*0] + (in1[2*6]>>1);        t1 = in1[2*0] - in1[2*6];        tmp1[ 6] = t1 - (t2>>1);        tmp1[16] = t1 + t2;        t0 = MULH(2*(in1[2*2] + in1[2*4]),    C2);        t1 = MULH(   in1[2*4] - in1[2*8] , -2*C8);        t2 = MULH(2*(in1[2*2] + in1[2*8]),   -C4);        tmp1[10] = t3 - t0 - t2;        tmp1[ 2] = t3 + t0 + t1;        tmp1[14] = t3 + t2 - t1;        tmp1[ 4] = MULH(2*(in1[2*5] + in1[2*7] - in1[2*1]), -C3);        t2 = MULH(2*(in1[2*1] + in1[2*5]),    C1);        t3 = MULH(   in1[2*5] - in1[2*7] , -2*C7);        t0 = MULH(2*in1[2*3], C3);        t1 = MULH(2*(in1[2*1] + in1[2*7]),   -C5);        tmp1[ 0] = t2 + t3 + t0;        tmp1[12] = t2 + t1 - t0;        tmp1[ 8] = t3 - t1 - t0;#endif    }    i = 0;    for(j=0;j<4;j++) {        t0 = tmp[i];        t1 = tmp[i + 2];        s0 = t1 + t0;        s2 = t1 - t0;        t2 = tmp[i + 1];        t3 = tmp[i + 3];        s1 = MULH(2*(t3 + t2), icos36h[j]);        s3 = MULL(t3 - t2, icos36[8 - j]);        t0 = s0 + s1;        t1 = s0 - s1;        out[(9 + j)*SBLIMIT] =  MULH(t1, win[9 + j]) + buf[9 + j];        out[(8 - j)*SBLIMIT] =  MULH(t1, win[8 - j]) + buf[8 - j];        buf[9 + j] = MULH(t0, win[18 + 9 + j]);        buf[8 - j] = MULH(t0, win[18 + 8 - j]);        t0 = s2 + s3;        t1 = s2 - s3;        out[(9 + 8 - j)*SBLIMIT] =  MULH(t1, win[9 + 8 - j]) + buf[9 + 8 - j];        out[(        j)*SBLIMIT] =  MULH(t1, win[        j]) + buf[        j];        buf[9 + 8 - j] = MULH(t0, win[18 + 9 + 8 - j]);        buf[      + j] = MULH(t0, win[18         + j]);        i += 4;    }    s0 = tmp[16];    s1 = MULH(2*tmp[17], icos36h[4]);    t0 = s0 + s1;    t1 = s0 - s1;    out[(9 + 4)*SBLIMIT] =  MULH(t1, win[9 + 4]) + buf[9 + 4];    out[(8 - 4)*SBLIMIT] =  MULH(t1, win[8 - 4]) + buf[8 - 4];    buf[9 + 4] = MULH(t0, win[18 + 9 + 4]);    buf[8 - 4] = MULH(t0, win[18 + 8 - 4]);}/* return the number of decoded frames */static int mp_decode_layer1(MPADecodeContext *s){    int bound, i, v, n, ch, j, mant;    uint8_t allocation[MPA_MAX_CHANNELS][SBLIMIT];    uint8_t scale_factors[MPA_MAX_CHANNELS][SBLIMIT];    if (s->mode == MPA_JSTEREO)        bound = (s->mode_ext + 1) * 4;    else        bound = SBLIMIT;    /* allocation bits */    for(i=0;i<bound;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            allocation[ch][i] = get_bits(&s->gb, 4);        }    }    for(i=bound;i<SBLIMIT;i++) {        allocation[0][i] = get_bits(&s->gb, 4);    }    /* scale factors */    for(i=0;i<bound;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            if (allocation[ch][i])                scale_factors[ch][i] = get_bits(&s->gb, 6);        }    }    for(i=bound;i<SBLIMIT;i++) {        if (allocation[0][i]) {            scale_factors[0][i] = get_bits(&s->gb, 6);            scale_factors[1][i] = get_bits(&s->gb, 6);        }    }    /* compute samples */    for(j=0;j<12;j++) {        for(i=0;i<bound;i++) {            for(ch=0;ch<s->nb_channels;ch++) {                n = allocation[ch][i];                if (n) {                    mant = get_bits(&s->gb, n + 1);                    v = l1_unscale(n, mant, scale_factors[ch][i]);                } else {                    v = 0;                }                s->sb_samples[ch][j][i] = v;            }        }        for(i=bound;i<SBLIMIT;i++) {            n = allocation[0][i];            if (n) {                mant = get_bits(&s->gb, n + 1);                v = l1_unscale(n, mant, scale_factors[0][i]);                s->sb_samples[0][j][i] = v;                v = l1_unscale(n, mant, scale_factors[1][i]);                s->sb_samples[1][j][i] = v;            } else {                s->sb_samples[0][j][i] = 0;                s->sb_samples[1][j][i] = 0;            }        }    }    return 12;}static int mp_decode_layer2(MPADecodeContext *s){    int sblimit; /* number of used subbands */    const unsigned char *alloc_table;    int table, bit_alloc_bits, i, j, ch, bound, v;    unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT];    unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT];    unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3], *sf;    int scale, qindex, bits, steps, k, l, m, b;    /* select decoding table */    table = ff_mpa_l2_select_table(s->bit_rate / 1000, s->nb_channels,                            s->sample_rate, s->lsf);    sblimit = ff_mpa_sblimit_table[table];    alloc_table = ff_mpa_alloc_tables[table];    if (s->mode == MPA_JSTEREO)        bound = (s->mode_ext + 1) * 4;    else        bound = sblimit;    dprintf(s->avctx, "bound=%d sblimit=%d\n", bound, sblimit);    /* sanity check */    if( bound > sblimit ) bound = sblimit;    /* parse bit allocation */    j = 0;    for(i=0;i<bound;i++) {        bit_alloc_bits = alloc_table[j];        for(ch=0;ch<s->nb_channels;ch++) {            bit_alloc[ch][i] = get_bits(&s->gb, bit_alloc_bits);        }        j += 1 << bit_alloc_bits;    }    for(i=bound;i<sblimit;i++) {        bit_alloc_bits = alloc_table[j];        v = get_bits(&s->gb, bit_alloc_bits);        bit_alloc[0][i] = v;        bit_alloc[1][i] = v;        j += 1 << bit_alloc_bits;    }#ifdef DEBUG    {        for(ch=0;ch<s->nb_channels;ch++) {            for(i=0;i<sblimit;i++)                dprintf(s->avctx, " %d", bit_alloc[ch][i]);            dprintf(s->avctx, "\n");        }    }#endif    /* scale codes */    for(i=0;i<sblimit;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            if (bit_alloc[ch][i])                scale_code[ch][i] = get_bits(&s->gb, 2);        }    }    /* scale factors */    for(i=0;i<sblimit;i++) {        for(ch=0;ch<s->nb_channels;ch++) {            if (bit_alloc[ch][i]) {                sf = scale_factors[ch][i];                switch(scale_code[ch][i]) {                default:                case 0:                    sf[0] = get_bits(&s->gb, 6);                    sf[1] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    break;                case 2:                    sf[0] = get_bits(&s->gb, 6);                    sf[1] = sf[0];                    sf[2] = sf[0];                    break;                case 1:                    sf[0] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    sf[1] = sf[0];                    break;                case 3:                    sf[0] = get_bits(&s->gb, 6);                    sf[2] = get_bits(&s->gb, 6);                    sf[1] = sf[2];                    break;                }            }        }    }#ifdef DEBUG    for(ch=0;ch<s->nb_channels;ch++) {        for(i=0;i<sblimit;i++) {            if (bit_alloc[ch][i]) {                sf = scale_factors[ch][i];                dprintf(s->avctx, " %d %d %d", sf[0], sf[1], sf[2]);            } else {                dprintf(s->avctx, " -");            }        }        dprintf(s->avctx, "\n");    }#endif    /* samples */

⌨️ 快捷键说明

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