[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