Ejemplo n.º 1
0
 public virtual int synth_1to1_mono_ptr <X>(
     MPGLib.mpstr_tag mp,
     float[] @in,
     int inPos,
     X[] @out,
     MPGLib.ProcessedBytes p,
     Decode.Factory <X> tFactory)
 {
     return(outerInstance.decode.synth_1to1_mono(mp, @in, inPos, @out, p, tFactory));
 }
Ejemplo n.º 2
0
 public virtual int synth_1to1_ptr(
     MPGLib.mpstr_tag mp,
     float[] @in,
     int inPos,
     int i,
     T[] @out,
     MPGLib.ProcessedBytes p,
     Decode.Factory <T> tFactory)
 {
     return(outerInstance.decode.synth_1to1_unclipped(mp, @in, inPos, i, @out, p, tFactory));
 }
Ejemplo n.º 3
0
 public virtual int decode <X>(
     mpstr_tag mp,
     byte[] @in,
     int bufferPos,
     int isize,
     X[] @out,
     int osize,
     ProcessedBytes done,
     Decode.Factory <X> tFactory)
 {
     return(outerInstance.interf.decodeMP3(mp, @in, bufferPos, isize, @out, osize, done, tFactory));
 }
Ejemplo n.º 4
0
 internal ISynthAnonymousInnerClass(
     Interface outerInstance,
     MPGLib.mpstr_tag mp,
     byte[] @in,
     T[] @out,
     Decode.Factory <T> tFactory)
 {
     this.outerInstance = outerInstance;
     this.mp            = mp;
     this.@in           = @in;
     this.@out          = @out;
     this.tFactory      = tFactory;
 }
Ejemplo n.º 5
0
        internal virtual int do_layer1 <T>(
            MPGLib.mpstr_tag mp,
            T[] pcm_sample,
            MPGLib.ProcessedBytes pcm_point,
            Decode.Factory <T> tFactory)
        {
            var clip        = 0;
            var balloc      = new int[2 * MPG123.SBLIMIT];
            var scale_index = new int[2 * MPG123.SBLIMIT];

            var fraction = Arrays.ReturnRectangularArray <float>(2, MPG123.SBLIMIT);
            var fr = mp.fr;
            int i, stereo = fr.stereo;
            var single = fr.single;

            fr.jsbound = fr.mode == MPG123.MPG_MD_JOINT_STEREO ? (fr.mode_ext << 2) + 4 : 32;

            if (stereo == 1 || single == 3)
            {
                single = 0;
            }

            I_step_one(mp, balloc, scale_index, fr);

            for (i = 0; i < MPG123.SCALE_BLOCK; i++)
            {
                I_step_two(mp, fraction, balloc, scale_index, fr);

                if (single >= 0)
                {
                    clip += decode.synth_1to1_mono(mp, fraction[single], 0, pcm_sample, pcm_point, tFactory);
                }
                else
                {
                    var p1 = new MPGLib.ProcessedBytes();
                    p1.pb = pcm_point.pb;
                    clip += decode.synth_1to1(mp, fraction[0], 0, 0, pcm_sample, p1, tFactory);
                    clip += decode.synth_1to1(mp, fraction[1], 0, 1, pcm_sample, pcm_point, tFactory);
                }
            }

            return(clip);
        }
Ejemplo n.º 6
0
        internal virtual int decodeMP3 <T>(
            MPGLib.mpstr_tag mp,
            byte[] @in,
            int bufferPos,
            int isize,
            T[] @out,
            int osize,
            MPGLib.ProcessedBytes done,
            Decode.Factory <T> tFactory)
        {
            if (osize < 2304)
            {
                Console.WriteLine("hip: Insufficient memory for decoding buffer %d\n", osize);
                return(MPGLib.MP3_ERR);
            }

            /* passing pointers to the functions which clip the samples */
            ISynth synth = new ISynthAnonymousInnerClass <T>(this, mp, @in, @out, tFactory);

            return(decodeMP3_clipchoice(mp, @in, bufferPos, isize, @out, done, synth, tFactory));
        }
