Change MagickImageProxy to FFmpegImageProxy and make it use FFmpeg
[dcpomatic.git] / src / lib / shuffler.cc
index 997d91fb16569718d3cb05fa8ccd48ac01e49118..9c155174b081adafa07bfce77184a7141bd8a5f0 100644 (file)
@@ -42,18 +42,17 @@ struct Comparator
 void
 Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
 {
-       std::cout << "shuffler gets " << video.frame << " " << video.eyes << "\n";
-
-       /* Something has gong wrong if our store gets too big */
-       DCPOMATIC_ASSERT (_store.size() != 8);
-       /* We should only ever see 3D_LEFT / 3D_RIGHT */
-       DCPOMATIC_ASSERT (video.eyes == EYES_LEFT || video.eyes == EYES_RIGHT);
+       if (video.eyes != EYES_LEFT && video.eyes != EYES_RIGHT) {
+               /* Pass through anything that we don't care about */
+               Video (weak_piece, video);
+               return;
+       }
 
        shared_ptr<Piece> piece = weak_piece.lock ();
        DCPOMATIC_ASSERT (piece);
 
-       if (!_last) {
-               /* We haven't seen anything since the last clear() so assume everything is OK */
+       if (!_last && video.eyes == EYES_LEFT) {
+               /* We haven't seen anything since the last clear() and we have some eyes-left so assume everything is OK */
                Video (weak_piece, video);
                _last = video;
                return;
@@ -62,16 +61,24 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
        _store.push_back (make_pair (weak_piece, video));
        _store.sort (Comparator());
 
-       while (
-               !_store.empty() &&
-               (
-                       (_store.front().second.frame == _last->frame && _store.front().second.eyes == EYES_RIGHT && _last->eyes == EYES_LEFT) ||
-                       (_store.front().second.frame == (_last->frame + 1) && _store.front().second.eyes == EYES_LEFT && _last->eyes == EYES_RIGHT) ||
-                       _store.size() > 8
-                       )
-               ) {
+       while (true) {
+
+               bool const store_front_in_sequence =
+                       !_store.empty() &&
+                       _last &&
+                       (
+                               (_store.front().second.frame == _last->frame && _store.front().second.eyes == EYES_RIGHT && _last->eyes == EYES_LEFT) ||
+                               (_store.front().second.frame == (_last->frame + 1) && _store.front().second.eyes == EYES_LEFT && _last->eyes == EYES_RIGHT)
+                               );
+
+               if (!store_front_in_sequence && _store.size() <= 8) {
+                       /* store_front_in_sequence means everything is ok; otherwise if the store is getting too big just
+                          start emitting things as best we can.  This can easily happen if, for example, there is only content
+                          for one eye in some part of the timeline.
+                       */
+                       break;
+               }
 
-               std::cout << "shuffler emits " << _store.front().second.frame << " " << _store.front().second.eyes << "\n";
                Video (_store.front().first, _store.front().second);
                _last = _store.front().second;
                _store.pop_front ();
@@ -81,6 +88,7 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
 void
 Shuffler::clear ()
 {
+       _store.clear ();
        _last = optional<ContentVideo>();
 }