From 00b3fbdb1ab9b9dce6ca8a88287563a7be687c9d Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 28 Apr 2019 22:57:06 +0200 Subject: [PATCH] movies: fix for loading unseekable ogg vorbis files Now, compressed/encrypted ogg files will properly be detected as unseekable, and will still be able to be played. --- panda/src/movies/vorbisAudioCursor.cxx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/panda/src/movies/vorbisAudioCursor.cxx b/panda/src/movies/vorbisAudioCursor.cxx index d3210ae46e..97666d0056 100644 --- a/panda/src/movies/vorbisAudioCursor.cxx +++ b/panda/src/movies/vorbisAudioCursor.cxx @@ -199,6 +199,22 @@ cb_seek_func(void *datasource, ogg_int64_t offset, int whence) { break; case SEEK_CUR: + // Vorbis uses a seek with offset 0 to determine whether seeking is + // supported, but this is not good enough. We seek to the end and back. + if (offset == 0) { + std::streambuf *buf = stream->rdbuf(); + std::streampos pos = buf->pubseekoff(0, std::ios::cur, std::ios::in); + if (pos < 0) { + return -1; + } + if (buf->pubseekoff(0, std::ios::end, std::ios::in) >= 0) { + // It worked; seek back to the previous location. + buf->pubseekpos(pos, std::ios::in); + return 0; + } else { + return -1; + } + } stream->seekg(offset, std::ios::cur); break;