std::shared_ptr
[dcpomatic.git] / src / lib / j2k_encoder.cc
index 18bb27645ea72e209d0054323dd235570fe4bd45..273bce8fb6331acc76101e2b1b1a0f42ce609c44 100644 (file)
@@ -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<const Film> film, shared_ptr<Writer> 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<PlayerVideo> 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<PlayerVideo> 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<PlayerVideo> 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());