From: Carl Hetherington Date: Tue, 19 Dec 2023 11:45:38 +0000 (+0100) Subject: Add custom reels option to Film. X-Git-Tag: v2.17.13~2^2~6 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=521424e747dced3ade9600fc62c48526e199ef16 Add custom reels option to Film. --- 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 (static_cast (_reel_type))); root->add_child("ReelLength")->add_child_text (raw_convert (_reel_length)); + for (auto boundary: _custom_reel_boundaries) { + root->add_child("CustomReelBoundary")->add_child_text(raw_convert(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 path) _reel_type = static_cast (f.optional_number_child("ReelType").get_value_or (static_cast(ReelType::SINGLE))); _reel_length = f.optional_number_child("ReelLength").get_value_or (2000000000); + for (auto boundary: f.node_children("CustomReelBoundary")) { + _custom_reel_boundaries.push_back(DCPTime(raw_convert(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 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 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 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 _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 };