package dolda.xiphutil; import java.io.IOException; import com.jcraft.jogg.Packet; import com.jcraft.jogg.Page; import com.jcraft.jogg.StreamState; /** * The <code>Packet</code> class decodes Ogg packets from a page stream. * * @author Fredrik Tolf <code><fredrik@dolda2000.com></code> */ public class PacketStream { private StreamState strm = null; private Page page = null; private final PageStream in; private boolean eos = false; /** * Constructs a new <code>PacketStream</code> object. * * @param in * the {@link PageStream} object to decode packets from. */ public PacketStream(PageStream in) { this.in = in; } /** * Fetches one packet from the stream. * * @return the packet fetched, or <code>null</code> if at the end of the * stream. * @exception java.io.IOException * if the <code>PageStream</code> itself throws an * <code>IOException</code>. * @exception FormatException * if a format error is found in the stream. */ public Packet packet() throws IOException { if (eos) return (null); if (strm == null) { strm = new StreamState(); page = in.page(); strm.init(page.serialno()); } Packet pkt = new Packet(); while (true) { int ret = strm.packetout(pkt); if (ret < 0) throw (new OggException()); /* ? */ if (ret == 1) return (pkt); if (page == null) { if ((page = in.page()) == null) { eos = true; return (null); } } if (strm.pagein(page) != 0) throw (new OggException()); page = null; } } /** * 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(); } }