#include "cinema_sound_processor.h"
#include "compose.hpp"
#include "config.h"
+#include "constants.h"
#include "cross.h"
#include "crypto.h"
#include "dcp_content_type.h"
+#include "dcpomatic_log.h"
#include "digester.h"
#include "exceptions.h"
#include "ffmpeg_image_proxy.h"
/* Render something to fontconfig to create its cache */
list<StringText> subs;
dcp::SubtitleString ss(
- optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, dcp::Direction::LTR,
+ optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR,
"Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0
);
- subs.push_back (StringText(ss, 0));
- render_text (subs, list<shared_ptr<Font>>(), dcp::Size(640, 480), DCPTime(), 24);
+ subs.push_back (StringText(ss, 0, {}, dcp::Standard::SMPTE));
+ render_text (subs, dcp::Size(640, 480), DCPTime(), 24);
#endif
Ratio::setup_ratios ();
curl_global_init (CURL_GLOBAL_ALL);
ui_thread = boost::this_thread::get_id ();
+
+ capture_asdcp_logs ();
}
#ifdef DCPOMATIC_WINDOWS
_("Rs"),
_("HI"),
_("VI"),
- _("Lc"),
- _("Rc"),
+ _("9"),
+ _("10"),
_("BsL"),
_("BsR"),
_("DBP"),
_("DBS"),
_("Sign"),
- ""
+ _("16")
};
return channels[c];
return dcp::Size (full_frame.width, lrintf (full_frame.width / ratio));
}
-map<string, string>
-split_get_request (string url)
-{
- enum {
- AWAITING_QUESTION_MARK,
- KEY,
- VALUE
- } state = AWAITING_QUESTION_MARK;
-
- map<string, string> r;
- string k;
- string v;
- for (size_t i = 0; i < url.length(); ++i) {
- switch (state) {
- case AWAITING_QUESTION_MARK:
- if (url[i] == '?') {
- state = KEY;
- }
- break;
- case KEY:
- if (url[i] == '=') {
- v.clear ();
- state = VALUE;
- } else {
- k += url[i];
- }
- break;
- case VALUE:
- if (url[i] == '&') {
- r.insert (make_pair (k, v));
- k.clear ();
- state = KEY;
- } else {
- v += url[i];
- }
- break;
- }
- }
-
- if (state == VALUE) {
- r.insert (make_pair (k, v));
- }
-
- return r;
-}
-
-
static
string
asset_filename (shared_ptr<dcp::Asset> asset, string type, int reel_index, int reel_count, optional<string> summary, string extension)
}
-float
-relaxed_string_to_float (string s)
-{
- try {
- boost::algorithm::replace_all (s, ",", ".");
- return lexical_cast<float> (s);
- } catch (bad_lexical_cast &) {
- boost::algorithm::replace_all (s, ".", ",");
- return lexical_cast<float> (s);
- }
-}
-
string
careful_string_filter (string s)
{
return N;
}
-string
-day_of_week_to_string (boost::gregorian::greg_weekday d)
-{
- switch (d.as_enum()) {
- case boost::date_time::Sunday:
- return _("Sunday");
- case boost::date_time::Monday:
- return _("Monday");
- case boost::date_time::Tuesday:
- return _("Tuesday");
- case boost::date_time::Wednesday:
- return _("Wednesday");
- case boost::date_time::Thursday:
- return _("Thursday");
- case boost::date_time::Friday:
- return _("Friday");
- case boost::date_time::Saturday:
- return _("Saturday");
- }
-
- return d.as_long_string ();
-}
/** @param size Size of picture that the subtitle will be overlaid onto */
void
decoder->emit_bitmap (period, image, rect);
}
-bool
-show_jobs_on_console (bool progress)
-{
- bool first = true;
- bool error = false;
- while (true) {
-
- dcpomatic_sleep_seconds (5);
-
- auto jobs = JobManager::instance()->get();
-
- if (!first && progress) {
- for (size_t i = 0; i < jobs.size(); ++i) {
- cout << "\033[1A\033[2K";
- }
- cout.flush ();
- }
-
- first = false;
-
- for (auto i: jobs) {
- if (progress) {
- cout << i->name();
- if (!i->sub_name().empty()) {
- cout << "; " << i->sub_name();
- }
- cout << ": ";
-
- if (i->progress ()) {
- cout << i->status() << " \n";
- } else {
- cout << ": Running \n";
- }
- }
-
- if (!progress && i->finished_in_error()) {
- /* We won't see this error if we haven't been showing progress,
- so show it now.
- */
- cout << i->status() << "\n";
- }
-
- if (i->finished_in_error()) {
- error = true;
- }
- }
-
- if (!JobManager::instance()->work_to_do()) {
- break;
- }
- }
-
- return error;
-}
/** XXX: could use mmap? */
void
if (!boost::filesystem::exists(liberation_normal)) {
liberation_normal = "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf";
}
+ if (!boost::filesystem::exists(liberation_normal)) {
+ liberation_normal = "/usr/share/fonts/liberation-sans/LiberationSans-Regular.ttf";
+ }
return liberation_normal;
}
-string
-to_upper (string s)
-{
- transform (s.begin(), s.end(), s.begin(), ::toupper);
- return s;
-}
-
-
/* Set to 1 to print the IDs of some of our threads to stdout on creation */
#define DCPOMATIC_DEBUG_THREADS 0
}
#endif
+
+class LogSink : public Kumu::ILogSink
+{
+public:
+ LogSink () {}
+ LogSink (LogSink const&) = delete;
+ LogSink& operator= (LogSink const&) = delete;
+
+ void WriteEntry(const Kumu::LogEntry& entry) override {
+ Kumu::AutoMutex L(m_lock);
+ WriteEntryToListeners(entry);
+ if (entry.TestFilter(m_filter)) {
+ string buffer;
+ entry.CreateStringWithOptions(buffer, m_options);
+ LOG_GENERAL("asdcplib: %1", buffer);
+ }
+ }
+};
+
+
+void
+capture_asdcp_logs ()
+{
+ static LogSink log_sink;
+ Kumu::SetDefaultLogSink(&log_sink);
+}
+
+
+string
+error_details(boost::system::error_code ec)
+{
+ return String::compose("%1:%2:%3", ec.category().name(), ec.value(), ec.message());
+}
+
+
+bool
+contains_assetmap(boost::filesystem::path dir)
+{
+ return boost::filesystem::is_regular_file(dir / "ASSETMAP") || boost::filesystem::is_regular_file(dir / "ASSETMAP.xml");
+}
+