diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-06-21 11:57:56 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-07-10 23:13:14 +0200 |
| commit | bed96db6eb73bd86ca06894c3acba010e5ed2635 (patch) | |
| tree | b9d69326426b1722d3635e8b9d9a1e7db46d41f4 | |
| parent | 9db2168dcc14a803dcd9da047ddd70e2142d82e2 (diff) | |
Respect playlist's requested player crop.
| -rw-r--r-- | src/tools/dcpomatic_player.cc | 34 | ||||
| -rw-r--r-- | src/wx/playlist_controls.cc | 9 | ||||
| -rw-r--r-- | src/wx/playlist_controls.h | 2 |
3 files changed, 23 insertions, 22 deletions
diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 77f7fa29e..9e15dd011 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -259,7 +259,7 @@ public: if (Config::instance()->player_mode() == Config::PlayerMode::DUAL) { auto pc = new PlaylistControls (_overall_panel, _viewer); _controls = pc; - pc->ResetFilm.connect (bind(&DOMFrame::reset_film_weak, this, _1)); + pc->ResetFilm.connect(bind(&DOMFrame::reset_film_weak, this, _1, _2)); } else { _controls = new StandardControls (_overall_panel, _viewer, false); } @@ -463,24 +463,26 @@ public: } } - void reset_film_weak (weak_ptr<Film> weak_film) + void reset_film_weak(weak_ptr<Film> weak_film, optional<float> crop_to_ratio) { - auto film = weak_film.lock (); - if (film) { - reset_film (film); + if (auto film = weak_film.lock()) { + reset_film(film, crop_to_ratio); } } - void reset_film(shared_ptr<Film> film = std::make_shared<Film>(boost::none)) + void reset_film(shared_ptr<Film> film = std::make_shared<Film>(boost::none), optional<float> crop_to_ratio = {}) { _film = film; - prepare_to_play_film(); + if (!crop_to_ratio) { + crop_to_ratio = Config::instance()->player_crop_output_ratio(); + } + prepare_to_play_film(crop_to_ratio); } /* _film is now something new: set up to play it */ - void prepare_to_play_film() + void prepare_to_play_film(optional<float> crop_to_ratio) { if (_viewer.playing()) { _viewer.stop(); @@ -532,8 +534,6 @@ public: _cpl_menu->Remove (i); } - auto const crop = Config::instance()->player_crop_output_ratio(); - if (_film->content().size() == 1) { /* Offer a CPL menu */ auto first = dynamic_pointer_cast<DCPContent>(_film->content().front()); @@ -549,21 +549,21 @@ public: } } - if (crop) { + if (crop_to_ratio) { auto size = _film->content()[0]->video->size().get_value_or({1998, 1080}); int pixels = 0; - if (*crop > (2048.0 / 1080.0)) { - pixels = (size.height - (size.width / *crop)) / 2; + if (*crop_to_ratio > (2048.0 / 1080.0)) { + pixels = (size.height - (size.width / *crop_to_ratio)) / 2; _film->content()[0]->video->set_crop(Crop{0, 0, pixels, pixels}); } else { - pixels = (size.width - (size.height * *crop)) / 2; + pixels = (size.width - (size.height * *crop_to_ratio)) / 2; _film->content()[0]->video->set_crop(Crop{pixels, pixels, 0, 0}); } } } - if (crop) { - _film->set_container(Ratio(*crop, "custom", "custom", {}, "custom")); + if (crop_to_ratio) { + _film->set_container(Ratio(*crop_to_ratio, "custom", "custom", {}, "custom")); } else { _film->set_container(auto_ratio); } @@ -774,7 +774,7 @@ private: } auto job = make_shared<ExamineContentJob>(_film, dcp, true); - _examine_job_connection = job->Finished.connect(boost::bind(&DOMFrame::prepare_to_play_film, this); + _examine_job_connection = job->Finished.connect(boost::bind(&DOMFrame::prepare_to_play_film, this, Config::instance()->player_crop_output_ratio())); JobManager::instance()->add(job); display_progress(variant::wx::dcpomatic_player(), _("Loading content")); diff --git a/src/wx/playlist_controls.cc b/src/wx/playlist_controls.cc index c7dad4139..bde065659 100644 --- a/src/wx/playlist_controls.cc +++ b/src/wx/playlist_controls.cc @@ -149,7 +149,7 @@ PlaylistControls::deselect_playlist () _selected_playlist = boost::none; _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED); } - ResetFilm(std::make_shared<Film>(optional<boost::filesystem::path>())); + ResetFilm(std::make_shared<Film>(optional<boost::filesystem::path>()), {}); } void @@ -380,8 +380,9 @@ PlaylistControls::reset_film () { DCPOMATIC_ASSERT (_selected_playlist); auto film = std::make_shared<Film>(optional<boost::filesystem::path>()); - film->add_content (_playlists[*_selected_playlist].get()[_selected_playlist_position].content); - ResetFilm (film); + auto entry = _playlists[*_selected_playlist].get(_selected_playlist_position); + film->add_content(entry.content); + ResetFilm(film, entry.crop_to_ratio); } void @@ -425,7 +426,7 @@ PlaylistControls::viewer_finished () } else { /* Finished the whole SPL */ _selected_playlist_position = 0; - ResetFilm(std::make_shared<Film>(optional<boost::filesystem::path>())); + ResetFilm(std::make_shared<Film>(optional<boost::filesystem::path>()), {}); _play_button->Enable (true); _pause_button->Enable (false); } diff --git a/src/wx/playlist_controls.h b/src/wx/playlist_controls.h index 76ec63824..d3f9c038e 100644 --- a/src/wx/playlist_controls.h +++ b/src/wx/playlist_controls.h @@ -35,7 +35,7 @@ public: when we have created one from a SPL. We could call a method in the player's DOMFrame but we don't have that in a header. */ - boost::signals2::signal<void (std::weak_ptr<Film>)> ResetFilm; + boost::signals2::signal<void (std::weak_ptr<Film>, boost::optional<float>)> ResetFilm; void play () override; void stop () override; |
