Wait for in-order input to shuffler before emitting anything, otherwise
authorCarl Hetherington <cth@carlh.net>
Thu, 5 Apr 2018 01:41:40 +0000 (02:41 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 5 Apr 2018 01:41:40 +0000 (02:41 +0100)
we emit a crucial frame and then fail to carry on because we miss it.

ChangeLog
src/lib/shuffler.cc

index ae42142265f0059903df0910d6d96656b5ffeef6..e2cf6af908485cf2739c7c1750a2e62ad70fa9d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2018-04-05  Carl Hetherington  <cth@carlh.net>
+
+       * Fix assertion failures with 3D content in some cases.
+
 2018-03-28  Carl Hetherington  <cth@carlh.net>
 
        * Disable audio mapping control when analysing audio (#1250).
index 889d81c71397967c78e19839cc54967ec12d1a49..9e90f180d3e8ff95f88178deec6747bebe07f619 100644 (file)
@@ -50,8 +50,8 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
        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;
@@ -62,6 +62,7 @@ Shuffler::video (weak_ptr<Piece> weak_piece, ContentVideo video)
 
        while (
                !_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) ||