diff options
| -rw-r--r-- | src/lib/shuffler.cc | 12 | ||||
| -rw-r--r-- | test/shuffler_test.cc | 23 |
2 files changed, 30 insertions, 5 deletions
diff --git a/src/lib/shuffler.cc b/src/lib/shuffler.cc index c32649f00..00edc27d5 100644 --- a/src/lib/shuffler.cc +++ b/src/lib/shuffler.cc @@ -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 (); diff --git a/test/shuffler_test.cc b/test/shuffler_test.cc index 879f2e079..440d014cf 100644 --- a/test/shuffler_test.cc +++ b/test/shuffler_test.cc @@ -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__); +} |
