Merge 1.0
[dcpomatic.git] / src / lib / encoder.cc
index 475c230da5ac1f3ba4458afd6cb55d062810e365..ca9134c04d29e52400579330eb34d4fa75a5196e 100644 (file)
@@ -96,7 +96,6 @@ Encoder::process_begin ()
        ServerFinder::instance()->connect (boost::bind (&Encoder::server_found, this, _1));
 }
 
-
 void
 Encoder::process_end ()
 {
@@ -199,9 +198,12 @@ Encoder::process_video (shared_ptr<PlayerImage> image, Eyes eyes, ColourConversi
                return;
        }
 
-       if (_writer->thrown ()) {
-               _writer->rethrow ();
-       }
+       _writer->rethrow ();
+       /* Re-throw any exception raised by one of our threads.  If more
+          than one has thrown an exception, only one will be rethrown, I think;
+          but then, if that happens something has gone badly wrong.
+       */
+       rethrow ();
 
        if (_writer->can_fake_write (_video_frames_out)) {
                _writer->fake_write (_video_frames_out, eyes);
@@ -257,6 +259,7 @@ Encoder::terminate_threads ()
 
 void
 Encoder::encoder_thread (optional<ServerDescription> server)
+try
 {
        /* Number of seconds that we currently wait between attempts
           to connect to the server; not relevant for localhost
@@ -338,6 +341,10 @@ Encoder::encoder_thread (optional<ServerDescription> server)
                _condition.notify_all ();
        }
 }
+catch (...)
+{
+       store_current ();
+}
 
 void
 Encoder::server_found (ServerDescription s)