X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Factive_text.cc;h=1e0fd6adbcc1bc80b4d90c08a293893bfaf48370;hb=HEAD;hp=6e813144cf2e6240204900388dd979cb63c1092e;hpb=c380909d3dcac0809dbeedc6240c33d37118296d;p=dcpomatic.git diff --git a/src/lib/active_text.cc b/src/lib/active_text.cc index 6e813144c..2a5c4d836 100644 --- a/src/lib/active_text.cc +++ b/src/lib/active_text.cc @@ -18,50 +18,37 @@ */ + #include "active_text.h" #include "text_content.h" -#include -#include + using std::list; using std::pair; using std::make_pair; -using boost::weak_ptr; -using boost::shared_ptr; +using std::weak_ptr; +using std::shared_ptr; using boost::optional; +using namespace dcpomatic; -void -ActiveText::add (DCPTimePeriod period, list& pc, list p) const -{ - BOOST_FOREACH (Period i, p) { - DCPTimePeriod test (i.from, i.to.get_value_or(DCPTime::max())); - optional overlap = period.overlap (test); - if (overlap && overlap->duration() > DCPTime(period.duration().get() / 2)) { - pc.push_back (i.subs); - } - } -} -list -ActiveText::get (DCPTimePeriod period) const +ActiveText::ActiveText(ActiveText&& other) + : _data(std::move(other._data)) { - boost::mutex::scoped_lock lm (_mutex); - list ps; +} - for (Map::const_iterator i = _data.begin(); i != _data.end(); ++i) { - shared_ptr caption = i->first.lock (); - if (!caption || !caption->use()) { - continue; - } - - add (period, ps, i->second); +ActiveText& +ActiveText::operator=(ActiveText&& other) +{ + if (this != &other) { + _data = std::move(other._data); } - - return ps; + return *this; } + /** Get the open captions that should be burnt into a given period. * @param period Period of interest. * @param always_burn_captions Always burn captions even if their content is not set to burn. @@ -73,9 +60,9 @@ ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_captions) const list ps; - for (Map::const_iterator i = _data.begin(); i != _data.end(); ++i) { + for (auto const& i: _data) { - shared_ptr caption = i->first.lock (); + auto caption = i.first.lock (); if (!caption) { continue; } @@ -85,12 +72,19 @@ ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_captions) const continue; } - add (period, ps, i->second); + for (auto j: i.second) { + DCPTimePeriod test (j.from, j.to.get_value_or(DCPTime::max())); + auto overlap = period.overlap (test); + if (overlap && overlap->duration() > DCPTime(period.duration().get() / 2)) { + ps.push_back (j.subs); + } + } } return ps; } + /** Remove subtitles that finish before a given time from our list. * @param time Time to remove before. */ @@ -100,20 +94,21 @@ ActiveText::clear_before (DCPTime time) boost::mutex::scoped_lock lm (_mutex); Map updated; - for (Map::const_iterator i = _data.begin(); i != _data.end(); ++i) { + for (auto const& i: _data) { list as; - BOOST_FOREACH (Period j, i->second) { + for (auto j: i.second) { if (!j.to || j.to.get() >= time) { as.push_back (j); } } if (!as.empty ()) { - updated[i->first] = as; + updated[i.first] = as; } } _data = updated; } + /** Add a new subtitle with a from time. * @param content Content that the subtitle is from. * @param ps Subtitles. @@ -130,6 +125,7 @@ ActiveText::add_from (weak_ptr content, PlayerText ps, DCPTim _data[content].push_back (Period (ps, from)); } + /** Add the to time for the last subtitle added from a piece of content. * @param content Content that the subtitle is from. * @param to To time for the last subtitle submitted to add_from for this content. @@ -144,13 +140,14 @@ ActiveText::add_to (weak_ptr content, DCPTime to) _data[content].back().to = to; - BOOST_FOREACH (StringText& i, _data[content].back().subs.text) { + for (auto& i: _data[content].back().subs.string) { i.set_out (dcp::Time(to.seconds(), 1000)); } return make_pair (_data[content].back().subs, _data[content].back().from); } + /** @param content Some content. * @return true if we have any active subtitles from this content. */ @@ -159,7 +156,7 @@ ActiveText::have (weak_ptr content) const { boost::mutex::scoped_lock lm (_mutex); - Map::const_iterator i = _data.find(content); + auto i = _data.find(content); if (i == _data.end()) { return false; } @@ -167,6 +164,7 @@ ActiveText::have (weak_ptr content) const return !i->second.empty(); } + void ActiveText::clear () {