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(); } }