X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Factive_text.cc;h=1180ce7b0bc42f3c6b1deb7ef1fb0fdbb789eecd;hb=c59981ce92898f6be6987f10ebb29161e36e6766;hp=885aa034ce88d131ced81e892a3de6e8c8e66186;hpb=0ab83642f0c96ae2681beae04873b3226338a570;p=dcpomatic.git diff --git a/src/lib/active_text.cc b/src/lib/active_text.cc index 885aa034c..1180ce7b0 100644 --- a/src/lib/active_text.cc +++ b/src/lib/active_text.cc @@ -18,41 +18,43 @@ */ + #include "active_text.h" -#include "piece.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; -/** Get the subtitles that should be burnt into a given period. +/** Get the open captions that should be burnt into a given period. * @param period Period of interest. - * @param always_burn_subtitles Always burn subtitles even if their content is not set to burn. + * @param always_burn_captions Always burn captions even if their content is not set to burn. */ list -ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_subtitles) const +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) { - shared_ptr piece = i->first.lock (); - if (!piece) { + shared_ptr caption = i->first.lock (); + if (!caption) { continue; } - if (!piece->content->subtitle->use() || (!always_burn_subtitles && !piece->content->subtitle->burn())) { - /* Not burning this piece */ + if (!caption->use() || (!always_burn_captions && !caption->burn())) { + /* Not burning this content */ continue; } - BOOST_FOREACH (Period j, 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)) { @@ -70,10 +72,12 @@ ActiveText::get_burnt (DCPTimePeriod period, bool always_burn_subtitles) 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); } @@ -86,45 +90,51 @@ ActiveText::clear_before (DCPTime time) } /** Add a new subtitle with a from time. - * @param piece Piece that the subtitle is from. + * @param content Content that the subtitle is from. * @param ps Subtitles. * @param from From time for these subtitles. */ void -ActiveText::add_from (weak_ptr piece, PlayerText ps, DCPTime from) +ActiveText::add_from (weak_ptr content, PlayerText ps, DCPTime from) { - if (_data.find(piece) == _data.end()) { - _data[piece] = list(); + boost::mutex::scoped_lock lm (_mutex); + + if (_data.find(content) == _data.end()) { + _data[content] = list(); } - _data[piece].push_back (Period (ps, from)); + _data[content].push_back (Period (ps, from)); } -/** Add the to time for the last subtitle added from a piece. - * @param piece Piece that the subtitle is from. - * @param to To time for the last subtitle submitted to add_from for this piece. +/** 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. * @return Return the corresponding subtitles and their from time. */ pair -ActiveText::add_to (weak_ptr piece, DCPTime to) +ActiveText::add_to (weak_ptr content, DCPTime to) { - DCPOMATIC_ASSERT (_data.find(piece) != _data.end()); + boost::mutex::scoped_lock lm (_mutex); + + DCPOMATIC_ASSERT (_data.find(content) != _data.end()); - _data[piece].back().to = to; + _data[content].back().to = to; - BOOST_FOREACH (PlainText& i, _data[piece].back().subs.text) { + for (auto& i: _data[content].back().subs.string) { i.set_out (dcp::Time(to.seconds(), 1000)); } - return make_pair (_data[piece].back().subs, _data[piece].back().from); + return make_pair (_data[content].back().subs, _data[content].back().from); } -/** @param piece A piece. - * @return true if we have any active subtitles from this piece. +/** @param content Some content. + * @return true if we have any active subtitles from this content. */ bool -ActiveText::have (weak_ptr piece) const +ActiveText::have (weak_ptr content) const { - Map::const_iterator i = _data.find(piece); + boost::mutex::scoped_lock lm (_mutex); + + Map::const_iterator i = _data.find(content); if (i == _data.end()) { return false; } @@ -135,5 +145,6 @@ ActiveText::have (weak_ptr piece) const void ActiveText::clear () { + boost::mutex::scoped_lock lm (_mutex); _data.clear (); }