diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-05-06 01:07:39 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-05-08 01:29:35 +0200 |
| commit | 6b9ecf45d64a2d62b217f2984af0ccc805db857a (patch) | |
| tree | f098376420a35b72ecedc57c866817a5c552c91c /src/lib/film.cc | |
| parent | 3617ae6e58623bd259d71b66928dc1ed74a5c822 (diff) | |
Add Film::possible_reel_types().
Diffstat (limited to 'src/lib/film.cc')
| -rw-r--r-- | src/lib/film.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc index f0af131ea..c969ff699 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -2469,3 +2469,44 @@ Film::write_remembered_assets(vector<RememberedAsset> const& assets) const LOG_ERROR("Could not write assets file %1", file(assets_file)); } } + + +vector<ReelType> +Film::possible_reel_types() const +{ + auto film_reels = reels_for_type(ReelType::SINGLE); + + bool referring = false; + bool dcp_reel_not_present = false; + + for (auto c: content()) { + if (auto dcp = dynamic_pointer_cast<DCPContent>(c)) { + if (dcp->reference_anything()) { + referring = true; + try { + for (auto const& dcp_reel: dcp->reels(shared_from_this())) { + if (std::find(film_reels.begin(), film_reels.end(), dcp_reel) == film_reels.end()) { + dcp_reel_not_present = true; + } + } + } catch (dcp::ReadError &) { + /* We couldn't read the DCP; it's probably missing */ + } + } + } + } + + if (referring && !dcp_reel_not_present) { + /* We're referring to some DCP content but single-reel mode is possible. + * We'll disallow BY_LENGTH and CUSTOM just for an easy life. + */ + + return { ReelType::SINGLE, ReelType::BY_VIDEO_CONTENT }; + } else if (referring && dcp_reel_not_present) { + /* We have to use by-video */ + return { ReelType::BY_VIDEO_CONTENT }; + } + + return { ReelType::SINGLE, ReelType::BY_VIDEO_CONTENT, ReelType::BY_LENGTH, ReelType::CUSTOM }; +} + |
