X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=abcefcab5c57fcae7afbc5db48589cd12088d343;hp=575fd5c231585a33bcf5aabf785d248e227082fc;hb=86515d34200fa2a387e48b117eed9b02cabde30d;hpb=fbdfc901498605f89f28a57d595df966bddc4eb1 diff --git a/src/lib/player.cc b/src/lib/player.cc index 575fd5c23..abcefcab5 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -384,7 +384,23 @@ Player::setup_pieces () 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)) { - (*piece)->ignore_video = (*later_piece)->content->period(film).overlap(period); + 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); + } } } } @@ -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; } @@ -1592,6 +1618,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); }