diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-05-12 15:22:28 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-05-15 23:49:51 +0200 |
| commit | 26678a922a1808db33954e002c165678d8191fc6 (patch) | |
| tree | 03404face5f2db2e4afae05de84fe2fd884a02d4 | |
| parent | 6d88d2246881d0fd8828786dd4a25a73fafe575e (diff) | |
Get DCP transcode progress from the player (#2804).
| -rw-r--r-- | src/lib/dcp_encoder.cc | 2 | ||||
| -rw-r--r-- | src/lib/player.cc | 67 | ||||
| -rw-r--r-- | src/lib/player.h | 2 |
3 files changed, 50 insertions, 21 deletions
diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index 9a840c8ab..c7ee180e1 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -159,5 +159,5 @@ DCPEncoder::current_rate () const Frame DCPEncoder::frames_done () const { - return _j2k_encoder.video_frames_enqueued(); + return _player.frames_done(); } 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<shared_ptr<Piece>, optional<DCPTime>> +Player::earliest_piece_and_time() const +{ + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + + shared_ptr<Piece> earliest_content; + optional<DCPTime> 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<Piece> earliest_content; optional<DCPTime> 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<Piece> earliest_content; + optional<DCPTime> earliest_time; + std::tie(earliest_content, earliest_time) = earliest_piece_and_time(); + + return earliest_time.get_value_or({}).frames_round(film->video_frame_rate()); +} diff --git a/src/lib/player.h b/src/lib/player.h index 94e41bbca..43c46945c 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -90,6 +90,7 @@ public: bool pass (); void seek (dcpomatic::DCPTime time, bool accurate); + Frame frames_done() const; std::vector<std::shared_ptr<dcpomatic::Font>> get_subtitle_fonts (); @@ -155,6 +156,7 @@ private: dcpomatic::ContentTime dcp_to_content_time (std::shared_ptr<const Piece> piece, dcpomatic::DCPTime t) const; dcpomatic::DCPTime content_time_to_dcp (std::shared_ptr<const Piece> piece, dcpomatic::ContentTime t) const; std::shared_ptr<PlayerVideo> black_player_video_frame (Eyes eyes) const; + std::pair<std::shared_ptr<Piece>, boost::optional<dcpomatic::DCPTime>> earliest_piece_and_time() const; void video (std::weak_ptr<Piece>, ContentVideo); void audio (std::weak_ptr<Piece>, AudioStreamPtr, ContentAudio); |
