summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-12-19 12:45:38 +0100
committerCarl Hetherington <cth@carlh.net>2024-03-12 23:41:00 +0100
commit521424e747dced3ade9600fc62c48526e199ef16 (patch)
tree5855a0b0a522bce947b7db6d7bc7e192ca5b6ea7
parent4fa9f7e81789b44e5e61b01e4c5352a616d9ae6d (diff)
Add custom reels option to Film.
-rw-r--r--src/lib/film.cc28
-rw-r--r--src/lib/film.h9
-rw-r--r--src/lib/film_property.h1
-rw-r--r--src/lib/types.h3
4 files changed, 39 insertions, 2 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc
index d94ef0af3..835f3efdf 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -413,6 +413,9 @@ Film::metadata (bool with_content_paths) const
}
root->add_child("ReelType")->add_child_text (raw_convert<string> (static_cast<int> (_reel_type)));
root->add_child("ReelLength")->add_child_text (raw_convert<string> (_reel_length));
+ for (auto boundary: _custom_reel_boundaries) {
+ root->add_child("CustomReelBoundary")->add_child_text(raw_convert<string>(boundary.get()));
+ }
root->add_child("ReencodeJ2K")->add_child_text (_reencode_j2k ? "1" : "0");
root->add_child("UserExplicitVideoFrameRate")->add_child_text(_user_explicit_video_frame_rate ? "1" : "0");
for (auto const& marker: _markers) {
@@ -600,6 +603,9 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_reel_type = static_cast<ReelType> (f.optional_number_child<int>("ReelType").get_value_or (static_cast<int>(ReelType::SINGLE)));
_reel_length = f.optional_number_child<int64_t>("ReelLength").get_value_or (2000000000);
+ for (auto boundary: f.node_children("CustomReelBoundary")) {
+ _custom_reel_boundaries.push_back(DCPTime(raw_convert<int64_t>(boundary->content())));
+ }
_reencode_j2k = f.optional_bool_child("ReencodeJ2K").get_value_or(false);
_user_explicit_video_frame_rate = f.optional_bool_child("UserExplicitVideoFrameRate").get_value_or(false);
@@ -1233,6 +1239,16 @@ Film::set_reel_length (int64_t r)
_reel_length = r;
}
+
+void
+Film::set_custom_reel_boundaries(vector<DCPTime> boundaries)
+{
+ FilmChangeSignaller ch(this, FilmProperty::CUSTOM_REEL_BOUNDARIES);
+ std::sort(boundaries.begin(), boundaries.end());
+ _custom_reel_boundaries = std::move(boundaries);
+}
+
+
void
Film::set_reencode_j2k (bool r)
{
@@ -1865,6 +1881,18 @@ Film::reels () const
}
break;
}
+ case ReelType::CUSTOM:
+ {
+ DCPTimePeriod current;
+ for (auto boundary: _custom_reel_boundaries) {
+ current.to = boundary;
+ periods.push_back(current);
+ current.from = boundary;
+ }
+ current.to = len;
+ periods.push_back(current);
+ break;
+ }
}
return periods;
diff --git a/src/lib/film.h b/src/lib/film.h
index a5cefa4d4..0a0c5a4e1 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -291,6 +291,10 @@ public:
return _reel_length;
}
+ std::vector<dcpomatic::DCPTime> custom_reel_boundaries() const {
+ return _custom_reel_boundaries;
+ }
+
std::string context_id () const {
return _context_id;
}
@@ -408,6 +412,7 @@ public:
void set_audio_processor (AudioProcessor const * processor);
void set_reel_type (ReelType);
void set_reel_length (int64_t);
+ void set_custom_reel_boundaries(std::vector<dcpomatic::DCPTime> boundaries);
void set_reencode_j2k (bool);
void set_marker (dcp::Marker type, dcpomatic::DCPTime time);
void unset_marker (dcp::Marker type);
@@ -527,8 +532,10 @@ private:
bool _limit_to_smpte_bv20;
AudioProcessor const * _audio_processor;
ReelType _reel_type;
- /** Desired reel length in bytes, if _reel_type == REELTYPE_BY_LENGTH */
+ /** Desired reel length in bytes, if _reel_type == BY_LENGTH */
int64_t _reel_length;
+ /** Reel boundaries (excluding those at the start and end, sorted in ascending order) if _reel_type == CUSTOM */
+ std::vector<dcpomatic::DCPTime> _custom_reel_boundaries;
bool _reencode_j2k;
/** true if the user has ever explicitly set the video frame rate of this film */
bool _user_explicit_video_frame_rate;
diff --git a/src/lib/film_property.h b/src/lib/film_property.h
index c23297965..0841caa5c 100644
--- a/src/lib/film_property.h
+++ b/src/lib/film_property.h
@@ -51,6 +51,7 @@ enum class FilmProperty {
AUDIO_PROCESSOR,
REEL_TYPE,
REEL_LENGTH,
+ CUSTOM_REEL_BOUNDARIES,
REENCODE_J2K,
MARKERS,
RATINGS,
diff --git a/src/lib/types.h b/src/lib/types.h
index 36059401e..c9c87bae5 100644
--- a/src/lib/types.h
+++ b/src/lib/types.h
@@ -107,7 +107,8 @@ enum class ReelType
{
SINGLE,
BY_VIDEO_CONTENT,
- BY_LENGTH
+ BY_LENGTH,
+ CUSTOM
};