Add contains_assetmap()
[dcpomatic.git] / src / lib / player.cc
index 0ff2c4032c0a2c7de5da3bdd381284e4a808feb9..7e3a1bdcf15e072ce740236fe0c30755aae529d3 100644 (file)
@@ -344,9 +344,11 @@ Player::set_video_container_size (dcp::Size s)
 
        _video_container_size = s;
 
-       auto black = make_shared<Image>(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED);
-       black->make_black ();
-       std::atomic_store(&_black_image, black);
+       {
+               boost::mutex::scoped_lock lm(_black_image_mutex);
+               _black_image = make_shared<Image>(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED);
+               _black_image->make_black ();
+       }
 
        Change (ChangeType::DONE, PlayerProperty::VIDEO_CONTAINER_SIZE, false);
 }
@@ -397,10 +399,10 @@ Player::film_change (ChangeType type, Film::Property p)
 shared_ptr<PlayerVideo>
 Player::black_player_video_frame (Eyes eyes) const
 {
-       auto black = std::atomic_load(&_black_image);
+       boost::mutex::scoped_lock lm(_black_image_mutex);
 
        return std::make_shared<PlayerVideo> (
-               std::make_shared<const RawImageProxy>(black),
+               std::make_shared<const RawImageProxy>(_black_image),
                Crop(),
                optional<double>(),
                _video_container_size,
@@ -758,7 +760,7 @@ Player::open_subtitles_for_frame (DCPTime time) const
 
        for (
                auto j:
-               _active_texts[static_cast<int>(TextType::OPEN_SUBTITLE)].get_burnt(DCPTimePeriod(time, time + DCPTime::from_frames(1, vfr)), _always_burn_open_subtitles)
+               _active_texts[TextType::OPEN_SUBTITLE].get_burnt(DCPTimePeriod(time, time + DCPTime::from_frames(1, vfr)), _always_burn_open_subtitles)
                ) {
 
                /* Bitmap subtitles */
@@ -1049,7 +1051,7 @@ Player::bitmap_text_start (weak_ptr<Piece> weak_piece, weak_ptr<const TextConten
        }
 
        DCPTime from(content_time_to_dcp(piece, subtitle.from()));
-       _active_texts[static_cast<int>(content->type())].add_from(weak_content, ps, from);
+       _active_texts[content->type()].add_from(weak_content, ps, from);
 }
 
 
@@ -1097,7 +1099,7 @@ Player::plain_text_start (weak_ptr<Piece> weak_piece, weak_ptr<const TextContent
                ps.string.push_back (s);
        }
 
-       _active_texts[static_cast<int>(content->type())].add_from(weak_content, ps, from);
+       _active_texts[content->type()].add_from(weak_content, ps, from);
 }
 
 
@@ -1113,7 +1115,7 @@ Player::subtitle_stop (weak_ptr<Piece> weak_piece, weak_ptr<const TextContent> w
                return;
        }
 
-       if (!_active_texts[static_cast<int>(content->type())].have(weak_content)) {
+       if (!_active_texts[content->type()].have(weak_content)) {
                return;
        }
 
@@ -1128,7 +1130,7 @@ Player::subtitle_stop (weak_ptr<Piece> weak_piece, weak_ptr<const TextContent> w
                return;
        }
 
-       auto from = _active_texts[static_cast<int>(content->type())].add_to(weak_content, dcp_to);
+       auto from = _active_texts[content->type()].add_to(weak_content, dcp_to);
 
        bool const always = (content->type() == TextType::OPEN_SUBTITLE && _always_burn_open_subtitles);
        if (content->use() && !always && !content->burn()) {
@@ -1159,9 +1161,7 @@ Player::seek (DCPTime time, bool accurate)
        }
 
        _audio_merger.clear ();
-       for (int i = 0; i < static_cast<int>(TextType::COUNT); ++i) {
-               _active_texts[i].clear ();
-       }
+       std::for_each(_active_texts.begin(), _active_texts.end(), [](ActiveText& a) { a.clear(); });
 
        for (auto i: _pieces) {
                if (time < i->content->position()) {
@@ -1236,9 +1236,7 @@ void
 Player::do_emit_video (shared_ptr<PlayerVideo> pv, DCPTime time)
 {
        if (pv->eyes() == Eyes::BOTH || pv->eyes() == Eyes::RIGHT) {
-               for (int i = 0; i < static_cast<int>(TextType::COUNT); ++i) {
-                       _active_texts[i].clear_before (time);
-               }
+               std::for_each(_active_texts.begin(), _active_texts.end(), [time](ActiveText& a) { a.clear_before(time); });
        }
 
        auto subtitles = open_subtitles_for_frame (time);