X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Factive_text.cc;h=1180ce7b0bc42f3c6b1deb7ef1fb0fdbb789eecd;hb=4417fa5d535d870999672c94541fe03837e986f4;hp=de3dc816563cb8b3c0e46807dbab4bb27218ba1f;hpb=df17bbd25da69fc38eb2dcd8b4a2531cf0bab0bc;p=dcpomatic.git diff --git a/src/lib/active_text.cc b/src/lib/active_text.cc index de3dc8165..1180ce7b0 100644 --- a/src/lib/active_text.cc +++ b/src/lib/active_text.cc @@ -18,47 +18,18 @@ */ + #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; - -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 -{ - 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); - } - - return ps; -} +using namespace dcpomatic; /** Get the open captions that should be burnt into a given period. * @param period Period of interest. @@ -67,6 +38,8 @@ ActiveText::get (DCPTimePeriod period) const list ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_captions) const { + boost::mutex::scoped_lock lm (_mutex); + list ps; for (Map::const_iterator i = _data.begin(); i != _data.end(); ++i) { @@ -81,7 +54,13 @@ 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())); + optional overlap = period.overlap (test); + if (overlap && overlap->duration() > DCPTime(period.duration().get() / 2)) { + ps.push_back (j.subs); + } + } } return ps; @@ -93,10 +72,12 @@ ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_captions) const void ActiveText::clear_before (DCPTime time) { + boost::mutex::scoped_lock lm (_mutex); + Map updated; for (Map::const_iterator i = _data.begin(); i != _data.end(); ++i) { list as; - BOOST_FOREACH (Period j, i->second) { + for (auto j: i->second) { if (!j.to || j.to.get() >= time) { as.push_back (j); } @@ -116,6 +97,8 @@ ActiveText::clear_before (DCPTime time) void ActiveText::add_from (weak_ptr content, PlayerText ps, DCPTime from) { + boost::mutex::scoped_lock lm (_mutex); + if (_data.find(content) == _data.end()) { _data[content] = list(); } @@ -130,11 +113,13 @@ ActiveText::add_from (weak_ptr content, PlayerText ps, DCPTim pair ActiveText::add_to (weak_ptr content, DCPTime to) { + boost::mutex::scoped_lock lm (_mutex); + DCPOMATIC_ASSERT (_data.find(content) != _data.end()); _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)); } @@ -147,6 +132,8 @@ ActiveText::add_to (weak_ptr content, DCPTime to) bool ActiveText::have (weak_ptr content) const { + boost::mutex::scoped_lock lm (_mutex); + Map::const_iterator i = _data.find(content); if (i == _data.end()) { return false; @@ -158,5 +145,6 @@ ActiveText::have (weak_ptr content) const void ActiveText::clear () { + boost::mutex::scoped_lock lm (_mutex); _data.clear (); }