Skip to content

Commit 6b35f26

Browse files
committed
Move MovieWriterMJPEG class to jpg module it depends on
Fixes #90932.
1 parent 0b019c6 commit 6b35f26

File tree

6 files changed

+29
-18
lines changed

6 files changed

+29
-18
lines changed

doc/classes/MovieWriter.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<description>
77
Godot can record videos with non-real-time simulation. Like the [code]--fixed-fps[/code] [url=$DOCS_URL/tutorials/editor/command_line_tutorial.html]command line argument[/url], this forces the reported [code]delta[/code] in [method Node._process] functions to be identical across frames, regardless of how long it actually took to render the frame. This can be used to record high-quality videos with perfect frame pacing regardless of your hardware's capabilities.
88
Godot has 2 built-in [MovieWriter]s:
9-
- AVI container with MJPEG for video and uncompressed audio ([code].avi[/code] file extension). Lossy compression, medium file sizes, fast encoding. The lossy compression quality can be adjusted by changing [member ProjectSettings.editor/movie_writer/mjpeg_quality]. The resulting file can be viewed in most video players, but it must be converted to another format for viewing on the web or by Godot with [VideoStreamPlayer]. MJPEG does not support transparency. AVI output is currently limited to a file of 4 GB in size at most.
9+
- AVI container with MJPEG for video and uncompressed audio ([code].avi[/code] file extension). This requires the [code]jpg[/code] module to be enabled at compile time (default behavior). Lossy compression, medium file sizes, fast encoding. The lossy compression quality can be adjusted by changing [member ProjectSettings.editor/movie_writer/mjpeg_quality]. The resulting file can be viewed in most video players, but it must be converted to another format for viewing on the web or by Godot with [VideoStreamPlayer]. MJPEG does not support transparency. AVI output is currently limited to a file of 4 GB in size at most.
1010
- PNG image sequence for video and WAV for audio ([code].png[/code] file extension). Lossless compression, large file sizes, slow encoding. Designed to be encoded to a video file with another tool such as [url=https://ffmpeg.org/]FFmpeg[/url] after recording. Transparency is currently not supported, even if the root viewport is set to be transparent.
1111
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.
1212
[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.

main/main.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
#include "servers/camera_server.h"
7272
#include "servers/display_server.h"
7373
#include "servers/movie_writer/movie_writer.h"
74-
#include "servers/movie_writer/movie_writer_mjpeg.h"
7574
#include "servers/register_server_types.h"
7675
#include "servers/rendering/rendering_server_default.h"
7776
#include "servers/text/text_server_dummy.h"

modules/jpg/register_types.cpp

+27-10
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,40 @@
3131
#include "register_types.h"
3232

3333
#include "image_loader_libjpeg_turbo.h"
34+
#include "movie_writer_mjpeg.h"
3435

3536
static Ref<ImageLoaderLibJPEGTurbo> image_loader_libjpeg_turbo;
37+
static MovieWriterMJPEG *writer_mjpeg = nullptr;
3638

3739
void initialize_jpg_module(ModuleInitializationLevel p_level) {
38-
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
39-
return;
40-
}
40+
switch (p_level) {
41+
case MODULE_INITIALIZATION_LEVEL_SERVERS: {
42+
writer_mjpeg = memnew(MovieWriterMJPEG);
43+
MovieWriter::add_writer(writer_mjpeg);
44+
} break;
45+
46+
case MODULE_INITIALIZATION_LEVEL_SCENE: {
47+
image_loader_libjpeg_turbo.instantiate();
48+
ImageLoader::add_image_format_loader(image_loader_libjpeg_turbo);
49+
} break;
4150

42-
image_loader_libjpeg_turbo.instantiate();
43-
ImageLoader::add_image_format_loader(image_loader_libjpeg_turbo);
51+
default:
52+
break;
53+
}
4454
}
4555

4656
void uninitialize_jpg_module(ModuleInitializationLevel p_level) {
47-
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
48-
return;
49-
}
57+
switch (p_level) {
58+
case MODULE_INITIALIZATION_LEVEL_SCENE: {
59+
ImageLoader::remove_image_format_loader(image_loader_libjpeg_turbo);
60+
image_loader_libjpeg_turbo.unref();
61+
} break;
62+
63+
case MODULE_INITIALIZATION_LEVEL_SERVERS: {
64+
memdelete(writer_mjpeg);
65+
} break;
5066

51-
ImageLoader::remove_image_format_loader(image_loader_libjpeg_turbo);
52-
image_loader_libjpeg_turbo.unref();
67+
default:
68+
break;
69+
}
5370
}

servers/register_server_types.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
#include "display/native_menu.h"
6161
#include "display_server.h"
6262
#include "movie_writer/movie_writer.h"
63-
#include "movie_writer/movie_writer_mjpeg.h"
6463
#include "movie_writer/movie_writer_pngwav.h"
6564
#include "rendering/renderer_rd/framebuffer_cache_rd.h"
6665
#include "rendering/renderer_rd/storage_rd/render_data_rd.h"
@@ -133,7 +132,6 @@ static bool has_server_feature_callback(const String &p_feature) {
133132
return false;
134133
}
135134

136-
static MovieWriterMJPEG *writer_mjpeg = nullptr;
137135
static MovieWriterPNGWAV *writer_pngwav = nullptr;
138136

139137
void register_server_types() {
@@ -342,9 +340,7 @@ void register_server_types() {
342340
GDREGISTER_ABSTRACT_CLASS(XRTracker);
343341
#endif // XR_DISABLED
344342

345-
writer_mjpeg = memnew(MovieWriterMJPEG);
346-
MovieWriter::add_writer(writer_mjpeg);
347-
343+
// MovieWriterMJPEG is registered in the jpg module.
348344
writer_pngwav = memnew(MovieWriterPNGWAV);
349345
MovieWriter::add_writer(writer_pngwav);
350346

@@ -356,7 +352,6 @@ void unregister_server_types() {
356352

357353
ServersDebugger::deinitialize();
358354
memdelete(shader_types);
359-
memdelete(writer_mjpeg);
360355
memdelete(writer_pngwav);
361356

362357
OS::get_singleton()->benchmark_end_measure("Servers", "Unregister Extensions");

0 commit comments

Comments
 (0)