コード例 #1
0
ファイル: SubbandLayer1.cs プロジェクト: jorsi/UltimaXNA
 /// <summary>
 ///     *
 /// </summary>
 public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
 {
     if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL))
     {
         float scaled_sample = (sample * factor + offset) * scalefactor;
         filter1.input_sample(scaled_sample, subbandnumber);
     }
     return true;
 }
コード例 #2
0
ファイル: LayerIDecoder.cs プロジェクト: msx752/UltimaXNA
 public virtual void Create(Bitstream stream0, Header header0, SynthesisFilter filtera, SynthesisFilter filterb,
     ABuffer buffer0, int whichCh0)
 {
     stream = stream0;
     header = header0;
     filter1 = filtera;
     filter2 = filterb;
     buffer = buffer0;
     which_channels = whichCh0;
 }
コード例 #3
0
        /// <summary>
        ///     *
        /// </summary>
        public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
        {
            if (allocation != 0)
            {
                float sample = samples[samplenumber];

                if (groupingtable[0] == null)
                    sample = (sample + d[0]) * c[0];
                if (channels == OutputChannels.BOTH_CHANNELS)
                {
                    float sample2 = sample;
                    if (groupnumber <= 4)
                    {
                        sample *= scalefactor1;
                        sample2 *= channel2_scalefactor1;
                    }
                    else if (groupnumber <= 8)
                    {
                        sample *= scalefactor2;
                        sample2 *= channel2_scalefactor2;
                    }
                    else
                    {
                        sample *= scalefactor3;
                        sample2 *= channel2_scalefactor3;
                    }
                    filter1.input_sample(sample, subbandnumber);
                    filter2.input_sample(sample2, subbandnumber);
                }
                else if (channels == OutputChannels.LEFT_CHANNEL)
                {
                    if (groupnumber <= 4)
                        sample *= scalefactor1;
                    else if (groupnumber <= 8)
                        sample *= scalefactor2;
                    else
                        sample *= scalefactor3;
                    filter1.input_sample(sample, subbandnumber);
                }
                else
                {
                    if (groupnumber <= 4)
                        sample *= channel2_scalefactor1;
                    else if (groupnumber <= 8)
                        sample *= channel2_scalefactor2;
                    else
                        sample *= channel2_scalefactor3;
                    filter1.input_sample(sample, subbandnumber);
                }
            }

            if (++samplenumber == 3)
                return true;
            return false;
        }
コード例 #4
0
 /// <summary>
 ///     *
 /// </summary>
 public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
 {
     base.put_next_sample(channels, filter1, filter2);
     if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL))
     {
         float sample2 = (channel2_sample * channel2_factor + channel2_offset) * channel2_scalefactor;
         if (channels == OutputChannels.BOTH_CHANNELS)
             filter2.input_sample(sample2, subbandnumber);
         else
             filter1.input_sample(sample2, subbandnumber);
     }
     return true;
 }
コード例 #5
0
        /// <summary>
        ///     *
        /// </summary>
        public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
        {
            bool returnvalue = base.put_next_sample(channels, filter1, filter2);
            if ((channel2_allocation != 0) && (channels != OutputChannels.LEFT_CHANNEL))
            {
                float sample = channel2_samples[samplenumber - 1];

                if (groupingtable[1] == null)
                    sample = (sample + channel2_d[0]) * channel2_c[0];

                if (groupnumber <= 4)
                    sample *= channel2_scalefactor1;
                else if (groupnumber <= 8)
                    sample *= channel2_scalefactor2;
                else
                    sample *= channel2_scalefactor3;
                if (channels == OutputChannels.BOTH_CHANNELS)
                    filter2.input_sample(sample, subbandnumber);
                else
                    filter1.input_sample(sample, subbandnumber);
            }
            return returnvalue;
        }
コード例 #6
0
 /// <summary>
 ///     *
 /// </summary>
 public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
 {
     if (allocation != 0)
     {
         sample = sample * factor + offset; // requantization
         if (channels == OutputChannels.BOTH_CHANNELS)
         {
             float sample1 = sample * scalefactor, sample2 = sample * channel2_scalefactor;
             filter1.input_sample(sample1, subbandnumber);
             filter2.input_sample(sample2, subbandnumber);
         }
         else if (channels == OutputChannels.LEFT_CHANNEL)
         {
             float sample1 = sample * scalefactor;
             filter1.input_sample(sample1, subbandnumber);
         }
         else
         {
             float sample2 = sample * channel2_scalefactor;
             filter1.input_sample(sample2, subbandnumber);
         }
     }
     return true;
 }
