From 78eb0b68d3d639ef4e3ff05e9928ad52101f28c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Fri, 2 May 2025 10:49:55 +0200 Subject: [PATCH] Move MovieWriterMJPEG class to `jpg` module it depends on Fixes #90932. --- doc/classes/MovieWriter.xml | 1 + main/main.cpp | 1 - .../jpg}/movie_writer_mjpeg.cpp | 0 .../jpg}/movie_writer_mjpeg.h | 0 modules/jpg/register_types.cpp | 41 ++++++++++++++----- servers/register_server_types.cpp | 11 +---- 6 files changed, 33 insertions(+), 21 deletions(-) rename {servers/movie_writer => modules/jpg}/movie_writer_mjpeg.cpp (100%) rename {servers/movie_writer => modules/jpg}/movie_writer_mjpeg.h (100%) diff --git a/doc/classes/MovieWriter.xml b/doc/classes/MovieWriter.xml index e96080d6a83..fccfd4585ec 100644 --- a/doc/classes/MovieWriter.xml +++ b/doc/classes/MovieWriter.xml @@ -11,6 +11,7 @@ If you need to encode to a different format or pipe a stream through third-party software, you can extend the [MovieWriter] class to create your own movie writers. This should typically be done using GDExtension for performance reasons. [b]Editor usage:[/b] A default movie file path can be specified in [member ProjectSettings.editor/movie_writer/movie_file]. Alternatively, for running single scenes, a [code]movie_file[/code] metadata can be added to the root node, specifying the path to a movie file that will be used when recording that scene. Once a path is set, click the video reel icon in the top-right corner of the editor to enable Movie Maker mode, then run any scene as usual. The engine will start recording as soon as the splash screen is finished, and it will only stop recording when the engine quits. Click the video reel icon again to disable Movie Maker mode. Note that toggling Movie Maker mode does not affect project instances that are already running. [b]Note:[/b] MovieWriter is available for use in both the editor and exported projects, but it is [i]not[/i] designed for use by end users to record videos while playing. Players wishing to record gameplay videos should install tools such as [url=https://obsproject.com/]OBS Studio[/url] or [url=https://www.maartenbaert.be/simplescreenrecorder/]SimpleScreenRecorder[/url] instead. + [b]Note:[/b] MJPEG support ([code].avi[/code] file extension) depends on the [code]jpg[/code] module being enabled at compile time (default behavior). diff --git a/main/main.cpp b/main/main.cpp index 310494724ad..9b73d3046f8 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -71,7 +71,6 @@ #include "servers/camera_server.h" #include "servers/display_server.h" #include "servers/movie_writer/movie_writer.h" -#include "servers/movie_writer/movie_writer_mjpeg.h" #include "servers/register_server_types.h" #include "servers/rendering/rendering_server_default.h" #include "servers/text/text_server_dummy.h" diff --git a/servers/movie_writer/movie_writer_mjpeg.cpp b/modules/jpg/movie_writer_mjpeg.cpp similarity index 100% rename from servers/movie_writer/movie_writer_mjpeg.cpp rename to modules/jpg/movie_writer_mjpeg.cpp diff --git a/servers/movie_writer/movie_writer_mjpeg.h b/modules/jpg/movie_writer_mjpeg.h similarity index 100% rename from servers/movie_writer/movie_writer_mjpeg.h rename to modules/jpg/movie_writer_mjpeg.h diff --git a/modules/jpg/register_types.cpp b/modules/jpg/register_types.cpp index aedb6e8da38..198248c007a 100644 --- a/modules/jpg/register_types.cpp +++ b/modules/jpg/register_types.cpp @@ -31,23 +31,44 @@ #include "register_types.h" #include "image_loader_libjpeg_turbo.h" +#include "movie_writer_mjpeg.h" static Ref image_loader_libjpeg_turbo; +static MovieWriterMJPEG *writer_mjpeg = nullptr; void initialize_jpg_module(ModuleInitializationLevel p_level) { - if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { - return; - } + switch (p_level) { + case MODULE_INITIALIZATION_LEVEL_SERVERS: { + if (GD_IS_CLASS_ENABLED(MovieWriterMJPEG)) { + writer_mjpeg = memnew(MovieWriterMJPEG); + MovieWriter::add_writer(writer_mjpeg); + } + } break; - image_loader_libjpeg_turbo.instantiate(); - ImageLoader::add_image_format_loader(image_loader_libjpeg_turbo); + case MODULE_INITIALIZATION_LEVEL_SCENE: { + image_loader_libjpeg_turbo.instantiate(); + ImageLoader::add_image_format_loader(image_loader_libjpeg_turbo); + } break; + + default: + break; + } } void uninitialize_jpg_module(ModuleInitializationLevel p_level) { - if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { - return; - } + switch (p_level) { + case MODULE_INITIALIZATION_LEVEL_SCENE: { + ImageLoader::remove_image_format_loader(image_loader_libjpeg_turbo); + image_loader_libjpeg_turbo.unref(); + } break; - ImageLoader::remove_image_format_loader(image_loader_libjpeg_turbo); - image_loader_libjpeg_turbo.unref(); + case MODULE_INITIALIZATION_LEVEL_SERVERS: { + if (GD_IS_CLASS_ENABLED(MovieWriterMJPEG)) { + memdelete(writer_mjpeg); + } + } break; + + default: + break; + } } diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index 4016a6b9a08..7ae224f5c1b 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -59,7 +59,6 @@ #include "display/native_menu.h" #include "display_server.h" #include "movie_writer/movie_writer.h" -#include "movie_writer/movie_writer_mjpeg.h" #include "movie_writer/movie_writer_pngwav.h" #include "rendering/renderer_rd/framebuffer_cache_rd.h" #include "rendering/renderer_rd/storage_rd/render_data_rd.h" @@ -135,7 +134,6 @@ static bool has_server_feature_callback(const String &p_feature) { return false; } -static MovieWriterMJPEG *writer_mjpeg = nullptr; static MovieWriterPNGWAV *writer_pngwav = nullptr; void register_server_types() { @@ -346,11 +344,6 @@ void register_server_types() { GDREGISTER_ABSTRACT_CLASS(XRTracker); #endif // XR_DISABLED - if (GD_IS_CLASS_ENABLED(MovieWriterMJPEG)) { - writer_mjpeg = memnew(MovieWriterMJPEG); - MovieWriter::add_writer(writer_mjpeg); - } - if (GD_IS_CLASS_ENABLED(MovieWriterPNGWAV)) { writer_pngwav = memnew(MovieWriterPNGWAV); MovieWriter::add_writer(writer_pngwav); @@ -364,12 +357,10 @@ void unregister_server_types() { ServersDebugger::deinitialize(); memdelete(shader_types); - if (GD_IS_CLASS_ENABLED(MovieWriterMJPEG)) { - memdelete(writer_mjpeg); - } if (GD_IS_CLASS_ENABLED(MovieWriterPNGWAV)) { memdelete(writer_pngwav); } + OS::get_singleton()->benchmark_end_measure("Servers", "Unregister Extensions"); }