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

📄 mpegaudiodec.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
                } else {                found1:                    if (s->mode_ext & MODE_EXT_MS_STEREO) {                        /* lower part of the spectrum : do ms stereo                           if enabled */                        for(j=0;j<len;j++) {                            tmp0 = tab0[j];                            tmp1 = tab1[j];                            tab0[j] = MULL(tmp0 + tmp1, ISQRT2);                            tab1[j] = MULL(tmp0 - tmp1, ISQRT2);                        }                    }                }            }        }        non_zero_found = non_zero_found_short[0] |            non_zero_found_short[1] |            non_zero_found_short[2];        for(i = g1->long_end - 1;i >= 0;i--) {            len = band_size_long[s->sample_rate_index][i];            tab0 -= len;            tab1 -= len;            /* test if non zero band. if so, stop doing i-stereo */            if (!non_zero_found) {                for(j=0;j<len;j++) {                    if (tab1[j] != 0) {                        non_zero_found = 1;                        goto found2;                    }                }                /* for last band, use previous scale factor */                k = (i == 21) ? 20 : i;                sf = g1->scale_factors[k];                if (sf >= sf_max)                    goto found2;                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);                }            } else {            found2:                if (s->mode_ext & MODE_EXT_MS_STEREO) {                    /* lower part of the spectrum : do ms stereo                       if enabled */                    for(j=0;j<len;j++) {                        tmp0 = tab0[j];                        tmp1 = tab1[j];                        tab0[j] = MULL(tmp0 + tmp1, ISQRT2);                        tab1[j] = MULL(tmp0 - tmp1, ISQRT2);                    }                }            }        }    } else if (s->mode_ext & MODE_EXT_MS_STEREO) {        /* ms stereo ONLY */        /* NOTE: the 1/sqrt(2) normalization factor is included in the           global gain */        tab0 = g0->sb_hybrid;        tab1 = g1->sb_hybrid;        for(i=0;i<576;i++) {            tmp0 = tab0[i];            tmp1 = tab1[i];            tab0[i] = tmp0 + tmp1;            tab1[i] = tmp0 - tmp1;        }    }}static void compute_antialias_integer(MPADecodeContext *s,                              GranuleDef *g){    int32_t *ptr, *csa;    int n, i;    /* we antialias only "long" bands */    if (g->block_type == 2) {        if (!g->switch_point)            return;        /* XXX: check this for 8000Hz case */        n = 1;    } else {        n = SBLIMIT - 1;    }    ptr = g->sb_hybrid + 18;    for(i = n;i > 0;i--) {        int tmp0, tmp1, tmp2;        csa = &csa_table[0][0];#define INT_AA(j) \            tmp0 = ptr[-1-j];\            tmp1 = ptr[   j];\            tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\            ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\            ptr[   j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j]));        INT_AA(0)        INT_AA(1)        INT_AA(2)        INT_AA(3)        INT_AA(4)        INT_AA(5)        INT_AA(6)        INT_AA(7)        ptr += 18;    }}static void compute_antialias_float(MPADecodeContext *s,                              GranuleDef *g){    int32_t *ptr;    int n, i;    /* we antialias only "long" bands */    if (g->block_type == 2) {        if (!g->switch_point)            return;        /* XXX: check this for 8000Hz case */        n = 1;    } else {        n = SBLIMIT - 1;    }    ptr = g->sb_hybrid + 18;    for(i = n;i > 0;i--) {        float tmp0, tmp1;        float *csa = &csa_table_float[0][0];#define FLOAT_AA(j)\        tmp0= ptr[-1-j];\        tmp1= ptr[   j];\        ptr[-1-j] = lrintf(tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j]);\        ptr[   j] = lrintf(tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j]);        FLOAT_AA(0)        FLOAT_AA(1)        FLOAT_AA(2)        FLOAT_AA(3)        FLOAT_AA(4)        FLOAT_AA(5)        FLOAT_AA(6)        FLOAT_AA(7)        ptr += 18;    }}static void compute_imdct(MPADecodeContext *s,                          GranuleDef *g,                          int32_t *sb_samples,                          int32_t *mdct_buf){    int32_t *ptr, *win, *win1, *buf, *out_ptr, *ptr1;    int32_t out2[12];    int i, j, mdct_long_end, v, sblimit;    /* find last non zero block */    ptr = g->sb_hybrid + 576;    ptr1 = g->sb_hybrid + 2 * 18;    while (ptr >= ptr1) {        ptr -= 6;        v = ptr[0] | ptr[1] | ptr[2] | ptr[3] | ptr[4] | ptr[5];        if (v != 0)            break;    }    sblimit = ((ptr - g->sb_hybrid) / 18) + 1;    if (g->block_type == 2) {        /* XXX: check for 8000 Hz */        if (g->switch_point)            mdct_long_end = 2;        else            mdct_long_end = 0;    } else {        mdct_long_end = sblimit;    }    buf = mdct_buf;    ptr = g->sb_hybrid;    for(j=0;j<mdct_long_end;j++) {        /* apply window & overlap with previous buffer */        out_ptr = sb_samples + j;        /* select window */        if (g->switch_point && j < 2)            win1 = mdct_win[0];        else            win1 = mdct_win[g->block_type];        /* select frequency inversion */        win = win1 + ((4 * 36) & -(j & 1));        imdct36(out_ptr, buf, ptr, win);        out_ptr += 18*SBLIMIT;        ptr += 18;        buf += 18;    }    for(j=mdct_long_end;j<sblimit;j++) {        /* select frequency inversion */        win = mdct_win[2] + ((4 * 36) & -(j & 1));        out_ptr = sb_samples + j;        for(i=0; i<6; i++){            *out_ptr = buf[i];            out_ptr += SBLIMIT;        }        imdct12(out2, ptr + 0);        for(i=0;i<6;i++) {            *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*1];            buf[i + 6*2] = MULH(out2[i + 6], win[i + 6]);            out_ptr += SBLIMIT;        }        imdct12(out2, ptr + 1);        for(i=0;i<6;i++) {            *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*2];            buf[i + 6*0] = MULH(out2[i + 6], win[i + 6]);            out_ptr += SBLIMIT;        }        imdct12(out2, ptr + 2);        for(i=0;i<6;i++) {            buf[i + 6*0] = MULH(out2[i], win[i]) + buf[i + 6*0];            buf[i + 6*1] = MULH(out2[i + 6], win[i + 6]);            buf[i + 6*2] = 0;        }        ptr += 18;        buf += 18;    }    /* zero bands */    for(j=sblimit;j<SBLIMIT;j++) {        /* overlap */        out_ptr = sb_samples + j;        for(i=0;i<18;i++) {            *out_ptr = buf[i];            buf[i] = 0;            out_ptr += SBLIMIT;        }        buf += 18;    }}#if defined(DEBUG)void sample_dump(int fnum, int32_t *tab, int n){    static FILE *files[16], *f;    char buf[512];    int i;    int32_t v;    f = files[fnum];    if (!f) {        snprintf(buf, sizeof(buf), "/tmp/out%d.%s.pcm",                fnum,#ifdef USE_HIGHPRECISION                "hp"#else                "lp"#endif                );        f = fopen(buf, "w");        if (!f)            return;        files[fnum] = f;    }    if (fnum == 0) {        static int pos = 0;        av_log(NULL, AV_LOG_DEBUG, "pos=%d\n", pos);        for(i=0;i<n;i++) {            av_log(NULL, AV_LOG_DEBUG, " %0.4f", (double)tab[i] / FRAC_ONE);            if ((i % 18) == 17)                av_log(NULL, AV_LOG_DEBUG, "\n");        }        pos += n;    }    for(i=0;i<n;i++) {        /* normalize to 23 frac bits */        v = tab[i] << (23 - FRAC_BITS);        fwrite(&v, 1, sizeof(int32_t), f);    }}#endif/* main layer3 decoding function */static int mp_decode_layer3(MPADecodeContext *s){    int nb_granules, main_data_begin, private_bits;    int gr, ch, blocksplit_flag, i, j, k, n, bits_pos;    GranuleDef granules[2][2], *g;    int16_t exponents[576];    /* read side info */    if (s->lsf) {        main_data_begin = get_bits(&s->gb, 8);        private_bits = get_bits(&s->gb, s->nb_channels);        nb_granules = 1;    } else {        main_data_begin = get_bits(&s->gb, 9);        if (s->nb_channels == 2)            private_bits = get_bits(&s->gb, 3);        else            private_bits = get_bits(&s->gb, 5);        nb_granules = 2;        for(ch=0;ch<s->nb_channels;ch++) {            granules[ch][0].scfsi = 0; /* all scale factors are transmitted */            granules[ch][1].scfsi = get_bits(&s->gb, 4);        }    }    for(gr=0;gr<nb_granules;gr++) {        for(ch=0;ch<s->nb_channels;ch++) {            dprintf(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch);            g = &granules[ch][gr];            g->part2_3_length = get_bits(&s->gb, 12);            g->big_values = get_bits(&s->gb, 9);            if(g->big_values > 288){                av_log(s->avctx, AV_LOG_ERROR, "big_values too big\n");                return -1;            }            g->global_gain = get_bits(&s->gb, 8);            /* if MS stereo only is selected, we precompute the               1/sqrt(2) renormalization factor */            if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) ==                MODE_EXT_MS_STEREO)                g->global_gain -= 2;            if (s->lsf)                g->scalefac_compress = get_bits(&s->gb, 9);            else                g->scalefac_compress = get_bits(&s->gb, 4);            blocksplit_flag = get_bits1(&s->gb);            if (blocksplit_flag) {                g->block_type = get_bits(&s->gb, 2);                if (g->block_type == 0){                    av_log(NULL, AV_LOG_ERROR, "invalid block type\n");                    return -1;                }                g->switch_point = get_bits1(&s->gb);                for(i=0;i<2;i++)                    g->table_select[i] = get_bits(&s->gb, 5);                for(i=0;i<3;i++)                    g->subblock_gain[i] = get_bits(&s->gb, 3);                ff_init_short_region(s, g);            } else {                int region_address1, region_address2;                g->block_type = 0;                g->switch_point = 0;                for(i=0;i<3;i++)                    g->table_select[i] = get_bits(&s->gb, 5);                /* compute huffman coded region sizes */                region_address1 = get_bits(&s->gb, 4);                region_address2 = get_bits(&s->gb, 3);                dprintf(s->avctx, "region1=%d region2=%d\n",                        region_address1, region_address2);                ff_init_long_region(s, g, region_address1, region_address2);            }            ff_region_offset2size(g);            ff_compute_band_indexes(s, g);            g->preflag = 0;            if (!s->lsf)                g->preflag = get_bits1(&s->gb);            g->scalefac_scale = get_bits1(&s->gb);            g->count1table_select = get_bits1(&s->gb);            dprintf(s->avctx, "block_type=%d switch_point=%d\n",                    g->block_type, g->switch_point);        }    }  if (!s->adu_mode) {    const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);    assert((get_bits_count(&s->gb) & 7) == 0);    /* now we get bits from the main_data_begin offset */    dprintf(s->avctx, "seekback: %d\n", main_data_begin);//av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);    memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES);    s->in_gb= s->gb;        init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8);        skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin));  }    for(gr=0;gr<nb_granules;gr++) {        for(ch=0;ch<s->nb_channels;ch++) {            g = &granules[ch][gr];            if(get_bits_count(&s->gb)<0){                av_log(NULL, AV_LOG_ERROR, "mdb:%d, lastbuf:%d skipping granule %d\n",                                            main_data_begin, s->last_buf_size, gr);                skip_bits_long(&s->gb, g->part2_3_length);                memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));                if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer){                    skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);                    s->gb= s->in_gb;                    s->in_gb.buffer=NULL;                }                continue;            }            bits_pos = get_bits_count(&s->gb);            if (!s->lsf) {                uint8_t *sc;                int slen, slen1, slen2;                /* MPEG1 scale factors */                slen1 = slen_table[0][g->scalefac_compress];                slen2 = slen_table[1][g->scalefac_compress];                dprintf(s->avctx, "slen1=%d slen2=%d\n", slen1, slen2);                if (g->block_type == 2) {                    n = g->switch_point ? 17 : 18;                    j = 0;                    if(slen1){                        for(i=0;i<n;i++)                            g->scale_factors[j++] = get_bits(&s->gb, slen1);                    }else{                        for(i=0;i<n;i++)                            g->scale_factors[j++] = 0;                    }                    if(slen2){                        for(i=0;i<18;i++)                            g->scale_factors[j++] = get_bits(&s->gb, slen2);                        for(i=0;i<3;i++)                            g->scale_factors[j++] = 0;                    }else{                        for(i=0;i<21;i++)                            g->scale_factors[j++] = 0;                    }                } else {    

⌨️ 快捷键说明

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