Merge remote-tracking branch 'origin/main' into v2.17.x
[dcpomatic.git] / src / lib / j2k_encoder.cc
index 7d695245a05a68032e5a6bb3fa73ec81ea9803cc..de229113b3a93234f9af47d91c17c1133ae8575f 100644 (file)
@@ -34,6 +34,7 @@
 #include "film.h"
 #include "cpu_j2k_encoder_thread.h"
 #ifdef DCPOMATIC_GROK
+#include "grok/context.h"
 #include "grok_j2k_encoder_thread.h"
 #endif
 #include "remote_j2k_encoder_thread.h"
@@ -59,6 +60,33 @@ using boost::optional;
 using dcp::Data;
 using namespace dcpomatic;
 
+#ifdef DCPOMATIC_GROK
+
+namespace grk_plugin {
+
+IMessengerLogger* sLogger = nullptr;
+
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+void setMessengerLogger(grk_plugin::IMessengerLogger* logger)
+{
+       delete sLogger;
+       sLogger = logger;
+}
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
+grk_plugin::IMessengerLogger* getMessengerLogger(void)
+{
+       return sLogger;
+}
+
+}
+
+#endif
+
 
 /** @param film Film that we are encoding.
  *  @param writer Writer that we are using.
@@ -67,11 +95,14 @@ J2KEncoder::J2KEncoder(shared_ptr<const Film> film, Writer& writer)
        : _film (film)
        , _history (200)
        , _writer (writer)
+{
 #ifdef DCPOMATIC_GROK
-       , _dcpomatic_context(film, writer, _history, Config::instance()->gpu_binary_location())
-       , _context(Config::instance()->enable_gpu() ? new grk_plugin::GrokContext(_dcpomatic_context) : nullptr)
+       auto grok = Config::instance()->grok().get_value_or({});
+       _dcpomatic_context = new grk_plugin::DcpomaticContext(film, writer, _history, grok.binary_location);
+       if (grok.enable) {
+               _context = new grk_plugin::GrokContext(_dcpomatic_context);
+       }
 #endif
-{
 }
 
 
@@ -83,6 +114,7 @@ J2KEncoder::~J2KEncoder ()
 
 #ifdef DCPOMATIC_GROK
        delete _context;
+       delete _dcpomatic_context;
 #endif
 }
 
@@ -91,9 +123,14 @@ void
 J2KEncoder::servers_list_changed()
 {
        auto config = Config::instance();
+#ifdef DCPOMATIC_GROK
+       auto const grok_enable = config->grok().get_value_or({}).enable;
+#else
+       auto const grok_enable = false;
+#endif
 
-       auto const cpu = (config->enable_gpu() || config->only_servers_encode()) ? 0 : config->master_encoding_threads();
-       auto const gpu = config->enable_gpu() ? config->master_encoding_threads() : 0;
+       auto const cpu = (grok_enable || config->only_servers_encode()) ? 0 : config->master_encoding_threads();
+       auto const gpu = grok_enable ? config->master_encoding_threads() : 0;
 
        remake_threads(cpu, gpu, EncodeServerFinder::instance()->servers());
 }
@@ -112,16 +149,17 @@ J2KEncoder::begin ()
 void
 J2KEncoder::pause()
 {
-       if (!Config::instance()->enable_gpu()) {
+#ifdef DCPOMATIC_GROK
+       if (!Config::instance()->grok().get_value_or({}).enable) {
                return;
        }
+       return;
 
        terminate_threads ();
 
        /* Something might have been thrown during terminate_threads */
        rethrow ();
 
-#ifdef DCPOMATIC_GROK
        delete _context;
        _context = nullptr;
 #endif
@@ -130,14 +168,14 @@ J2KEncoder::pause()
 
 void J2KEncoder::resume()
 {
-       if (!Config::instance()->enable_gpu()) {
+#ifdef DCPOMATIC_GROK
+       if (!Config::instance()->grok().get_value_or({}).enable) {
                return;
        }
 
-#ifdef DCPOMATIC_GROK
        _context = new grk_plugin::GrokContext(_dcpomatic_context);
-#endif
        servers_list_changed();
+#endif
 }
 
 
@@ -174,7 +212,7 @@ J2KEncoder::end()
        */
        for (auto & i: _queue) {
 #ifdef DCPOMATIC_GROK
-               if (Config::instance()->enable_gpu ()) {
+               if (Config::instance()->grok().get_value_or({}).enable) {
                        if (!_context->scheduleCompress(i)){
                                LOG_GENERAL (N_("[%1] J2KEncoder thread pushes frame %2 back onto queue after failure"), thread_id(), i.index());
                                // handle error
@@ -326,12 +364,10 @@ J2KEncoder::terminate_threads ()
 
 
 void
-#ifdef DCPOMATIC_GROK
 J2KEncoder::remake_threads(int cpu, int gpu, list<EncodeServerDescription> servers)
-#else
-J2KEncoder::remake_threads(int cpu, int, list<EncodeServerDescription> servers)
-#endif
 {
+       LOG_GENERAL("Making threads: CPU=%1, GPU=%2, Remote=%3", cpu, gpu, servers.size());
+
        boost::mutex::scoped_lock lm (_threads_mutex);
        if (_ending) {
                return;