Browse Source

Fix #1943 duplicate frames being skipped when decoding Theora

George Paton 2 years ago
parent
commit
ec0c65642b
1 changed files with 14 additions and 7 deletions
  1. 14 7
      src/modules/video/theora/TheoraVideoStream.cpp

+ 14 - 7
src/modules/video/theora/TheoraVideoStream.cpp

@@ -229,17 +229,24 @@ void TheoraVideoStream::threadedFillBackBuffer(double dt)
 			failedSeek = true;
 			failedSeek = true;
 		}
 		}
 
 
+		if (packet.granulepos > 0) {
+			th_decode_ctl(decoder, TH_DECCTL_SET_GRANPOS, &packet.granulepos, sizeof(packet.granulepos));
+		}
+
+		// TODO: Should be checking the result of th_decode_packetin
 		th_decode_ycbcr_out(decoder, bufferinfo);
 		th_decode_ycbcr_out(decoder, bufferinfo);
 		hasFrame = true;
 		hasFrame = true;
 
 
-		ogg_int64_t granulePosition;
-		do
-		{
-			if (demuxer.readPacket(packet))
-				return;
-		} while (th_decode_packetin(decoder, &packet, &granulePosition) != 0);
+		// Decode the current packet for the frame
+		ogg_int64_t decoderPosition;
+		th_decode_packetin(decoder, &packet, &decoderPosition);
+
+		// Prepare the next packet for the next frame
+		if (demuxer.readPacket(packet))
+			return;
+
 		lastFrame = nextFrame;
 		lastFrame = nextFrame;
-		nextFrame = th_granule_time(decoder, granulePosition);
+		nextFrame = th_granule_time(decoder, decoderPosition);
 	}
 	}
 
 
 	// Only swap once, even if we read many frames to get here
 	// Only swap once, even if we read many frames to get here