[Scummvm-cvs-logs] scummvm master -> e28544d6d16edff0ca5355cf5ebbde5f7b0cf0d8

clone2727 clone2727 at gmail.com
Tue Nov 26 02:34:46 CET 2013


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

Summary:
fa350f9c1f VIDEO: Ignore AVI strn metadata
6fb6ffd77b VIDEO: Handle prematurely ending AVI videos
e28544d6d1 VIDEO: Ensure debug output of the first AVI index


Commit: fa350f9c1f9acd2e36fedceb7520b2723d3ff604
    https://github.com/scummvm/scummvm/commit/fa350f9c1f9acd2e36fedceb7520b2723d3ff604
Author: Matthew Hoops (clone2727 at gmail.com)
Date: 2013-11-25T17:21:18-08:00

Commit Message:
VIDEO: Ignore AVI strn metadata

Changed paths:
    video/avi_decoder.cpp



diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index eb5a71c..41102f0 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -69,6 +69,7 @@ namespace Video {
 #define ID_ISFT MKTAG('I','S','F','T')
 #define ID_DISP MKTAG('D','I','S','P')
 #define ID_PRMI MKTAG('P','R','M','I')
+#define ID_STRN MKTAG('s','t','r','n')
 
 // Codec tags
 #define ID_RLE  MKTAG('R','L','E',' ')
@@ -155,6 +156,7 @@ bool AVIDecoder::parseNextChunk() {
 	case ID_JUNK: // Alignment bytes, should be ignored
 	case ID_ISFT: // Metadata, safe to ignore
 	case ID_DISP: // Metadata, should be safe to ignore
+	case ID_STRN: // Metadata, safe to ignore
 		skipChunk(size);
 		break;
 	case ID_IDX1:


Commit: 6fb6ffd77ba93cc46a2674b8ee94ab3f7d9966fa
    https://github.com/scummvm/scummvm/commit/6fb6ffd77ba93cc46a2674b8ee94ab3f7d9966fa
Author: Matthew Hoops (clone2727 at gmail.com)
Date: 2013-11-25T17:32:53-08:00

Commit Message:
VIDEO: Handle prematurely ending AVI videos

Changed paths:
    video/avi_decoder.cpp
    video/avi_decoder.h



diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index 41102f0..db8538e 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -110,6 +110,7 @@ void AVIDecoder::initCommon() {
 	_decodedHeader = false;
 	_foundMovieList = false;
 	_movieListStart = 0;
+	_movieListEnd = 0;
 	_fileStream = 0;
 	memset(&_header, 0, sizeof(_header));
 }
@@ -186,6 +187,7 @@ void AVIDecoder::handleList(uint32 listSize) {
 		// We found the movie block
 		_foundMovieList = true;
 		_movieListStart = curPos;
+		_movieListEnd = _movieListStart + listSize + (listSize & 1);
 		_fileStream->skip(listSize);
 		return;
 	case ID_HDRL: // Header List
@@ -346,17 +348,27 @@ void AVIDecoder::close() {
 	_decodedHeader = false;
 	_foundMovieList = false;
 	_movieListStart = 0;
+	_movieListEnd = 0;
 
 	_indexEntries.clear();
 	memset(&_header, 0, sizeof(_header));
 }
 
 void AVIDecoder::readNextPacket() {
+	if ((uint32)_fileStream->pos() >= _movieListEnd) {
+		// Ugh, reached the end premature.
+		forceVideoEnd();
+		return;
+	}
+
 	uint32 nextTag = _fileStream->readUint32BE();
 	uint32 size = _fileStream->readUint32LE();
 
-	if (_fileStream->eos())
+	if (_fileStream->eos()) {
+		// Also premature end.
+		forceVideoEnd();
 		return;
+	}
 
 	if (nextTag == ID_LIST) {
 		// A list of audio/video chunks
@@ -656,6 +668,16 @@ void AVIDecoder::readOldIndex(uint32 size) {
 	}
 }
 
+void AVIDecoder::forceVideoEnd() {
+	// Horrible AVI video has a premature end
+	// Force the frame to be the last frame
+	debug(0, "Forcing end of AVI video");
+
+	for (TrackListIterator it = getTrackListBegin(); it != getTrackListEnd(); it++)
+		if ((*it)->getTrackType() == Track::kTrackTypeVideo)
+			((AVIVideoTrack *)*it)->forceTrackEnd();
+}
+
 AVIDecoder::AVIVideoTrack::AVIVideoTrack(int frameCount, const AVIStreamHeader &streamHeader, const BitmapInfoHeader &bitmapInfoHeader, byte *initialPalette)
 		: _frameCount(frameCount), _vidsHeader(streamHeader), _bmInfo(bitmapInfoHeader), _initialPalette(initialPalette) {
 	_videoCodec = createCodec();
@@ -758,6 +780,10 @@ Codec *AVIDecoder::AVIVideoTrack::createCodec() {
 	return 0;
 }
 
+void AVIDecoder::AVIVideoTrack::forceTrackEnd() {
+	_curFrame = _frameCount - 1;
+}
+
 AVIDecoder::AVIAudioTrack::AVIAudioTrack(const AVIStreamHeader &streamHeader, const PCMWaveFormat &waveFormat, Audio::Mixer::SoundType soundType)
 		: _audsHeader(streamHeader), _wvInfo(waveFormat), _soundType(soundType) {
 	_audStream = createAudioStream();
diff --git a/video/avi_decoder.h b/video/avi_decoder.h
index 9f28196..882cce3 100644
--- a/video/avi_decoder.h
+++ b/video/avi_decoder.h
@@ -166,6 +166,7 @@ protected:
 		~AVIVideoTrack();
 
 		void decodeFrame(Common::SeekableReadStream *stream);
+		void forceTrackEnd();
 
 		uint16 getWidth() const { return _bmInfo.width; }
 		uint16 getHeight() const { return _bmInfo.height; }
@@ -238,7 +239,7 @@ protected:
 	Common::SeekableReadStream *_fileStream;
 	bool _decodedHeader;
 	bool _foundMovieList;
-	uint32 _movieListStart;
+	uint32 _movieListStart, _movieListEnd;
 
 	Audio::Mixer::SoundType _soundType;
 	Common::Rational _frameRateOverride;
@@ -250,6 +251,7 @@ protected:
 	void handleStreamHeader(uint32 size);
 	uint16 getStreamType(uint32 tag) const { return tag & 0xFFFF; }
 	byte getStreamIndex(uint32 tag) const;
+	void forceVideoEnd();
 
 public:
 	virtual AVIAudioTrack *createAudioTrack(AVIStreamHeader sHeader, PCMWaveFormat wvInfo);


Commit: e28544d6d16edff0ca5355cf5ebbde5f7b0cf0d8
    https://github.com/scummvm/scummvm/commit/e28544d6d16edff0ca5355cf5ebbde5f7b0cf0d8
Author: Matthew Hoops (clone2727 at gmail.com)
Date: 2013-11-25T17:33:14-08:00

Commit Message:
VIDEO: Ensure debug output of the first AVI index

Changed paths:
    video/avi_decoder.cpp



diff --git a/video/avi_decoder.cpp b/video/avi_decoder.cpp
index db8538e..36fe83f 100644
--- a/video/avi_decoder.cpp
+++ b/video/avi_decoder.cpp
@@ -650,6 +650,7 @@ void AVIDecoder::readOldIndex(uint32 size) {
 	if (!isAbsolute)
 		firstEntry.offset += _movieListStart - 4;
 
+	debug(0, "Index 0: Tag '%s', Offset = %d, Size = %d (Flags = %d)", tag2str(firstEntry.id), firstEntry.offset, firstEntry.size, firstEntry.flags);
 	_indexEntries.push_back(firstEntry);
 
 	for (uint32 i = 1; i < entryCount; i++) {






More information about the Scummvm-git-logs mailing list