コード例 #7
0
ファイル: SubbandLayer2.cs プロジェクト: clashbyte/openvice
        /// <summary>
        ///     *
        /// </summary>
        public override bool PutNextSample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
        {
            if ((allocation != 0) && (channels != OutputChannels.RIGHT_CHANNEL))
            {
                float sample = samples[samplenumber];

                if (groupingtable[0] == null)
                    sample = (sample + d[0]) * c[0];
                if (groupnumber <= 4)
                    sample *= scalefactor1;
                else if (groupnumber <= 8)
                    sample *= scalefactor2;
                else
                    sample *= scalefactor3;
                filter1.WriteSample(sample, subbandnumber);
            }

            if (++samplenumber == 3)
                return true;
            return false;
        }
コード例 #8
0
ファイル: LayerIIIDecoder.cs プロジェクト: jorsi/UltimaXNA
        /// <summary>
        ///     Constructor.
        ///     REVIEW: these constructor arguments should be moved to the decodeFrame() method.
        /// </summary>
        public LayerIIIDecoder(Bitstream stream, Header header, SynthesisFilter filtera, SynthesisFilter filterb, ABuffer buffer, int whichCh)
        {
            Huffman.Initialize();

            InitBlock();
            is_1d = new int[SBLIMIT*SSLIMIT + 4];
            ro = new float[2][][];
            for (int i = 0; i < 2; i++)
            {
                ro[i] = new float[SBLIMIT][];
                for (int i2 = 0; i2 < SBLIMIT; i2++)
                {
                    ro[i][i2] = new float[SSLIMIT];
                }
            }
            lr = new float[2][][];
            for (int i3 = 0; i3 < 2; i3++)
            {
                lr[i3] = new float[SBLIMIT][];
                for (int i4 = 0; i4 < SBLIMIT; i4++)
                {
                    lr[i3][i4] = new float[SSLIMIT];
                }
            }
            out_1d = new float[SBLIMIT*SSLIMIT];
            prevblck = new float[2][];
            for (int i5 = 0; i5 < 2; i5++)
            {
                prevblck[i5] = new float[SBLIMIT*SSLIMIT];
            }
            k = new float[2][];
            for (int i6 = 0; i6 < 2; i6++)
            {
                k[i6] = new float[SBLIMIT*SSLIMIT];
            }
            nonzero = new int[2];

            //III_scalefact_t
            III_scalefac_t = new ScaleFactorData[2];
            III_scalefac_t[0] = new ScaleFactorData();
            III_scalefac_t[1] = new ScaleFactorData();
            scalefac = III_scalefac_t;
            // L3TABLE INIT

            sfBandIndex = new SBI[9]; // SZD: MPEG2.5 +3 indices
            int[] l0 =
            {
                0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
            };
            int[] s0 = {0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192};
            int[] l1 =
            {
                0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 330, 394, 464, 540, 576
            };
            int[] s1 = {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192};
            int[] l2 =
            {
                0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
            };
            int[] s2 = {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192};

            int[] l3 =
            {
                0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576
            };
            int[] s3 = {0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192};
            int[] l4 =
            {
                0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576
            };
            int[] s4 = {0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192};
            int[] l5 =
            {
                0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550,
                576
            };
            int[] s5 = {0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192};
            // SZD: MPEG2.5
            int[] l6 =
            {
                0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522,
                576
            };
            int[] s6 = {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192};
            int[] l7 =
            {
                0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522,
                576
            };
            int[] s7 = {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192};
            int[] l8 =
            {
                0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572,
                574, 576
            };
            int[] s8 = {0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192};

            sfBandIndex[0] = new SBI(l0, s0);
            sfBandIndex[1] = new SBI(l1, s1);
            sfBandIndex[2] = new SBI(l2, s2);

            sfBandIndex[3] = new SBI(l3, s3);
            sfBandIndex[4] = new SBI(l4, s4);
            sfBandIndex[5] = new SBI(l5, s5);
            //SZD: MPEG2.5
            sfBandIndex[6] = new SBI(l6, s6);
            sfBandIndex[7] = new SBI(l7, s7);
            sfBandIndex[8] = new SBI(l8, s8);
            // END OF L3TABLE INIT

            if (reorder_table == null)
            {
                // SZD: generate LUT
                reorder_table = new int[9][];
                for (int i = 0; i < 9; i++)
                    reorder_table[i] = Reorder(sfBandIndex[i].s);
            }

            // Sftable
            int[] ll0 = {0, 6, 11, 16, 21};
            int[] ss0 = {0, 6, 12};
            sftable = new ScaleFactorTable(this, ll0, ss0);
            // END OF Sftable

            // scalefac_buffer
            scalefac_buffer = new int[54];
            // END OF scalefac_buffer

            this.stream = stream;
            this.header = header;
            filter1 = filtera;
            filter2 = filterb;
            this.buffer = buffer;
            which_channels = whichCh;

            frame_start = 0;
            channels = (this.header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2;
            max_gr = (this.header.version() == Header.MPEG1) ? 2 : 1;

            sfreq = this.header.sample_frequency() +
                    ((this.header.version() == Header.MPEG1) ? 3 : (this.header.version() == Header.MPEG25_LSF) ? 6 : 0); // SZD

            if (channels == 2)
            {
                switch (which_channels)
                {
                    case (int) OutputChannelsEnum.LEFT_CHANNEL:
                    case (int) OutputChannelsEnum.DOWNMIX_CHANNELS:
                        first_channel = last_channel = 0;
                        break;

                    case (int) OutputChannelsEnum.RIGHT_CHANNEL:
                        first_channel = last_channel = 1;
                        break;

                    case (int) OutputChannelsEnum.BOTH_CHANNELS:
                    default:
                        first_channel = 0;
                        last_channel = 1;
                        break;
                }
            }
            else
            {
                first_channel = last_channel = 0;
            }

            for (int ch = 0; ch < 2; ch++)
                for (int j = 0; j < 576; j++)
                    prevblck[ch][j] = 0.0f;

            nonzero[0] = nonzero[1] = 576;

            m_BitReserve = new BitReserve();
            m_SideInfo = new Layer3SideInfo();
        }
コード例 #9
0
ファイル: ASubband.cs プロジェクト: jorsi/UltimaXNA
 public abstract bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2);
