Further adjustment of shuffler to cope with having sources for only one eye. v2.13.12
authorCarl Hetherington <cth@carlh.net>
Thu, 5 Apr 2018 15:31:18 +0000 (16:31 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 5 Apr 2018 15:31:18 +0000 (16:31 +0100)
src/lib/shuffler.cc
test/shuffler_test.cc

index c32649f..00edc27 100644 (file)
@@ -42,8 +42,6 @@ struct Comparator
 void
 Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
 {
-       /* 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);
 
@@ -60,15 +58,19 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
        _store.push_back (make_pair (weak_piece, video));
        _store.sort (Comparator());
 
-       while (
+       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)
-                       )
-               ) {
+                       );
 
+       /* 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.
+       */
+       while (store_front_in_sequence || _store.size() > 8) {
                Video (_store.front().first, _store.front().second);
                _last = _store.front().second;
                _store.pop_front ();
index 879f2e0..440d014 100644 (file)
@@ -120,3 +120,26 @@ BOOST_AUTO_TEST_CASE (shuffler_test4)
        check (4, EYES_LEFT, __LINE__);
        check (4, EYES_RIGHT, __LINE__);
 }
+
+/** Only one eye */
+BOOST_AUTO_TEST_CASE (shuffler_test5)
+{
+       Shuffler s;
+       s.Video.connect (boost::bind (&receive, _1, _2));
+
+       /* One left should come out straight away */
+       push (s, 0, EYES_LEFT);
+       check (0, EYES_LEFT, __LINE__);
+
+       /* More lefts should be kept in the shuffler in the hope that some rights arrive */
+       for (int i = 0; i < 8; ++i) {
+               push (s, i + 1, EYES_LEFT);
+       }
+       BOOST_CHECK (pending_cv.empty ());
+
+       /* If enough lefts come the shuffler should conclude that there's no rights and start
+          giving out the lefts.
+       */
+       push (s, 9, EYES_LEFT);
+       check (1, EYES_LEFT, __LINE__);
+}