diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-12-31 21:12:04 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-12-31 21:26:43 +0100 |
| commit | b75ec8ef46adb00419946d1975b00f6d921807b0 (patch) | |
| tree | 9102efbd7da9e98fb74f5533b4669a1be0568a4b /src | |
| parent | 1289b316fb067f4e2f71485306ea25af6b4d81b9 (diff) | |
Move ReelWriter creation into the job thread so it doesn't hang the GUI when it takes a long time.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/dcp_film_encoder.cc | 53 | ||||
| -rw-r--r-- | src/lib/dcp_film_encoder.h | 2 |
2 files changed, 32 insertions, 23 deletions
diff --git a/src/lib/dcp_film_encoder.cc b/src/lib/dcp_film_encoder.cc index e98dfb423..c66858bac 100644 --- a/src/lib/dcp_film_encoder.cc +++ b/src/lib/dcp_film_encoder.cc @@ -66,24 +66,9 @@ using namespace dcpomatic; */ DCPFilmEncoder::DCPFilmEncoder(shared_ptr<const Film> film, weak_ptr<Job> job) : FilmEncoder(film, job) - , _writer(film, job, film->dir(film->dcp_name())) , _finishing(false) , _non_burnt_subtitles(false) { - switch (_film->video_encoding()) { - case VideoEncoding::JPEG2000: - _encoder.reset(new J2KEncoder(film, _writer)); - break; - case VideoEncoding::MPEG2: - _encoder.reset(new MPEG2Encoder(film, _writer)); - break; - case VideoEncoding::COUNT: - DCPOMATIC_ASSERT(false); - } - - /* Now that we have a Writer we can clear out the assets directory */ - clean_up_asset_directory(film->assets_path()); - _player_video_connection = _player.Video.connect(bind(&DCPFilmEncoder::video, this, _1, _2)); _player_audio_connection = _player.Audio.connect(bind(&DCPFilmEncoder::audio, this, _1, _2)); _player_text_connection = _player.Text.connect(bind(&DCPFilmEncoder::text, this, _1, _2, _3, _4)); @@ -110,7 +95,24 @@ DCPFilmEncoder::~DCPFilmEncoder() void DCPFilmEncoder::go() { - _writer.start(); + auto job = _job.lock(); + _writer.reset(new Writer(_film, job, _film->dir(_film->dcp_name()))); + + switch (_film->video_encoding()) { + case VideoEncoding::JPEG2000: + _encoder.reset(new J2KEncoder(_film, *_writer)); + break; + case VideoEncoding::MPEG2: + _encoder.reset(new MPEG2Encoder(_film, *_writer)); + break; + case VideoEncoding::COUNT: + DCPOMATIC_ASSERT(false); + } + + /* Now that we have a Writer we can clear out the assets directory */ + clean_up_asset_directory(_film->assets_path()); + + _writer->start(); _encoder->begin(); { @@ -120,7 +122,7 @@ DCPFilmEncoder::go() } if (_non_burnt_subtitles) { - _writer.write(_player.get_subtitle_fonts()); + _writer->write(_player.get_subtitle_fonts()); } int passes = 0; @@ -133,12 +135,12 @@ DCPFilmEncoder::go() } for (auto i: get_referenced_reel_assets(_film, _film->playlist())) { - _writer.write(i); + _writer->write(i); } _finishing = true; _encoder->end(); - _writer.finish(); + _writer->finish(); } @@ -164,14 +166,16 @@ DCPFilmEncoder::video(shared_ptr<PlayerVideo> data, DCPTime time) void DCPFilmEncoder::audio(shared_ptr<AudioBuffers> data, DCPTime time) { - _writer.write(data, time); + DCPOMATIC_ASSERT(_writer); + _writer->write(data, time); } void DCPFilmEncoder::text(PlayerText data, TextType type, optional<DCPTextTrack> track, DCPTimePeriod period) { if (type == TextType::CLOSED_CAPTION || _non_burnt_subtitles) { - _writer.write(data, type, track, period); + DCPOMATIC_ASSERT(_writer); + _writer->write(data, type, track, period); } } @@ -179,13 +183,18 @@ DCPFilmEncoder::text(PlayerText data, TextType type, optional<DCPTextTrack> trac void DCPFilmEncoder::atmos(shared_ptr<const dcp::AtmosFrame> data, DCPTime time, AtmosMetadata metadata) { - _writer.write(data, time, metadata); + DCPOMATIC_ASSERT(_writer); + _writer->write(data, time, metadata); } optional<float> DCPFilmEncoder::current_rate() const { + if (!_encoder) { + return {}; + } + return _encoder->current_encoding_rate(); } diff --git a/src/lib/dcp_film_encoder.h b/src/lib/dcp_film_encoder.h index 54a387045..4ce4a2dc9 100644 --- a/src/lib/dcp_film_encoder.h +++ b/src/lib/dcp_film_encoder.h @@ -67,7 +67,7 @@ private: void text(PlayerText, TextType, boost::optional<DCPTextTrack>, dcpomatic::DCPTimePeriod); void atmos(std::shared_ptr<const dcp::AtmosFrame>, dcpomatic::DCPTime, AtmosMetadata metadata); - Writer _writer; + std::unique_ptr<Writer> _writer; std::unique_ptr<VideoEncoder> _encoder; bool _finishing; bool _non_burnt_subtitles; |
