From 4219d4b76c5cd5690b1f4fa0c248d93ced26d05a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 15 Apr 2020 16:17:01 +0200 Subject: [PATCH] Fix length of player output so it can be either the film's length or playlist's length, as appropriate. --- src/lib/analyse_audio_job.cc | 2 +- src/lib/empty.cc | 4 ++-- src/lib/empty.h | 2 +- src/lib/encoder.cc | 2 +- src/lib/hints.cc | 2 +- src/lib/player.cc | 17 +++++++---------- src/lib/player.h | 5 ++--- src/tools/server_test.cc | 2 +- src/wx/film_viewer.cc | 2 +- test/butler_test.cc | 2 +- test/dcp_decoder_test.cc | 6 +++--- test/dcp_playback_test.cc | 2 +- test/empty_test.cc | 6 +++--- test/ffmpeg_audio_only_test.cc | 2 +- test/ffmpeg_audio_test.cc | 4 ++-- test/ffmpeg_decoder_sequential_test.cc | 2 +- test/player_test.cc | 14 +++++++------- test/time_calculation_test.cc | 6 +++--- test/upmixer_a_test.cc | 2 +- test/vf_test.cc | 2 +- 20 files changed, 41 insertions(+), 45 deletions(-) diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index ad28dcfd4..1fc09b905 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -107,7 +107,7 @@ AnalyseAudioJob::json_name () const void AnalyseAudioJob::run () { - shared_ptr player (new Player (_film, _playlist)); + shared_ptr player (new Player(_film, _playlist, _playlist->length(_film))); player->set_ignore_video (); player->set_ignore_text (); player->set_fast (); diff --git a/src/lib/empty.cc b/src/lib/empty.cc index 71bf3aa95..c145c231b 100644 --- a/src/lib/empty.cc +++ b/src/lib/empty.cc @@ -36,7 +36,7 @@ using boost::dynamic_pointer_cast; using boost::function; using namespace dcpomatic; -Empty::Empty (shared_ptr film, shared_ptr playlist, function)> part) +Empty::Empty (shared_ptr film, shared_ptr playlist, function)> part, DCPTime length) { list full; BOOST_FOREACH (shared_ptr i, playlist->content()) { @@ -45,7 +45,7 @@ Empty::Empty (shared_ptr film, shared_ptr playlist, } } - _periods = subtract (DCPTimePeriod(DCPTime(), playlist->length(film)), coalesce(full)); + _periods = subtract (DCPTimePeriod(DCPTime(), length), coalesce(full)); if (!_periods.empty ()) { _position = _periods.front().from; diff --git a/src/lib/empty.h b/src/lib/empty.h index abd6fdef0..2368c4491 100644 --- a/src/lib/empty.h +++ b/src/lib/empty.h @@ -35,7 +35,7 @@ class Empty { public: Empty () {} - Empty (boost::shared_ptr film, boost::shared_ptr playlist, boost::function)> part); + Empty (boost::shared_ptr film, boost::shared_ptr playlist, boost::function)> part, dcpomatic::DCPTime length); dcpomatic::DCPTime position () const { return _position; diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 535389a94..b52507ed1 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -41,7 +41,7 @@ using boost::shared_ptr; Encoder::Encoder (shared_ptr film, weak_ptr job) : _film (film) , _job (job) - , _player (new Player (film, film->playlist ())) + , _player (new Player(film, film->playlist(), film->length())) { } diff --git a/src/lib/hints.cc b/src/lib/hints.cc index 3edceeee3..68cf82b84 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -259,7 +259,7 @@ Hints::thread () emit (bind(boost::ref(Progress), _("Examining closed captions"))); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_ignore_video (); player->set_ignore_audio (); player->Text.connect (bind(&Hints::text, this, _1, _2, _4)); diff --git a/src/lib/player.cc b/src/lib/player.cc index 3202c1b85..ab05d42ad 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -84,7 +84,7 @@ int const PlayerProperty::FILM_CONTAINER = 702; int const PlayerProperty::FILM_VIDEO_FRAME_RATE = 703; int const PlayerProperty::DCP_DECODE_REDUCTION = 704; -Player::Player (shared_ptr film, shared_ptr playlist) +Player::Player (shared_ptr film, shared_ptr playlist, DCPTime playback_length) : _film (film) , _playlist (playlist) , _suspended (0) @@ -97,6 +97,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _play_referenced (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) + , _playback_length (playback_length) { _film_changed_connection = _film->Change.connect (bind (&Player::film_change, this, _1, _2)); /* The butler must hear about this first, so since we are proxying this through to the butler we must @@ -237,15 +238,12 @@ Player::setup_pieces_unlocked () } } - _black = Empty (_film, _playlist, bind(&have_video, _1)); - _silent = Empty (_film, _playlist, bind(&have_audio, _1)); + _black = Empty (_film, _playlist, bind(&have_video, _1), _playback_length); + _silent = Empty (_film, _playlist, bind(&have_audio, _1), _playback_length); _last_video_time = DCPTime (); _last_video_eyes = EYES_BOTH; _last_audio_time = DCPTime (); - - /* Cached value to save recalculating it on every ::pass */ - _film_length = _film->length (); } void @@ -566,15 +564,14 @@ bool Player::pass () { boost::mutex::scoped_lock lm (_mutex); - DCPOMATIC_ASSERT (_film_length); if (_suspended) { /* We can't pass in this state */ return false; } - if (*_film_length == DCPTime()) { - /* Special case of an empty Film; just give one black frame */ + if (_playback_length == DCPTime()) { + /* Special; just give one black frame */ emit_video (black_player_video_frame(EYES_BOTH), DCPTime()); return true; } @@ -680,7 +677,7 @@ Player::pass () /* Work out the time before which the audio is definitely all here. This is the earliest last_push_end of one of our streams, or the position of the _silent. */ - DCPTime pull_to = *_film_length; + DCPTime pull_to = _playback_length; for (map::const_iterator i = _stream_states.begin(); i != _stream_states.end(); ++i) { if (!i->second.piece->done && i->second.last_push_end < pull_to) { pull_to = i->second.last_push_end; diff --git a/src/lib/player.h b/src/lib/player.h index c2911bf10..5a1b08ecf 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -68,7 +68,7 @@ public: class Player : public boost::enable_shared_from_this, public boost::noncopyable { public: - Player (boost::shared_ptr, boost::shared_ptr playlist); + Player (boost::shared_ptr, boost::shared_ptr playlist, dcpomatic::DCPTime playback_length); ~Player (); bool pass (); @@ -207,8 +207,7 @@ private: ActiveText _active_texts[TEXT_COUNT]; boost::shared_ptr _audio_processor; - /* Cached stuff */ - boost::optional _film_length; + dcpomatic::DCPTime _playback_length; boost::signals2::scoped_connection _film_changed_connection; boost::signals2::scoped_connection _playlist_change_connection; diff --git a/src/tools/server_test.cc b/src/tools/server_test.cc index 1dc6fa6ca..4c410eade 100644 --- a/src/tools/server_test.cc +++ b/src/tools/server_test.cc @@ -145,7 +145,7 @@ main (int argc, char* argv[]) film.reset (new Film (film_dir)); film->read_metadata (); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->Video.connect (bind (&process_video, _1)); while (!player->pass ()) {} } catch (std::exception& e) { diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index bff2df0ff..cac6e8c28 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -164,7 +164,7 @@ FilmViewer::set_film (shared_ptr film) } try { - _player.reset (new Player (_film, _film->playlist ())); + _player.reset (new Player(_film, _film->playlist(), _film->length())); _player->set_fast (); if (_dcp_decode_reduction) { _player->set_dcp_decode_reduction (_dcp_decode_reduction); diff --git a/test/butler_test.cc b/test/butler_test.cc index 7aeba78f9..13efc3131 100644 --- a/test/butler_test.cc +++ b/test/butler_test.cc @@ -52,7 +52,7 @@ BOOST_AUTO_TEST_CASE (butler_test1) map.set (i, i, 1); } - Butler butler (shared_ptr(new Player(film, film->playlist())), map, 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, false); + Butler butler (shared_ptr(new Player(film, film->playlist(), film->length())), map, 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, false); BOOST_CHECK (butler.get_video(true, 0).second == DCPTime()); BOOST_CHECK (butler.get_video(true, 0).second == DCPTime::from_frames(1, 24)); diff --git a/test/dcp_decoder_test.cc b/test/dcp_decoder_test.cc index 32eed9354..36df09834 100644 --- a/test/dcp_decoder_test.cc +++ b/test/dcp_decoder_test.cc @@ -89,7 +89,7 @@ BOOST_AUTO_TEST_CASE (check_reuse_old_data_test) ov_content.reset (new DCPContent(ov->dir(ov->dcp_name(false)))); test->examine_and_add_content (ov_content); BOOST_REQUIRE (!wait_for_jobs()); - shared_ptr player (new Player(test, test->playlist())); + shared_ptr player (new Player(test, test->playlist(), test->length())); shared_ptr decoder = boost::dynamic_pointer_cast(player->_pieces.front()->decoder); BOOST_REQUIRE (decoder); @@ -107,7 +107,7 @@ BOOST_AUTO_TEST_CASE (check_reuse_old_data_test) shared_ptr vf_content (new DCPContent(vf->dir(vf->dcp_name(false)))); test->examine_and_add_content (vf_content); BOOST_REQUIRE (!wait_for_jobs()); - player.reset (new Player(test, test->playlist())); + player.reset (new Player(test, test->playlist(), test->length())); decoder = boost::dynamic_pointer_cast(player->_pieces.front()->decoder); BOOST_REQUIRE (decoder); @@ -125,7 +125,7 @@ BOOST_AUTO_TEST_CASE (check_reuse_old_data_test) shared_ptr encrypted_content (new DCPContent(encrypted->dir(encrypted->dcp_name(false)))); test->examine_and_add_content (encrypted_content); BOOST_REQUIRE (!wait_for_jobs()); - player.reset (new Player(test, test->playlist())); + player.reset (new Player(test, test->playlist(), test->length())); decoder = boost::dynamic_pointer_cast(player->_pieces.front()->decoder); BOOST_REQUIRE (decoder); diff --git a/test/dcp_playback_test.cc b/test/dcp_playback_test.cc index 787857375..e8d916487 100644 --- a/test/dcp_playback_test.cc +++ b/test/dcp_playback_test.cc @@ -40,7 +40,7 @@ BOOST_AUTO_TEST_CASE (dcp_playback_test) shared_ptr butler ( new Butler( - shared_ptr(new Player(film, film->playlist())), + shared_ptr(new Player(film, film->playlist(), film->length())), AudioMapping(6, 6), 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), diff --git a/test/empty_test.cc b/test/empty_test.cc index 1a4d03300..029e83966 100644 --- a/test/empty_test.cc +++ b/test/empty_test.cc @@ -62,7 +62,7 @@ BOOST_AUTO_TEST_CASE (empty_test1) contentB->video->set_length (1); contentB->set_position (film, DCPTime::from_frames (7, vfr)); - Empty black (film, film->playlist(), bind(&has_video, _1)); + Empty black (film, film->playlist(), bind(&has_video, _1), film->playlist()->length(film)); BOOST_REQUIRE_EQUAL (black._periods.size(), 2); list::const_iterator i = black._periods.begin(); BOOST_CHECK (i->from == DCPTime::from_frames(0, vfr)); @@ -96,7 +96,7 @@ BOOST_AUTO_TEST_CASE (empty_test2) contentB->video->set_length (1); contentB->set_position (film, DCPTime::from_frames(7, vfr)); - Empty black (film, film->playlist(), bind(&has_video, _1)); + Empty black (film, film->playlist(), bind(&has_video, _1), film->playlist()->length(film)); BOOST_REQUIRE_EQUAL (black._periods.size(), 1); BOOST_CHECK (black._periods.front().from == DCPTime::from_frames(3, vfr)); BOOST_CHECK (black._periods.front().to == DCPTime::from_frames(7, vfr)); @@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE (empty_test3) shared_ptr playlist (new Playlist); playlist->add (film, contentB); - Empty black (film, playlist, bind(&has_video, _1)); + Empty black (film, playlist, bind(&has_video, _1), playlist->length(film)); BOOST_REQUIRE_EQUAL (black._periods.size(), 1); BOOST_CHECK (black._periods.front().from == DCPTime::from_frames(0, vfr)); BOOST_CHECK (black._periods.front().to == DCPTime::from_frames(7, vfr)); diff --git a/test/ffmpeg_audio_only_test.cc b/test/ffmpeg_audio_only_test.cc index a8a7184c4..df32cadd4 100644 --- a/test/ffmpeg_audio_only_test.cc +++ b/test/ffmpeg_audio_only_test.cc @@ -92,7 +92,7 @@ test (boost::filesystem::path file) ref_buffer_size = info.samplerate * info.channels; ref_buffer = new float[ref_buffer_size]; - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->Audio.connect (bind (&audio, _1, info.channels)); while (!player->pass ()) {} diff --git a/test/ffmpeg_audio_test.cc b/test/ffmpeg_audio_test.cc index 8e0fd9280..7a9aaf346 100644 --- a/test/ffmpeg_audio_test.cc +++ b/test/ffmpeg_audio_test.cc @@ -134,7 +134,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test2) film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs ()); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); while (!player->pass ()) {} } @@ -146,7 +146,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test3) film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs ()); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_fast (); while (!player->pass ()) {} } diff --git a/test/ffmpeg_decoder_sequential_test.cc b/test/ffmpeg_decoder_sequential_test.cc index cf841bcab..041d976fe 100644 --- a/test/ffmpeg_decoder_sequential_test.cc +++ b/test/ffmpeg_decoder_sequential_test.cc @@ -65,7 +65,7 @@ ffmpeg_decoder_sequential_test_one (boost::filesystem::path file, float fps, int film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); film->write_metadata (); - shared_ptr player (new Player (film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); BOOST_REQUIRE (content->video_frame_rate()); BOOST_CHECK_CLOSE (content->video_frame_rate().get(), fps, 0.01); diff --git a/test/player_test.cc b/test/player_test.cc index a242d620b..378e0af9b 100644 --- a/test/player_test.cc +++ b/test/player_test.cc @@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE (player_silence_padding_test) accumulated.reset (new AudioBuffers (film->audio_channels(), 0)); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->Audio.connect (bind (&accumulate, _1, _2)); while (!player->pass ()) {} BOOST_REQUIRE (accumulated->frames() >= 48000); @@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE (player_subframe_test) /* Length should be rounded up from B's length to the next video frame */ BOOST_CHECK (film->length() == DCPTime::from_frames(3 * 24 + 1, 24)); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->setup_pieces (); BOOST_REQUIRE_EQUAL (player->_black._periods.size(), 1); BOOST_CHECK (player->_black._periods.front() == DCPTimePeriod(DCPTime::from_frames(3 * 24, 24), DCPTime::from_frames(3 * 24 + 1, 24))); @@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE (player_interleave_test) film->examine_and_add_content (s); BOOST_REQUIRE (!wait_for_jobs ()); - shared_ptr player (new Player(film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->Video.connect (bind (&video, _1, _2)); player->Audio.connect (bind (&audio, _1, _2)); video_frames = audio_frames = 0; @@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test) BOOST_REQUIRE (!wait_for_jobs ()); dcp->only_text()->set_use (true); - shared_ptr player (new Player (film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_fast (); player->set_always_burn_open_subtitles (); player->set_play_referenced (); @@ -241,7 +241,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test2) BOOST_REQUIRE (!wait_for_jobs ()); dcp->only_text()->set_use (true); - shared_ptr player (new Player (film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_fast (); player->set_always_burn_open_subtitles (); player->set_play_referenced (); @@ -310,7 +310,7 @@ BOOST_AUTO_TEST_CASE (player_ignore_video_and_audio_test) text->only_text()->set_type (TEXT_CLOSED_CAPTION); text->only_text()->set_use (true); - shared_ptr player (new Player(film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_ignore_video (); player->set_ignore_audio (); @@ -329,7 +329,7 @@ BOOST_AUTO_TEST_CASE (player_trim_crash) film->examine_and_add_content (boon); BOOST_REQUIRE (!wait_for_jobs()); - shared_ptr player (new Player(film, film->playlist())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->set_fast (); shared_ptr butler (new Butler(player, AudioMapping(), 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)); diff --git a/test/time_calculation_test.cc b/test/time_calculation_test.cc index 968138f96..f6412d9de 100644 --- a/test/time_calculation_test.cc +++ b/test/time_calculation_test.cc @@ -190,7 +190,7 @@ BOOST_AUTO_TEST_CASE (player_time_calculation_test1) film->set_sequence (false); film->add_content (content); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); /* Position 0, no trim, content rate = DCP rate */ content->set_position (film, DCPTime()); @@ -396,7 +396,7 @@ BOOST_AUTO_TEST_CASE (player_time_calculation_test2) film->set_sequence (false); film->add_content (content); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); /* Position 0, no trim, content rate = DCP rate */ content->set_position (film, DCPTime()); @@ -573,7 +573,7 @@ BOOST_AUTO_TEST_CASE (player_time_calculation_test3) film->set_sequence (false); film->add_content (content); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); /* Position 0, no trim, video/audio content rate = video/audio DCP rate */ content->set_position (film, DCPTime()); diff --git a/test/upmixer_a_test.cc b/test/upmixer_a_test.cc index 545f081ba..a00a77add 100644 --- a/test/upmixer_a_test.cc +++ b/test/upmixer_a_test.cc @@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE (upmixer_a_test) Ls = sf_open ("build/test/upmixer_a_test/Ls.wav", SFM_WRITE, &info); Rs = sf_open ("build/test/upmixer_a_test/Rs.wav", SFM_WRITE, &info); - shared_ptr player (new Player (film, film->playlist ())); + shared_ptr player (new Player(film, film->playlist(), film->length())); player->Audio.connect (bind (&write, _1, _2)); while (!player->pass()) {} diff --git a/test/vf_test.cc b/test/vf_test.cc index 8cbf7a345..35c32e603 100644 --- a/test/vf_test.cc +++ b/test/vf_test.cc @@ -287,7 +287,7 @@ BOOST_AUTO_TEST_CASE (vf_test5) BOOST_REQUIRE (!wait_for_jobs()); /* Check that the selected reel assets are right */ - shared_ptr player (new Player(vf, vf->playlist())); + shared_ptr player (new Player(vf, vf->playlist(), vf->length())); list a = player->get_reel_assets(); BOOST_REQUIRE_EQUAL (a.size(), 4); list::const_iterator i = a.begin(); -- 2.30.2