Port 65514eea7705fb12985cef448f08ceb47db6acab from 1.x; failure to handle separate...
authorCarl Hetherington <cth@carlh.net>
Mon, 13 Jul 2015 23:28:59 +0000 (00:28 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 13 Jul 2015 23:28:59 +0000 (00:28 +0100)
ChangeLog
src/lib/encoder.cc
src/lib/encoder.h

index 6f3ed961cca450a03663c862041d5c1cce20ad10..14204b5889ef3ca10f3c4addfaf9014e08048b54 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2015-07-14  Carl Hetherington  <cth@carlh.net>
 
+       * Fix failure to encode 3D from separate content
+       in some cases (from 1.x) (#634).
+
        * Fix non-working 3D DCP creation when using separate
        pieces of content for each eye (#635).
 
index 07c97c6747fa6a341e5a759ac370139398ae252c..9b195bade0bf9f36dfe81b7e4a1aec88beaf4452 100644 (file)
@@ -64,6 +64,8 @@ Encoder::Encoder (shared_ptr<const Film> film, weak_ptr<Job> j, shared_ptr<Write
        : _film (film)
        , _job (j)
        , _video_frames_enqueued (0)
+       , _left_done (false)
+       , _right_done (false)
        , _terminate (false)
        , _writer (writer)
 {
@@ -247,8 +249,23 @@ Encoder::enqueue (shared_ptr<PlayerVideo> pv)
                _empty_condition.notify_all ();
        }
 
-       if (pv->eyes() != EYES_LEFT) {
+       switch (pv->eyes ()) {
+       case EYES_BOTH:
                ++_video_frames_enqueued;
+               break;
+       case EYES_LEFT:
+               _left_done = true;
+               break;
+       case EYES_RIGHT:
+               _right_done = true;
+               break;
+       default:
+               break;
+       }
+
+       if (_left_done && _right_done) {
+               ++_video_frames_enqueued;
+               _left_done = _right_done = false;
        }
 
        _last_player_video = pv;
index 85bc6ae99d57b823058d6cc95251cc955c416d82..47eef823bc6705c9c4ae38429bd09da742b0b58c 100644 (file)
@@ -100,6 +100,8 @@ private:
 
        /** Number of video frames enqueued so far */
        int _video_frames_enqueued;
+       bool _left_done;
+       bool _right_done;
 
        bool _terminate;
        std::list<boost::shared_ptr<DCPVideo> > _queue;