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

📄 mpegaudiodec.c

📁 tcpmp播放器的flv插件
💻 C
📖 第 1 页 / 共 5 页
字号:
            dst = tmp + k;            for(j=len;j>0;j--) {                *dst = *ptr++;                dst += 3;            }        }        memcpy(ptr1, tmp, len * 3 * sizeof(int32_t));    }}#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);                    }                } 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, bits_left;    GranuleDef granules[2][2], *g;    int16_t exponents[576];    /* read side info */    if (s->lsf) {        main_data_begin = get_bits(&s->gb, 8);        if (s->nb_channels == 2)            private_bits = get_bits(&s->gb, 2);        else            private_bits = get_bits(&s->gb, 1);        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("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);            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_bits(&s->gb, 1);            if (blocksplit_flag) {                g->block_type = get_bits(&s->gb, 2);                if (g->block_type == 0)                    return -1;                g->switch_point = get_bits(&s->gb, 1);                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);                /* compute huffman coded region sizes */                if (g->block_type == 2)                    g->region_size[0] = (36 / 2);                else {                    if (s->sample_rate_index <= 2)                         g->region_size[0] = (36 / 2);                    else if (s->sample_rate_index != 8)                         g->region_size[0] = (54 / 2);                    else                        g->region_size[0] = (108 / 2);                }                g->region_size[1] = (576 / 2);            } else {                int region_address1, region_address2, l;                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("region1=%d region2=%d\n",                         region_address1, region_address2);                g->region_size[0] =                     band_index_long[s->sample_rate_index][region_address1 + 1] >> 1;                l = region_address1 + region_address2 + 2;                /* should not overflow */                if (l > 22)                    l = 22;                g->region_size[1] =                     band_index_long[s->sample_rate_index][l] >> 1;            }            /* convert region offsets to region sizes and truncate               si

⌨️ 快捷键说明

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