Browse Source

Pre-emptively work around an issue in libvorbis 1.3.4 and older when rewinding some Ogg Theora videos.

May (or may not) also fix crash issues when rewinding Ogg files on some systems...
Alex Szpakowski 10 years ago
parent
commit
1c0870ee29
1 changed files with 11 additions and 2 deletions
  1. 11 2
      src/modules/sound/lullaby/VorbisDecoder.cpp

+ 11 - 2
src/modules/sound/lullaby/VorbisDecoder.cpp

@@ -210,7 +210,14 @@ int VorbisDecoder::decode()
 
 
 bool VorbisDecoder::seek(float s)
 bool VorbisDecoder::seek(float s)
 {
 {
-	int result = ov_time_seek(&handle, s);
+	int result = 0;
+
+	// Avoid ov_time_seek (which calls ov_pcm_seek) when seeking to 0, to avoid
+	// a bug in libvorbis <= 1.3.4 when seeking to PCM 0 in multiplexed streams.
+	if (s <= 0.000001)
+		result = ov_raw_seek(&handle, 0);
+	else
+		result = ov_time_seek(&handle, s);
 
 
 	if (result == 0)
 	if (result == 0)
 	{
 	{
@@ -223,7 +230,9 @@ bool VorbisDecoder::seek(float s)
 
 
 bool VorbisDecoder::rewind()
 bool VorbisDecoder::rewind()
 {
 {
-	int result = ov_pcm_seek(&handle, 0);
+	// Avoid ov_time_seek to avoid a bug in libvorbis <= 1.3.4 when seeking to
+	// PCM 0 in multiplexed streams.
+	int result = ov_raw_seek(&handle, 0);
 
 
 	if (result == 0)
 	if (result == 0)
 	{
 	{