[Scummvm-git-logs] scummvm master -> 3afe32c66c5101053de5efc0e004dc5105d6eb30
sev-
sev at scummvm.org
Thu Aug 20 21:50:54 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:
586790d987 DIRECTOR: Start Digital Videos when they appear on a channel
fbbea1a01f DIRECTOR: Implement DV::setMovieRate()
3afe32c66c DIRECTOR: LINGO: Implement 'the duration of cast'
Commit: 586790d98792d45c645b0c52b1f78a200e67da91
https://github.com/scummvm/scummvm/commit/586790d98792d45c645b0c52b1f78a200e67da91
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-20T23:50:34+02:00
Commit Message:
DIRECTOR: Start Digital Videos when they appear on a channel
Changed paths:
engines/director/castmember.cpp
engines/director/castmember.h
engines/director/channel.cpp
diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 535261eea3..3c968bb44a 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -258,6 +258,8 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
_type = kCastDigitalVideo;
_video = nullptr;
+ _getFirstFrame = false;
+
_initialRect = Movie::readRect(stream);
_vflags = stream.readUint32();
_frameRate = (_vflags >> 24) & 0xff;
@@ -314,6 +316,27 @@ bool DigitalVideoCastMember::isModified() {
return _video->needsUpdate();
}
+void DigitalVideoCastMember::startVideo(Channel *channel) {
+ _channel = channel;
+
+ if (_pausedAtStart) {
+ _getFirstFrame = true;
+ } else {
+ if (_channel->_movieRate == 0.0)
+ _channel->_movieRate = 1.0;
+ }
+
+ if (_video->isPlaying())
+ _video->rewind();
+ else
+ _video->start();
+
+ debugC(2, kDebugImages, "STARTING VIDEO %s", _filename.c_str());
+
+ if (_channel->_stopTime == 0)
+ _channel->_stopTime = getMovieTotalTime();
+}
+
Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Channel *channel) {
Graphics::MacWidget *widget = new Graphics::MacWidget(g_director->getCurrentWindow(), bbox.left, bbox.top, bbox.width(), bbox.height(), g_director->_wm, false);
@@ -328,15 +351,6 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
return nullptr;
}
- // FIXME: HACK: We need to understand when really start the video
- if (!_video->isPlaying()) {
- _video->start();
- debugC(2, kDebugImages, "STARTING VIDEO %s", _filename.c_str());
-
- if (_channel->_stopTime == 0)
- _channel->_stopTime = getMovieTotalTime();
- }
-
debugC(2, kDebugImages, "Video time: %d rate: %f", _channel->_movieTime, _channel->_movieRate);
const Graphics::Surface *frame = _video->decodeNextFrame();
@@ -356,6 +370,11 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
}
}
+ if (_getFirstFrame) {
+ _video->stop();
+ _getFirstFrame = false;
+ }
+
if (_video->endOfVideo())
_channel->_movieRate = 0.0;
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index bcbc33f3e2..2396508c40 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -140,6 +140,7 @@ public:
virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel) override;
bool loadVideo(Common::String path);
+ void startVideo(Channel *channel);
uint getMovieCurrentTime();
uint getMovieTotalTime();
@@ -168,6 +169,7 @@ public:
FrameRateType _frameRateType;
uint16 _frameRate;
+ bool _getFirstFrame;
Video::VideoDecoder *_video;
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 80c75225ec..a880650db5 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -274,6 +274,11 @@ 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->_type == kCastDigitalVideo)
+ ((DigitalVideoCastMember *)nextSprite->_cast)->startVideo(this);
+ }
+
if (_sprite->_puppet || partial) {
// Updating scripts, etc. does not require a full re-render
_sprite->_scriptId = nextSprite->_scriptId;
Commit: fbbea1a01f1da74ecf53b7f448add21b9f581945
https://github.com/scummvm/scummvm/commit/fbbea1a01f1da74ecf53b7f448add21b9f581945
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-20T23:50:34+02:00
Commit Message:
DIRECTOR: Implement DV::setMovieRate()
Changed paths:
engines/director/castmember.cpp
engines/director/castmember.h
engines/director/lingo/lingo-the.cpp
diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 3c968bb44a..158ba18f7a 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -343,7 +343,7 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
_channel = channel;
// Do not render stopped videos
- if (_channel->_movieRate == 0.0)
+ if (_channel->_movieRate == 0.0 && !_pausedAtStart)
return nullptr;
if (!_video || !_video->isVideoLoaded()) {
@@ -421,11 +421,14 @@ void DigitalVideoCastMember::setStopTime(int stamp) {
_video->setEndTime(Audio::Timestamp(_channel->_stopTime * 1000 / 60, dur.framerate()));
}
-void DigitalVideoCastMember::setMovieRate(int rate) {
+void DigitalVideoCastMember::setMovieRate(double rate) {
if (!_video)
return;
- warning("STUB: DigitalVideoCastMember::setMovieRate(%d)", rate);
+ if (rate < 0.0)
+ warning("STUB: DigitalVideoCastMember::setMovieRate(%g)", rate);
+ else
+ _video->setRate(Common::Rational((int)(rate * 100.0), 100));
}
void DigitalVideoCastMember::setFrameRate(int rate) {
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 2396508c40..95b6d6b2e3 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -146,7 +146,7 @@ public:
uint getMovieTotalTime();
void seekMovie(int stamp);
void setStopTime(int stamp);
- void setMovieRate(int rate);
+ void setMovieRate(double rate);
void setFrameRate(int rate);
bool hasField(int field) override;
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index ca0adeed24..e94ca7fb7d 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1172,9 +1172,10 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
d.u.i = sprite->_moveable;
break;
case kTheMovieRate:
- d.u.i = channel->_movieRate;
+ d.type = FLOAT;
+ d.u.f = channel->_movieRate;
if (debugChannelSet(-1, kDebugEndVideo))
- d.u.i = 0;
+ d.u.f = 0.0;
break;
case kTheMovieTime:
d.u.i = channel->_movieTime;
@@ -1373,7 +1374,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
sprite->_moveable = d.asInt();
break;
case kTheMovieRate:
- channel->_movieRate = d.asInt();
+ channel->_movieRate = d.asFloat();
if (sprite->_cast->_type == kCastDigitalVideo)
((DigitalVideoCastMember *)sprite->_cast)->setMovieRate(channel->_movieRate);
else
Commit: 3afe32c66c5101053de5efc0e004dc5105d6eb30
https://github.com/scummvm/scummvm/commit/3afe32c66c5101053de5efc0e004dc5105d6eb30
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-20T23:50:34+02:00
Commit Message:
DIRECTOR: LINGO: Implement 'the duration of cast'
Changed paths:
engines/director/castmember.cpp
engines/director/castmember.h
engines/director/lingo/lingo-object.cpp
diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 158ba18f7a..cc5770d7a7 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -259,6 +259,7 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
_video = nullptr;
_getFirstFrame = false;
+ _duration = 0;
_initialRect = Movie::readRect(stream);
_vflags = stream.readUint32();
@@ -335,6 +336,8 @@ void DigitalVideoCastMember::startVideo(Channel *channel) {
if (_channel->_stopTime == 0)
_channel->_stopTime = getMovieTotalTime();
+
+ _duration = getMovieTotalTime();
}
Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Channel *channel) {
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 95b6d6b2e3..80abac4f76 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -170,6 +170,7 @@ public:
uint16 _frameRate;
bool _getFirstFrame;
+ int _duration;
Video::VideoDecoder *_video;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index ba6a1d57de..bb968dadd0 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -602,7 +602,7 @@ bool CastMember::setField(int field, const Datum &d) {
warning("STUB: CastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
return false;
case kTheCastType:
- warning("Lingo::setTheCast(): Attempt to set read-only field %s of cast %d", g_lingo->entity2str(field), _castId);
+ warning("CastMember::setField(): Attempt to set read-only field %s of cast %d", g_lingo->entity2str(field), _castId);
return false;
case kTheFileName:
if (!castInfo) {
@@ -688,7 +688,7 @@ Datum DigitalVideoCastMember::getField(int field) {
d = _directToStage;
break;
case kTheDuration:
- warning("STUB: DigitalVideoCastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+ d = _duration;
break;
case kTheFrameRate:
d = _frameRate;
@@ -730,7 +730,7 @@ bool DigitalVideoCastMember::setField(int field, const Datum &d) {
_directToStage = (bool)d.asInt();
return true;
case kTheDuration:
- warning("STUB: DigitalVideoCastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+ warning("DigitalVideoCastMember::setField(): Attempt to set read-only field %s of cast %d", g_lingo->entity2str(field), _castId);
return false;
case kTheFrameRate:
_frameRate = d.asInt();
More information about the Scummvm-git-logs
mailing list