diff options
Diffstat (limited to 'src/lib/j2k_encoder.cc')
| -rw-r--r-- | src/lib/j2k_encoder.cc | 75 |
1 files changed, 60 insertions, 15 deletions
diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index fae7752cf..70f3c32d4 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -26,6 +26,9 @@ #include "j2k_encoder_cpu_backend.h" #include "j2k_encoder_remote_backend.h" +#ifdef DCPOMATIC_FASTVIDEO +#include "j2k_encoder_fastvideo_backend.h" +#endif #include "j2k_encoder.h" #include "util.h" #include "film.h" @@ -60,6 +63,9 @@ using namespace dcpomatic; */ J2KEncoder::J2KEncoder (shared_ptr<const Film> film, shared_ptr<Writer> writer) : _film (film) +#ifdef DCPOMATIC_FASTVIDEO + , _gpu_barrier (Config::instance()->master_encoding_threads()) +#endif , _history (200) , _writer (writer) { @@ -105,6 +111,10 @@ J2KEncoder::end () LOG_GENERAL (N_("Clearing queue of %1"), _queue.size ()); +#ifdef DCPOMATIC_FASTVIDEO + _gpu_barrier.lower(); +#endif + /* Keep waking workers until the queue is empty */ while (!_queue.empty ()) { rethrow (); @@ -341,20 +351,12 @@ catch (...) } -void -J2KEncoder::servers_list_changed () -try +int +J2KEncoder::create_cpu_threads () { - boost::mutex::scoped_lock lm (_threads_mutex); - - terminate_threads (); - _threads = make_shared<boost::thread_group>(); - - _frames_in_parallel = 0; - - /* XXX: could re-use threads */ + int parallel = 0; - if (!Config::instance()->only_servers_encode ()) { + if (!Config::instance()->only_servers_encode()) { auto backend = std::make_shared<J2KEncoderCPUBackend>(); for (int i = 0; i < Config::instance()->master_encoding_threads (); ++i) { #ifdef DCPOMATIC_LINUX @@ -363,7 +365,7 @@ try #else _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, backend)); #endif - _frames_in_parallel += backend->quantity(); + parallel += backend->quantity(); } } @@ -377,11 +379,54 @@ try LOG_GENERAL (N_("Adding %1 worker threads for remote %2"), i.threads(), i.host_name()); for (int j = 0; j < i.threads(); ++j) { _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, backend)); - _frames_in_parallel += backend->quantity(); + parallel += backend->quantity(); } } - _writer->set_encoder_threads (_threads->size()); + return parallel; +} + + +#ifdef DCPOMATIC_FASTVIDEO +int +J2KEncoder::create_fastvideo_threads () +{ + int parallel = 0; + for (int i = 0; i < Config::instance()->master_encoding_threads(); ++i) { + auto backend = std::make_shared<J2KEncoderFastvideoBackend>(_gpu_barrier); + _threads->create_thread(boost::bind(&J2KEncoder::encoder_thread, this, backend)); + parallel += backend->quantity(); + } + return parallel; +} +#endif + + +void +J2KEncoder::servers_list_changed () +try +{ + boost::mutex::scoped_lock lm (_threads_mutex); + + terminate_threads (); + _threads = make_shared<boost::thread_group>(); + + /* XXX: could re-use threads */ + +#ifdef DCPOMATIC_FASTVIDEO + switch (Config::instance()->encoding_backend()) { + case Config::EncodingBackend::CPU: + _frames_in_parallel = create_cpu_threads(); + break; + case Config::EncodingBackend::FASTVIDEO: + _frames_in_parallel = create_fastvideo_threads(); + break; + } +#else + _frames_in_parallel = create_cpu_threads(); +#endif + + _writer->set_encoder_threads (_frames_in_parallel); } catch (...) { terminate_threads (); |
