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

📄 layeriiidecoder.java

📁 java mp3 player library. for play back mp3 audio
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                s[2][5] = br.hgetbits(length0);
                s[0][6] = br.hgetbits(length1);
                s[1][6] = br.hgetbits(length1);
                s[2][6] = br.hgetbits(length1);
                s[0][7] = br.hgetbits(length1);
                s[1][7] = br.hgetbits(length1);
                s[2][7] = br.hgetbits(length1);
                s[0][8] = br.hgetbits(length1);
                s[1][8] = br.hgetbits(length1);
                s[2][8] = br.hgetbits(length1);
                s[0][9] = br.hgetbits(length1);
                s[1][9] = br.hgetbits(length1);
                s[2][9] = br.hgetbits(length1);
                s[0][10] = br.hgetbits(length1);
                s[1][10] = br.hgetbits(length1);
                s[2][10] = br.hgetbits(length1);
                s[0][11] = br.hgetbits(length1);
                s[1][11] = br.hgetbits(length1);
                s[2][11] = br.hgetbits(length1);
                s[0][12] = s[1][12] = s[2][12] = 0;
            }
            // SHORT
        } else {
            // LONG types 0,1,3
            int si_t[] = si.ch[ch].scfsi;
            if (gr == 0) {
                l[0] = br.hgetbits(length0);
                l[1] = br.hgetbits(length0);
                l[2] = br.hgetbits(length0);
                l[3] = br.hgetbits(length0);
                l[4] = br.hgetbits(length0);
                l[5] = br.hgetbits(length0);
                l[6] = br.hgetbits(length0);
                l[7] = br.hgetbits(length0);
                l[8] = br.hgetbits(length0);
                l[9] = br.hgetbits(length0);
                l[10] = br.hgetbits(length0);
                l[11] = br.hgetbits(length1);
                l[12] = br.hgetbits(length1);
                l[13] = br.hgetbits(length1);
                l[14] = br.hgetbits(length1);
                l[15] = br.hgetbits(length1);
                l[16] = br.hgetbits(length1);
                l[17] = br.hgetbits(length1);
                l[18] = br.hgetbits(length1);
                l[19] = br.hgetbits(length1);
                l[20] = br.hgetbits(length1);
            }
            else{
              if (si_t[0] == 0) {
                l[0] = br.hgetbits(length0);
                l[1] = br.hgetbits(length0);
                l[2] = br.hgetbits(length0);
                l[3] = br.hgetbits(length0);
                l[4] = br.hgetbits(length0);
                l[5] = br.hgetbits(length0);
              }
              if (si_t[1] == 0) {
                l[6] = br.hgetbits(length0);
                l[7] = br.hgetbits(length0);
                l[8] = br.hgetbits(length0);
                l[9] = br.hgetbits(length0);
                l[10] = br.hgetbits(length0);
              }
              if (si_t[2] == 0) {
                l[11] = br.hgetbits(length1);
                l[12] = br.hgetbits(length1);
                l[13] = br.hgetbits(length1);
                l[14] = br.hgetbits(length1);
                l[15] = br.hgetbits(length1);
              }
              if (si_t[3] == 0) {
                l[16] = br.hgetbits(length1);
                l[17] = br.hgetbits(length1);
                l[18] = br.hgetbits(length1);
                l[19] = br.hgetbits(length1);
                l[20] = br.hgetbits(length1);
              }
            }
            l[21] = l[22] = 0;
        }
    }


    private final void huffman_decode(final int ch, final int gr) {
        //huff.x = huff.y = huff.v = huff.w= 0;
        GRInfo s = si.ch[ch].gr[gr];
        int part2_3_end = part2_start + s.part2_3_length;
        int num_bits=0;
        int region1Start=0;
        int region2Start=0;
        int index;
        int buf;
        int buf1;

        // Find region boundary for short block case
        if (((s.window_switching_flag) != 0) && (s.block_type == 2)) {
            // Region2.
            region1Start = 36;
            // sfb[9/3]*3=36
            region2Start = 576;
            // No Region2 for short block case
        } else {
            // Find region boundary for long block case
            buf = s.region0_count + 1;
            buf1 = buf + s.region1_count + 1;
            if (buf1 > sfBandIndexL.length - 1) {
                buf1 = sfBandIndexL.length - 1;
            }
            region1Start = sfBandIndexL[buf];
            region2Start = sfBandIndexL[buf1];
        }
        index = 0;
        // Read bigvalues area
        int big_val_max, is_1d_max;

        big_val_max = s.big_values << 1;
        is_1d_max = is_1d.length;
       // for (int i = 0; (i < (s.big_values << 1)) && (i<is_1d.length); i += 2) {
        for (int i = 0; (i<big_val_max) && (i<is_1d_max); i += 2) {
            if (i < region1Start) {
                h = HuffmanTables.ht[s.table_select[0]];
            }
            else if (i < region2Start) {
                h = HuffmanTables.ht[s.table_select[1]];
            }
            else {
                h = HuffmanTables.ht[s.table_select[2]];
            }
            HuffmanTables.decode(h, huff, br);
            is_1d[index++] = huff.x;
            is_1d[index++] = huff.y;
        }

        h = HuffmanTables.ht[s.count1table_select + 32];
        num_bits = br.totbit;
        while ((num_bits < part2_3_end) && (index < 576)) {
            HuffmanTables.decode(h, huff, br);
            is_1d[index++] = huff.v;
            is_1d[index++] = huff.w;
            is_1d[index++] = huff.x;
            is_1d[index++] = huff.y;
            num_bits = br.totbit;
        }

        if (num_bits > part2_3_end) {
            br.rewindNbits(num_bits - part2_3_end);
            index -= 4;
        }

        num_bits = br.totbit;
        // Dismiss stuffing bits
        if (num_bits < part2_3_end) {
            br.hgetbits(part2_3_end - num_bits);
        }

        // Zero out rest
        if (index < 576) {
            if(ch==0)
              nonzero0 = index;
            else
              nonzero1 = index;
        } else {
            if(ch==0)
              nonzero0 = 576;
            else
              nonzero1 = 576;
        }
        if (index < 0) {
            index = 0;
        }
    }

    private final void dequantize_sample(final float xr[][], final int ch, final int gr) {
        GRInfo gr_info = (si.ch[ch].gr[gr]);
        int cb = 0;
        int next_cb_boundary =0;
        int cb_begin = 0;
        int cb_width = 0;
        float g_gain = 0.0f;
        // choose correct scalefactor band per block type, initalize boundary
        if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
            if (gr_info.mixed_block_flag != 0) {
                next_cb_boundary = sfBandIndexL[1];
            }
            // LONG blocks: 0,1,3
            else {
                cb_width = sfBandIndexS[1];
                next_cb_boundary = (cb_width << 2) - cb_width;
                cb_begin = 0;
            }
        } else {
            next_cb_boundary = sfBandIndexL[1];
            // LONG blocks: 0,1,3
        }
        // Compute overall (global) scaling.
        g_gain = (float) Math.pow(2.0, (0.25 * (gr_info.global_gain - 210.0)));
        int maxNonZero = (ch == 0) ? nonzero0 : nonzero1;
        for (int j = 0; j < maxNonZero; j++) {
            reste = j % SSLIMIT;
            quotien = (int) ((j - reste) / SSLIMIT);
            if (is_1d[j] == 0) {
                xr[quotien][reste] = 0.0f;
            }
            else {
              int abv = is_1d[j];
              if (is_1d[j] > 0) {
                xr[quotien][reste] = g_gain * t_43[abv];
              }
              else {
                xr[quotien][reste] = -g_gain * t_43[-abv];
              }
            }
        }
        // apply formula per block type
        for (int i=0, j = 0; j < maxNonZero; j++,i++) {
            reste = j % SSLIMIT;
            quotien = (int) ((j - reste) / SSLIMIT);
            if (i == next_cb_boundary) {
                /*
                 *  Adjust critical band boundary
                 */
                if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2)) {
                    if (gr_info.mixed_block_flag != 0) {
                        if (i == sfBandIndexL[8]) {
                            next_cb_boundary = sfBandIndexS[4];
                            next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
                            cb = 3;
                            cb_width = sfBandIndexS[4] - sfBandIndexS[3];
                            cb_begin = sfBandIndexS[3];
                            cb_begin = (cb_begin << 2) - cb_begin;
                        } else if (i < sfBandIndexL[8]) {
                            next_cb_boundary = sfBandIndexL[(++cb) + 1];
                        } else {
                            next_cb_boundary = sfBandIndexS[(++cb) + 1];
                            next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
                            cb_begin = sfBandIndexS[cb];
                            cb_width = sfBandIndexS[cb + 1] - cb_begin;
                            cb_begin = (cb_begin << 2) - cb_begin;
                        }
                    } else {
                        next_cb_boundary = sfBandIndexS[(++cb) + 1];
                        next_cb_boundary = (next_cb_boundary << 2) - next_cb_boundary;
                        cb_begin = sfBandIndexS[cb];
                        cb_width = sfBandIndexS[cb + 1] - cb_begin;
                        cb_begin = (cb_begin << 2) - cb_begin;
                    }
                } else {
                    // long blocks
                    next_cb_boundary = sfBandIndexL[(++cb) + 1];
                }
            }
            int s[][] = (ch==0)?scalefac0S:scalefac1S;
            int l[] = (ch==0)?scalefac0L:scalefac1L;
            // Do long/short dependent scaling operations
            if ((gr_info.window_switching_flag != 0) && (((gr_info.block_type == 2) && (gr_info.mixed_block_flag == 0)) || ((gr_info.block_type == 2) && (gr_info.mixed_block_flag != 0) && (j >= 36)))) {
                int t_index = (i - cb_begin) / cb_width;
                int idx = s[t_index][cb] << gr_info.scalefac_scale;
                idx += (gr_info.subblock_gain[t_index] << 2);
                xr[quotien][reste] *= two_to_negative_half_pow[idx];
            } else {
                // LONG block types 0

⌨️ 快捷键说明

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