From 990f879d9af6300068af44c431b1a8e158e7f7a0 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 23 Apr 2020 15:48:19 +0200 Subject: [PATCH] Nicer fix for 86102d30bf0aad89115bbeb3d8aaa2a27a0aa432 --- src/lib/analyse_audio_job.cc | 2 +- src/lib/encoder.cc | 2 +- src/lib/hints.cc | 2 +- src/lib/player.cc | 38 ++++++++++++++++++-------- src/lib/player.h | 6 ++-- src/tools/server_test.cc | 2 +- src/wx/film_viewer.cc | 3 +- test/butler_test.cc | 2 +- test/dcp_decoder_test.cc | 6 ++-- test/dcp_playback_test.cc | 2 +- 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 +- 17 files changed, 56 insertions(+), 41 deletions(-) diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index ead36bca1..e77f83bde 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -140,7 +140,7 @@ AnalyseAudioJob::json_name () const void AnalyseAudioJob::run () { - shared_ptr player (new Player(_film, _playlist, _playlist->length(_film))); + shared_ptr player (new Player(_film, _playlist)); player->set_ignore_video (); player->set_ignore_text (); player->set_fast (); diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index b52507ed1..0a29989b1 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(), film->length())) + , _player (new Player(film)) { } diff --git a/src/lib/hints.cc b/src/lib/hints.cc index 68cf82b84..581d63972 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(), film->length())); + shared_ptr player (new Player(film)); 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 00650d88d..e41cecf13 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -85,7 +85,23 @@ int const PlayerProperty::FILM_VIDEO_FRAME_RATE = 703; int const PlayerProperty::DCP_DECODE_REDUCTION = 704; int const PlayerProperty::PLAYBACK_LENGTH = 705; -Player::Player (shared_ptr film, shared_ptr playlist_, DCPTime playback_length) +Player::Player (shared_ptr film) + : _film (film) + , _suspended (0) + , _ignore_video (false) + , _ignore_audio (false) + , _ignore_text (false) + , _always_burn_open_subtitles (false) + , _fast (false) + , _tolerant (film->tolerant()) + , _play_referenced (false) + , _audio_merger (_film->audio_frame_rate()) + , _shuffler (0) +{ + construct (); +} + +Player::Player (shared_ptr film, shared_ptr playlist_) : _film (film) , _playlist (playlist_) , _suspended (0) @@ -98,7 +114,12 @@ Player::Player (shared_ptr film, shared_ptr playlist , _play_referenced (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) - , _playback_length (playback_length) +{ + construct (); +} + +void +Player::construct () { _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 @@ -127,15 +148,6 @@ Player::setup_pieces () } -void -Player::set_playback_length (DCPTime len) -{ - Change (CHANGE_TYPE_PENDING, PlayerProperty::PLAYBACK_LENGTH, false); - _playback_length = len; - Change (CHANGE_TYPE_DONE, PlayerProperty::PLAYBACK_LENGTH, false); - setup_pieces (); -} - bool have_video (shared_ptr content) { @@ -151,6 +163,8 @@ have_audio (shared_ptr content) void Player::setup_pieces_unlocked () { + _playback_length = _playlist ? _playlist->length(_film) : _film->length(); + list > old_pieces = _pieces; _pieces.clear (); @@ -1247,6 +1261,6 @@ Player::content_time_to_dcp (shared_ptr content, ContentTime t) shared_ptr Player::playlist () const { - return _playlist; + return _playlist ? _playlist : _film->playlist(); } diff --git a/src/lib/player.h b/src/lib/player.h index 407f7651a..51de78982 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -69,7 +69,8 @@ public: class Player : public boost::enable_shared_from_this, public boost::noncopyable { public: - Player (boost::shared_ptr, boost::shared_ptr playlist, dcpomatic::DCPTime playback_length); + Player (boost::shared_ptr); + Player (boost::shared_ptr, boost::shared_ptr playlist); ~Player (); bool pass (); @@ -82,7 +83,6 @@ public: return _video_container_size; } - void set_playback_length (dcpomatic::DCPTime len); void set_video_container_size (dcp::Size); void set_ignore_video (); void set_ignore_audio (); @@ -115,6 +115,7 @@ private: friend struct empty_test2; friend struct check_reuse_old_data_test; + void construct (); void setup_pieces (); void setup_pieces_unlocked (); void flush (); @@ -151,6 +152,7 @@ private: mutable boost::mutex _mutex; boost::shared_ptr _film; + /** Playlist, or 0 if we are using the one from the _film */ boost::shared_ptr _playlist; /** > 0 if we are suspended (i.e. pass() and seek() do nothing) */ diff --git a/src/tools/server_test.cc b/src/tools/server_test.cc index 4c410eade..03a99b2e5 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(), film->length())); + shared_ptr player (new Player(film)); 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 bb59122aa..4b9528bc0 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(), _film->length())); + _player.reset (new Player(_film)); _player->set_fast (); if (_dcp_decode_reduction) { _player->set_dcp_decode_reduction (_dcp_decode_reduction); @@ -406,7 +406,6 @@ void FilmViewer::film_length_change () { _video_view->set_length (_film->length()); - _player->set_playback_length (_film->length()); } /** Re-get the current frame slowly by seeking */ diff --git a/test/butler_test.cc b/test/butler_test.cc index 13efc3131..7575728fd 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(), film->length())), map, 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, false); + Butler butler (shared_ptr(new Player(film)), 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 36df09834..231a99da2 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(), test->length())); + shared_ptr player (new Player(test)); 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(), test->length())); + player.reset (new Player(test)); 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(), test->length())); + player.reset (new Player(test)); 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 e8d916487..0f639587b 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(), film->length())), + shared_ptr(new Player(film)), AudioMapping(6, 6), 6, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), diff --git a/test/ffmpeg_audio_only_test.cc b/test/ffmpeg_audio_only_test.cc index df32cadd4..6fc9f9f2c 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(), film->length())); + shared_ptr player (new Player(film)); 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 7a9aaf346..6ad6c1fdb 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); player->set_fast (); while (!player->pass ()) {} } diff --git a/test/ffmpeg_decoder_sequential_test.cc b/test/ffmpeg_decoder_sequential_test.cc index 041d976fe..d761d9465 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(), film->length())); + shared_ptr player (new Player(film)); 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 378e0af9b..6877d7e21 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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(), film->length())); + shared_ptr player (new Player(film)); 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 f6412d9de..dbcf2677b 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(), film->length())); + shared_ptr player (new Player(film)); /* 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(), film->length())); + shared_ptr player (new Player(film)); /* 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(), film->length())); + shared_ptr player (new Player(film)); /* 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 a00a77add..ba07eafd1 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(), film->length())); + shared_ptr player (new Player(film)); player->Audio.connect (bind (&write, _1, _2)); while (!player->pass()) {} diff --git a/test/vf_test.cc b/test/vf_test.cc index 35c32e603..6fd0a00e8 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(), vf->length())); + shared_ptr player (new Player(vf)); list a = player->get_reel_assets(); BOOST_REQUIRE_EQUAL (a.size(), 4); list::const_iterator i = a.begin(); -- 2.30.2