[Scummvm-git-logs] scummvm master -> e72a1d7c46a352e9d8d7850212275eee78cf4c39

dreammaster dreammaster at scummvm.org
Mon Sep 4 01:53:14 CEST 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e72a1d7c46 VIDEO: Simplify AVIDecoder reverse playback special handling


Commit: e72a1d7c46a352e9d8d7850212275eee78cf4c39
    https://github.com/scummvm/scummvm/commit/e72a1d7c46a352e9d8d7850212275eee78cf4c39
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-09-03T19:52:48-04:00

Commit Message:
VIDEO: Simplify AVIDecoder reverse playback special handling

Changed paths:
    video/avi_decoder.cpp


diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index 13b2c98..ea10b95 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -130,20 +130,35 @@ bool AVIDecoder::isSeekable() const {
 }
 
 const Graphics::Surface *AVIDecoder::decodeNextFrame() {
-	// When playing in reverse, we need to seek to the correct prior frame
 	AVIVideoTrack *track = nullptr;
 	bool isReversed = false;
+	int frameNum;
+
+	// Check whether the video is playing in revese
 	for (int idx = _videoTracks.size() - 1; idx >= 0; --idx) {
 		track = static_cast<AVIVideoTrack *>(_videoTracks[idx].track);
 		isReversed |= track->isReversed();
 	}
 
 	if (isReversed) {
-		Audio::Timestamp time = track->getFrameTime(getCurFrame());
-		seekIntern(time);
+		// For reverse mode we need to keep seeking to just before the
+		// desired frame prior to actually decoding a frame
+		frameNum = getCurFrame();
+		seekIntern(track->getFrameTime(frameNum));
+	}
+
+	// Decode the next frame
+	const Graphics::Surface *frame = VideoDecoder::decodeNextFrame();
+
+	if (isReversed) {
+		// In reverse mode, set next frame to be the prior frame number
+		for (int idx = _videoTracks.size() - 1; idx >= 0; --idx) {
+			track = static_cast<AVIVideoTrack *>(_videoTracks[idx].track);
+			track->setCurFrame(frameNum - 1);
+		}
 	}
 
-	return VideoDecoder::decodeNextFrame();
+	return frame;
 }
 
 const Graphics::Surface *AVIDecoder::decodeNextTransparency() {
@@ -746,7 +761,7 @@ bool AVIDecoder::seekIntern(const Audio::Timestamp &time) {
 		seekTransparencyFrame(frame);
 
 	// Set the video track's frame
-	videoTrack->setCurFrame(videoTrack->isReversed() ? frame : frame - 1);
+	videoTrack->setCurFrame(frame - 1);
 
 	// Set the video track's search offset to the right spot
 	_videoTracks[0].chunkSearchOffset = _indexEntries[frameIndex].offset;
@@ -788,7 +803,7 @@ void AVIDecoder::seekTransparencyFrame(int frame) {
 		}
 	}
 
-	transTrack->setCurFrame((int)frame - 1);
+	transTrack->setCurFrame(frame - 1);
 }
 
 byte AVIDecoder::getStreamIndex(uint32 tag) {





More information about the Scummvm-git-logs mailing list