More c++ tidying.
[dcpomatic.git] / src / lib / j2k_encoder.cc
index 64cd3814784306877628794326fdcec462cd88af..7c6e2347733f361c7054f3bd862b7bf1e2d19357 100644 (file)
@@ -37,7 +37,6 @@
 #include "encode_server_description.h"
 #include "compose.hpp"
 #include <libcxml/cxml.h>
 #include "encode_server_description.h"
 #include "compose.hpp"
 #include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
 #include <iostream>
 
 #include "i18n.h"
 #include <iostream>
 
 #include "i18n.h"
@@ -45,8 +44,9 @@
 using std::list;
 using std::cout;
 using std::exception;
 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 std::make_shared;
 using boost::optional;
 using dcp::Data;
 using namespace dcpomatic;
 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 ()
 {
 
 J2KEncoder::~J2KEncoder ()
 {
+       boost::mutex::scoped_lock lm (_threads_mutex);
        terminate_threads ();
 }
 
        terminate_threads ();
 }
 
@@ -83,7 +84,7 @@ J2KEncoder::begin ()
 void
 J2KEncoder::call_servers_list_changed (weak_ptr<J2KEncoder> encoder)
 {
 void
 J2KEncoder::call_servers_list_changed (weak_ptr<J2KEncoder> encoder)
 {
-       shared_ptr<J2KEncoder> e = encoder.lock ();
+       auto e = encoder.lock ();
        if (e) {
                e->servers_list_changed ();
        }
        if (e) {
                e->servers_list_changed ();
        }
@@ -107,7 +108,10 @@ J2KEncoder::end ()
 
        LOG_GENERAL_NC (N_("Terminating encoder threads"));
 
 
        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 ();
 
        /* Something might have been thrown during terminate_threads */
        rethrow ();
@@ -123,13 +127,13 @@ J2KEncoder::end ()
             So just mop up anything left in the queue here.
        */
 
             So just mop up anything left in the queue here.
        */
 
-       for (list<shared_ptr<DCPVideo> >::iterator i = _queue.begin(); i != _queue.end(); ++i) {
-               LOG_GENERAL (N_("Encode left-over frame %1"), (*i)->index ());
+       for (auto i: _queue) {
+               LOG_GENERAL(N_("Encode left-over frame %1"), i->index());
                try {
                        _writer->write (
                try {
                        _writer->write (
-                               (*i)->encode_locally(),
-                               (*i)->index(),
-                               (*i)->eyes()
+                               make_shared<dcp::ArrayData>(i->encode_locally()),
+                               i->index(),
+                               i->eyes()
                                );
                        frame_done ();
                } catch (std::exception& e) {
                                );
                        frame_done ();
                } catch (std::exception& e) {
@@ -178,7 +182,11 @@ J2KEncoder::encode (shared_ptr<PlayerVideo> pv, DCPTime time)
 {
        _waker.nudge ();
 
 {
        _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);
 
 
        boost::mutex::scoped_lock queue_lock (_queue_mutex);
 
@@ -198,7 +206,7 @@ J2KEncoder::encode (shared_ptr<PlayerVideo> pv, DCPTime time)
        */
        rethrow ();
 
        */
        rethrow ();
 
-       Frame const position = time.frames_floor(_film->video_frame_rate());
+       auto const position = time.frames_floor(_film->video_frame_rate());
 
        if (_writer->can_fake_write (position)) {
                /* We can fake-write this frame */
 
        if (_writer->can_fake_write (position)) {
                /* We can fake-write this frame */
@@ -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 ());
                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 ());
        } 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 ());
@@ -216,15 +225,13 @@ J2KEncoder::encode (shared_ptr<PlayerVideo> pv, DCPTime time)
                LOG_DEBUG_ENCODE("Frame @ %1 ENCODE", to_string(time));
                /* Queue this new frame for encoding */
                LOG_TIMING ("add-frame-to-queue queue=%1", _queue.size ());
                LOG_DEBUG_ENCODE("Frame @ %1 ENCODE", to_string(time));
                /* Queue this new frame for encoding */
                LOG_TIMING ("add-frame-to-queue queue=%1", _queue.size ());
-               _queue.push_back (shared_ptr<DCPVideo> (
-                                         new DCPVideo (
-                                                 pv,
-                                                 position,
-                                                 _film->video_frame_rate(),
-                                                 _film->j2k_bandwidth(),
-                                                 _film->resolution()
-                                                 )
-                                         ));
+               _queue.push_back (make_shared<DCPVideo>(
+                               pv,
+                               position,
+                               _film->video_frame_rate(),
+                               _film->j2k_bandwidth(),
+                               _film->resolution()
+                               ));
 
                /* The queue might not be empty any more, so notify anything which is
                   waiting on that.
 
                /* The queue might not be empty any more, so notify anything which is
                   waiting on that.
@@ -236,6 +243,8 @@ J2KEncoder::encode (shared_ptr<PlayerVideo> pv, DCPTime time)
        _last_player_video_time = time;
 }
 
        _last_player_video_time = time;
 }
 
+
+/** Caller must hold a lock on _threads_mutex */
 void
 J2KEncoder::terminate_threads ()
 {
 void
 J2KEncoder::terminate_threads ()
 {
@@ -282,7 +291,7 @@ try
                }
 
                LOG_TIMING ("encoder-wake thread=%1 queue=%2", thread_id(), _queue.size());
                }
 
                LOG_TIMING ("encoder-wake thread=%1 queue=%2", thread_id(), _queue.size());
-               shared_ptr<DCPVideo> vf = _queue.front ();
+               auto vf = _queue.front ();
 
                /* We're about to commit to either encoding this frame or putting it back onto the queue,
                   so we must not be interrupted until one or other of these things have happened.  This
 
                /* We're about to commit to either encoding this frame or putting it back onto the queue,
                   so we must not be interrupted until one or other of these things have happened.  This
@@ -296,12 +305,12 @@ try
 
                        lock.unlock ();
 
 
                        lock.unlock ();
 
-                       optional<Data> encoded;
+                       shared_ptr<Data> encoded;
 
                        /* We need to encode this input */
                        if (server) {
                                try {
 
                        /* We need to encode this input */
                        if (server) {
                                try {
-                                       encoded = vf->encode_remotely (server.get ());
+                                       encoded = make_shared<dcp::ArrayData>(vf->encode_remotely(server.get()));
 
                                        if (remote_backoff > 0) {
                                                LOG_GENERAL ("%1 was lost, but now she is found; removing backoff", server->host_name ());
 
                                        if (remote_backoff > 0) {
                                                LOG_GENERAL ("%1 was lost, but now she is found; removing backoff", server->host_name ());
@@ -324,7 +333,7 @@ try
                        } else {
                                try {
                                        LOG_TIMING ("start-local-encode thread=%1 frame=%2", thread_id(), vf->index());
                        } else {
                                try {
                                        LOG_TIMING ("start-local-encode thread=%1 frame=%2", thread_id(), vf->index());
-                                       encoded = vf->encode_locally ();
+                                       encoded = make_shared<dcp::ArrayData>(vf->encode_locally());
                                        LOG_TIMING ("finish-local-encode thread=%1 frame=%2", thread_id(), vf->index());
                                } catch (std::exception& e) {
                                        /* This is very bad, so don't cope with it, just pass it on */
                                        LOG_TIMING ("finish-local-encode thread=%1 frame=%2", thread_id(), vf->index());
                                } catch (std::exception& e) {
                                        /* This is very bad, so don't cope with it, just pass it on */
@@ -334,7 +343,7 @@ try
                        }
 
                        if (encoded) {
                        }
 
                        if (encoded) {
-                               _writer->write (encoded.get(), vf->index (), vf->eyes ());
+                               _writer->write (encoded, vf->index(), vf->eyes());
                                frame_done ();
                        } else {
                                lock.lock ();
                                frame_done ();
                        } else {
                                lock.lock ();
@@ -367,15 +376,17 @@ catch (...)
 void
 J2KEncoder::servers_list_changed ()
 {
 void
 J2KEncoder::servers_list_changed ()
 {
+       boost::mutex::scoped_lock lm (_threads_mutex);
+
        terminate_threads ();
        terminate_threads ();
-       _threads.reset (new boost::thread_group());
+       _threads = make_shared<boost::thread_group>();
 
        /* XXX: could re-use threads */
 
        if (!Config::instance()->only_servers_encode ()) {
                for (int i = 0; i < Config::instance()->master_encoding_threads (); ++i) {
 #ifdef DCPOMATIC_LINUX
 
        /* XXX: could re-use threads */
 
        if (!Config::instance()->only_servers_encode ()) {
                for (int i = 0; i < Config::instance()->master_encoding_threads (); ++i) {
 #ifdef DCPOMATIC_LINUX
-                       boost::thread* t = _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription>()));
+                       auto t = _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription>()));
                        pthread_setname_np (t->native_handle(), "encode-worker");
 #else
                        _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription>()));
                        pthread_setname_np (t->native_handle(), "encode-worker");
 #else
                        _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, optional<EncodeServerDescription>()));
@@ -383,7 +394,7 @@ J2KEncoder::servers_list_changed ()
                }
        }
 
                }
        }
 
-       BOOST_FOREACH (EncodeServerDescription i, EncodeServerFinder::instance()->servers()) {
+       for (auto i: EncodeServerFinder::instance()->servers()) {
                if (!i.current_link_version()) {
                        continue;
                }
                if (!i.current_link_version()) {
                        continue;
                }