summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-02-10 00:38:33 +0100
committerCarl Hetherington <cth@carlh.net>2023-02-10 10:31:15 +0100
commit3a9265b3f824bde609ec3f16a853b7c69c11877d (patch)
treed86a970d83ec149692f7751537757a4147090640
parent46a1e43f9e3f03565536419afc8137c64d5681c0 (diff)
Ignore overlapping ATMOS data in the same way that we ignore video (#2429).
-rw-r--r--src/lib/piece.h1
-rw-r--r--src/lib/player.cc23
2 files changed, 24 insertions, 0 deletions
diff --git a/src/lib/piece.h b/src/lib/piece.h
index 41b9aa2dc..9fd53748d 100644
--- a/src/lib/piece.h
+++ b/src/lib/piece.h
@@ -45,6 +45,7 @@ public:
std::shared_ptr<Content> content;
std::shared_ptr<Decoder> decoder;
std::vector<dcpomatic::DCPTimePeriod> ignore_video;
+ std::vector<dcpomatic::DCPTimePeriod> ignore_atmos;
FrameRateChange frc;
bool done;
};
diff --git a/src/lib/player.cc b/src/lib/player.cc
index ab8b59656..018571fe2 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -392,6 +392,20 @@ Player::setup_pieces ()
}
}
+ 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);
+ }
+ }
+ }
+ }
+ }
+
_black = Empty(film, playlist(), bind(&have_video, _1), _playback_length);
_silent = Empty(film, playlist(), bind(&have_audio, _1), _playback_length);
@@ -1599,6 +1613,15 @@ Player::atmos (weak_ptr<Piece> 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);
}