From 3a9265b3f824bde609ec3f16a853b7c69c11877d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 10 Feb 2023 00:38:33 +0100 Subject: [PATCH] Ignore overlapping ATMOS data in the same way that we ignore video (#2429). --- src/lib/piece.h | 1 + src/lib/player.cc | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) 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; std::shared_ptr decoder; std::vector ignore_video; + std::vector 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 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); } -- 2.30.2