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

sev- sev at scummvm.org
Sat Aug 22 16:02:51 UTC 2020


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:
f3f0816bd3 DIRECTOR: Fixed showing initial frame on stopped videos
d1b0c5a986 DIRECTOR: Render last frame from paused or stopped videos
f6f669c953 DIRECTOR: Setting loop for stopped DV should actually play it


Commit: f3f0816bd381fed8533afcdab38fe6cd5dbb6170
    https://github.com/scummvm/scummvm/commit/f3f0816bd381fed8533afcdab38fe6cd5dbb6170
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-22T18:02:10+02:00

Commit Message:
DIRECTOR: Fixed showing initial frame on stopped videos

Changed paths:
    engines/director/castmember.cpp
    engines/director/channel.cpp
    engines/director/score.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index c6915cbfac..c29c6d1409 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -311,7 +311,13 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
 }
 
 bool DigitalVideoCastMember::isModified() {
-	if (!_video || !_video->isVideoLoaded() || _channel->_movieRate == 0.0)
+	if (!_video || !_video->isVideoLoaded())
+		return true;
+
+	if (_getFirstFrame)
+		return true;
+
+	if (_channel->_movieRate == 0.0)
 		return false;
 
 	return _video->needsUpdate();
@@ -346,7 +352,7 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 	_channel = channel;
 
 	// Do not render stopped videos
-	if (_channel->_movieRate == 0.0 && !_pausedAtStart)
+	if (_channel->_movieRate == 0.0 && !_getFirstFrame)
 		return nullptr;
 
 	if (!_video || !_video->isVideoLoaded()) {
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index c9be048689..84d6988533 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -275,7 +275,7 @@ void Channel::setClean(Sprite *nextSprite, int spriteId, bool partial) {
 	bool replace = isDirty(nextSprite);
 
 	if (nextSprite) {
-		if (_sprite->_castId != nextSprite->_castId && nextSprite->_cast) {
+		if (nextSprite->_cast && (_dirty || _sprite->_castId != nextSprite->_castId)) {
 			if (nextSprite->_cast->_type == kCastDigitalVideo) {
 				Common::String path = nextSprite->_cast->getCast()->getVideoPath(nextSprite->_castId);
 
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 589dc77627..f000849ccc 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -502,7 +502,7 @@ void Score::renderSprites(uint16 frameId, RenderMode mode) {
 		if (channel->isActiveVideo())
 			_movie->_videoPlayback = true;
 
-		if (channel->isDirty(nextSprite) || widgetRedrawn || mode == kRenderForceUpdate) {
+		if (channel->isDirty(nextSprite) || channel->isActiveVideo() || widgetRedrawn || mode == kRenderForceUpdate) {
 			if (!currentSprite->_trails)
 				_window->addDirtyRect(channel->getBbox());
 


Commit: d1b0c5a986fd5a4af369a9fbe01a60ced492ec42
    https://github.com/scummvm/scummvm/commit/d1b0c5a986fd5a4af369a9fbe01a60ced492ec42
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-22T18:02:10+02:00

Commit Message:
DIRECTOR: Render last frame from paused or stopped videos

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index c29c6d1409..b318de106b 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -257,6 +257,7 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
 		: CastMember(cast, castId, stream) {
 	_type = kCastDigitalVideo;
 	_video = nullptr;
+	_lastFrame = nullptr;
 
 	_getFirstFrame = false;
 	_duration = 0;
@@ -296,6 +297,9 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
 
 DigitalVideoCastMember::~DigitalVideoCastMember() {
 	delete _video;
+
+	if (g_director->_pixelformat.bytesPerPixel != 1)
+		delete _lastFrame;
 }
 
 bool DigitalVideoCastMember::loadVideo(Common::String path) {
@@ -351,16 +355,23 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 
 	_channel = channel;
 
-	// Do not render stopped videos
-	if (_channel->_movieRate == 0.0 && !_getFirstFrame)
-		return nullptr;
+	warning("creating");
 
 	if (!_video || !_video->isVideoLoaded()) {
 		warning("DigitalVideoCastMember::createWidget: No video decoder");
+		delete widget;
+
 		return nullptr;
 	}
 
-	debugC(2, kDebugImages, "Video time: %d  rate: %f", _channel->_movieTime, _channel->_movieRate);
+	// Do not render stopped videos
+	if (_channel->_movieRate == 0.0 && !_getFirstFrame) {
+		widget->getSurface()->blitFrom(*_lastFrame);
+
+		return widget;
+	}
+
+	debugC(1, kDebugImages, "Video time: %d  rate: %f", _channel->_movieTime, _channel->_movieRate);
 	const Graphics::Surface *frame = _video->decodeNextFrame();
 
 	_channel->_movieTime = getMovieCurrentTime();
@@ -370,13 +381,16 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 			if (frame->format.bytesPerPixel != 1) {
 				warning("STUB: video >8bpp");
 			} else {
+				_lastFrame = frame;
 				widget->getSurface()->blitFrom(*frame);
 			}
 		} else {
-			const Graphics::Surface *surf = frame->convertTo(g_director->_pixelformat, g_director->getPalette());
-			widget->getSurface()->blitFrom(*surf);
-			delete surf;
+			delete _lastFrame;
+			_lastFrame = frame->convertTo(g_director->_pixelformat, g_director->getPalette());
+			widget->getSurface()->blitFrom(*_lastFrame);
 		}
+	} else {
+		widget->getSurface()->blitFrom(*_lastFrame);
 	}
 
 	if (_getFirstFrame) {
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 9bb64d57e9..cebcc9931a 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -173,6 +173,7 @@ public:
 	int _duration;
 
 	Video::VideoDecoder *_video;
+	const Graphics::Surface *_lastFrame;
 
 	Channel *_channel;
 };


Commit: f6f669c95330a1b22be25b156f9d3d795eb3828d
    https://github.com/scummvm/scummvm/commit/f6f669c95330a1b22be25b156f9d3d795eb3828d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-22T18:02:10+02:00

Commit Message:
DIRECTOR: Setting loop for stopped DV should actually play it

Changed paths:
    engines/director/castmember.cpp
    engines/director/channel.h
    engines/director/lingo/lingo-object.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index b318de106b..c65d07df66 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -355,8 +355,6 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 
 	_channel = channel;
 
-	warning("creating");
-
 	if (!_video || !_video->isVideoLoaded()) {
 		warning("DigitalVideoCastMember::createWidget: No video decoder");
 		delete widget;
@@ -453,10 +451,15 @@ void DigitalVideoCastMember::setMovieRate(double rate) {
 	if (!_video)
 		return;
 
+	_channel->_movieRate = rate;
+
 	if (rate < 0.0)
 		warning("STUB: DigitalVideoCastMember::setMovieRate(%g)", rate);
 	else
 		_video->setRate(Common::Rational((int)(rate * 100.0), 100));
+
+	if (_video->endOfVideo())
+		_video->rewind();
 }
 
 void DigitalVideoCastMember::setFrameRate(int rate) {
diff --git a/engines/director/channel.h b/engines/director/channel.h
index 3eac0f53c7..a235f24d24 100644
--- a/engines/director/channel.h
+++ b/engines/director/channel.h
@@ -23,6 +23,8 @@
 #ifndef DIRECTOR_CHANNEL_H
 #define DIRECTOR_CHANNEL_H
 
+#include "director/cursor.h"
+
 namespace Graphics {
 	struct Surface;
 	class ManagedSurface;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index d35894468a..a736914662 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -24,6 +24,7 @@
 
 #include "director/director.h"
 #include "director/cast.h"
+#include "director/channel.h"
 #include "director/castmember.h"
 #include "director/window.h"
 #include "director/util.h"
@@ -738,6 +739,9 @@ bool DigitalVideoCastMember::setField(int field, const Datum &d) {
 		return true;
 	case kTheLoop:
 		_looping = (bool)d.asInt();
+		if (_looping && _channel && _channel->_movieRate == 0.0) {
+			setMovieRate(1.0);
+		}
 		return true;
 	case kThePausedAtStart:
 		_pausedAtStart = (bool)d.asInt();




More information about the Scummvm-git-logs mailing list