Thanks! So ogg_stream_pageout() and ogg_stream_flush() *do* "fill in" the contents of the ogg_page structure, and its only valid to access the ogg_page structure's contents (like in the file writing routines) after you have either flush()ed or pageout()ed. As for what this is used for, I am implementing a network daemon that runs single socket, and has to support muxing/demuxing all within the same connection, instead of reinvent the wheel I decided to go with ogg. BUT to get acquinted with the format for that project, I am actually a member of Kenshoto (
<a href="mailto:sa7ori@kenshoto.com">sa7ori@kenshoto.com</a>) the organizers of the Capture The Flag games at a convention called Defcon (<a href="http://www.defcon.org">www.defcon.org</a>). I procrastinated, and am hurrying to finish the last of the development for the qualification rounds. This particular use of ogg, is for the &quot;Forensics&quot; challenge portion. The idea being that someone is smuggling data in an ogg file, and the challenge is to write a parser, and decrypt the obfuscated contents to obtain &quot;the flag&quot;.
<br><br><div><span class="gmail_quote">On 6/8/06, <b class="gmail_sendername">Ralph Giles</b> &lt;<a href="mailto:giles@xiph.org">giles@xiph.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Wed, Jun 07, 2006 at 09:43:12PM -0400, Stephen Whiters-Ridley wrote:<br><br>&gt; ok, I know its faux pas to post code snippets but will pseudo code be ok?<br><br>Is it? We often find there's no other way to give useful advice. :-)
<br><br>&gt; while (amtread = fread(readbuf, file)){<br>&gt;&nbsp;&nbsp;ogg_packet.bytes = amtread<br>&gt;&nbsp;&nbsp;if first_read_from_file then<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;ogg_packet.b_o_s = 1<br>&gt;&nbsp;&nbsp;if amtread &lt; PACKETSIZE then<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;ogg_packet.e_o_s = 1
<br>&gt;&nbsp;&nbsp;ogg_packet.packet = readbuf<br>&gt;&nbsp;&nbsp;ogg_stream_packetin()<br>&gt;&nbsp;&nbsp;if (ogg_stream_pageout()) then<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;write_page_to_file()<br>&gt;&nbsp;&nbsp;elseif (amtread &lt; PACKETSIZE) then<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;ogg_stream_flush() and write_page_to_file()
<br>&gt; }<br><br>So that should be:<br><br>&nbsp;&nbsp;...<br>&nbsp;&nbsp;while (ogg_stream_pageout()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;write_page_to_file()<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;if (amtread &lt; PACKETSIZE) {<br>&nbsp;&nbsp;&nbsp;&nbsp;while (ogg_stream_flush() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_page_to_file()
<br>&nbsp;&nbsp;}<br>}<br><br>Otherwise you can easily (depending on the size of PACKETSIZE) have<br>some fraction of your file buffered inside libogg and so the first<br>ogg_stream_flush() doesn't actually return the last page. That remains
<br>my best guess why you're not seeing your eos.<br><br>You also probably want to update the sequence number and granulepos<br>fields for each packet.<br><br>Just out of curiousity, what kind of data is this you're encapsulating?
<br><br> -r<br></blockquote></div><br>