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

sev- sev at scummvm.org
Wed Aug 12 17:37:53 UTC 2020


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

Summary:
db4c8164e5 DIRECTOR: More work on Digital Video


Commit: db4c8164e509adae0091334d669e0a70847b8709
    https://github.com/scummvm/scummvm/commit/db4c8164e509adae0091334d669e0a70847b8709
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-08-12T19:37:30+02:00

Commit Message:
DIRECTOR: More work on Digital Video

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


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index cc7efa364d..879aa1b770 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -26,6 +26,8 @@
 
 #include "director/director.h"
 #include "director/castmember.h"
+#include "director/cursor.h"
+#include "director/channel.h"
 #include "director/movie.h"
 #include "director/window.h"
 #include "director/stxt.h"
@@ -163,7 +165,7 @@ BitmapCastMember::~BitmapCastMember() {
 		delete _matte;
 }
 
-Graphics::MacWidget *BitmapCastMember::createWidget(Common::Rect &bbox) {
+Graphics::MacWidget *BitmapCastMember::createWidget(Common::Rect &bbox, Channel *channel) {
 	if (!_img) {
 		warning("BitmapCastMember::createWidget: No image decoder");
 		return nullptr;
@@ -280,19 +282,28 @@ bool DigitalVideoCastMember::isModified() {
 	return _video->needsUpdate();
 }
 
-Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox) {
+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);
 
+	_channel = channel;
+
 	if (!_video || !_video->isVideoLoaded()) {
 		warning("DigitalVideoCastMember::createWidget: No video decoder");
 		return nullptr;
 	}
 
 	// FIXME: HACK: We need to understand when really start the video
-	if (!_video->isPlaying())
+	if (!_video->isPlaying()) {
 		_video->start();
 
+		if (_channel->_stopTime == 0)
+			_channel->_stopTime = getMovieTotalTime();
+	}
+
 	const Graphics::Surface *frame = _video->decodeNextFrame();
+
+	_channel->_movieTime = getMovieCurrentTime();
+
 	if (frame) {
 		if (frame->format.bytesPerPixel != 1) {
 			warning("STUB: video >8bpp");
@@ -304,6 +315,57 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox) {
 	return widget;
 }
 
+uint DigitalVideoCastMember::getMovieCurrentTime() {
+	if (!_video)
+		return 0;
+
+	int stamp = MIN<int>(_video->getTime() * 60 / 1000, getMovieTotalTime());
+
+	return stamp;
+}
+
+uint DigitalVideoCastMember::getMovieTotalTime() {
+	if (!_video)
+		return 0;
+
+	int stamp = _video->getDuration().msecs() * 60 / 1000;
+
+	return stamp;
+}
+
+void DigitalVideoCastMember::seekMovie(int stamp) {
+	if (!_video)
+		return;
+
+	_channel->_startTime = stamp;
+
+	Audio::Timestamp dur = _video->getDuration();
+
+	_video->seek(Audio::Timestamp(_channel->_startTime * 1000 / 60, dur.framerate()));
+}
+
+void DigitalVideoCastMember::setStopTime(int stamp) {
+	if (!_video)
+		return;
+
+	warning("STUB: DigitalVideoCastMember::setStopTime(%d)", stamp);
+}
+
+void DigitalVideoCastMember::setMovieRate(int rate) {
+	if (!_video)
+		return;
+
+	warning("STUB: DigitalVideoCastMember::setMovieRate(%d)", rate);
+}
+
+void DigitalVideoCastMember::setFrameRate(int rate) {
+	if (!_video)
+		return;
+
+	warning("STUB: DigitalVideoCastMember::setFrameRate(%d)", rate);
+}
+
+
 SoundCastMember::SoundCastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream, uint16 version)
 		: CastMember(cast, castId, stream) {
 	_type = kCastSound;
@@ -476,7 +538,7 @@ void TextCastMember::importStxt(const Stxt *stxt) {
 	_ptext = stxt->_ptext;
 }
 
-Graphics::MacWidget *TextCastMember::createWidget(Common::Rect &bbox) {
+Graphics::MacWidget *TextCastMember::createWidget(Common::Rect &bbox, Channel *channel) {
 	Graphics::MacFont *macFont = new Graphics::MacFont(_fontId, _fontSize, _textSlant);
 	Graphics::MacWidget *widget = nullptr;
 
@@ -508,7 +570,7 @@ Graphics::MacWidget *TextCastMember::createWidget(Common::Rect &bbox) {
 }
 
 Common::Rect TextCastMember::getWidgetRect() {
-	Graphics::MacWidget *widget = createWidget(_initialRect);
+	Graphics::MacWidget *widget = createWidget(_initialRect, nullptr);
 	Common::Rect result = _initialRect;
 	if (widget) {
 		result = widget->_dims;
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index e09f20af7e..a179659a2d 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -52,9 +52,10 @@ class VideoDecoder;
 
 namespace Director {
 
-class Stxt;
 class AudioDecoder;
+class Channel;
 struct Resource;
+class Stxt;
 
 class CastMember {
 public:
@@ -67,7 +68,7 @@ public:
 	virtual bool isEditable() { return false; }
 	virtual void setEditable(bool editable) {}
 	virtual bool isModified() { return _modified; }
-	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox) { return nullptr; }
+	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel) { return nullptr; }
 	virtual void updateFromWidget(Graphics::MacWidget *widget) {}
 	virtual Common::Rect getWidgetRect() { return _initialRect; }
 
@@ -96,7 +97,7 @@ class BitmapCastMember : public CastMember {
 public:
 	BitmapCastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream, uint32 castTag, uint16 version, uint8 flags1 = 0);
 	~BitmapCastMember();
-	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox) override;
+	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel) override;
 
 	void createMatte();
 	Graphics::Surface *getMatte();
@@ -123,7 +124,13 @@ public:
 	~DigitalVideoCastMember();
 
 	virtual bool isModified() override;
-	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox) override;
+	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel) override;
+	uint getMovieCurrentTime();
+	uint getMovieTotalTime();
+	void seekMovie(int stamp);
+	void setStopTime(int stamp);
+	void setMovieRate(int rate);
+	void setFrameRate(int rate);
 
 	uint32 _vflags;
 	bool _looping;
@@ -141,6 +148,8 @@ public:
 	uint16 _frameRate;
 
 	Video::VideoDecoder *_video;
+
+	Channel *_channel;
 };
 
 class SoundCastMember : public CastMember {
@@ -175,7 +184,7 @@ public:
 	virtual void setColors(int *fgcolor, int *bgcolor) override;
 
 	void setText(const char *text);
-	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox) override;
+	virtual Graphics::MacWidget *createWidget(Common::Rect &bbox, Channel *channel) override;
 	virtual Common::Rect getWidgetRect() override;
 
 	virtual bool isEditable() override;
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index 167df1e7b7..7fad08dbb7 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -113,7 +113,7 @@ const Graphics::Surface *Channel::getMask(bool forceMatte) {
 
 		if (member && member->_initialRect == _sprite->_cast->_initialRect) {
 			Common::Rect bbox(getBbox());
-			Graphics::MacWidget *widget = member->createWidget(bbox);
+			Graphics::MacWidget *widget = member->createWidget(bbox, this);
 			if (_mask)
 				delete _mask;
 			_mask = new Graphics::ManagedSurface();
@@ -335,7 +335,7 @@ void Channel::replaceWidget() {
 		Common::Rect bbox(getBbox());
 		_sprite->_cast->_modified = false;
 
-		_widget = _sprite->_cast->createWidget(bbox);
+		_widget = _sprite->_cast->createWidget(bbox, this);
 		if (_widget) {
 			_widget->_priority = _priority;
 			_widget->draw();
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 76c7e445ff..09908b2a94 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1344,9 +1344,17 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		break;
 	case kTheMovieRate:
 		channel->_movieRate = d.asInt();
+		if (sprite->_cast->_type == kCastDigitalVideo)
+			((DigitalVideoCastMember *)sprite->_cast)->setMovieRate(channel->_movieRate);
+		else
+			warning("Setting movieTime for non-digital video");
 		break;
 	case kTheMovieTime:
 		channel->_movieTime = d.asInt();
+		if (sprite->_cast->_type == kCastDigitalVideo)
+			((DigitalVideoCastMember *)sprite->_cast)->seekMovie(channel->_movieTime);
+		else
+			warning("Setting movieTime for non-digital video");
 		break;
 	case kThePattern:
 		if (d.asInt() != sprite->getPattern()){
@@ -1363,9 +1371,17 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		break;
 	case kTheStartTime:
 		channel->_startTime = d.asInt();
+		if (sprite->_cast->_type == kCastDigitalVideo)
+			((DigitalVideoCastMember *)sprite->_cast)->seekMovie(channel->_startTime);
+		else
+			warning("Setting startTime for non-digital video");
 		break;
 	case kTheStopTime:
 		channel->_stopTime = d.asInt();
+		if (sprite->_cast->_type == kCastDigitalVideo)
+			((DigitalVideoCastMember *)sprite->_cast)->setStopTime(channel->_stopTime);
+		else
+			warning("Setting stopTime for non-digital video");
 		break;
 	case kTheStretch:
 		if (d.asInt() != sprite->_stretch) {
@@ -1684,6 +1700,7 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 	case kTheFrameRate:
 		if (castType == kCastDigitalVideo) {
 			((DigitalVideoCastMember *)member)->_frameRate = d.asInt();
+			//((DigitalVideoCastMember *)sprite->_cast)->setFrameRate(d.asInt());
 		} else {
 			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
 		}




More information about the Scummvm-git-logs mailing list