Package com.jcraft.jogg

Examples of com.jcraft.jogg.Page


     * Initializes all the jOrbis and jOgg vars that are used for song playback.
     */
    private void init_jorbis() {
        oggSyncState_ = new SyncState();
        oggStreamState_ = new StreamState();
        oggPage_ = new Page();
        oggPacket_ = new Packet();
        vorbisInfo = new Info();
        vorbisComment = new Comment();
        vorbisDspState = new DspState();
        vorbisBlock = new Block(vorbisDspState);
View Full Code Here


     * Initializes all the jOrbis and jOgg vars that are used for song playback.
     */
    private void init_jorbis() {
        oggSyncState_ = new SyncState();
        oggStreamState_ = new StreamState();
        oggPage_ = new Page();
        oggPacket_ = new Packet();
        vorbisInfo = new Info();
        vorbisComment = new Comment();
        vorbisDspState = new DspState();
        vorbisBlock = new Block(vorbisDspState);
View Full Code Here

 
    private void read( final InputStream in ) {

        state.in = in;

        final Page og = new Page();

        int index;
        byte[] buffer;
        int bytes = 0;

        state.oy = new SyncState();
        state.oy.init();

        index = state.oy.buffer( CHUNKSIZE );
        buffer = state.oy.data;
        try {
            bytes = state.in.read( buffer, index, CHUNKSIZE );
        }
        catch ( final Exception e ) {
            log.error( e );
            return;
        }
        state.oy.wrote( bytes );

        if ( state.oy.pageout(og) != 1 ) {
            if( bytes < CHUNKSIZE )
                log.error( "Input truncated or empty." );
            else
                log.error( "Input is not an Ogg bitstream." );
            return;
        }
        state.serial = og.serialno();
        state.os = new StreamState();
        state.os.init( state.serial );

        state.vi = new Info();
        state.vi.init();
View Full Code Here

     * Taken from the JOrbis Player
     */
    private void initJOrbis(){
        oy=new SyncState();
        os=new StreamState();
        og=new Page();
        op=new Packet();
     
        vi=new Info();
        vc=new Comment();
        vd=new DspState();
View Full Code Here

            }
        }

        SyncState oy = new SyncState(); // sync and verify incoming physical bitstream
        StreamState os = new StreamState(); // take physical pages, weld into a logical stream of packets
        Page og = new Page(); // one Ogg bitstream page.  Vorbis packets are inside
        Packet op = new Packet(); // one raw packet of data for decode

        Info vi = new Info(); // struct that stores all the static vorbis bitstream settings
        Comment vc = new Comment(); // struct that stores all the bitstream user comments
        DspState vd = new DspState(); // central working state for the packet->PCM decoder
        Block vb = new Block(vd); // local working space for packet->PCM decode

        byte[] buffer;
        int bytes = 0;

        // Decode setup

        oy.init(); // Now we can read pages

        while (true) { // we repeat if the bitstream is chained
            int eos = 0;

            // grab some data at the head of the stream.  We want the first page
            // (which is guaranteed to be small and only contain the Vorbis
            // stream initial header) We need the first page to get the stream
            // serialno.

            // submit a 4k block to libvorbis' Ogg layer
            int index = oy.buffer(4096);
            buffer = oy.data;
            try {
                bytes = input.read(buffer, index, 4096);
            }
            catch (Exception e) {
                System.err.println(e);
                System.exit(-1);
            }
            oy.wrote(bytes);

            // Get the first page.
            if (oy.pageout(og) != 1) {
                // have we simply run out of data?  If so, we're done.
                if (bytes < 4096)
                    break;

                // error case.  Must not be Vorbis data
                System.err.println("Input does not appear to be an Ogg bitstream.");
                System.exit(1);
            }

            // Get the serial number and set up the rest of decode.
            // serialno first; use it to set up a logical stream
            os.init(og.serialno());

            // extract the initial header from the first page and verify that the
            // Ogg bitstream is in fact Vorbis data

            // I handle the initial header first instead of just having the code
            // read all three Vorbis headers at once because reading the initial
            // header is an easy way to identify a Vorbis bitstream and it's
            // useful to see that functionality seperated out.

            vi.init();
            vc.init();
            if (os.pagein(og) < 0) {
                // error; stream version mismatch perhaps
                System.err.println("Error reading first page of Ogg bitstream data.");
                System.exit(1);
            }

            if (os.packetout(op) != 1) {
                // no page? must not be vorbis
                System.err.println("Error reading initial header packet.");
                System.exit(1);
            }

            if (vi.synthesis_headerin(vc, op) < 0) {
                // error case; not a vorbis header
                System.err
                        .println("This Ogg bitstream does not contain Vorbis audio data.");
                System.exit(1);
            }

            // At this point, we're sure we're Vorbis.  We've set up the logical
            // (Ogg) bitstream decoder.  Get the comment and codebook headers and
            // set up the Vorbis decoder

            // The next two packets in order are the comment and codebook headers.
            // They're likely large and may span multiple pages.  Thus we reead
            // and submit data until we get our two pacakets, watching that no
            // pages are missing.  If a page is missing, error out; losing a
            // header page is the only place where missing data is fatal. */

            int i = 0;
            while (i < 2) {
                while (i < 2) {

                    int result = oy.pageout(og);
                    if (result == 0)
                        break; // Need more data
                    // Don't complain about missing or corrupt data yet.  We'll
                    // catch it at the packet output phase

                    if (result == 1) {
                        os.pagein(og); // we can ignore any errors here
                        // as they'll also become apparent
                        // at packetout
                        while (i < 2) {
                            result = os.packetout(op);
                            if (result == 0)
                                break;
                            if (result == -1) {
                                // Uh oh; data at some point was corrupted or missing!
                                // We can't tolerate that in a header.  Die.
                                System.err.println("Corrupt secondary header.  Exiting.");
                                System.exit(1);
                            }
                            vi.synthesis_headerin(vc, op);
                            i++;
                        }
                    }
                }
                // no harm in not checking before adding more
                index = oy.buffer(4096);
                buffer = oy.data;
                try {
                    bytes = input.read(buffer, index, 4096);
                }
                catch (Exception e) {
                    System.err.println(e);
                    System.exit(1);
                }
                if (bytes == 0 && i < 2) {
                    System.err.println("End of file before finding all Vorbis headers!");
                    System.exit(1);
                }
                oy.wrote(bytes);
            }

            // Throw the comments plus a few lines about the bitstream we're
            // decoding
            {
                byte[][] ptr = vc.user_comments;
                for (int j = 0; j < ptr.length; j++) {
                    if (ptr[j] == null)
                        break;
                    System.err.println(new String(ptr[j], 0, ptr[j].length - 1));
                }
                System.err.println("\nBitstream is " + vi.channels + " channel, " + vi.rate
                        + "Hz");
                System.err.println("Encoded by: "
                        + new String(vc.vendor, 0, vc.vendor.length - 1) + "\n");
            }

            convsize = 4096 / vi.channels;

            // OK, got and parsed all three headers. Initialize the Vorbis
            //  packet->PCM decoder.
            vd.synthesis_init(vi); // central decode state
            vb.init(vd); // local state for most of the decode
            // so multiple block decodes can
            // proceed in parallel.  We could init
            // multiple vorbis_block structures
            // for vd here

            float[][][] _pcm = new float[1][][];
            int[] _index = new int[vi.channels];
            // The rest is just a straight decode loop until end of stream
            while (eos == 0) {
                while (eos == 0) {

                    int result = oy.pageout(og);
                    if (result == 0)
                        break; // need more data
                    if (result == -1) { // missing or corrupt data at this page position
                        System.err
                                .println("Corrupt or missing data in bitstream; continuing...");
                    } else {
                        os.pagein(og); // can safely ignore errors at
                        // this point
                        while (true) {
                            result = os.packetout(op);

                            if (result == 0)
                                break; // need more data
                            if (result == -1) { // missing or corrupt data at this page position
                                // no reason to complain; already complained above
                            } else {
                                // we have a packet.  Decode it
                                int samples;
                                if (vb.synthesis(op) == 0) { // test for success!
                                    vd.synthesis_blockin(vb);
                                }

                                // **pcm is a multichannel float vector.  In stereo, for
                                // example, pcm[0] is left, and pcm[1] is right.  samples is
                                // the size of each channel.  Convert the float values
                                // (-1.<=range<=1.) to whatever PCM format and write it out

                                while ((samples = vd.synthesis_pcmout(_pcm, _index)) > 0) {
                                    float[][] pcm = _pcm[0];
                                    int bout = (samples < convsize ? samples : convsize);

                                    // convert floats to 16 bit signed ints (host order) and
                                    // interleave
                                    for (i = 0; i < vi.channels; i++) {
                                        int ptr = i * 2;
                                        //int ptr=i;
                                        int mono = _index[i];
                                        for (int j = 0; j < bout; j++) {
                                            int val = (int) (pcm[i][mono + j] * 32767.);
                                            //          short val=(short)(pcm[i][mono+j]*32767.);
                                            //          int val=(int)Math.round(pcm[i][mono+j]*32767.);
                                            // might as well guard against clipping
                                            if (val > 32767) {
                                                val = 32767;
                                            }
                                            if (val < -32768) {
                                                val = -32768;
                                            }
                                            if (val < 0)
                                                val = val | 0x8000;
                                            convbuffer[ptr] = (byte) (val);
                                            convbuffer[ptr + 1] = (byte) (val >>> 8);
                                            ptr += 2 * (vi.channels);
                                        }
                                    }

                                    System.out.write(convbuffer, 0, 2 * vi.channels * bout);

                                    // tell libvorbis how
                                    // many samples we
                                    // actually consumed
                                    vd.synthesis_read(bout);
                                }
                            }
                        }
                        if (og.eos() != 0)
                            eos = 1;
                    }
                }
                if (eos == 0) {
                    index = oy.buffer(4096);
View Full Code Here

    int bisect_forward_serialno(long begin, long searched, long end,
                                int currentno, int m) {
        long endsearched = end;
        long next = end;
        Page page = new Page();
        int ret;

        while (searched < endsearched) {
            long bisect;
            if (endsearched - searched < CHUNKSIZE) {
                bisect = searched;
            } else {
                bisect = (searched + endsearched) / 2;
            }

            seek_helper(bisect);
            ret = get_next_page(page, -1);
            if (ret == OV_EREAD)
                return OV_EREAD;
            if (ret < 0 || page.serialno() != currentno) {
                endsearched = bisect;
                if (ret >= 0)
                    next = ret;
            } else {
                searched = ret + page.header_len + page.body_len;
            }
        }
        seek_helper(next);
        ret = get_next_page(page, -1);
        if (ret == OV_EREAD)
            return OV_EREAD;

        if (searched >= end || ret == -1) {
            links = m + 1;
            offsets = new long[m + 2];
            offsets[m + 1] = searched;
        } else {
            ret = bisect_forward_serialno(next, offset, end, page.serialno(), m + 1);
            if (ret == OV_EREAD)
                return OV_EREAD;
        }
        offsets[m] = begin;
        return 0;
View Full Code Here

    }

    // uses the local ogg_stream storage in vf; this is important for
    // non-streaming input sources
    int fetch_headers(Info vi, Comment vc, int[] serialno, Page og_ptr) {
        Page og = new Page();
        Packet op = new Packet();
        int ret;

        if (og_ptr == null) {
            ret = get_next_page(og, CHUNKSIZE);
View Full Code Here

    // vorbis_info structs and PCM positions.  Only called by the seekable
    // initialization (local stream storage is hacked slightly; pay
    // attention to how that's done)
    void prefetch_all_headers(Info first_i, Comment first_c, int dataoffset)
            throws JOrbisException {
        Page og = new Page();
        int ret;

        vi = new Info[links];
        vc = new Comment[links];
        dataoffsets = new long[links];
        pcmlengths = new long[links];
        serialnos = new int[links];

        for (int i = 0; i < links; i++) {
            if (first_i != null && first_c != null && i == 0) {
                // we already grabbed the initial header earlier.  This just
                // saves the waste of grabbing it again
                vi[i] = first_i;
                vc[i] = first_c;
                dataoffsets[i] = dataoffset;
            } else {
                // seek to the location of the initial header
                seek_helper(offsets[i]); //!!!
                vi[i] = new Info();
                vc[i] = new Comment();
                if (fetch_headers(vi[i], vc[i], null, null) == -1) {
                    dataoffsets[i] = -1;
                } else {
                    dataoffsets[i] = offset;
                    os.clear();
                }
            }

            // get the serial number and PCM length of this link. To do this,
            // get the last page of the stream
            {
                long end = offsets[i + 1]; //!!!
                seek_helper(end);

                while (true) {
                    ret = get_prev_page(og);
                    if (ret == -1) {
                        // this should not be possible
                        vi[i].clear();
                        vc[i].clear();
                        break;
                    }
                    if (og.granulepos() != -1) {
                        serialnos[i] = og.serialno();
                        pcmlengths[i] = og.granulepos();
                        break;
                    }
                }
            }
        }
View Full Code Here

        Comment initial_c = new Comment();
        int serialno;
        long end;
        int ret;
        int dataoffset;
        Page og = new Page();
        // is this even vorbis...?
        int[] foo = new int[1];
        ret = fetch_headers(initial_i, initial_c, foo, null);
        serialno = foo[0];
        dataoffset = (int) offset; //!!
        os.clear();
        if (ret == -1)
            return (-1);
        if (ret < 0)
            return (ret);
        // we can seek, so set out learning all about this file
        seekable = true;
        fseek(datasource, 0, SEEK_END);
        offset = ftell(datasource);
        end = offset;
        // We get the offset for the last page of the physical bitstream.
        // Most OggVorbis files will contain a single logical bitstream
        end = get_prev_page(og);
        // moer than one logical bitstream?
        if (og.serialno() != serialno) {
            // Chained bitstream. Bisect-search each logical bitstream
            // section.  Do so based on serial number only
            if (bisect_forward_serialno(0, 0, end + 1, serialno, 0) < 0) {
                clear();
                return OV_EREAD;
View Full Code Here

    // return: -1) hole in the data (lost packet)
    //          0) need more date (only if readp==0)/eof
    //          1) got a packet

    int process_packet(int readp) {
        Page og = new Page();

        // handle one packet.  Try to fetch it from current stream state
        // extract packets from page
        while (true) {
            // process a packet if we can.  If the machine isn't loaded,
            // neither is a page
            if (decode_ready) {
                Packet op = new Packet();
                int result = os.packetout(op);
                long granulepos;
                // if(result==-1)return(-1); // hole in the data. For now, swallow
                // and go. We'll need to add a real
                // error code in a bit.
                if (result > 0) {
                    // got a packet.  process it
                    granulepos = op.granulepos;
                    if (vb.synthesis(op) == 0) { // lazy check for lazy
                        // header handling.  The
                        // header packets aren't
                        // audio, so if/when we
                        // submit them,
                        // vorbis_synthesis will
                        // reject them
                        // suck in the synthesis data and track bitrate
                        {
                            int oldsamples = vd.synthesis_pcmout(null, null);
                            vd.synthesis_blockin(vb);
                            samptrack += vd.synthesis_pcmout(null, null) - oldsamples;
                            bittrack += op.bytes * 8;
                        }

                        // update the pcm offset.
                        if (granulepos != -1 && op.e_o_s == 0) {
                            int link = (seekable ? current_link : 0);
                            int samples;
                            // this packet has a pcm_offset on it (the last packet
                            // completed on a page carries the offset) After processing
                            // (above), we know the pcm position of the *last* sample
                            // ready to be returned. Find the offset of the *first*
                            //
                            // As an aside, this trick is inaccurate if we begin
                            // reading anew right at the last page; the end-of-stream
                            // granulepos declares the last frame in the stream, and the
                            // last packet of the last page may be a partial frame.
                            // So, we need a previous granulepos from an in-sequence page
                            // to have a reference point.  Thus the !op.e_o_s clause above

                            samples = vd.synthesis_pcmout(null, null);
                            granulepos -= samples;
                            for (int i = 0; i < link; i++) {
                                granulepos += pcmlengths[i];
                            }
                            pcm_offset = granulepos;
                        }
                        return (1);
                    }
                }
            }

            if (readp == 0)
                return (0);
            if (get_next_page(og, -1) < 0)
                return (0); // eof. leave unitialized

            // bitrate tracking; add the header's bytes here, the body bytes
            // are done by packet above
            bittrack += og.header_len * 8;

            // has our decoding just traversed a bitstream boundary?
            if (decode_ready) {
                if (current_serialno != og.serialno()) {
                    decode_clear();
                }
            }

            // Do we need to load a new machine before submitting the page?
            // This is different in the seekable and non-seekable cases.
            //
            // In the seekable case, we already have all the header
            // information loaded and cached; we just initialize the machine
            // with it and continue on our merry way.
            //
            // In the non-seekable (streaming) case, we'll only be at a
            // boundary if we just left the previous logical bitstream and
            // we're now nominally at the header of the next bitstream

            if (!decode_ready) {
                int i;
                if (seekable) {
                    current_serialno = og.serialno();

                    // match the serialno to bitstream section.  We use this rather than
                    // offset positions to avoid problems near logical bitstream
                    // boundaries
                    for (i = 0; i < links; i++) {
View Full Code Here

TOP

Related Classes of com.jcraft.jogg.Page

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.