diff --git a/doc/classes/VideoStreamPlayback.xml b/doc/classes/VideoStreamPlayback.xml
index 17e29ae337a..80f34ec5f90 100644
--- a/doc/classes/VideoStreamPlayback.xml
+++ b/doc/classes/VideoStreamPlayback.xml
@@ -33,6 +33,12 @@
Return the current playback timestamp. Called in response to the [member VideoStreamPlayer.stream_position] getter.
+
+
+
+ Return the current playback speed.
+
+
@@ -78,6 +84,13 @@
Set the paused status of video playback. [method _is_paused] must return [param paused]. Called in response to the [member VideoStreamPlayer.paused] setter.
+
+
+
+
+ Set playback speed.
+
+
diff --git a/doc/classes/VideoStreamPlayer.xml b/doc/classes/VideoStreamPlayer.xml
index f903f171d10..3e152a8149b 100644
--- a/doc/classes/VideoStreamPlayer.xml
+++ b/doc/classes/VideoStreamPlayer.xml
@@ -81,6 +81,10 @@
The current position of the stream, in seconds.
[b]Note:[/b] Changing this value won't have any effect as seeking is not implemented yet, except in video formats implemented by a GDExtension add-on.
+
+ The current speed of the stream. 1.0 means the normal speed.
+ [b]Note:[/b] Changing this value won't have any effect as there is no speed feature implemented yet, except in video formats implemented by a GDExtension add-on.
+
Audio volume as a linear value.
diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp
index 02a1c7f8687..0b97e893aec 100644
--- a/modules/theora/video_stream_theora.cpp
+++ b/modules/theora/video_stream_theora.cpp
@@ -488,6 +488,15 @@ double VideoStreamPlaybackTheora::get_length() const {
return 0;
}
+double VideoStreamPlaybackTheora::get_playback_speed() const {
+ WARN_PRINT_ONCE("Video speed option in Theora videos is not implemented yet (it's only supported for GDExtension-provided video streams).");
+ return 1;
+}
+
+void VideoStreamPlaybackTheora::set_playback_speed(double p_speed) {
+ WARN_PRINT_ONCE("Video speed option in Theora videos is not implemented yet (it's only supported for GDExtension-provided video streams).");
+}
+
double VideoStreamPlaybackTheora::get_playback_position() const {
return get_time();
}
diff --git a/modules/theora/video_stream_theora.h b/modules/theora/video_stream_theora.h
index 45b6746d40b..5d719d6fe07 100644
--- a/modules/theora/video_stream_theora.h
+++ b/modules/theora/video_stream_theora.h
@@ -111,6 +111,9 @@ public:
virtual double get_length() const override;
+ virtual double get_playback_speed() const override;
+ virtual void set_playback_speed(double p_speed) override;
+
virtual double get_playback_position() const override;
virtual void seek(double p_time) override;
diff --git a/scene/gui/video_stream_player.cpp b/scene/gui/video_stream_player.cpp
index fa965179a4d..14004b5a6e8 100644
--- a/scene/gui/video_stream_player.cpp
+++ b/scene/gui/video_stream_player.cpp
@@ -412,6 +412,19 @@ float VideoStreamPlayer::get_volume_db() const {
}
}
+void VideoStreamPlayer::set_stream_speed(float p_speed) {
+ if (playback.is_valid()) {
+ playback->set_playback_speed(p_speed);
+ }
+}
+
+float VideoStreamPlayer::get_stream_speed() const {
+ if (playback.is_null()) {
+ return 1;
+ }
+ return playback->get_playback_speed();
+}
+
String VideoStreamPlayer::get_stream_name() const {
if (stream.is_null()) {
return "";
@@ -507,6 +520,9 @@ void VideoStreamPlayer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_volume_db", "db"), &VideoStreamPlayer::set_volume_db);
ClassDB::bind_method(D_METHOD("get_volume_db"), &VideoStreamPlayer::get_volume_db);
+ ClassDB::bind_method(D_METHOD("set_stream_speed", "speed"), &VideoStreamPlayer::set_stream_speed);
+ ClassDB::bind_method(D_METHOD("get_stream_speed"), &VideoStreamPlayer::get_stream_speed);
+
ClassDB::bind_method(D_METHOD("set_audio_track", "track"), &VideoStreamPlayer::set_audio_track);
ClassDB::bind_method(D_METHOD("get_audio_track"), &VideoStreamPlayer::get_audio_track);
@@ -536,6 +552,7 @@ void VideoStreamPlayer::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "VideoStream"), "set_stream", "get_stream");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume_db", PROPERTY_HINT_RANGE, "-80,24,0.01,suffix:dB"), "set_volume_db", "get_volume_db");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume", PROPERTY_HINT_RANGE, "0,15,0.01,exp", PROPERTY_USAGE_NONE), "set_volume", "get_volume");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "stream_speed", PROPERTY_HINT_RANGE, "0,1280000,0.1", PROPERTY_USAGE_NONE), "set_stream_speed", "get_stream_speed");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "has_autoplay");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused"), "set_paused", "is_paused");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand"), "set_expand", "has_expand");
diff --git a/scene/gui/video_stream_player.h b/scene/gui/video_stream_player.h
index 2cbe6cac218..d4591eefe58 100644
--- a/scene/gui/video_stream_player.h
+++ b/scene/gui/video_stream_player.h
@@ -106,6 +106,9 @@ public:
void set_volume_db(float p_db);
float get_volume_db() const;
+ void set_stream_speed(float p_speed);
+ float get_stream_speed() const;
+
String get_stream_name() const;
double get_stream_length() const;
double get_stream_position() const;
diff --git a/scene/resources/video_stream.cpp b/scene/resources/video_stream.cpp
index 32e87c38f3e..70388017dc5 100644
--- a/scene/resources/video_stream.cpp
+++ b/scene/resources/video_stream.cpp
@@ -40,6 +40,8 @@ void VideoStreamPlayback::_bind_methods() {
GDVIRTUAL_BIND(_set_paused, "paused");
GDVIRTUAL_BIND(_is_paused);
GDVIRTUAL_BIND(_get_length);
+ GDVIRTUAL_BIND(_get_playback_speed);
+ GDVIRTUAL_BIND(_set_playback_speed, "speed");
GDVIRTUAL_BIND(_get_playback_position);
GDVIRTUAL_BIND(_seek, "time");
GDVIRTUAL_BIND(_set_audio_track, "idx");
@@ -91,6 +93,18 @@ double VideoStreamPlayback::get_length() const {
return 0;
}
+double VideoStreamPlayback::get_playback_speed() const {
+ double ret;
+ if (GDVIRTUAL_CALL(_get_playback_speed, ret)) {
+ return ret;
+ }
+ return 1;
+}
+
+void VideoStreamPlayback::set_playback_speed(double p_speed) {
+ GDVIRTUAL_CALL(_set_playback_speed, p_speed);
+}
+
double VideoStreamPlayback::get_playback_position() const {
double ret;
if (GDVIRTUAL_CALL(_get_playback_position, ret)) {
diff --git a/scene/resources/video_stream.h b/scene/resources/video_stream.h
index b3d0739e759..70c571d7536 100644
--- a/scene/resources/video_stream.h
+++ b/scene/resources/video_stream.h
@@ -51,6 +51,8 @@ protected:
GDVIRTUAL1(_set_paused, bool);
GDVIRTUAL0RC(bool, _is_paused);
GDVIRTUAL0RC(double, _get_length);
+ GDVIRTUAL0RC(double, _get_playback_speed);
+ GDVIRTUAL1(_set_playback_speed, double);
GDVIRTUAL0RC(double, _get_playback_position);
GDVIRTUAL1(_seek, double);
GDVIRTUAL1(_set_audio_track, int);
@@ -75,6 +77,9 @@ public:
virtual double get_length() const;
+ virtual double get_playback_speed() const;
+ virtual void set_playback_speed(double p_speed);
+
virtual double get_playback_position() const;
virtual void seek(double p_time);