X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fencoder.cc;h=8f31b596eb8f4d972f38eb95c3b9e84c8e9d921f;hp=475c230da5ac1f3ba4458afd6cb55d062810e365;hb=854f2e5bbb7ffb9758b823af87034033033f3cb8;hpb=ec95ff05f66e9b4cf3bcdbefa0c75ca8f99dc279 diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 475c230da..8f31b596e 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -35,6 +35,7 @@ #include "writer.h" #include "server_finder.h" #include "player.h" +#include "dcp_video.h" #include "i18n.h" @@ -60,17 +61,12 @@ Encoder::Encoder (shared_ptr f, weak_ptr j) , _video_frames_out (0) , _terminate (false) { - _have_a_real_frame[EYES_BOTH] = false; - _have_a_real_frame[EYES_LEFT] = false; - _have_a_real_frame[EYES_RIGHT] = false; + } Encoder::~Encoder () { terminate_threads (); - if (_writer) { - _writer->finish (); - } } /** Add a worker thread for a each thread on a remote server. Caller must hold @@ -80,6 +76,7 @@ Encoder::~Encoder () void Encoder::add_worker_threads (ServerDescription d) { + _film->log()->log (String::compose (N_("Adding %1 worker threads for remote %2"), d.host_name ())); for (int i = 0; i < d.threads(); ++i) { _threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, d))); } @@ -96,7 +93,6 @@ Encoder::process_begin () ServerFinder::instance()->connect (boost::bind (&Encoder::server_found, this, _1)); } - void Encoder::process_end () { @@ -182,8 +178,10 @@ Encoder::frame_done () } void -Encoder::process_video (shared_ptr image, Eyes eyes, ColourConversion conversion, bool same) +Encoder::process_video (shared_ptr frame) { + _waker.nudge (); + boost::mutex::scoped_lock lock (_mutex); /* XXX: discard 3D here if required */ @@ -199,33 +197,36 @@ Encoder::process_video (shared_ptr 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); - _have_a_real_frame[eyes] = false; - frame_done (); - } else if (same && _have_a_real_frame[eyes]) { - /* Use the last frame that we encoded. */ - _writer->repeat (_video_frames_out, eyes); + _writer->fake_write (_video_frames_out, frame->eyes ()); frame_done (); } else { /* Queue this new frame for encoding */ TIMING ("adding to queue of %1", _queue.size ()); _queue.push_back (shared_ptr ( new DCPVideoFrame ( - image->image(PIX_FMT_RGB24, false), _video_frames_out, eyes, conversion, _film->video_frame_rate(), - _film->j2k_bandwidth(), _film->resolution(), _film->log() + frame->image(PIX_FMT_RGB24, false), + _video_frames_out, + frame->eyes(), + frame->conversion(), + _film->video_frame_rate(), + _film->j2k_bandwidth(), + _film->resolution(), + _film->log() ) )); _condition.notify_all (); - _have_a_real_frame[eyes] = true; } - if (eyes != EYES_LEFT) { + if (frame->eyes() != EYES_LEFT) { ++_video_frames_out; } } @@ -257,6 +258,7 @@ Encoder::terminate_threads () void Encoder::encoder_thread (optional server) +try { /* Number of seconds that we currently wait between attempts to connect to the server; not relevant for localhost @@ -338,6 +340,10 @@ Encoder::encoder_thread (optional server) _condition.notify_all (); } } +catch (...) +{ + store_current (); +} void Encoder::server_found (ServerDescription s)