Assorted C++11/formatting cleanups.
[dcpomatic.git] / src / lib / player.cc
index 465fcad6d7fc342eb66f78dc318b89a550d062fc..0bdf46f4abe33532f2edc7f14e7ad0f29bcb219f 100644 (file)
@@ -266,12 +266,28 @@ Player::setup_pieces_unlocked ()
                }
        }
 
+       for (auto i = _pieces.begin(); i != _pieces.end(); ++i) {
+               if (auto video = (*i)->content->video) {
+                       if (video->use() && video->frame_type() != VideoFrameType::THREE_D_LEFT && video->frame_type() != VideoFrameType::THREE_D_RIGHT) {
+                               /* Look for content later in the content list with in-use video that overlaps this */
+                               auto period = DCPTimePeriod((*i)->content->position(), (*i)->content->end(_film));
+                               auto j = i;
+                               ++j;
+                               for (; j != _pieces.end(); ++j) {
+                                       if ((*j)->content->video && (*j)->content->video->use()) {
+                                               (*i)->ignore_video = DCPTimePeriod((*j)->content->position(), (*j)->content->end(_film)).overlap(period);
+                                       }
+                               }
+                       }
+               }
+       }
+
        _black = Empty (_film, playlist(), bind(&have_video, _1), _playback_length);
        _silent = Empty (_film, playlist(), bind(&have_audio, _1), _playback_length);
 
-       _last_video_time = {};
+       _last_video_time = boost::optional<dcpomatic::DCPTime>();
        _last_video_eyes = Eyes::BOTH;
-       _last_audio_time = {};
+       _last_audio_time = boost::optional<dcpomatic::DCPTime>();
 }
 
 
@@ -851,6 +867,10 @@ Player::video (weak_ptr<Piece> wp, ContentVideo video)
                return;
        }
 
+       if (piece->ignore_video && piece->ignore_video->contains(time)) {
+               return;
+       }
+
        /* Fill gaps that we discover now that we have some video which needs to be emitted.
           This is where we need to fill to.
        */
@@ -1179,6 +1199,16 @@ Player::seek (DCPTime time, bool accurate)
 void
 Player::emit_video (shared_ptr<PlayerVideo> pv, DCPTime time)
 {
+       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 relevent subtitles arrive at the
           player before the video that requires them.
        */