[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