package dolda.xiphutil; import java.io.IOException; import java.io.InputStream; import com.jcraft.jogg.Page; import com.jcraft.jogg.SyncState; /** * The <code>PageStream</code> class decodes Ogg pages from a byte * stream. * * @author Fredrik Tolf <code><fredrik@dolda2000.com></code> */ public class PageStream { private SyncState sync = new SyncState(); private final InputStream in; private boolean eos = false; /** * Constructs a new <code>PageStream</code> object. * * @param in the Java IO <code>InputStream</code> to fetch pages * from. */ public PageStream(InputStream in) { this.in = in; sync.init(); } /** * Fetches one page from the byte stream. * * @return the page fetched, or <code>null</code> if at the end of * the stream. * @exception java.io.IOException if the <code>InputStream</code> * itself throws an <code>IOException</code>. * @exception FormatException if a format error is found in the * stream. */ public Page page() throws IOException { if(eos) return(null); Page page = new Page(); while(true) { int ret = sync.pageout(page); if(ret < 0) throw(new OggException()); /* ? */ if(ret == 1) { if(page.eos() != 0) eos = true; return(page); } int off = sync.buffer(4096); int len = in.read(sync.data, off, 4096); if(len < 0) return(null); sync.wrote(len); } } /** * Closes the stream backing this object. * * @exception java.io.IOException if the backing input stream * itself throws an <code>IOException</code>. */ public void close() throws IOException { in.close(); } }