X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=40773e2504c3217b1c52fa07caac7434d867c351;hb=c7f45cd00b94393f6e15428a2ea256995f890412;hp=510def583279819e6e4c60239dec3f7481325399;hpb=2f12058c535045cecc226fe47b3d60da8851a862;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 510def583..40773e250 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -143,7 +143,7 @@ Player::construct () connect(); set_video_container_size(film->frame_size()); - film_change (ChangeType::DONE, Film::Property::AUDIO_PROCESSOR); + film_change(ChangeType::DONE, FilmProperty::AUDIO_PROCESSOR); setup_pieces (); seek (DCPTime (), true); @@ -378,13 +378,29 @@ Player::setup_pieces () return v && v->use() && v->frame_type() != VideoFrameType::THREE_D_LEFT && v->frame_type() != VideoFrameType::THREE_D_RIGHT; }; - for (auto i = _pieces.begin(); i != _pieces.end(); ++i) { - if (ignore_overlap((*i)->content->video)) { + for (auto piece = _pieces.begin(); piece != _pieces.end(); ++piece) { + if (ignore_overlap((*piece)->content->video)) { /* Look for content later in the content list with in-use video that overlaps this */ - auto const period = DCPTimePeriod((*i)->content->position(), (*i)->content->end(film)); - for (auto j = std::next(i); j != _pieces.end(); ++j) { - if ((*j)->content->video && ignore_overlap((*j)->content->video)) { - (*i)->ignore_video = DCPTimePeriod((*j)->content->position(), (*j)->content->end(film)).overlap(period); + auto const period = (*piece)->content->period(film); + for (auto later_piece = std::next(piece); later_piece != _pieces.end(); ++later_piece) { + if (ignore_overlap((*later_piece)->content->video)) { + if (auto overlap = (*later_piece)->content->period(film).overlap(period)) { + (*piece)->ignore_video.push_back(*overlap); + } + } + } + } + } + + for (auto piece = _pieces.begin(); piece != _pieces.end(); ++piece) { + if ((*piece)->content->atmos) { + /* Look for content later in the content list with ATMOS that overlaps this */ + auto const period = (*piece)->content->period(film); + for (auto later_piece = std::next(piece); later_piece != _pieces.end(); ++later_piece) { + if ((*later_piece)->content->atmos) { + if (auto overlap = (*later_piece)->content->period(film).overlap(period)) { + (*piece)->ignore_atmos.push_back(*overlap); + } } } } @@ -465,7 +481,7 @@ Player::playlist_change (ChangeType type) void -Player::film_change (ChangeType type, Film::Property p) +Player::film_change(ChangeType type, FilmProperty p) { /* Here we should notice Film properties that affect our output, and alert listeners that our output now would be different to how it was @@ -477,9 +493,9 @@ Player::film_change (ChangeType type, Film::Property p) return; } - if (p == Film::Property::CONTAINER) { + if (p == FilmProperty::CONTAINER) { Change (type, PlayerProperty::FILM_CONTAINER, false); - } else if (p == Film::Property::VIDEO_FRAME_RATE) { + } else if (p == FilmProperty::VIDEO_FRAME_RATE) { /* Pieces contain a FrameRateChange which contains the DCP frame rate, so we need new pieces here. */ @@ -487,12 +503,12 @@ Player::film_change (ChangeType type, Film::Property p) setup_pieces (); } Change (type, PlayerProperty::FILM_VIDEO_FRAME_RATE, false); - } else if (p == Film::Property::AUDIO_PROCESSOR) { + } else if (p == FilmProperty::AUDIO_PROCESSOR) { if (type == ChangeType::DONE && film->audio_processor ()) { boost::mutex::scoped_lock lm (_mutex); _audio_processor = film->audio_processor()->clone(film->audio_frame_rate()); } - } else if (p == Film::Property::AUDIO_CHANNELS) { + } else if (p == FilmProperty::AUDIO_CHANNELS) { if (type == ChangeType::DONE) { boost::mutex::scoped_lock lm (_mutex); _audio_merger.clear (); @@ -754,7 +770,12 @@ Player::pass () } case BLACK: LOG_DEBUG_PLAYER ("Emit black for gap at %1", to_string(_black.position())); - emit_video (black_player_video_frame(Eyes::BOTH), _black.position()); + if (film->three_d()) { + emit_video(black_player_video_frame(Eyes::LEFT), _black.position()); + emit_video(black_player_video_frame(Eyes::RIGHT), _black.position()); + } else { + emit_video(black_player_video_frame(Eyes::BOTH), _black.position()); + } _black.set_position (_black.position() + one_video_frame()); break; case SILENT: @@ -1004,7 +1025,12 @@ Player::video (weak_ptr weak_piece, ContentVideo video) return; } - if (piece->ignore_video && piece->ignore_video->contains(time)) { + auto ignore_video = std::find_if( + piece->ignore_video.begin(), + piece->ignore_video.end(), + [time](DCPTimePeriod period) { return period.contains(time); } + ); + if (ignore_video != piece->ignore_video.end()) { return; } @@ -1396,16 +1422,6 @@ Player::emit_video (shared_ptr pv, DCPTime time) auto film = _film.lock(); DCPOMATIC_ASSERT(film); - if (!film->three_d()) { - if (pv->eyes() == Eyes::LEFT) { - /* Use left-eye images for both eyes... */ - pv->set_eyes (Eyes::BOTH); - } else if (pv->eyes() == Eyes::RIGHT) { - /* ...and discard the right */ - return; - } - } - /* We need a delay to give a little wiggle room to ensure that relevant subtitles arrive at the player before the video that requires them. */ @@ -1592,6 +1608,15 @@ Player::atmos (weak_ptr weak_piece, ContentAtmos data) return; } + auto ignore_atmos = std::find_if( + piece->ignore_atmos.begin(), + piece->ignore_atmos.end(), + [dcp_time](DCPTimePeriod period) { return period.contains(dcp_time); } + ); + if (ignore_atmos != piece->ignore_atmos.end()) { + return; + } + Atmos (data.data, dcp_time, data.metadata); }