From 26678a922a1808db33954e002c165678d8191fc6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 12 May 2024 15:22:28 +0200 Subject: Get DCP transcode progress from the player (#2804). --- src/lib/player.cc | 67 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 20 deletions(-) (limited to 'src/lib/player.cc') diff --git a/src/lib/player.cc b/src/lib/player.cc index c03cb97a5..2e96e4bee 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -688,6 +688,39 @@ Player::set_play_referenced () } +pair, optional> +Player::earliest_piece_and_time() const +{ + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + + shared_ptr earliest_content; + optional earliest_time; + + for (auto const& piece: _pieces) { + if (piece->done) { + continue; + } + + auto const t = content_time_to_dcp(piece, max(piece->decoder->position(), piece->content->trim_start())); + if (t > piece->content->end(film)) { + piece->done = true; + } else { + + /* Given two choices at the same time, pick the one with texts so we see it before + the video. + */ + if (!earliest_time || t < *earliest_time || (t == *earliest_time && !piece->decoder->text.empty())) { + earliest_time = t; + earliest_content = piece; + } + } + } + + return { earliest_content, earliest_time }; +} + + bool Player::pass () { @@ -711,26 +744,7 @@ Player::pass () shared_ptr earliest_content; optional earliest_time; - - for (auto i: _pieces) { - if (i->done) { - continue; - } - - auto const t = content_time_to_dcp (i, max(i->decoder->position(), i->content->trim_start())); - if (t > i->content->end(film)) { - i->done = true; - } else { - - /* Given two choices at the same time, pick the one with texts so we see it before - the video. - */ - if (!earliest_time || t < *earliest_time || (t == *earliest_time && !i->decoder->text.empty())) { - earliest_time = t; - earliest_content = i; - } - } - } + std::tie(earliest_content, earliest_time) = earliest_piece_and_time(); bool done = false; @@ -1644,3 +1658,16 @@ Player::set_disable_audio_processor() _disable_audio_processor = true; } + +Frame +Player::frames_done() const +{ + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + + shared_ptr earliest_content; + optional earliest_time; + std::tie(earliest_content, earliest_time) = earliest_piece_and_time(); + + return earliest_time.get_value_or({}).frames_round(film->video_frame_rate()); +} -- cgit v1.2.3 From 61130610f6d01fe6b1682d91933eb7dbbb1eac76 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 12 May 2024 15:38:31 +0200 Subject: Update DCP encoder progress on all passe()es, not just when audio is emitted. --- src/lib/dcp_encoder.cc | 13 ++++++++----- src/lib/player.cc | 14 ++++++++++++++ src/lib/player.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src/lib/player.cc') diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index c7ee180e1..a4bc133f8 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -107,7 +107,14 @@ DCPEncoder::go () _writer.write(_player.get_subtitle_fonts()); } - while (!_player.pass()) {} + int passes = 0; + while (!_player.pass()) { + if ((++passes % 8) == 0) { + auto job = _job.lock(); + DCPOMATIC_ASSERT(job); + job->set_progress(_player.progress()); + } + } for (auto i: get_referenced_reel_assets(_film, _film->playlist())) { _writer.write(i); @@ -128,10 +135,6 @@ void DCPEncoder::audio (shared_ptr data, DCPTime time) { _writer.write(data, time); - - auto job = _job.lock (); - DCPOMATIC_ASSERT (job); - job->set_progress (float(time.get()) / _film->length().get()); } void diff --git a/src/lib/player.cc b/src/lib/player.cc index 2e96e4bee..91a51c67f 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -1671,3 +1671,17 @@ Player::frames_done() const return earliest_time.get_value_or({}).frames_round(film->video_frame_rate()); } + + +float +Player::progress() const +{ + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + + shared_ptr earliest_content; + optional earliest_time; + std::tie(earliest_content, earliest_time) = earliest_piece_and_time(); + + return static_cast(earliest_time.get_value_or({}).get()) / film->length().get(); +} diff --git a/src/lib/player.h b/src/lib/player.h index 43c46945c..48f6f97ca 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -91,6 +91,7 @@ public: bool pass (); void seek (dcpomatic::DCPTime time, bool accurate); Frame frames_done() const; + float progress() const; std::vector> get_subtitle_fonts (); -- cgit v1.2.3