diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-04-21 02:10:35 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-04-21 02:12:34 +0200 |
| commit | 736745c86cefc6d5d4d8098799efc86f0f639061 (patch) | |
| tree | 2796958388113a6567eab368ee261fc745fbb781 | |
| parent | f525fad0c38e198f35055e639184fa983a3d5d56 (diff) | |
Allow DCPContent to recover and serialise marker positions.
| -rw-r--r-- | src/lib/dcp_content.cc | 17 | ||||
| -rw-r--r-- | src/lib/dcp_content.h | 5 | ||||
| -rw-r--r-- | src/lib/dcp_examiner.cc | 9 | ||||
| -rw-r--r-- | src/lib/dcp_examiner.h | 8 | ||||
| -rw-r--r-- | test/import_dcp_test.cc | 60 |
5 files changed, 95 insertions, 4 deletions
diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 52ac6132c..94d5c010b 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2018 Carl Hetherington <cth@carlh.net> + Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -49,6 +49,7 @@ using std::distance; using std::pair; using std::vector; using std::list; +using std::map; using boost::shared_ptr; using boost::scoped_ptr; using boost::optional; @@ -146,6 +147,10 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version) BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children("ReelLength")) { _reel_lengths.push_back (raw_convert<int64_t> (i->content ())); } + + BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children("Marker")) { + _markers[dcp::marker_from_string(i->string_attribute("type"))] = ContentTime(raw_convert<int64_t>(i->content())); + } } void @@ -240,6 +245,10 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job) _content_kind = examiner->content_kind (); _cpl = examiner->cpl (); _reel_lengths = examiner->reel_lengths (); + map<dcp::Marker, dcp::Time> markers = examiner->markers(); + for (map<dcp::Marker, dcp::Time>::const_iterator i = markers.begin(); i != markers.end(); ++i) { + _markers[i->first] = ContentTime(i->second.as_editable_units(DCPTime::HZ)); + } } if (old_texts == texts) { @@ -339,6 +348,12 @@ DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const BOOST_FOREACH (int64_t i, _reel_lengths) { node->add_child("ReelLength")->add_child_text (raw_convert<string> (i)); } + + for (map<dcp::Marker, ContentTime>::const_iterator i = _markers.begin(); i != _markers.end(); ++i) { + xmlpp::Element* marker = node->add_child("Marker"); + marker->set_attribute("type", dcp::marker_to_string(i->first)); + marker->add_child_text(raw_convert<string>(i->second.get())); + } } DCPTime diff --git a/src/lib/dcp_content.h b/src/lib/dcp_content.h index fb8d91781..b9c4d9ee5 100644 --- a/src/lib/dcp_content.h +++ b/src/lib/dcp_content.h @@ -150,6 +150,10 @@ public: return _standard.get (); } + std::map<dcp::Marker, dcpomatic::ContentTime> markers () const { + return _markers; + } + bool kdm_timing_window_valid () const; private: @@ -198,6 +202,7 @@ private: boost::optional<std::string> _cpl; /** List of the lengths of the reels in this DCP */ std::list<int64_t> _reel_lengths; + std::map<dcp::Marker, dcpomatic::ContentTime> _markers; }; #endif diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc index 9bf401125..a7d451eca 100644 --- a/src/lib/dcp_examiner.cc +++ b/src/lib/dcp_examiner.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net> + Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -40,6 +40,7 @@ #include <dcp/subtitle_asset.h> #include <dcp/reel_subtitle_asset.h> #include <dcp/reel_closed_caption_asset.h> +#include <dcp/reel_markers_asset.h> #include <dcp/sound_asset.h> #include <boost/foreach.hpp> #include <iostream> @@ -49,6 +50,7 @@ using std::list; using std::cout; using std::runtime_error; +using std::map; using boost::shared_ptr; using boost::dynamic_pointer_cast; @@ -183,6 +185,11 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content, bool tolerant) _text_count[TEXT_CLOSED_CAPTION]++; } + if (i->main_markers ()) { + map<dcp::Marker, dcp::Time> rm = i->main_markers()->get(); + _markers.insert (rm.begin(), rm.end()); + } + if (i->main_picture()) { _reel_lengths.push_back (i->main_picture()->actual_duration()); } else if (i->main_sound()) { diff --git a/src/lib/dcp_examiner.h b/src/lib/dcp_examiner.h index e52234e36..c1ba54dee 100644 --- a/src/lib/dcp_examiner.h +++ b/src/lib/dcp_examiner.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net> + Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -25,6 +25,7 @@ #include "video_examiner.h" #include "audio_examiner.h" #include "dcp.h" +#include <dcp/dcp_time.h> class DCPContent; @@ -118,6 +119,10 @@ public: return _reel_lengths; } + std::map<dcp::Marker, dcp::Time> markers () const { + return _markers; + } + private: boost::optional<double> _video_frame_rate; boost::optional<dcp::Size> _video_size; @@ -140,4 +145,5 @@ private: dcp::ContentKind _content_kind; std::string _cpl; std::list<int64_t> _reel_lengths; + std::map<dcp::Marker, dcp::Time> _markers; }; diff --git a/test/import_dcp_test.cc b/test/import_dcp_test.cc index 16ebfa454..4c227ac34 100644 --- a/test/import_dcp_test.cc +++ b/test/import_dcp_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington <cth@carlh.net> + Copyright (C) 2014-2020 Carl Hetherington <cth@carlh.net> This file is part of DCP-o-matic. @@ -35,12 +35,16 @@ #include "lib/job_manager.h" #include "lib/config.h" #include "lib/cross.h" +#include "lib/video_content.h" +#include "lib/content_factory.h" #include <dcp/cpl.h> #include <boost/test/unit_test.hpp> using std::vector; using std::string; +using std::map; using boost::shared_ptr; +using boost::dynamic_pointer_cast; /** Make an encrypted DCP, import it and make a new unencrypted DCP */ BOOST_AUTO_TEST_CASE (import_dcp_test) @@ -94,3 +98,57 @@ BOOST_AUTO_TEST_CASE (import_dcp_test) /* Should be 1s red, 1s green, 1s blue */ check_dcp ("test/data/import_dcp_test2", "build/test/import_dcp_test2/" + B->dcp_name()); } + + +/** Check that DCP markers are imported correctly */ +BOOST_AUTO_TEST_CASE (import_dcp_markers_test) +{ + /* Make a DCP with some markers */ + shared_ptr<Film> film = new_test_film2 ("import_dcp_markers_test"); + shared_ptr<Content> content = content_factory("test/data/flat_red.png").front(); + film->examine_and_add_content (content); + BOOST_REQUIRE (!wait_for_jobs()); + + content->video->set_length (24 * 60 * 10); + + film->set_marker(dcp::FFOC, dcpomatic::DCPTime::from_seconds(1.91)); + film->set_marker(dcp::FFMC, dcpomatic::DCPTime::from_seconds(9.4)); + film->set_marker(dcp::LFMC, dcpomatic::DCPTime::from_seconds(9.99)); + + film->make_dcp (); + BOOST_REQUIRE (!wait_for_jobs()); + + /* Import the DCP to a new film and check the markers */ + shared_ptr<Film> film2 = new_test_film2 ("import_dcp_markers_test2"); + shared_ptr<DCPContent> imported (new DCPContent(film->dir(film->dcp_name()))); + film2->examine_and_add_content (imported); + BOOST_REQUIRE (!wait_for_jobs()); + film2->write_metadata (); + + BOOST_CHECK_EQUAL (imported->markers().size(), 3); + + map<dcp::Marker, dcpomatic::ContentTime> markers = imported->markers(); + BOOST_REQUIRE(markers.find(dcp::FFOC) != markers.end()); + BOOST_CHECK(markers[dcp::FFOC] == dcpomatic::ContentTime(184000)); + BOOST_REQUIRE(markers.find(dcp::FFMC) != markers.end()); + BOOST_CHECK(markers[dcp::FFMC] == dcpomatic::ContentTime(904000)); + BOOST_REQUIRE(markers.find(dcp::LFMC) != markers.end()); + BOOST_CHECK(markers[dcp::LFMC] == dcpomatic::ContentTime(960000)); + + /* Load that film and check that the markers have been loaded */ + shared_ptr<Film> film3(new Film(boost::filesystem::path("build/test/import_dcp_markers_test2"))); + film3->read_metadata (); + BOOST_REQUIRE (film3->content().size() == 1); + shared_ptr<DCPContent> reloaded = dynamic_pointer_cast<DCPContent>(film3->content().front()); + BOOST_REQUIRE (reloaded); + + BOOST_CHECK_EQUAL (reloaded->markers().size(), 3); + + markers = reloaded->markers(); + BOOST_REQUIRE(markers.find(dcp::FFOC) != markers.end()); + BOOST_CHECK(markers[dcp::FFOC] == dcpomatic::ContentTime(184000)); + BOOST_REQUIRE(markers.find(dcp::FFMC) != markers.end()); + BOOST_CHECK(markers[dcp::FFMC] == dcpomatic::ContentTime(904000)); + BOOST_REQUIRE(markers.find(dcp::LFMC) != markers.end()); + BOOST_CHECK(markers[dcp::LFMC] == dcpomatic::ContentTime(960000)); +} |
