X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Futil.cc;h=2d2a63c35aaac629ab5496438180f7f4d6b81e25;hb=1a9554c281720d0bf54295ab16f593ccc0ef3b4e;hp=45b517c7f4f42d254253b5e7f6b5689787dce870;hpb=dd9be86db6cde0afa5da0d1d1ac43b42e05dca26;p=dcpomatic.git diff --git a/src/lib/util.cc b/src/lib/util.cc index 45b517c7f..2d2a63c35 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2020 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -54,14 +54,19 @@ #include #include #include +DCPOMATIC_DISABLE_WARNINGS extern "C" { #include #include #include } +DCPOMATIC_ENABLE_WARNINGS #include #include #include +#include +#include +#include #include #include #include @@ -104,6 +109,7 @@ using std::bad_alloc; using std::set_terminate; using std::make_pair; using std::shared_ptr; +using std::make_shared; using boost::thread; using boost::optional; using boost::lexical_cast; @@ -241,7 +247,7 @@ DCPOMATIC_DISABLE_WARNINGS LONG WINAPI exception_handler(struct _EXCEPTION_POINTERS * info) { - FILE* f = fopen_boost (backtrace_file, "w"); + auto f = fopen_boost (backtrace_file, "w"); fprintf (f, "C-style exception %d\n", info->ExceptionRecord->ExceptionCode); fclose(f); @@ -370,7 +376,7 @@ DCPOMATIC_ENABLE_WARNINGS /* Add our library directory to the libltdl search path so that xmlsec can find xmlsec1-openssl. */ - boost::filesystem::path lib = directory_containing_executable().parent_path(); + auto lib = directory_containing_executable().parent_path(); lib /= "Frameworks"; setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1); #endif @@ -394,11 +400,11 @@ DCPOMATIC_ENABLE_WARNINGS /* Render something to fontconfig to create its cache */ list subs; dcp::SubtitleString ss( - optional(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HALIGN_CENTER, 0, dcp::VALIGN_CENTER, dcp::DIRECTION_LTR, - "Hello dolly", dcp::NONE, dcp::Colour(), dcp::Time(), dcp::Time() + optional(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, dcp::Direction::LTR, + "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time() ); subs.push_back (StringText(ss, 0)); - render_text (subs, list >(), dcp::Size(640, 480), DCPTime(), 24); + render_text (subs, list>(), dcp::Size(640, 480), DCPTime(), 24); #endif Ratio::setup_ratios (); @@ -479,7 +485,7 @@ digest_head_tail (vector files, boost::uintmax_t size) char* p = buffer.get (); int i = 0; while (i < int64_t (files.size()) && to_do > 0) { - FILE* f = fopen_boost (files[i], "rb"); + auto f = fopen_boost (files[i], "rb"); if (!f) { throw OpenFileError (files[i].string(), errno, OpenFileError::READ); } @@ -499,7 +505,7 @@ digest_head_tail (vector files, boost::uintmax_t size) p = buffer.get (); i = files.size() - 1; while (i >= 0 && to_do > 0) { - FILE* f = fopen_boost (files[i], "rb"); + auto f = fopen_boost (files[i], "rb"); if (!f) { throw OpenFileError (files[i].string(), errno, OpenFileError::READ); } @@ -591,7 +597,7 @@ short_audio_channel_name (int c) _("BsR"), _("DBP"), _("DBS"), - "", + _("Sign"), "" }; @@ -606,13 +612,13 @@ valid_image_file (boost::filesystem::path f) return false; } - string ext = f.extension().string(); + auto ext = f.extension().string(); transform (ext.begin(), ext.end(), ext.begin(), ::tolower); return ( ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp" || ext == ".tga" || ext == ".dpx" || ext == ".j2c" || ext == ".j2k" || ext == ".jp2" || ext == ".exr" || - ext == ".jpf" + ext == ".jpf" || ext == ".psd" ); } @@ -623,7 +629,7 @@ valid_sound_file (boost::filesystem::path f) return false; } - string ext = f.extension().string(); + auto ext = f.extension().string(); transform (ext.begin(), ext.end(), ext.begin(), ::tolower); return (ext == ".wav" || ext == ".mp3" || ext == ".aif" || ext == ".aiff"); } @@ -631,7 +637,7 @@ valid_sound_file (boost::filesystem::path f) bool valid_j2k_file (boost::filesystem::path f) { - string ext = f.extension().string(); + auto ext = f.extension().string(); transform (ext.begin(), ext.end(), ext.begin(), ::tolower); return (ext == ".j2k" || ext == ".j2c" || ext == ".jp2"); } @@ -656,7 +662,7 @@ fit_ratio_within (float ratio, dcp::Size full_frame) void * wrapped_av_malloc (size_t s) { - void* p = av_malloc (s); + auto p = av_malloc (s); if (!p) { throw bad_alloc (); } @@ -770,28 +776,20 @@ careful_string_filter (string s) Safety first and all that. */ - wstring ws = boost::locale::conv::utf_to_utf(s); + /* First transliterate using libicu to try to remove accents in a "nice" way */ + auto icu_utf16 = icu::UnicodeString::fromUTF8(icu::StringPiece(s)); + auto status = U_ZERO_ERROR; + auto transliterator = icu::Transliterator::createInstance("NFD; [:M:] Remove; NFC", UTRANS_FORWARD, status); + transliterator->transliterate(icu_utf16); + s.clear (); + icu_utf16.toUTF8String(s); + /* Then remove anything that's not in a very limited character set */ + wstring ws = boost::locale::conv::utf_to_utf(s); string out; string const allowed = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_%.+"; for (size_t i = 0; i < ws.size(); ++i) { - wchar_t c = ws[i]; - - /* Remove some accents */ - if (wstring(L"áàâ").find(c) != string::npos) { - c = 'a'; - } - if (wstring(L"éèêë").find(c) != string::npos) { - c = 'e'; - } - if (wstring(L"ö").find(c) != string::npos) { - c = 'o'; - } - if (wstring(L"ü").find(c) != string::npos) { - c = 'u'; - } - if (allowed.find(c) != string::npos) { out += c; } @@ -810,31 +808,31 @@ audio_channel_types (list mapped, int channels) int non_lfe = 0; int lfe = 0; - BOOST_FOREACH (int i, mapped) { + for (auto i: mapped) { if (i >= channels) { /* This channel is mapped but is not included in the DCP */ continue; } switch (static_cast(i)) { - case dcp::LFE: + case dcp::Channel::LFE: ++lfe; break; - case dcp::LEFT: - case dcp::RIGHT: - case dcp::CENTRE: - case dcp::LS: - case dcp::RS: - case dcp::BSL: - case dcp::BSR: + case dcp::Channel::LEFT: + case dcp::Channel::RIGHT: + case dcp::Channel::CENTRE: + case dcp::Channel::LS: + case dcp::Channel::RS: + case dcp::Channel::BSL: + case dcp::Channel::BSR: ++non_lfe; break; - case dcp::HI: - case dcp::VI: - case dcp::MOTION_DATA: - case dcp::SYNC_SIGNAL: - case dcp::SIGN_LANGUAGE: - case dcp::CHANNEL_COUNT: + case dcp::Channel::HI: + case dcp::Channel::VI: + case dcp::Channel::MOTION_DATA: + case dcp::Channel::SYNC_SIGNAL: + case dcp::Channel::SIGN_LANGUAGE: + case dcp::Channel::CHANNEL_COUNT: break; } } @@ -845,19 +843,19 @@ audio_channel_types (list mapped, int channels) shared_ptr remap (shared_ptr input, int output_channels, AudioMapping map) { - shared_ptr mapped (new AudioBuffers (output_channels, input->frames())); + auto mapped = make_shared(output_channels, input->frames()); mapped->make_silent (); int to_do = min (map.input_channels(), input->channels()); for (int i = 0; i < to_do; ++i) { for (int j = 0; j < mapped->channels(); ++j) { - if (map.get (i, static_cast (j)) > 0) { - mapped->accumulate_channel ( + if (map.get(i, j) > 0) { + mapped->accumulate_channel( input.get(), i, - static_cast (j), - map.get (i, static_cast (j)) + j, + map.get(i, j) ); } } @@ -869,11 +867,11 @@ remap (shared_ptr input, int output_channels, AudioMapping m Eyes increment_eyes (Eyes e) { - if (e == EYES_LEFT) { - return EYES_RIGHT; + if (e == Eyes::LEFT) { + return Eyes::RIGHT; } - return EYES_LEFT; + return Eyes::LEFT; } void @@ -953,33 +951,33 @@ void emit_subtitle_image (ContentTimePeriod period, dcp::SubtitleImage sub, dcp::Size size, shared_ptr decoder) { /* XXX: this is rather inefficient; decoding the image just to get its size */ - FFmpegImageProxy proxy (sub.png_image(), VIDEO_RANGE_FULL); - shared_ptr image = proxy.image().image; + FFmpegImageProxy proxy (sub.png_image()); + auto image = proxy.image().image; /* set up rect with height and width */ dcpomatic::Rect rect(0, 0, image->size().width / double(size.width), image->size().height / double(size.height)); /* add in position */ switch (sub.h_align()) { - case dcp::HALIGN_LEFT: + case dcp::HAlign::LEFT: rect.x += sub.h_position(); break; - case dcp::HALIGN_CENTER: + case dcp::HAlign::CENTER: rect.x += 0.5 + sub.h_position() - rect.width / 2; break; - case dcp::HALIGN_RIGHT: + case dcp::HAlign::RIGHT: rect.x += 1 - sub.h_position() - rect.width; break; } switch (sub.v_align()) { - case dcp::VALIGN_TOP: + case dcp::VAlign::TOP: rect.y += sub.v_position(); break; - case dcp::VALIGN_CENTER: + case dcp::VAlign::CENTER: rect.y += 0.5 + sub.v_position() - rect.height / 2; break; - case dcp::VALIGN_BOTTOM: + case dcp::VAlign::BOTTOM: rect.y += 1 - sub.v_position() - rect.height; break; } @@ -996,7 +994,7 @@ show_jobs_on_console (bool progress) dcpomatic_sleep_seconds (5); - list > jobs = JobManager::instance()->get(); + auto jobs = JobManager::instance()->get(); if (!first && progress) { for (size_t i = 0; i < jobs.size(); ++i) { @@ -1007,7 +1005,7 @@ show_jobs_on_console (bool progress) first = false; - BOOST_FOREACH (shared_ptr i, jobs) { + for (auto i: jobs) { if (progress) { cout << i->name(); if (!i->sub_name().empty()) { @@ -1044,13 +1042,13 @@ show_jobs_on_console (bool progress) /** XXX: could use mmap? */ void -copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, boost::function progress) +copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, std::function progress) { - FILE* f = fopen_boost (from, "rb"); + auto f = fopen_boost (from, "rb"); if (!f) { throw OpenFileError (from, errno, OpenFileError::READ); } - FILE* t = fopen_boost (to, "wb"); + auto t = fopen_boost (to, "wb"); if (!t) { fclose (f); throw OpenFileError (to, errno, OpenFileError::WRITE); @@ -1059,7 +1057,7 @@ copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, boost::f /* on the order of a second's worth of copying */ boost::uintmax_t const chunk = 20 * 1024 * 1024; - uint8_t* buffer = static_cast (malloc(chunk)); + auto buffer = static_cast (malloc(chunk)); if (!buffer) { throw std::bad_alloc (); } @@ -1132,10 +1130,10 @@ decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm) return dcp::DecryptedKDM (kdm, Config::instance()->decryption_chain()->key().get()); } catch (dcp::KDMDecryptionError& e) { /* Try to flesh out the error a bit */ - string const kdm_subject_name = kdm.recipient_x509_subject_name(); + auto const kdm_subject_name = kdm.recipient_x509_subject_name(); bool on_chain = false; - shared_ptr dc = Config::instance()->decryption_chain(); - BOOST_FOREACH (dcp::Certificate i, dc->root_to_leaf()) { + auto dc = Config::instance()->decryption_chain(); + for (auto i: dc->root_to_leaf()) { if (i.subject() == kdm_subject_name) { on_chain = true; } @@ -1171,3 +1169,30 @@ default_font_file () 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 + +#if DCPOMATIC_DEBUG_THREADS +void +start_of_thread (string name) +{ + std::cout << "THREAD:" << name << ":" << std::hex << pthread_self() << "\n"; +} +#else +void +start_of_thread (string) +{ + +} +#endif +