X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=503452b59cd1e73f8f60de9fd26a3eab8a5cad41;hb=a5d004b0773f633401528392fc28e66d70e13ac8;hp=57fc7a67c6bdeab59cc591a9c316ce655b3494fc;hpb=f20ec58b5fa6b5ffd49f0af6865290a775077e73;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 57fc7a67c..503452b59 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -56,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -73,11 +72,14 @@ using std::pair; using std::map; using std::make_pair; using std::copy; -using boost::shared_ptr; -using boost::weak_ptr; -using boost::dynamic_pointer_cast; +using std::shared_ptr; +using std::weak_ptr; +using std::dynamic_pointer_cast; using boost::optional; using boost::scoped_ptr; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif using namespace dcpomatic; int const PlayerProperty::VIDEO_CONTAINER_SIZE = 700; @@ -174,7 +176,7 @@ Player::setup_pieces_unlocked () _shuffler = new Shuffler(); _shuffler->Video.connect(bind(&Player::video, this, _1, _2)); - BOOST_FOREACH (shared_ptr i, playlist()->content()) { + for (auto i: playlist()->content()) { if (!i->paths_valid ()) { continue; @@ -186,7 +188,7 @@ Player::setup_pieces_unlocked () } shared_ptr old_decoder; - BOOST_FOREACH (shared_ptr j, old_pieces) { + for (auto j: old_pieces) { if (j->content == i) { old_decoder = j->decoder; break; @@ -207,7 +209,7 @@ Player::setup_pieces_unlocked () } if (_ignore_text) { - BOOST_FOREACH (shared_ptr i, decoder->text) { + for (auto i: decoder->text) { i->set_ignore (true); } } @@ -258,9 +260,9 @@ Player::setup_pieces_unlocked () } _stream_states.clear (); - BOOST_FOREACH (shared_ptr i, _pieces) { + for (auto i: _pieces) { if (i->content->audio) { - BOOST_FOREACH (AudioStreamPtr j, i->content->audio->streams()) { + for (auto j: i->content->audio->streams()) { _stream_states[j] = StreamState (i, i->content->position ()); } } @@ -277,18 +279,28 @@ Player::setup_pieces_unlocked () void Player::playlist_content_change (ChangeType type, int property, bool frequent) { - if (type == CHANGE_TYPE_PENDING) { - /* The player content is probably about to change, so we can't carry on - until that has happened and we've rebuilt our pieces. Stop pass() - and seek() from working until then. - */ - ++_suspended; - } else if (type == CHANGE_TYPE_DONE) { - /* A change in our content has gone through. Re-build our pieces. */ - setup_pieces (); - --_suspended; - } else if (type == CHANGE_TYPE_CANCELLED) { - --_suspended; + if (property == VideoContentProperty::CROP) { + if (type == CHANGE_TYPE_DONE) { + dcp::Size const vcs = video_container_size(); + boost::mutex::scoped_lock lm (_mutex); + for (list, DCPTime> >::const_iterator i = _delay.begin(); i != _delay.end(); ++i) { + i->first->reset_metadata (_film, vcs); + } + } + } else { + if (type == CHANGE_TYPE_PENDING) { + /* The player content is probably about to change, so we can't carry on + until that has happened and we've rebuilt our pieces. Stop pass() + and seek() from working until then. + */ + ++_suspended; + } else if (type == CHANGE_TYPE_DONE) { + /* A change in our content has gone through. Re-build our pieces. */ + setup_pieces (); + --_suspended; + } else if (type == CHANGE_TYPE_CANCELLED) { + --_suspended; + } } Change (type, property, frequent); @@ -371,7 +383,7 @@ Player::black_player_video_frame (Eyes eyes) const PART_WHOLE, PresetColourConversion::all().front().conversion, VIDEO_RANGE_FULL, - boost::weak_ptr(), + std::weak_ptr(), boost::optional(), false ) @@ -435,20 +447,18 @@ Player::content_time_to_dcp (shared_ptr piece, ContentTime t) const return max (DCPTime (), DCPTime (t - piece->content->trim_start(), piece->frc) + piece->content->position()); } -list > +vector Player::get_subtitle_fonts () { boost::mutex::scoped_lock lm (_mutex); - list > fonts; - BOOST_FOREACH (shared_ptr i, _pieces) { - BOOST_FOREACH (shared_ptr j, i->content->text) { - /* XXX: things may go wrong if there are duplicate font IDs - with different font files. - */ - list > f = j->fonts (); - copy (f.begin(), f.end(), back_inserter (fonts)); - } + vector fonts; + for (auto i: _pieces) { + /* XXX: things may go wrong if there are duplicate font IDs + with different font files. + */ + vector f = i->decoder->fonts (); + copy (f.begin(), f.end(), back_inserter(fonts)); } return fonts; @@ -524,7 +534,7 @@ Player::get_reel_assets () list a; - BOOST_FOREACH (shared_ptr i, playlist()->content()) { + for (auto i: playlist()->content()) { shared_ptr j = dynamic_pointer_cast (i); if (!j) { continue; @@ -547,12 +557,12 @@ Player::get_reel_assets () int64_t offset_from_start = 0; /* position in the asset from the end */ int64_t offset_from_end = 0; - BOOST_FOREACH (shared_ptr k, decoder->reels()) { + for (auto k: decoder->reels()) { /* Assume that main picture duration is the length of the reel */ offset_from_end += k->main_picture()->actual_duration(); } - BOOST_FOREACH (shared_ptr k, decoder->reels()) { + for (auto k: decoder->reels()) { /* Assume that main picture duration is the length of the reel */ int64_t const reel_duration = k->main_picture()->actual_duration(); @@ -575,7 +585,7 @@ Player::get_reel_assets () } if (j->reference_text (TEXT_CLOSED_CAPTION)) { - BOOST_FOREACH (shared_ptr l, k->closed_captions()) { + for (auto l: k->closed_captions()) { maybe_add_asset (a, l, reel_trim_start, reel_trim_end, from, ffr); } } @@ -610,7 +620,7 @@ Player::pass () shared_ptr earliest_content; optional earliest_time; - BOOST_FOREACH (shared_ptr i, _pieces) { + for (auto i: _pieces) { if (i->done) { continue; } @@ -754,13 +764,13 @@ Player::open_subtitles_for_frame (DCPTime time) const list captions; int const vfr = _film->video_frame_rate(); - BOOST_FOREACH ( - PlayerText j, + for ( + auto j: _active_texts[TEXT_OPEN_SUBTITLE].get_burnt(DCPTimePeriod(time, time + DCPTime::from_frames(1, vfr)), _always_burn_open_subtitles) ) { /* Bitmap subtitles */ - BOOST_FOREACH (BitmapText i, j.bitmap) { + for (auto i: j.bitmap) { if (!i.image) { continue; } @@ -1023,7 +1033,7 @@ Player::plain_text_start (weak_ptr wp, weak_ptr wc, Co return; } - BOOST_FOREACH (dcp::SubtitleString s, subtitle.subs) { + for (auto s: subtitle.subs) { s.set_h_position (s.h_position() + text->x_offset ()); s.set_v_position (s.v_position() + text->y_offset ()); float const xs = text->x_scale(); @@ -1108,7 +1118,7 @@ Player::seek (DCPTime time, bool accurate) _active_texts[i].clear (); } - BOOST_FOREACH (shared_ptr i, _pieces) { + for (auto i: _pieces) { if (time < i->content->position()) { /* Before; seek to the start of the content. Even if this request is for an inaccurate seek we must seek this (following) content accurately, otherwise when we come to the end of the current @@ -1263,7 +1273,7 @@ Player::content_time_to_dcp (shared_ptr content, ContentTime t) { boost::mutex::scoped_lock lm (_mutex); - BOOST_FOREACH (shared_ptr i, _pieces) { + for (auto i: _pieces) { if (i->content == content) { return content_time_to_dcp (i, t); }