[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