summaryrefslogtreecommitdiff
path: root/src/lib/film.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-05-06 01:07:39 +0200
committerCarl Hetherington <cth@carlh.net>2025-05-08 01:29:35 +0200
commit6b9ecf45d64a2d62b217f2984af0ccc805db857a (patch)
treef098376420a35b72ecedc57c866817a5c552c91c /src/lib/film.cc
parent3617ae6e58623bd259d71b66928dc1ed74a5c822 (diff)
Add Film::possible_reel_types().
Diffstat (limited to 'src/lib/film.cc')
-rw-r--r--src/lib/film.cc41
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 };
+}
+