X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fj2k_encoder.cc;h=d2e840f85f2a87ce647789321525fb5a14782bad;hb=a988cabec09c28ba11a0e46f0acdc564aa04baca;hp=c2553854bf5241e193e139987c1f6503956f7892;hpb=3339d3bce70afe9ae2ca10e9fcfc4b54b748fbf4;p=dcpomatic.git diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index c2553854b..d2e840f85 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -24,32 +24,31 @@ */ -#include "j2k_encoder.h" -#include "util.h" -#include "film.h" -#include "log.h" -#include "dcpomatic_log.h" +#include "compose.hpp" #include "config.h" -#include "dcp_video.h" #include "cross.h" -#include "writer.h" +#include "dcp_video.h" +#include "dcpomatic_log.h" +#include "encode_server_description.h" #include "encode_server_finder.h" -#include "player.h" +#include "film.h" +#include "j2k_encoder.h" +#include "log.h" #include "player_video.h" -#include "encode_server_description.h" -#include "compose.hpp" +#include "util.h" +#include "writer.h" #include #include #include "i18n.h" -using std::list; using std::cout; using std::exception; +using std::list; +using std::make_shared; using std::shared_ptr; using std::weak_ptr; -using std::make_shared; using boost::optional; using dcp::Data; using namespace dcpomatic; @@ -58,7 +57,7 @@ using namespace dcpomatic; /** @param film Film that we are encoding. * @param writer Writer that we are using. */ -J2KEncoder::J2KEncoder (shared_ptr film, shared_ptr writer) +J2KEncoder::J2KEncoder(shared_ptr film, Writer& writer) : _film (film) , _history (200) , _writer (writer) @@ -69,6 +68,8 @@ J2KEncoder::J2KEncoder (shared_ptr film, shared_ptr writer) J2KEncoder::~J2KEncoder () { + _server_found_connection.disconnect(); + boost::mutex::scoped_lock lm (_threads_mutex); terminate_threads (); } @@ -77,27 +78,12 @@ J2KEncoder::~J2KEncoder () void J2KEncoder::begin () { - auto wp = shared_from_this (); - _server_found_connection = EncodeServerFinder::instance()->ServersListChanged.connect ( - boost::bind (&J2KEncoder::call_servers_list_changed, wp) + _server_found_connection = EncodeServerFinder::instance()->ServersListChanged.connect( + boost::bind(&J2KEncoder::servers_list_changed, this) ); } -/* We don't want the servers-list-changed callback trying to do things - during destruction of J2KEncoder, and I think this is the neatest way - to achieve that. -*/ -void -J2KEncoder::call_servers_list_changed (weak_ptr encoder) -{ - auto e = encoder.lock (); - if (e) { - e->servers_list_changed (); - } -} - - void J2KEncoder::end () { @@ -135,13 +121,13 @@ J2KEncoder::end () So just mop up anything left in the queue here. */ - for (auto i: _queue) { - LOG_GENERAL(N_("Encode left-over frame %1"), i->index()); + for (auto const& i: _queue) { + LOG_GENERAL(N_("Encode left-over frame %1"), i.index()); try { - _writer->write ( - make_shared(i->encode_locally()), - i->index(), - i->eyes() + _writer.write( + make_shared(i.encode_locally()), + i.index(), + i.eyes() ); frame_done (); } catch (std::exception& e) { @@ -211,7 +197,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) LOG_TIMING ("decoder-wake queue=%1 threads=%2", _queue.size(), threads); } - _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. @@ -220,24 +206,24 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) auto const position = time.frames_floor(_film->video_frame_rate()); - if (_writer->can_fake_write (position)) { + if (_writer.can_fake_write(position)) { /* We can fake-write this frame */ LOG_DEBUG_ENCODE("Frame @ %1 FAKE", to_string(time)); - _writer->fake_write (position, pv->eyes ()); + _writer.fake_write(position, pv->eyes ()); frame_done (); } else if (pv->has_j2k() && !_film->reencode_j2k()) { 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 ()); + _writer.write(pv->j2k(), position, pv->eyes ()); frame_done (); - } else if (_last_player_video[static_cast(pv->eyes())] && _writer->can_repeat(position) && pv->same (_last_player_video[static_cast(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 ()); + _writer.repeat(position, pv->eyes()); } else { 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 (make_shared( + _queue.push_back (DCPVideo( pv, position, _film->video_frame_rate(), @@ -251,7 +237,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) _empty_condition.notify_all (); } - _last_player_video[static_cast(pv->eyes())] = pv; + _last_player_video[pv->eyes()] = pv; _last_player_video_time = time; } @@ -283,6 +269,8 @@ void J2KEncoder::encoder_thread (optional server) try { + start_of_thread ("J2KEncoder"); + if (server) { LOG_TIMING ("start-encoder-thread thread=%1 server=%2", thread_id (), server->host_name ()); } else { @@ -313,7 +301,7 @@ try { boost::this_thread::disable_interruption dis; - LOG_TIMING ("encoder-pop thread=%1 frame=%2 eyes=%3", thread_id(), vf->index(), (int) vf->eyes ()); + LOG_TIMING ("encoder-pop thread=%1 frame=%2 eyes=%3", thread_id(), vf.index(), static_cast(vf.eyes())); _queue.pop_front (); lock.unlock (); @@ -323,7 +311,7 @@ try /* We need to encode this input */ if (server) { try { - encoded = make_shared(vf->encode_remotely(server.get())); + encoded = make_shared(vf.encode_remotely(server.get())); if (remote_backoff > 0) { LOG_GENERAL ("%1 was lost, but now she is found; removing backoff", server->host_name ()); @@ -339,15 +327,15 @@ try } LOG_ERROR ( N_("Remote encode of %1 on %2 failed (%3); thread sleeping for %4s"), - vf->index(), server->host_name(), e.what(), remote_backoff + vf.index(), server->host_name(), e.what(), remote_backoff ); } } else { try { - LOG_TIMING ("start-local-encode thread=%1 frame=%2", thread_id(), vf->index()); - encoded = make_shared(vf->encode_locally()); - LOG_TIMING ("finish-local-encode thread=%1 frame=%2", thread_id(), vf->index()); + LOG_TIMING ("start-local-encode thread=%1 frame=%2", thread_id(), vf.index()); + encoded = make_shared(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_ERROR (N_("Local encode failed (%1)"), e.what ()); @@ -356,11 +344,11 @@ try } if (encoded) { - _writer->write (encoded, vf->index(), vf->eyes()); + _writer.write(encoded, vf.index(), vf.eyes()); frame_done (); } else { lock.lock (); - LOG_GENERAL (N_("[%1] J2KEncoder thread pushes frame %2 back onto queue after failure"), thread_id(), vf->index()); + LOG_GENERAL (N_("[%1] J2KEncoder thread pushes frame %2 back onto queue after failure"), thread_id(), vf.index()); _queue.push_front (vf); lock.unlock (); } @@ -419,5 +407,5 @@ J2KEncoder::servers_list_changed () } } - _writer->set_encoder_threads (_threads->size()); + _writer.set_encoder_threads(_threads->size()); }