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);
_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 ();
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__);
+}