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

📄 mpegaudiodec.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
    for(k=0;k<3;k++) {        for(l=0;l<12;l+=3) {            j = 0;            for(i=0;i<bound;i++) {                bit_alloc_bits = alloc_table[j];                for(ch=0;ch<s->nb_channels;ch++) {                    b = bit_alloc[ch][i];                    if (b) {                        scale = scale_factors[ch][i][k];                        qindex = alloc_table[j+b];                        bits = ff_mpa_quant_bits[qindex];                        if (bits < 0) {                            /* 3 values at the same time */                            v = get_bits(&s->gb, -bits);                            steps = ff_mpa_quant_steps[qindex];                            s->sb_samples[ch][k * 12 + l + 0][i] =                                l2_unscale_group(steps, v % steps, scale);                            v = v / steps;                            s->sb_samples[ch][k * 12 + l + 1][i] =                                l2_unscale_group(steps, v % steps, scale);                            v = v / steps;                            s->sb_samples[ch][k * 12 + l + 2][i] =                                l2_unscale_group(steps, v, scale);                        } else {                            for(m=0;m<3;m++) {                                v = get_bits(&s->gb, bits);                                v = l1_unscale(bits - 1, v, scale);                                s->sb_samples[ch][k * 12 + l + m][i] = v;                            }                        }                    } else {                        s->sb_samples[ch][k * 12 + l + 0][i] = 0;                        s->sb_samples[ch][k * 12 + l + 1][i] = 0;                        s->sb_samples[ch][k * 12 + l + 2][i] = 0;                    }                }                /* next subband in alloc table */                j += 1 << bit_alloc_bits;            }            /* XXX: find a way to avoid this duplication of code */            for(i=bound;i<sblimit;i++) {                bit_alloc_bits = alloc_table[j];                b = bit_alloc[0][i];                if (b) {                    int mant, scale0, scale1;                    scale0 = scale_factors[0][i][k];                    scale1 = scale_factors[1][i][k];                    qindex = alloc_table[j+b];                    bits = ff_mpa_quant_bits[qindex];                    if (bits < 0) {                        /* 3 values at the same time */                        v = get_bits(&s->gb, -bits);                        steps = ff_mpa_quant_steps[qindex];                        mant = v % steps;                        v = v / steps;                        s->sb_samples[0][k * 12 + l + 0][i] =                            l2_unscale_group(steps, mant, scale0);                        s->sb_samples[1][k * 12 + l + 0][i] =                            l2_unscale_group(steps, mant, scale1);                        mant = v % steps;                        v = v / steps;                        s->sb_samples[0][k * 12 + l + 1][i] =                            l2_unscale_group(steps, mant, scale0);                        s->sb_samples[1][k * 12 + l + 1][i] =                            l2_unscale_group(steps, mant, scale1);                        s->sb_samples[0][k * 12 + l + 2][i] =                            l2_unscale_group(steps, v, scale0);                        s->sb_samples[1][k * 12 + l + 2][i] =                            l2_unscale_group(steps, v, scale1);                    } else {                        for(m=0;m<3;m++) {                            mant = get_bits(&s->gb, bits);                            s->sb_samples[0][k * 12 + l + m][i] =                                l1_unscale(bits - 1, mant, scale0);                            s->sb_samples[1][k * 12 + l + m][i] =                                l1_unscale(bits - 1, mant, scale1);                        }                    }                } else {                    s->sb_samples[0][k * 12 + l + 0][i] = 0;                    s->sb_samples[0][k * 12 + l + 1][i] = 0;                    s->sb_samples[0][k * 12 + l + 2][i] = 0;                    s->sb_samples[1][k * 12 + l + 0][i] = 0;                    s->sb_samples[1][k * 12 + l + 1][i] = 0;                    s->sb_samples[1][k * 12 + l + 2][i] = 0;                }                /* next subband in alloc table */                j += 1 << bit_alloc_bits;            }            /* fill remaining samples to zero */            for(i=sblimit;i<SBLIMIT;i++) {                for(ch=0;ch<s->nb_channels;ch++) {                    s->sb_samples[ch][k * 12 + l + 0][i] = 0;                    s->sb_samples[ch][k * 12 + l + 1][i] = 0;                    s->sb_samples[ch][k * 12 + l + 2][i] = 0;                }            }        }    }    return 3 * 12;}static inline void lsf_sf_expand(int *slen,                                 int sf, int n1, int n2, int n3){    if (n3) {        slen[3] = sf % n3;        sf /= n3;    } else {        slen[3] = 0;    }    if (n2) {        slen[2] = sf % n2;        sf /= n2;    } else {        slen[2] = 0;    }    slen[1] = sf % n1;    sf /= n1;    slen[0] = sf;}static void exponents_from_scale_factors(MPADecodeContext *s,                                         GranuleDef *g,                                         int16_t *exponents){    const uint8_t *bstab, *pretab;    int len, i, j, k, l, v0, shift, gain, gains[3];    int16_t *exp_ptr;    exp_ptr = exponents;    gain = g->global_gain - 210;    shift = g->scalefac_scale + 1;    bstab = band_size_long[s->sample_rate_index];    pretab = mpa_pretab[g->preflag];    for(i=0;i<g->long_end;i++) {        v0 = gain - ((g->scale_factors[i] + pretab[i]) << shift) + 400;        len = bstab[i];        for(j=len;j>0;j--)            *exp_ptr++ = v0;    }    if (g->short_start < 13) {        bstab = band_size_short[s->sample_rate_index];        gains[0] = gain - (g->subblock_gain[0] << 3);        gains[1] = gain - (g->subblock_gain[1] << 3);        gains[2] = gain - (g->subblock_gain[2] << 3);        k = g->long_end;        for(i=g->short_start;i<13;i++) {            len = bstab[i];            for(l=0;l<3;l++) {                v0 = gains[l] - (g->scale_factors[k++] << shift) + 400;                for(j=len;j>0;j--)                *exp_ptr++ = v0;            }        }    }}/* handle n = 0 too */static inline int get_bitsz(GetBitContext *s, int n){    if (n == 0)        return 0;    else        return get_bits(s, n);}static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos, int *end_pos2){    if(s->in_gb.buffer && *pos >= s->gb.size_in_bits){        s->gb= s->in_gb;        s->in_gb.buffer=NULL;        assert((get_bits_count(&s->gb) & 7) == 0);        skip_bits_long(&s->gb, *pos - *end_pos);        *end_pos2=        *end_pos= *end_pos2 + get_bits_count(&s->gb) - *pos;        *pos= get_bits_count(&s->gb);    }}static int huffman_decode(MPADecodeContext *s, GranuleDef *g,                          int16_t *exponents, int end_pos2){    int s_index;    int i;    int last_pos, bits_left;    VLC *vlc;    int end_pos= FFMIN(end_pos2, s->gb.size_in_bits);    /* low frequencies (called big values) */    s_index = 0;    for(i=0;i<3;i++) {        int j, k, l, linbits;        j = g->region_size[i];        if (j == 0)            continue;        /* select vlc table */        k = g->table_select[i];        l = mpa_huff_data[k][0];        linbits = mpa_huff_data[k][1];        vlc = &huff_vlc[l];        if(!l){            memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*2*j);            s_index += 2*j;            continue;        }        /* read huffcode and compute each couple */        for(;j>0;j--) {            int exponent, x, y, v;            int pos= get_bits_count(&s->gb);            if (pos >= end_pos){//                av_log(NULL, AV_LOG_ERROR, "pos: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);                switch_buffer(s, &pos, &end_pos, &end_pos2);//                av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos);                if(pos >= end_pos)                    break;            }            y = get_vlc2(&s->gb, vlc->table, 7, 3);            if(!y){                g->sb_hybrid[s_index  ] =                g->sb_hybrid[s_index+1] = 0;                s_index += 2;                continue;            }            exponent= exponents[s_index];            dprintf(s->avctx, "region=%d n=%d x=%d y=%d exp=%d\n",                    i, g->region_size[i] - j, x, y, exponent);            if(y&16){                x = y >> 5;                y = y & 0x0f;                if (x < 15){                    v = expval_table[ exponent ][ x ];//                      v = expval_table[ (exponent&3) ][ x ] >> FFMIN(0 - (exponent>>2), 31);                }else{                    x += get_bitsz(&s->gb, linbits);                    v = l3_unscale(x, exponent);                }                if (get_bits1(&s->gb))                    v = -v;                g->sb_hybrid[s_index] = v;                if (y < 15){                    v = expval_table[ exponent ][ y ];                }else{                    y += get_bitsz(&s->gb, linbits);                    v = l3_unscale(y, exponent);                }                if (get_bits1(&s->gb))                    v = -v;                g->sb_hybrid[s_index+1] = v;            }else{                x = y >> 5;                y = y & 0x0f;                x += y;                if (x < 15){                    v = expval_table[ exponent ][ x ];                }else{                    x += get_bitsz(&s->gb, linbits);                    v = l3_unscale(x, exponent);                }                if (get_bits1(&s->gb))                    v = -v;                g->sb_hybrid[s_index+!!y] = v;                g->sb_hybrid[s_index+ !y] = 0;            }            s_index+=2;        }    }    /* high frequencies */    vlc = &huff_quad_vlc[g->count1table_select];    last_pos=0;    while (s_index <= 572) {        int pos, code;        pos = get_bits_count(&s->gb);        if (pos >= end_pos) {            if (pos > end_pos2 && last_pos){                /* some encoders generate an incorrect size for this                   part. We must go back into the data */                s_index -= 4;                skip_bits_long(&s->gb, last_pos - pos);                av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos);                if(s->error_resilience >= FF_ER_COMPLIANT)                    s_index=0;                break;            }//                av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);            switch_buffer(s, &pos, &end_pos, &end_pos2);//                av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index);            if(pos >= end_pos)                break;        }        last_pos= pos;        code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1);        dprintf(s->avctx, "t=%d code=%d\n", g->count1table_select, code);        g->sb_hybrid[s_index+0]=        g->sb_hybrid[s_index+1]=        g->sb_hybrid[s_index+2]=        g->sb_hybrid[s_index+3]= 0;        while(code){            static const int idxtab[16]={3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0};            int v;            int pos= s_index+idxtab[code];            code ^= 8>>idxtab[code];            v = exp_table[ exponents[pos] ];//            v = exp_table[ (exponents[pos]&3) ] >> FFMIN(0 - (exponents[pos]>>2), 31);            if(get_bits1(&s->gb))                v = -v;            g->sb_hybrid[pos] = v;        }        s_index+=4;    }    /* skip extension bits */    bits_left = end_pos2 - get_bits_count(&s->gb);//av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer);    if (bits_left < 0/* || bits_left > 500*/) {        av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left);        s_index=0;    }else if(bits_left > 0 && s->error_resilience >= FF_ER_AGGRESSIVE){        av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left);        s_index=0;    }    memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index));    skip_bits_long(&s->gb, bits_left);    i= get_bits_count(&s->gb);    switch_buffer(s, &i, &end_pos, &end_pos2);    return 0;}/* Reorder short blocks from bitstream order to interleaved order. It   would be faster to do it in parsing, but the code would be far more   complicated */static void reorder_block(MPADecodeContext *s, GranuleDef *g){    int i, j, len;    int32_t *ptr, *dst, *ptr1;    int32_t tmp[576];    if (g->block_type != 2)        return;    if (g->switch_point) {        if (s->sample_rate_index != 8) {            ptr = g->sb_hybrid + 36;        } else {            ptr = g->sb_hybrid + 48;        }    } else {        ptr = g->sb_hybrid;    }    for(i=g->short_start;i<13;i++) {        len = band_size_short[s->sample_rate_index][i];        ptr1 = ptr;        dst = tmp;        for(j=len;j>0;j--) {            *dst++ = ptr[0*len];            *dst++ = ptr[1*len];            *dst++ = ptr[2*len];            ptr++;        }        ptr+=2*len;        memcpy(ptr1, tmp, len * 3 * sizeof(*ptr1));    }}#define ISQRT2 FIXR(0.70710678118654752440)static void compute_stereo(MPADecodeContext *s,                           GranuleDef *g0, GranuleDef *g1){    int i, j, k, l;    int32_t v1, v2;    int sf_max, tmp0, tmp1, sf, len, non_zero_found;    int32_t (*is_tab)[16];    int32_t *tab0, *tab1;    int non_zero_found_short[3];    /* intensity stereo */    if (s->mode_ext & MODE_EXT_I_STEREO) {        if (!s->lsf) {            is_tab = is_table;            sf_max = 7;        } else {            is_tab = is_table_lsf[g1->scalefac_compress & 1];            sf_max = 16;        }        tab0 = g0->sb_hybrid + 576;        tab1 = g1->sb_hybrid + 576;        non_zero_found_short[0] = 0;        non_zero_found_short[1] = 0;        non_zero_found_short[2] = 0;        k = (13 - g1->short_start) * 3 + g1->long_end - 3;        for(i = 12;i >= g1->short_start;i--) {            /* for last band, use previous scale factor */            if (i != 11)                k -= 3;            len = band_size_short[s->sample_rate_index][i];            for(l=2;l>=0;l--) {                tab0 -= len;                tab1 -= len;                if (!non_zero_found_short[l]) {                    /* test if non zero band. if so, stop doing i-stereo */                    for(j=0;j<len;j++) {                        if (tab1[j] != 0) {                            non_zero_found_short[l] = 1;                            goto found1;                        }                    }                    sf = g1->scale_factors[k + l];                    if (sf >= sf_max)                        goto found1;                    v1 = is_tab[0][sf];                    v2 = is_tab[1][sf];                    for(j=0;j<len;j++) {                        tmp0 = tab0[j];                        tab0[j] = MULL(tmp0, v1);                        tab1[j] = MULL(tmp0, v2);                    }

⌨️ 快捷键说明

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