summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-03-15 00:52:56 +0000
committerCarl Hetherington <cth@carlh.net>2019-05-10 23:43:42 +0100
commit8c365af343a15bee11af53fc6bc16487b83260d1 (patch)
tree452bee816404f09a3bd0defa2e1a6564059240a2 /src/lib
parenta9ce4f64658979bc15c301b53c76846072fda0ef (diff)
Basics of setting and storing SMPTE CPL markers.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/film.cc34
-rw-r--r--src/lib/film.h8
2 files changed, 40 insertions, 2 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc
index aa16fdad8..b40b439f5 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -403,6 +403,11 @@ Film::metadata (bool with_content_paths) const
root->add_child("UploadAfterMakeDCP")->add_child_text (_upload_after_make_dcp ? "1" : "0");
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 (map<dcp::Marker, DCPTime>::const_iterator i = _markers.begin(); i != _markers.end(); ++i) {
+ xmlpp::Element* m = root->add_child("Marker");
+ m->set_attribute("Type", dcp::marker_to_string(i->first));
+ m->add_child_text(raw_convert<string>(i->second.get()));
+ }
_playlist->as_xml (root->add_child ("Playlist"), with_content_paths);
return doc;
@@ -531,7 +536,12 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_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);
+ BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("Marker")) {
+ _markers[dcp::marker_from_string(i->string_attribute("Type"))] = DCPTime(dcp::raw_convert<DCPTime::Type>(i->content()));
+ }
+
list<string> notes;
+ /* This method is the only one that can return notes (so far) */
_playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes);
/* Write backtraces to this film's directory, until another film is loaded */
@@ -1685,3 +1695,27 @@ Film::closed_caption_tracks () const
return tt;
}
+
+void
+Film::set_marker (dcp::Marker type, DCPTime time)
+{
+ ChangeSignaller<Film> ch (this, MARKERS);
+ _markers[type] = time;
+}
+
+void
+Film::unset_marker (dcp::Marker type)
+{
+ ChangeSignaller<Film> ch (this, MARKERS);
+ _markers.erase (type);
+}
+
+optional<DCPTime>
+Film::marker (dcp::Marker type) const
+{
+ map<dcp::Marker, DCPTime>::const_iterator i = _markers.find (type);
+ if (i == _markers.end()) {
+ return optional<DCPTime>();
+ }
+ return i->second;
+}
diff --git a/src/lib/film.h b/src/lib/film.h
index b77ce7a76..dd69c9e68 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -200,7 +200,8 @@ public:
REEL_TYPE,
REEL_LENGTH,
UPLOAD_AFTER_MAKE_DCP,
- REENCODE_J2K
+ REENCODE_J2K,
+ MARKERS
};
@@ -296,6 +297,7 @@ public:
return _reencode_j2k;
}
+ boost::optional<DCPTime> marker (dcp::Marker type) const;
/* SET */
@@ -327,6 +329,8 @@ public:
void set_reel_length (int64_t);
void set_upload_after_make_dcp (bool);
void set_reencode_j2k (bool);
+ void set_marker (dcp::Marker type, DCPTime time);
+ void unset_marker (dcp::Marker type);
/** Emitted when some property has of the Film is about to change or has changed */
mutable boost::signals2::signal<void (ChangeType, Property)> Change;
@@ -406,6 +410,7 @@ private:
bool _reencode_j2k;
/** true if the user has ever explicitly set the video frame rate of this film */
bool _user_explicit_video_frame_rate;
+ std::map<dcp::Marker, DCPTime> _markers;
int _state_version;
@@ -414,7 +419,6 @@ private:
/** film being used as a template, or 0 */
boost::shared_ptr<Film> _template_film;
-
boost::signals2::scoped_connection _playlist_change_connection;
boost::signals2::scoped_connection _playlist_order_changed_connection;
boost::signals2::scoped_connection _playlist_content_change_connection;