[Vorbis-dev] ov_pcm_seek to sample zero of Theora/Vorbis file hangs

Ian Nartowicz flac at nartowicz.co.uk
Sat Jun 7 14:52:14 PDT 2014


On Fri, 23 May 2014 23:51:58 +0100
Ian Nartowicz <flac at nartowicz.co.uk> wrote:

>Hi all,
>
>I'm having a little trouble with a Vorbis decoder hanging (actually hard
>looping the CPU) when I call ov_pcm_seek(&vorbis_file, 0) on a multiplexed
>theora/vorbis file.  It appears to be the vorbisfile library that has the
>problem.  The call to ov_pcm_seek never returns.
>
>Seeking in non-multiplexed, including chained, files is OK.  Seeking to other
>values, including sample 1, works OK.  Has anyone else seen this?
>
>I have tested against Big Buck Bunny:
>http://www.bigbuckbunny.org/index.php/download/
>
>and plane.ogg from Wikipedia:
>https://en.wikipedia.org/wiki/File:I-15bis.ogg
>
>--ian

So, to partially answer my own question.  This goes into an infinite loop in
_get_prev_page in vorbisfile.c, with begin=0 and end=0.  Perhaps this function
should never be called since it clearly can't handle this situation.

--ian

Here is the whole sequence (op_pcm_seek_page):
1. Bisect to find the page with a PCM less than or equal to the seek offset
(zero).
2. Start at PCM zero and exit as soon as the first page from the Vorbis stream
(the second page in this case) is read.
3. Because there was never actually any bisection, the raw offset is never set
to point at a Vorbis page, and is still zero.  It would normally point exactly
at a page in the Vorbis stream, a page containing the desired PCM.
4. Seek to the raw offset (zero) and blindly dump in the first page we find,
which is actually a Theora page (this fails, but the error is not detected).
5. The stream is empty so packetpeek returns zero and the loop assumes that it
needs to get the previous page until it finds the start of the packet.
6. Of course it will never find the start of the packet because it is already
at the start of the file and before the first Vorbis packet.  Loop forever ....

So that's what is broken, but I have no clue how to fix it.  A naive fix might
be to not assume the first page is from the correct stream and keep reading,
but it seems like it would be better just to make sure the raw seek position is
correct beforehand.

--ian


More information about the Vorbis-dev mailing list