diff options
| -rw-r--r-- | src/subtitle_asset.cc | 43 | ||||
| -rw-r--r-- | src/subtitle_asset.h | 10 | ||||
| -rw-r--r-- | test/read_interop_subtitle_test.cc | 94 | ||||
| -rw-r--r-- | test/read_smpte_subtitle_test.cc | 27 | ||||
| -rw-r--r-- | tools/dcpinfo.cc | 6 |
5 files changed, 109 insertions, 71 deletions
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index 59aff6be..fc9b972a 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net> + Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net> This file is part of libdcp. @@ -41,6 +41,7 @@ #include "subtitle_image.h" #include "dcp_assert.h" #include "load_font_node.h" +#include "reel_asset.h" #include <asdcp/AS_DCP.h> #include <asdcp/KM_util.h> #include <libxml++/nodes/element.h> @@ -56,6 +57,7 @@ using std::cerr; using std::map; using std::shared_ptr; using std::vector; +using std::make_shared; using boost::shared_array; using boost::optional; using boost::lexical_cast; @@ -407,11 +409,23 @@ SubtitleAsset::maybe_add_subtitle (string text, vector<ParseState> const & parse } } -vector<shared_ptr<Subtitle>> + +vector<shared_ptr<const Subtitle>> +SubtitleAsset::subtitles () const +{ + vector<shared_ptr<const Subtitle>> s; + for (auto i: _subtitles) { + s.push_back (i); + } + return s; +} + + +vector<shared_ptr<const Subtitle>> SubtitleAsset::subtitles_during (Time from, Time to, bool starting) const { - vector<shared_ptr<Subtitle> > s; - BOOST_FOREACH (shared_ptr<Subtitle> i, _subtitles) { + vector<shared_ptr<const Subtitle>> s; + for (auto i: _subtitles) { if ((starting && from <= i->in() && i->in() < to) || (!starting && i->out() >= from && i->in() <= to)) { s.push_back (i); } @@ -420,6 +434,27 @@ SubtitleAsset::subtitles_during (Time from, Time to, bool starting) const return s; } + +/* XXX: this needs a test */ +vector<shared_ptr<const Subtitle>> +SubtitleAsset::subtitles_in_reel (shared_ptr<const dcp::ReelAsset> asset) const +{ + auto frame_rate = asset->edit_rate().as_float(); + auto start = dcp::Time(asset->entry_point().get_value_or(0), frame_rate, time_code_rate()); + auto during = subtitles_during (start, start + dcp::Time(asset->intrinsic_duration(), frame_rate, time_code_rate()), false); + + vector<shared_ptr<const dcp::Subtitle>> corrected; + for (auto i: during) { + auto c = make_shared<dcp::Subtitle>(*i); + c->set_in (c->in() - start); + c->set_out (c->out() - start); + corrected.push_back (c); + } + + return corrected; +} + + void SubtitleAsset::add (shared_ptr<Subtitle> s) { diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 60ddc357..02976f7d 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -62,6 +62,7 @@ class FontNode; class TextNode; class SubtitleNode; class LoadFontNode; +class ReelAsset; namespace order { class Part; @@ -88,10 +89,9 @@ public: NoteHandler note ) const; - std::vector<std::shared_ptr<Subtitle>> subtitles_during (Time from, Time to, bool starting) const; - std::vector<std::shared_ptr<Subtitle>> const & subtitles () const { - return _subtitles; - } + std::vector<std::shared_ptr<const Subtitle>> subtitles_during (Time from, Time to, bool starting) const; + std::vector<std::shared_ptr<const Subtitle>> subtitles_in_reel(std::shared_ptr<const dcp::ReelAsset> asset) const; + std::vector<std::shared_ptr<const Subtitle>> subtitles () const; virtual void add (std::shared_ptr<Subtitle>); virtual void add_font (std::string id, dcp::ArrayData data) = 0; @@ -107,6 +107,8 @@ public: virtual std::vector<std::shared_ptr<LoadFontNode>> load_font_nodes () const = 0; + virtual int time_code_rate () const = 0; + std::string raw_xml () const { return _raw_xml; } diff --git a/test/read_interop_subtitle_test.cc b/test/read_interop_subtitle_test.cc index ba097222..d37e60d4 100644 --- a/test/read_interop_subtitle_test.cc +++ b/test/read_interop_subtitle_test.cc @@ -62,8 +62,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1) auto s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 1); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFontId"), false, false, @@ -87,8 +87,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1) s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFontId"), true, false, @@ -109,8 +109,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1) dcp::Time (0, 0, 0, 1, 250), dcp::Time (0, 0, 0, 1, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFontId"), false, false, @@ -134,8 +134,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1) s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 1); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFontId"), false, false, @@ -159,8 +159,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1) s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 1); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFontId"), false, true, @@ -190,8 +190,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) auto s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -212,8 +212,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -237,8 +237,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -259,8 +259,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -284,8 +284,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -306,8 +306,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -331,8 +331,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -353,8 +353,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -378,8 +378,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -400,8 +400,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -425,8 +425,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -447,8 +447,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -472,8 +472,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -494,8 +494,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -519,8 +519,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -541,8 +541,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), false, false, @@ -566,8 +566,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false); BOOST_REQUIRE_EQUAL (s.size(), 2); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.front())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.front()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -588,8 +588,8 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2) dcp::Time (0, 0, 0, 0, 250), dcp::Time (0, 0, 0, 0, 250) )); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(s.back())); - BOOST_CHECK_EQUAL (*dynamic_pointer_cast<dcp::SubtitleString>(s.back()), dcp::SubtitleString ( + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back())); + BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString ( string ("theFont"), true, false, @@ -618,7 +618,7 @@ BOOST_AUTO_TEST_CASE (read_interop_subtitle_test3) dcp::InteropSubtitleAsset subs ("test/data/subs3.xml"); BOOST_REQUIRE_EQUAL (subs.subtitles().size(), 1); - shared_ptr<dcp::SubtitleImage> si = dynamic_pointer_cast<dcp::SubtitleImage>(subs.subtitles().front()); + auto si = dynamic_pointer_cast<const dcp::SubtitleImage>(subs.subtitles().front()); BOOST_REQUIRE (si); BOOST_CHECK (si->png_image() == dcp::ArrayData("test/data/sub.png")); } diff --git a/test/read_smpte_subtitle_test.cc b/test/read_smpte_subtitle_test.cc index 8fbf0214..15fc5dd8 100644 --- a/test/read_smpte_subtitle_test.cc +++ b/test/read_smpte_subtitle_test.cc @@ -73,12 +73,12 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test) BOOST_CHECK_EQUAL (smpte_lfn->id, "theFontId"); BOOST_CHECK_EQUAL (smpte_lfn->urn, "9118bbce-4105-4a05-b37c-a5a6f75e1fea"); BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().front())); - BOOST_CHECK_EQUAL (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal."); + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())); + BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal."); BOOST_CHECK_EQUAL (sc.subtitles().front()->in(), dcp::Time (0, 0, 25, 12, 25)); BOOST_CHECK_EQUAL (sc.subtitles().front()->out(), dcp::Time (0, 0, 26, 4, 25)); - BOOST_REQUIRE (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().back())); - BOOST_CHECK_EQUAL (dynamic_pointer_cast<dcp::SubtitleString>(sc.subtitles().back())->text(), "Prochainement"); + BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())); + BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())->text(), "Prochainement"); BOOST_CHECK_EQUAL (sc.subtitles().back()->in(), dcp::Time (0, 1, 57, 17, 25)); BOOST_CHECK_EQUAL (sc.subtitles().back()->out(), dcp::Time (0, 1, 58, 12, 25)); } @@ -88,34 +88,35 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test2) { dcp::SMPTESubtitleAsset sc (private_test / "olsson.xml"); - BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 6); - auto i = sc.subtitles().begin(); - shared_ptr<dcp::SubtitleString> is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + auto subs = sc.subtitles(); + BOOST_REQUIRE_EQUAL (subs.size(), 6); + auto i = 0; + auto is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), "Testing is "); BOOST_CHECK (!is->italic()); ++i; - is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), "really"); BOOST_CHECK (is->italic()); ++i; - is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), " fun!"); BOOST_CHECK (!is->italic()); ++i; - is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), "This is the "); BOOST_CHECK (!is->italic()); ++i; - is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), "second"); BOOST_CHECK (is->italic()); ++i; - is = dynamic_pointer_cast<dcp::SubtitleString>(*i); + is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]); BOOST_REQUIRE (is); BOOST_CHECK_EQUAL (is->text(), " line!"); BOOST_CHECK (!is->italic()); @@ -127,7 +128,7 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test3) dcp::SMPTESubtitleAsset subs ("test/data/subs.mxf"); BOOST_REQUIRE_EQUAL (subs.subtitles().size(), 1); - shared_ptr<dcp::SubtitleImage> si = dynamic_pointer_cast<dcp::SubtitleImage>(subs.subtitles().front()); + auto si = dynamic_pointer_cast<const dcp::SubtitleImage>(subs.subtitles()[0]); BOOST_REQUIRE (si); BOOST_CHECK (si->png_image() == dcp::ArrayData("test/data/sub.png")); } diff --git a/tools/dcpinfo.cc b/tools/dcpinfo.cc index 18ed7886..5ca9b24f 100644 --- a/tools/dcpinfo.cc +++ b/tools/dcpinfo.cc @@ -259,14 +259,14 @@ main_subtitle (vector<string> const& only, shared_ptr<Reel> reel, bool list_subt OUTPUT_SUBTITLE(" in %1\n", smpte->language().get()); } if (list_subtitles) { - BOOST_FOREACH (shared_ptr<Subtitle> k, subs) { - shared_ptr<SubtitleString> ks = dynamic_pointer_cast<SubtitleString> (k); + for (auto k: subs) { + auto ks = dynamic_pointer_cast<const SubtitleString>(k); if (ks) { stringstream s; s << *ks; OUTPUT_SUBTITLE("%1\n", s.str()); } - shared_ptr<SubtitleImage> is = dynamic_pointer_cast<SubtitleImage> (k); + auto is = dynamic_pointer_cast<const SubtitleImage>(k); if (is) { stringstream s; s << *is; |