Ejemplo n.º 7
0
        internal virtual int decodeMP3 <T>(
            MPGLib.mpstr_tag mp,
            byte[] @in,
            int bufferPos,
            int isize,
            T[] @out,
            int osize,
            MPGLib.ProcessedBytes done,
            Decode.Factory <T> tFactory,
            bool seek)
        {
            if (osize < 2304)
            {
                return(MPGLib.MP3_ERR);
            }

            /* passing pointers to the functions which clip the samples */
            ISynth <T> synth = new ISynthAnonymousInnerClass <T>(this, mp, @in, @out, tFactory);

            return(decodeMP3_clipchoice(mp, @in, bufferPos, isize, @out, done, synth, tFactory, seek));
        }
Ejemplo n.º 8
0
        internal virtual int decodeMP3_unclipped <T>(
            MPGLib.mpstr_tag mp,
            byte[] @in,
            int bufferPos,
            int isize,
            T[] @out,
            int osize,
            MPGLib.ProcessedBytes done,
            Decode.Factory <T> tFactory)
        {
            /* we forbid input with more than 1152 samples per channel for output in unclipped mode */
            if (osize < 1152 * 2)
            {
                Console.WriteLine("hip: out space too small for unclipped mode\n");
                return(MPGLib.MP3_ERR);
            }

            ISynth synth = new ISynthAnonymousInnerClass2 <T>(this, mp, @in, @out, tFactory);

            /* passing pointers to the functions which don't clip the samples */
            return(decodeMP3_clipchoice(mp, @in, bufferPos, isize, @out, done, synth, tFactory));
        }
Ejemplo n.º 9
0
        /*
         * For lame_decode:  return code
         * -1     error
         *  0     ok, but need more data before outputing any samples
         *  n     number of samples output.  either 576 or 1152 depending on MP3 file.
         */

        private int decode1_headersB_clipchoice <T>(
            mpstr_tag pmp,
            byte[] buffer,
            int bufferPos,
            int len,
            T[] pcm_l,
            int pcm_lPos,
            T[] pcm_r,
            int pcm_rPos,
            MP3Data mp3data,
            Enc enc,
            T[] p,
            int psize,
            IDecoder decodeMP3_ptr,
            Decode.Factory <T> tFactory)
        {
            int processed_samples; // processed samples per channel
            int ret;

            mp3data.header_parsed = false;

            var pb = new ProcessedBytes();

            ret = decodeMP3_ptr.decode(pmp, buffer, bufferPos, len, p, psize, pb, tFactory);
            processed_samples = pb.pb;

            /* three cases:
             * 1. headers parsed, but data not complete
             *       pmp.header_parsed==1
             *       pmp.framesize=0
             *       pmp.fsizeold=size of last frame, or 0 if this is first frame
             *
             * 2. headers, data parsed, but ancillary data not complete
             *       pmp.header_parsed==1
             *       pmp.framesize=size of frame
             *       pmp.fsizeold=size of last frame, or 0 if this is first frame
             *
             * 3. frame fully decoded:
             *       pmp.header_parsed==0
             *       pmp.framesize=0
             *       pmp.fsizeold=size of frame (which is now the last frame)
             *
             */
            if (pmp.header_parsed || pmp.fsizeold > 0 || pmp.framesize > 0)
            {
                mp3data.header_parsed = true;
                mp3data.stereo        = pmp.fr.stereo;
                mp3data.samplerate    = Common.freqs[pmp.fr.sampling_frequency];
                mp3data.mode          = pmp.fr.mode;
                mp3data.mode_ext      = pmp.fr.mode_ext;
                mp3data.framesize     = smpls[pmp.fr.lsf][pmp.fr.lay];

                /* free format, we need the entire frame before we can determine
                 * the bitrate.  If we haven't gotten the entire frame, bitrate=0 */
                if (pmp.fsizeold > 0) // works for free format and fixed, no overrun, temporal results are < 400.e6
                {
                    mp3data.bitrate =
                        (int)(8 * (4 + pmp.fsizeold) * mp3data.samplerate / (1000 * mp3data.framesize) + 0.5);
                }
                else if (pmp.framesize > 0)
                {
                    mp3data.bitrate =
                        (int)(8 * (4 + pmp.framesize) * mp3data.samplerate / (1000 * mp3data.framesize) + 0.5);
                }
                else
                {
                    mp3data.bitrate = Common.tabsel_123[pmp.fr.lsf][pmp.fr.lay - 1][pmp.fr.bitrate_index];
                }

                if (pmp.num_frames > 0)
                {
                    /* Xing VBR header found and num_frames was set */
                    mp3data.totalframes = pmp.num_frames;
                    mp3data.nsamp       = mp3data.framesize * pmp.num_frames;
                    enc.enc_delay       = pmp.enc_delay;
                    enc.enc_padding     = pmp.enc_padding;
                }
            }

            switch (ret)
            {
            case MP3_OK:
                switch (pmp.fr.stereo)
                {
                case 1:
                    COPY_MONO(pcm_l, pcm_lPos, processed_samples, p);
                    break;

                case 2:
                    processed_samples = processed_samples >> 1;
                    COPY_STEREO(pcm_l, pcm_lPos, pcm_r, pcm_rPos, processed_samples, p);
                    break;

                default:
                    processed_samples = -1;
                    Debug.Assert(false);
                    break;
                }

                break;

            case MP3_NEED_MORE:
                processed_samples = 0;
                break;

            case MP3_ERR:
                processed_samples = -1;
                break;

            default:
                processed_samples = -1;
                Debug.Assert(false);
                break;
            }

            /*fprintf(stderr,"ok, more, err:  %i %i %i\n", MP3_OK, MP3_NEED_MORE, MP3_ERR ); */
            /*fprintf(stderr,"ret = %i out=%i\n", ret, processed_samples ); */
            return(processed_samples);
        }
