Basics of marker writing (part of #782).
authorCarl Hetherington <cth@carlh.net>
Sun, 17 Mar 2019 01:27:02 +0000 (01:27 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 10 May 2019 22:43:42 +0000 (23:43 +0100)
src/lib/film.cc
src/lib/film.h
src/lib/reel_writer.cc
src/lib/types.cc
src/wx/markers_dialog.cc

index b40b439f528628e577484fb6d40eab4d4322559a..0b2b67801c28ec7adca2775ba53e8d5bcaecb400 100644 (file)
@@ -1377,26 +1377,25 @@ Film::make_kdm (
 
        map<shared_ptr<const dcp::ReelMXF>, dcp::Key> keys;
 
-       BOOST_FOREACH(shared_ptr<const dcp::ReelAsset> i, cpl->reel_assets ()) {
-               shared_ptr<const dcp::ReelMXF> mxf = boost::dynamic_pointer_cast<const dcp::ReelMXF> (i);
-               if (!mxf || !mxf->key_id()) {
+       BOOST_FOREACH(shared_ptr<const dcp::ReelMXF> 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();
                }
        }
 
index dd69c9e68b3b6aaef1bd41a7bc1ab8756160b334..d61612e47d28b1b28f8bba1d1d846f81a64f6b24 100644 (file)
@@ -298,6 +298,9 @@ public:
        }
 
        boost::optional<DCPTime> marker (dcp::Marker type) const;
+       std::map<dcp::Marker, DCPTime> markers () const {
+               return _markers;
+       }
 
        /* SET */
 
index 3b9e413a23f47c1b00c3f92b2fffbf9ec769d38d..9be4ce57155d23fd2bbc318b58a80e156e8e9170 100644 (file)
@@ -39,6 +39,7 @@
 #include <dcp/reel_sound_asset.h>
 #include <dcp/reel_subtitle_asset.h>
 #include <dcp/reel_closed_caption_asset.h>
+#include <dcp/reel_markers_asset.h>
 #include <dcp/dcp.h>
 #include <dcp/cpl.h>
 #include <dcp/certificate_chain.h>
@@ -514,6 +515,25 @@ ReelWriter::create_reel (list<ReferencedReelAsset> const & refs, list<shared_ptr
                a->set_language (i->first.language);
        }
 
+       map<dcp::Marker, DCPTime> markers = _film->markers ();
+       map<dcp::Marker, DCPTime> reel_markers;
+       for (map<dcp::Marker, DCPTime>::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<dcp::ReelMarkersAsset> ma (new dcp::ReelMarkersAsset(dcp::Fraction(_film->video_frame_rate(), 1), 0));
+               for (map<dcp::Marker, DCPTime>::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;
 }
 
index a0095cedfdf1e96bdba7f22fd4e86a0b36943ca2..19e5da6ec78aa8c39c099f06d47f206cb3ab746d 100644 (file)
@@ -201,9 +201,8 @@ CPLSummary::CPLSummary (boost::filesystem::path p)
 
        encrypted = false;
        BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) {
-               BOOST_FOREACH (shared_ptr<const dcp::ReelAsset> k, j->reel_assets()) {
-                       shared_ptr<const dcp::ReelMXF> mxf = boost::dynamic_pointer_cast<const dcp::ReelMXF> (k);
-                       if (mxf && mxf->key_id()) {
+               BOOST_FOREACH (shared_ptr<const dcp::ReelMXF> k, j->reel_mxfs()) {
+                       if (k->key_id()) {
                                encrypted = true;
                        }
                }
index 724cb7d9efa51508b2244c743d57746987aa7d30..46e8e6d091e297bec3e572a5cf3b9010ddc35859 100644 (file)
@@ -82,6 +82,7 @@ private:
                shared_ptr<FilmViewer> v = viewer.lock ();
                DCPOMATIC_ASSERT (v);
                timecode->set (v->position(), f->video_frame_rate());
+               changed ();
        }
 
        void changed ()