Ignore overlapping ATMOS data in the same way that we ignore video (#2429).
authorCarl Hetherington <cth@carlh.net>
Thu, 9 Feb 2023 23:38:33 +0000 (00:38 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 10 Feb 2023 09:31:15 +0000 (10:31 +0100)
src/lib/piece.h
src/lib/player.cc

index 41b9aa2dcc87ae5ca01bc9eac79063de1aa9740c..9fd53748d42f4a83c3b40365623fe5fc5fe2d935 100644 (file)
@@ -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;
 };
index ab8b59656d72efc655017144648caccc0ddc1fb1..018571fe27b020955d8c80240f5374c287fba578 100644 (file)
@@ -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);
 }