コード例 #10
0
ファイル: ASubband.cs プロジェクト: clashbyte/openvice
 public abstract bool PutNextSample(int channels, SynthesisFilter filter1, SynthesisFilter filter2);
コード例 #11
0
        /// <summary>
        ///     *
        /// </summary>
        public override bool put_next_sample(int channels, SynthesisFilter filter1, SynthesisFilter filter2)
        {
            if (allocation != 0)
            {
                float sample = samples[samplenumber];

                if (groupingtable[0] == null)
                {
                    sample = (sample + d[0]) * c[0];
                }

                if (channels == OutputChannels.BOTH_CHANNELS)
                {
                    float sample2 = sample;

                    if (groupnumber <= 4)
                    {
                        sample  *= scalefactor1;
                        sample2 *= channel2_scalefactor1;
                    }
                    else if (groupnumber <= 8)
                    {
                        sample  *= scalefactor2;
                        sample2 *= channel2_scalefactor2;
                    }
                    else
                    {
                        sample  *= scalefactor3;
                        sample2 *= channel2_scalefactor3;
                    }

                    filter1.input_sample(sample, subbandnumber);
                    filter2.input_sample(sample2, subbandnumber);
                }
                else if (channels == OutputChannels.LEFT_CHANNEL)
                {
                    if (groupnumber <= 4)
                    {
                        sample *= scalefactor1;
                    }
                    else if (groupnumber <= 8)
                    {
                        sample *= scalefactor2;
                    }
                    else
                    {
                        sample *= scalefactor3;
                    }
                    filter1.input_sample(sample, subbandnumber);
                }
                else
                {
                    if (groupnumber <= 4)
                    {
                        sample *= channel2_scalefactor1;
                    }
                    else if (groupnumber <= 8)
                    {
                        sample *= channel2_scalefactor2;
                    }
                    else
                    {
                        sample *= channel2_scalefactor3;
                    }
                    filter1.input_sample(sample, subbandnumber);
                }
            }

            if (++samplenumber == 3)
            {
                return(true);
            }

            return(false);
        }
コード例 #12
0
ファイル: LayerIDecoder.cs プロジェクト: xoozyx/ClassicUO
 public virtual void Create(Bitstream stream0, Header header0, SynthesisFilter filtera, SynthesisFilter filterb,
                            ABuffer buffer0, int whichCh0)
 {
     stream         = stream0;
     header         = header0;
     filter1        = filtera;
     filter2        = filterb;
     buffer         = buffer0;
     which_channels = whichCh0;
 }