X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fencoder.cc;h=ef58ca09e6e71b85fb7c0c6e29d192fb3dfb468f;hb=aac97a7653003ab7032d927eeb236cff4ad726d1;hp=00e28e1ebabbdd235f7cd31d964fbab03bf3be17;hpb=b0297f77b23099a52d37becfa45930ee730bda4b;p=dcpomatic.git diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 00e28e1eb..ef58ca09e 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -43,6 +43,7 @@ #include "i18n.h" #define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL); +#define LOG_GENERAL_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_GENERAL); #define LOG_ERROR(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_ERROR); #define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING); @@ -61,7 +62,8 @@ Encoder::Encoder (shared_ptr film, weak_ptr j, shared_ptr film, weak_ptr j, shared_ptr pv) /* XXX: discard 3D here if required */ /* Wait until the queue has gone down a bit */ - while (_queue.size() >= threads * 2 && !_terminate) { + while (_queue.size() >= threads * 2 && !_terminate_enqueue) { LOG_TIMING ("decoder-sleep queue=%1", _queue.size()); _full_condition.wait (queue_lock); LOG_TIMING ("decoder-wake queue=%1", _queue.size()); } - if (_terminate) { + if (_terminate_enqueue) { return; } @@ -256,7 +266,7 @@ Encoder::terminate_threads () { { boost::mutex::scoped_lock queue_lock (_queue_mutex); - _terminate = true; + _terminate_encoding = true; _full_condition.notify_all (); _empty_condition.notify_all (); } @@ -271,7 +281,7 @@ Encoder::terminate_threads () } _threads.clear (); - _terminate = false; + _terminate_encoding = false; } void @@ -294,11 +304,11 @@ try LOG_TIMING ("encoder-sleep thread=%1", boost::this_thread::get_id()); boost::mutex::scoped_lock lock (_queue_mutex); - while (_queue.empty () && !_terminate) { + while (_queue.empty () && !_terminate_encoding) { _empty_condition.wait (lock); } - if (_terminate) { + if (_terminate_encoding) { return; } @@ -341,6 +351,7 @@ try LOG_TIMING ("finish-local-encode thread=%1 frame=%2", boost::this_thread::get_id(), vf->index()); } catch (std::exception& e) { LOG_ERROR (N_("Local encode failed (%1)"), e.what ()); + throw; } } @@ -366,6 +377,8 @@ try catch (...) { store_current (); + /* Wake anything waiting on _full_condition so it can see the exception */ + _full_condition.notify_all (); } void