X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fshuffler.cc;h=9c155174b081adafa07bfce77184a7141bd8a5f0;hb=bd12a72f78409e3f482be3d47b5efb57af4ad982;hp=00edc27d5983c7e88ff1fb3b9790b35dc821a7c4;hpb=5f5c64faa7b0114f84f45e50211611333042c672;p=dcpomatic.git diff --git a/src/lib/shuffler.cc b/src/lib/shuffler.cc index 00edc27d5..9c155174b 100644 --- a/src/lib/shuffler.cc +++ b/src/lib/shuffler.cc @@ -42,8 +42,11 @@ struct Comparator void Shuffler::video (weak_ptr weak_piece, ContentVideo video) { - /* 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 = weak_piece.lock (); DCPOMATIC_ASSERT (piece); @@ -58,19 +61,24 @@ Shuffler::video (weak_ptr weak_piece, ContentVideo video) _store.push_back (make_pair (weak_piece, video)); _store.sort (Comparator()); - 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) { + 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; + } + Video (_store.front().first, _store.front().second); _last = _store.front().second; _store.pop_front ();