javazoom.jl.decoder.LayerIIIDecoder.huffman_decode C# (CSharp) Метод

huffman_decode() приватный Метод

private huffman_decode ( int ch, int gr ) : void
ch int
gr int
Результат void
        private void huffman_decode(int ch, int gr)
        {
            x[0] = 0;
            y[0] = 0;
            v[0] = 0;
            w[0] = 0;

            int part2_3_end = part2_start + si.ch[ch].gr[gr].part2_3_length;
            int num_bits;
            int region1Start;
            int region2Start;
            int index;

            int buf, buf1;

            huffcodetab h;

            // Find region boundary for short block case

            if (((si.ch[ch].gr[gr].window_switching_flag) != 0) && (si.ch[ch].gr[gr].block_type == 2))
            {

                // Region2.
                //MS: Extrahandling for 8KHZ
                region1Start = (sfreq == 8)?72:36; // sfb[9/3]*3=36 or in case 8KHZ = 72
                region2Start = 576; // No Region2 for short block case
            }
            else
            {
                // Find region boundary for long block case

                buf = si.ch[ch].gr[gr].region0_count + 1;
                buf1 = buf + si.ch[ch].gr[gr].region1_count + 1;

                if (buf1 > sfBandIndex[sfreq].l.Length - 1)
                    buf1 = sfBandIndex[sfreq].l.Length - 1;

                region1Start = sfBandIndex[sfreq].l[buf];
                region2Start = sfBandIndex[sfreq].l[buf1]; /* MI */
            }

            index = 0;
            // Read bigvalues area
            for (int i = 0; i < (si.ch[ch].gr[gr].big_values << 1); i += 2)
            {
                if (i < region1Start)
                    h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[0]];
                else if (i < region2Start)
                    h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[1]];
                else
                    h = huffcodetab.ht[si.ch[ch].gr[gr].table_select[2]];

                huffcodetab.huffman_decoder(h, x, y, v, w, br);

                is_1d[index++] = x[0];
                is_1d[index++] = y[0];
                CheckSumHuff = CheckSumHuff + x[0] + y[0];
                // System.out.println("x = "+x[0]+" y = "+y[0]);
            }

            // Read count1 area
            h = huffcodetab.ht[si.ch[ch].gr[gr].count1table_select + 32];
            num_bits = br.hsstell();

            while ((num_bits < part2_3_end) && (index < 576))
            {

                huffcodetab.huffman_decoder(h, x, y, v, w, br);

                is_1d[index++] = v[0];
                is_1d[index++] = w[0];
                is_1d[index++] = x[0];
                is_1d[index++] = y[0];
                CheckSumHuff = CheckSumHuff + v[0] + w[0] + x[0] + y[0];
                // System.out.println("v = "+v[0]+" w = "+w[0]);
                // System.out.println("x = "+x[0]+" y = "+y[0]);
                num_bits = br.hsstell();
            }

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

            num_bits = br.hsstell();

            // Dismiss stuffing bits
            if (num_bits < part2_3_end)
                br.hgetbits(part2_3_end - num_bits);

            // Zero out rest

            if (index < 576)
                nonzero[ch] = index;
            else
                nonzero[ch] = 576;

            if (index < 0)
                index = 0;

            // may not be necessary
            for (; index < 576; index++)
                is_1d[index] = 0;
        }