Change subtitle SubtitleAsset API to return const Subtitle pointers; add subtitles_in...
authorCarl Hetherington <cth@carlh.net>
Mon, 11 Jan 2021 20:20:47 +0000 (21:20 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 17 Jan 2021 19:13:23 +0000 (20:13 +0100)
src/subtitle_asset.cc
src/subtitle_asset.h
test/read_interop_subtitle_test.cc
test/read_smpte_subtitle_test.cc
tools/dcpinfo.cc

index 59aff6befaf5771a219c48d43344e52cd1f5e7ab..fc9b972afae9565bc1fbb22e9ad3dc6e0164c164 100644 (file)
@@ -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)
 {
index 60ddc357d72da3d7bd58e191030677ec023fe151..02976f7d4b543cfbbcbc7b3434d320b4d9f6c628 100644 (file)
@@ -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;
        }
index ba09722226756ff91fda9f4c7207d7484ef5385b..d37e60d4dad577ea54c43762cce1d3a085a45dc9 100644 (file)
@@ -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"));
 }
index 8fbf02144dad494d5d028d3d132f083d72304e24..15fc5dd887ea425716f9b8839da96e84e633b29f 100644 (file)
@@ -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"));
 }
index 18ed788681c254cbdb5aa004aa92fea29530995a..5ca9b24ff651cc427193e6ca2937acd02f679b51 100644 (file)
@@ -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;