+
+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");
+}
+
+
+bool
+contains_sign_language(ContentList const& content)
+{
+ return std::any_of(
+ content.begin(),
+ content.end(),
+ [](shared_ptr<const Content> c) {
+ return c->video && c->video->type() == VideoType::SIGN_LANGUAGE;
+ });
+}
+
+
+void
+ffmpeg_log_callback(void* ptr, int level, const char* fmt, va_list vl)
+{
+ if (level > AV_LOG_WARNING) {
+ return;
+ }
+
+ char line[1024];
+ static int prefix = 0;
+ av_log_format_line(ptr, level, fmt, vl, line, sizeof(line), &prefix);
+ string str(line);
+ boost::algorithm::trim(str);
+ dcpomatic_log->log(String::compose("FFmpeg: %1", str), LogEntry::TYPE_GENERAL);
+}
+