From: Carl Hetherington Date: Sun, 17 Mar 2019 01:27:02 +0000 (+0000) Subject: Basics of marker writing (part of #782). X-Git-Tag: v2.15.1~51 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=2596b1db2fff8a9cc56be97099442dc791692882 Basics of marker writing (part of #782). --- diff --git a/src/lib/film.cc b/src/lib/film.cc index b40b439f5..0b2b67801 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1377,26 +1377,25 @@ Film::make_kdm ( map, dcp::Key> keys; - BOOST_FOREACH(shared_ptr i, cpl->reel_assets ()) { - shared_ptr mxf = boost::dynamic_pointer_cast (i); - if (!mxf || !mxf->key_id()) { + BOOST_FOREACH(shared_ptr i, cpl->reel_mxfs()) { + if (!i->key_id()) { continue; } /* Get any imported key for this ID */ bool done = false; BOOST_FOREACH (dcp::DecryptedKDMKey j, imported_keys) { - if (j.id() == mxf->key_id().get()) { - LOG_GENERAL ("Using imported key for %1", mxf->key_id().get()); - keys[mxf] = j.key(); + if (j.id() == i->key_id().get()) { + LOG_GENERAL ("Using imported key for %1", i->key_id().get()); + keys[i] = j.key(); done = true; } } if (!done) { /* No imported key; it must be an asset that we encrypted */ - LOG_GENERAL ("Using our own key for %1", mxf->key_id().get()); - keys[mxf] = key(); + LOG_GENERAL ("Using our own key for %1", i->key_id().get()); + keys[i] = key(); } } diff --git a/src/lib/film.h b/src/lib/film.h index dd69c9e68..d61612e47 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -298,6 +298,9 @@ public: } boost::optional marker (dcp::Marker type) const; + std::map markers () const { + return _markers; + } /* SET */ diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 3b9e413a2..9be4ce571 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -514,6 +515,25 @@ ReelWriter::create_reel (list const & refs, listset_language (i->first.language); } + map markers = _film->markers (); + map reel_markers; + for (map::const_iterator i = markers.begin(); i != markers.end(); ++i) { + if (_period.contains(i->second)) { + reel_markers[i->first] = i->second; + } + } + + if (!reel_markers.empty ()) { + shared_ptr ma (new dcp::ReelMarkersAsset(dcp::Fraction(_film->video_frame_rate(), 1), 0)); + for (map::const_iterator i = reel_markers.begin(); i != reel_markers.end(); ++i) { + int h, m, s, f; + DCPTime relative = i->second - _period.from; + relative.split (_film->video_frame_rate(), h, m, s, f); + ma->set (i->first, dcp::Time(h, m, s, f, _film->video_frame_rate())); + } + reel->add (ma); + } + return reel; } diff --git a/src/lib/types.cc b/src/lib/types.cc index a0095cedf..19e5da6ec 100644 --- a/src/lib/types.cc +++ b/src/lib/types.cc @@ -201,9 +201,8 @@ CPLSummary::CPLSummary (boost::filesystem::path p) encrypted = false; BOOST_FOREACH (shared_ptr j, dcp.cpls()) { - BOOST_FOREACH (shared_ptr k, j->reel_assets()) { - shared_ptr mxf = boost::dynamic_pointer_cast (k); - if (mxf && mxf->key_id()) { + BOOST_FOREACH (shared_ptr k, j->reel_mxfs()) { + if (k->key_id()) { encrypted = true; } } diff --git a/src/wx/markers_dialog.cc b/src/wx/markers_dialog.cc index 724cb7d9e..46e8e6d09 100644 --- a/src/wx/markers_dialog.cc +++ b/src/wx/markers_dialog.cc @@ -82,6 +82,7 @@ private: shared_ptr v = viewer.lock (); DCPOMATIC_ASSERT (v); timecode->set (v->position(), f->video_frame_rate()); + changed (); } void changed ()