[Vorbis-dev] ogg encoding

Ralph Giles giles at xiph.org
Wed Jun 7 21:54:01 PDT 2006


On Wed, Jun 07, 2006 at 09:43:12PM -0400, Stephen Whiters-Ridley wrote:

> ok, I know its faux pas to post code snippets but will pseudo code be ok?

Is it? We often find there's no other way to give useful advice. :-)

> while (amtread = fread(readbuf, file)){
>  ogg_packet.bytes = amtread
>  if first_read_from_file then
>    ogg_packet.b_o_s = 1
>  if amtread < PACKETSIZE then
>    ogg_packet.e_o_s = 1
>  ogg_packet.packet = readbuf
>  ogg_stream_packetin()
>  if (ogg_stream_pageout()) then
>    write_page_to_file()
>  elseif (amtread < PACKETSIZE) then
>    ogg_stream_flush() and write_page_to_file()
> }

So that should be:

  ...
  while (ogg_stream_pageout()) {
    write_page_to_file()
  }
  if (amtread < PACKETSIZE) {
    while (ogg_stream_flush() {
      write_page_to_file()
  }
}

Otherwise you can easily (depending on the size of PACKETSIZE) have 
some fraction of your file buffered inside libogg and so the first 
ogg_stream_flush() doesn't actually return the last page. That remains 
my best guess why you're not seeing your eos.

You also probably want to update the sequence number and granulepos 
fields for each packet.

Just out of curiousity, what kind of data is this you're encapsulating?

 -r


More information about the Vorbis-dev mailing list