X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fj2k_encoder.cc;h=5dee5ca35af998c07ed1ebcc76684b25c946563c;hb=0330b684fe616b465e65b67f7d995e659fa83fca;hp=7c6e2347733f361c7054f3bd862b7bf1e2d19357;hpb=9b946fc5250eff5a5dd4a661896916fcd5d9bd4b;p=dcpomatic.git diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 7c6e23477..5dee5ca35 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2019 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,10 +18,12 @@ */ + /** @file src/j2k_encoder.cc * @brief J2K encoder class. */ + #include "j2k_encoder.h" #include "util.h" #include "film.h" @@ -41,6 +43,7 @@ #include "i18n.h" + using std::list; using std::cout; using std::exception; @@ -51,6 +54,7 @@ using boost::optional; using dcp::Data; using namespace dcpomatic; + /** @param film Film that we are encoding. * @param writer Writer that we are using. */ @@ -62,21 +66,24 @@ J2KEncoder::J2KEncoder (shared_ptr film, shared_ptr writer) servers_list_changed (); } + J2KEncoder::~J2KEncoder () { boost::mutex::scoped_lock lm (_threads_mutex); terminate_threads (); } + void J2KEncoder::begin () { - weak_ptr wp = shared_from_this (); + auto wp = shared_from_this (); _server_found_connection = EncodeServerFinder::instance()->ServersListChanged.connect ( boost::bind (&J2KEncoder::call_servers_list_changed, wp) ); } + /* 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. @@ -90,6 +97,7 @@ J2KEncoder::call_servers_list_changed (weak_ptr encoder) } } + void J2KEncoder::end () { @@ -142,6 +150,7 @@ J2KEncoder::end () } } + /** @return an estimate of the current number of frames we are encoding per second, * if known. */ @@ -151,6 +160,7 @@ J2KEncoder::current_encoding_rate () const return _history.rate (); } + /** @return Number of video frames that have been queued for encoding */ int J2KEncoder::video_frames_enqueued () const @@ -162,6 +172,7 @@ J2KEncoder::video_frames_enqueued () const return _last_player_video_time->frames_floor (_film->video_frame_rate ()); } + /** Should be called when a frame has been encoded successfully */ void J2KEncoder::frame_done () @@ -169,6 +180,7 @@ J2KEncoder::frame_done () _history.event (); } + /** Called to request encoding of the next video frame in the DCP. This is called in order, * so each time the supplied frame is the one after the previous one. * pv represents one video frame, and could be empty if there is nothing to encode @@ -218,7 +230,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime 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()])) { + } else if (_last_player_video[static_cast(pv->eyes())] && _writer->can_repeat(position) && pv->same (_last_player_video[static_cast(pv->eyes())])) { LOG_DEBUG_ENCODE("Frame @ %1 REPEAT", to_string(time)); _writer->repeat (position, pv->eyes ()); } else { @@ -239,7 +251,7 @@ J2KEncoder::encode (shared_ptr pv, DCPTime time) _empty_condition.notify_all (); } - _last_player_video[pv->eyes()] = pv; + _last_player_video[static_cast(pv->eyes())] = pv; _last_player_video_time = time; } @@ -266,10 +278,13 @@ J2KEncoder::terminate_threads () _threads.reset (); } + 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 { @@ -373,6 +388,7 @@ catch (...) _full_condition.notify_all (); } + void J2KEncoder::servers_list_changed () {