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);
+ 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;
_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;
+ }
Video (_store.front().first, _store.front().second);
_last = _store.front().second;
void
Shuffler::clear ()
{
- VideoAdjuster::clear ();
+ _store.clear ();
_last = optional<ContentVideo>();
}
+
+void
+Shuffler::flush ()
+{
+ BOOST_FOREACH (Store i, _store) {
+ Video (i.first, i.second);
+ }
+}