Ejemplo n.º 10
0
        internal virtual int decodeMP3_clipchoice <T>(
            MPGLib.mpstr_tag mp,
            byte[] @in,
            int inPos,
            int isize,
            T[] @out,
            MPGLib.ProcessedBytes done,
            ISynth synth,
            Decode.Factory <T> tFactory)
        {
            int i, iret, bits, bytes;

            if (@in != null && isize != 0 && addbuf(mp, @in, inPos, isize) == null)
            {
                return(MPGLib.MP3_ERR);
            }

            /* First decode header */
            if (!mp.header_parsed)
            {
                if (mp.fsizeold == -1 || mp.sync_bitstream != 0)
                {
                    int vbrbytes;
                    mp.sync_bitstream = 0;

                    /* This is the very first call.   sync with anything */
                    /* bytes= number of bytes before header */
                    bytes = sync_buffer(mp, false);

                    /* now look for Xing VBR header */
                    if (mp.bsize >= bytes + XING_HEADER_SIZE)
                    {
                        vbrbytes = check_vbr_header(mp, bytes);
                    }
                    else
                    {
                        return(MPGLib.MP3_NEED_MORE);
                    }

                    if (mp.vbr_header)
                    {
                        /* do we have enough data to parse entire Xing header? */
                        if (bytes + vbrbytes > mp.bsize)
                        {
                            return(MPGLib.MP3_NEED_MORE);
                        }

                        /* read in Xing header.  Buffer data in case it
                         * is used by a non zero main_data_begin for the next
                         * frame, but otherwise dont decode Xing header */
                        //	#ifdef HIP_DEBUG
                        //	                fprintf(stderr, "hip: found xing header, skipping %i bytes\n", vbrbytes + bytes);
                        //	#endif
                        for (i = 0; i < vbrbytes + bytes; ++i)
                        {
                            read_buf_byte(mp);
                        }
                        /* now we need to find another syncword */
                        /* just return and make user send in more data */

                        return(MPGLib.MP3_NEED_MORE);
                    }
                }
                else
                {
                    /* match channels, samplerate, etc, when syncing */
                    bytes = sync_buffer(mp, true);
                }

                /* buffer now synchronized */
                if (bytes < 0)
                {
                    return(MPGLib.MP3_NEED_MORE);
                }

                if (bytes > 0)
                {
                    /* there were some extra bytes in front of header.
                     * bitstream problem, but we are now resynced
                     * should try to buffer previous data in case new
                     * frame has nonzero main_data_begin, but we need
                     * to make sure we do not overflow buffer
                     */
                    int size;
                    Console.WriteLine("hip: bitstream problem, resyncing skipping %d bytes...\n", bytes);
                    mp.old_free_format = false;

                    /* FIXME: correct ??? */
                    mp.sync_bitstream = 1;

                    /* skip some bytes, buffer the rest */
                    size = mp.wordpointerPos - 512;

                    if (size > MPG123.MAXFRAMESIZE)
                    {
                        /* wordpointer buffer is trashed.  probably cant recover, but try anyway */
                        Console.WriteLine(
                            "hip: wordpointer trashed.  size=%i (%i)  bytes=%i \n",
                            size,
                            MPG123.MAXFRAMESIZE,
                            bytes);
                        size              = 0;
                        mp.wordpointer    = mp.bsspace[mp.bsnum];
                        mp.wordpointerPos = 512;
                    }

                    /* buffer contains 'size' data right now
                     * we want to add 'bytes' worth of data, but do not
                     * exceed MAXFRAMESIZE, so we through away 'i' bytes */
                    i = size + bytes - MPG123.MAXFRAMESIZE;
                    for (; i > 0; --i)
                    {
                        --bytes;
                        read_buf_byte(mp);
                    }

                    copy_mp(mp, bytes, mp.wordpointer, mp.wordpointerPos);
                    mp.fsizeold += bytes;
                }

                read_head(mp);
                common.decode_header(mp.fr, mp.header);
                mp.header_parsed = true;
                mp.framesize     = mp.fr.framesize;
                mp.free_format   = mp.framesize == 0;

                if (mp.fr.lsf != 0)
                {
                    mp.ssize = mp.fr.stereo == 1 ? 9 : 17;
                }
                else
                {
                    mp.ssize = mp.fr.stereo == 1 ? 17 : 32;
                }

                if (mp.fr.error_protection)
                {
                    mp.ssize += 2;
                }

                mp.bsnum          = 1 - mp.bsnum; // toggle buffer
                mp.wordpointer    = mp.bsspace[mp.bsnum];
                mp.wordpointerPos = 512;
                mp.bitindex       = 0;

                /* for very first header, never parse rest of data */
                if (mp.fsizeold == -1)
                {
                    return(MPGLib.MP3_NEED_MORE);
                }
            } // end of header parsing block

            /* now decode side information */
            if (!mp.side_parsed)
            {
                /* Layer 3 only */
                if (mp.fr.lay == 3)
                {
                    if (mp.bsize < mp.ssize)
                    {
                        return(MPGLib.MP3_NEED_MORE);
                    }

                    copy_mp(mp, mp.ssize, mp.wordpointer, mp.wordpointerPos);

                    if (mp.fr.error_protection)
                    {
                        common.getbits(mp, 16);
                    }

                    bits = layer3.do_layer3_sideinfo(mp);
                    /* bits = actual number of bits needed to parse this frame */
                    /* can be negative, if all bits needed are in the reservoir */
                    if (bits < 0)
                    {
                        bits = 0;
                    }

                    /* read just as many bytes as necessary before decoding */
                    mp.dsize = (bits + 7) / 8;

                    //	#ifdef HIP_DEBUG
                    //	            fprintf(stderr,
                    //	                    "hip: %d bits needed to parse layer III frame, number of bytes to read before decoding dsize = %d\n",
                    //	                    bits, mp.dsize);
                    //	#endif

                    /* this will force mpglib to read entire frame before decoding */
                    /* mp.dsize= mp.framesize - mp.ssize; */
                }
                else
                {
                    /* Layers 1 and 2 */

                    /* check if there is enough input data */
                    if (mp.fr.framesize > mp.bsize)
                    {
                        return(MPGLib.MP3_NEED_MORE);
                    }

                    /* takes care that the right amount of data is copied into wordpointer */
                    mp.dsize = mp.fr.framesize;
                    mp.ssize = 0;
                }

                mp.side_parsed = true;
            }

            /* now decode main data */
            iret = MPGLib.MP3_NEED_MORE;
            if (!mp.data_parsed)
            {
                if (mp.dsize > mp.bsize)
                {
                    return(MPGLib.MP3_NEED_MORE);
                }

                copy_mp(mp, mp.dsize, mp.wordpointer, mp.wordpointerPos);

                done.pb = 0;

                /*do_layer3(&mp.fr,(unsigned char *) out,done); */
                switch (mp.fr.lay)
                {
                case 1:
                    if (mp.fr.error_protection)
                    {
                        common.getbits(mp, 16);
                    }

                    layer1.do_layer1(mp, @out, done, tFactory);
                    break;

                case 2:
                    if (mp.fr.error_protection)
                    {
                        common.getbits(mp, 16);
                    }

                    layer2.do_layer2(mp, @out, done, synth, tFactory);
                    break;

                case 3:
                    layer3.do_layer3(mp, @out, done, synth, tFactory);
                    break;

                default:
                    Console.WriteLine("hip: invalid layer %d\n", mp.fr.lay);
                    break;
                }

                mp.wordpointer    = mp.bsspace[mp.bsnum];
                mp.wordpointerPos = 512 + mp.ssize + mp.dsize;

                mp.data_parsed = true;
                iret           = MPGLib.MP3_OK;
            }

            /* remaining bits are ancillary data, or reservoir for next frame
             * If free format, scan stream looking for next frame to determine
             * mp.framesize */
            if (mp.free_format)
            {
                if (mp.old_free_format)
                {
                    /* free format.  bitrate must not vary */
                    mp.framesize = mp.fsizeold_nopadding + mp.fr.padding;
                }
                else
                {
                    bytes = sync_buffer(mp, true);
                    if (bytes < 0)
                    {
                        return(iret);
                    }

                    mp.framesize          = bytes + mp.ssize + mp.dsize;
                    mp.fsizeold_nopadding = mp.framesize - mp.fr.padding;

                    /*
                     * fprintf(stderr,"hip: freeformat bitstream:  estimated bitrate=%ikbs  \n",
                     * 8*(4+mp.framesize)*freqs[mp.fr.sampling_frequency]/
                     * (1000*576*(2-mp.fr.lsf)));
                     */
                }
            }

            /* buffer the ancillary data and reservoir for next frame */
            bytes = mp.framesize - (mp.ssize + mp.dsize);
            if (bytes > mp.bsize)
            {
                return(iret);
            }

            if (bytes > 0)
            {
                int size;
                copy_mp(mp, bytes, mp.wordpointer, mp.wordpointerPos);
                mp.wordpointerPos += bytes;

                size = mp.wordpointerPos - 512;
                if (size > MPG123.MAXFRAMESIZE)
                {
                    Console.WriteLine("hip: fatal error.  MAXFRAMESIZE not large enough.\n");
                }
            }

            /* the above frame is completely parsed.  start looking for next frame */
            mp.fsizeold        = mp.framesize;
            mp.old_free_format = mp.free_format;
            mp.framesize       = 0;
            mp.header_parsed   = false;
            mp.side_parsed     = false;
            mp.data_parsed     = false;

            return(iret);
        }