#pragma once
+
#include "../config.h"
#include "../dcp_video.h"
#include "../film.h"
#include "../writer.h"
#include "messenger.h"
#include <dcp/array_data.h>
+#include <boost/filesystem.hpp>
static std::mutex launchMutex;
uint32_t height_;
};
-class GrokContext {
+
+class GrokContext
+{
public:
- explicit GrokContext(const DcpomaticContext &dcpomaticContext) :
- dcpomaticContext_(dcpomaticContext),
+ explicit GrokContext(DcpomaticContext* dcpomatic_context) :
+ _dcpomatic_context(dcpomatic_context),
messenger_(nullptr),
- launched_(false)
+ launched_(false),
+ launchFailed_(false)
{
if (Config::instance()->enable_gpu ()) {
- boost::filesystem::path folder(dcpomaticContext_._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", dcpomaticContext_._location.c_str()
+ "Invalid binary location %s", _dcpomatic_context->_location.c_str()
);
return;
}
[this](FrameProxy srcFrame, uint8_t* compressed, uint32_t compressedFrameLength)
{
auto compressed_data = std::make_shared<dcp::ArrayData>(compressed, compressedFrameLength);
- dcpomaticContext_.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;
}
auto encoded = std::make_shared<dcp::ArrayData>(fp->vf.encode_locally());
- dcpomaticContext_.writer_.write(encoded, fp->vf.index(), fp->vf.eyes());
+ _dcpomatic_context->writer_.write(encoded, fp->vf.index(), fp->vf.eyes());
frame_done ();
}
}
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();
- dcpomaticContext_.setDimensions(s.width, s.height);
+ _dcpomatic_context->setDimensions(s.width, s.height);
auto config = Config::instance();
- messenger_->launchGrok(
- dcpomaticContext_._location,
- dcpomaticContext_.width_,dcpomaticContext_.width_,
- dcpomaticContext_.height_,
- 3, 12, device,
- dcpomaticContext_.film_->resolution() == Resolution::FOUR_K,
- dcpomaticContext_.film_->video_frame_rate(),
- dcpomaticContext_.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_;
}
messenger_ = nullptr;
}
void frame_done () {
- dcpomaticContext_.history_.event ();
+ _dcpomatic_context->history_.event();
}
private:
- DcpomaticContext dcpomaticContext_;
+ DcpomaticContext* _dcpomatic_context;
ScheduledMessenger<FrameProxy> *messenger_;
bool launched_;
+ bool launchFailed_;
};
}