Cleanup: include ordering.
[dcpomatic.git] / src / lib / grok / context.h
index 1aac6f177ed15f724d5c76dd530ecb374f4f88a9..6b27eb7a83ada16b3105aade317ea8e591c3d593 100644 (file)
@@ -20,6 +20,7 @@
 
 #pragma once
 
+
 #include "../config.h"
 #include "../dcp_video.h"
 #include "../film.h"
@@ -28,6 +29,7 @@
 #include "../writer.h"
 #include "messenger.h"
 #include <dcp/array_data.h>
+#include <boost/filesystem.hpp>
 
 
 static std::mutex launchMutex;
@@ -106,17 +108,18 @@ struct DcpomaticContext {
 class GrokContext
 {
 public:
-       explicit GrokContext(DcpomaticContext const& dcpomatic_context)
-               : _dcpomatic_context(dcpomatic_context)
-               , messenger_(nullptr)
-               , launched_(false)
+       explicit GrokContext(DcpomaticContext* dcpomatic_context) :
+                                                               _dcpomatic_context(dcpomatic_context),
+                                                               messenger_(nullptr),
+                                                               launched_(false),
+                                                               launchFailed_(false)
        {
                if (Config::instance()->enable_gpu ())  {
-                   boost::filesystem::path folder(_dcpomatic_context._location);
+                   boost::filesystem::path folder(_dcpomatic_context->_location);
                    boost::filesystem::path binaryPath = folder / "grk_compress";
                    if (!boost::filesystem::exists(binaryPath)) {
                            getMessengerLogger()->error(
-                                   "Invalid binary location %s", _dcpomatic_context._location.c_str()
+                                   "Invalid binary location %s", _dcpomatic_context->_location.c_str()
                                    );
                            return;
                    }
@@ -134,7 +137,7 @@ public:
                                                                [this](FrameProxy srcFrame, uint8_t* compressed, uint32_t compressedFrameLength)
                                                {
                                                        auto compressed_data = std::make_shared<dcp::ArrayData>(compressed, compressedFrameLength);
-                                                       _dcpomatic_context.writer_.write(compressed_data, srcFrame.index(), srcFrame.eyes());
+                                                       _dcpomatic_context->writer_.write(compressed_data, srcFrame.index(), srcFrame.eyes());
                                                        frame_done ();
                                                };
                                                int const minimum_size = 16384;
@@ -147,7 +150,7 @@ public:
                                                        }
 
                                                        auto encoded = std::make_shared<dcp::ArrayData>(fp->vf.encode_locally());
-                                                       _dcpomatic_context.writer_.write(encoded, fp->vf.index(), fp->vf.eyes());
+                                                       _dcpomatic_context->writer_.write(encoded, fp->vf.index(), fp->vf.eyes());
                                                        frame_done ();
                                                }
                                        }
@@ -166,33 +169,46 @@ public:
                shutdown();
        }
        bool launch(DCPVideo dcpv, int device){
+               namespace fs = boost::filesystem;
+
                if (!messenger_ )
                        return false;
                if (launched_)
                        return true;
+               if (launchFailed_)
+                       return false;
                std::unique_lock<std::mutex> lk_global(launchMutex);
                if (!messenger_)
                        return false;
                if (launched_)
                        return true;
+               if (launchFailed_)
+                       return false;
                if (MessengerInit::firstLaunch(true)) {
+
+                   if (!fs::exists(_dcpomatic_context->_location) || !fs::is_directory(_dcpomatic_context->_location)) {
+                       getMessengerLogger()->error("Invalid directory %s", _dcpomatic_context->_location.c_str());
+                               return false;
+                   }
                        auto s = dcpv.get_size();
-                       _dcpomatic_context.setDimensions(s.width, s.height);
+                       _dcpomatic_context->setDimensions(s.width, s.height);
                        auto config = Config::instance();
-                       messenger_->launchGrok(
-                               _dcpomatic_context._location,
-                               _dcpomatic_context.width_,_dcpomatic_context.width_,
-                               _dcpomatic_context.height_,
-                               3, 12, device,
-                               _dcpomatic_context.film_->resolution() == Resolution::FOUR_K,
-                               _dcpomatic_context.film_->video_frame_rate(),
-                               _dcpomatic_context.film_->j2k_bandwidth(),
-                               config->gpu_license_server(),
-                               config->gpu_license_port(),
-                               config->gpu_license()
-                               );
+                       if (!messenger_->launchGrok(_dcpomatic_context->_location,
+                                       _dcpomatic_context->width_,_dcpomatic_context->width_,
+                                       _dcpomatic_context->height_,
+                                       3, 12, device,
+                                       _dcpomatic_context->film_->resolution() == Resolution::FOUR_K,
+                                       _dcpomatic_context->film_->video_frame_rate(),
+                                       _dcpomatic_context->film_->j2k_bandwidth(),
+                                       config->gpu_license_server(),
+                                       config->gpu_license_port(),
+                                       config->gpu_license())) {
+                               launchFailed_ = true;
+                               return false;
+                       }
                }
                launched_ =  messenger_->waitForClientInit();
+               launchFailed_ = launched_;
 
                return launched_;
        }
@@ -220,12 +236,13 @@ public:
                messenger_ = nullptr;
        }
        void frame_done () {
-               _dcpomatic_context.history_.event();
+               _dcpomatic_context->history_.event();
        }
 private:
-       DcpomaticContext _dcpomatic_context;
+       DcpomaticContext* _dcpomatic_context;
        ScheduledMessenger<FrameProxy> *messenger_;
        bool launched_;
+       bool launchFailed_;
 };
 
 }