X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fj2k_encoder.cc;h=273bce8fb6331acc76101e2b1b1a0f42ce609c44;hp=18bb27645ea72e209d0054323dd235570fe4bd45;hb=dd9be86db6cde0afa5da0d1d1ac43b42e05dca26;hpb=2ea3a0d0e4066a166c0700bd1d53daa7f1c50dff diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 18bb27645..273bce8fb 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -45,8 +45,8 @@ using std::list; using std::cout; using std::exception; -using boost::shared_ptr; -using boost::weak_ptr; +using std::shared_ptr; +using std::weak_ptr; using boost::optional; using dcp::Data; using namespace dcpomatic; @@ -64,6 +64,7 @@ J2KEncoder::J2KEncoder (shared_ptr film, shared_ptr writer) J2KEncoder::~J2KEncoder () { + boost::mutex::scoped_lock lm (_threads_mutex); terminate_threads (); } @@ -107,7 +108,10 @@ J2KEncoder::end () LOG_GENERAL_NC (N_("Terminating encoder threads")); - terminate_threads (); + { + boost::mutex::scoped_lock lm (_threads_mutex); + terminate_threads (); + } /* Something might have been thrown during terminate_threads */ rethrow (); @@ -178,7 +182,11 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) { _waker.nudge (); - size_t threads = _threads->size(); + size_t threads = 0; + { + boost::mutex::scoped_lock lm (_threads_mutex); + threads = _threads->size(); + } boost::mutex::scoped_lock queue_lock (_queue_mutex); @@ -209,6 +217,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) LOG_DEBUG_ENCODE("Frame @ %1 J2K", to_string(time)); /* This frame already has J2K data, so just write it */ _writer->write (pv->j2k(), position, pv->eyes ()); + frame_done (); } else if (_last_player_video[pv->eyes()] && _writer->can_repeat(position) && pv->same (_last_player_video[pv->eyes()])) { LOG_DEBUG_ENCODE("Frame @ %1 REPEAT", to_string(time)); _writer->repeat (position, pv->eyes ()); @@ -236,6 +245,8 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) _last_player_video_time = time; } + +/** Caller must hold a lock on _threads_mutex */ void J2KEncoder::terminate_threads () { @@ -367,6 +378,8 @@ catch (...) void J2KEncoder::servers_list_changed () { + boost::mutex::scoped_lock lm (_threads_mutex); + terminate_threads (); _threads.reset (new boost::thread_group());