summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-05-12 15:22:28 +0200
committerCarl Hetherington <cth@carlh.net>2024-05-15 23:49:51 +0200
commit26678a922a1808db33954e002c165678d8191fc6 (patch)
tree03404face5f2db2e4afae05de84fe2fd884a02d4
parent6d88d2246881d0fd8828786dd4a25a73fafe575e (diff)
Get DCP transcode progress from the player (#2804).
-rw-r--r--src/lib/dcp_encoder.cc2
-rw-r--r--src/lib/player.cc67
-rw-r--r--src/lib/player.h2
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);