X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Futil.cc;h=d3af74376a3cd2349eeceafa9ab3ab35f5dc9423;hb=67ff55886b1ee86d99c2ea27d10c73b85b0504b7;hp=78fac8b3a101b44f4dc0e44ee2d9bacca4860713;hpb=28111007e2e6fd62f5810be780706ae1618bd33f;p=dcpomatic.git diff --git a/src/lib/util.cc b/src/lib/util.cc index 78fac8b3a..d3af74376 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -22,29 +22,33 @@ * @brief Some utility functions and classes. */ -#include "util.h" -#include "exceptions.h" -#include "dcp_content_type.h" -#include "filter.h" + +#define UNICODE 1 + + +#include "audio_buffers.h" +#include "audio_processor.h" #include "cinema_sound_processor.h" +#include "compose.hpp" #include "config.h" -#include "ratio.h" -#include "job.h" #include "cross.h" -#include "video_content.h" -#include "rect.h" -#include "digester.h" -#include "audio_processor.h" #include "crypto.h" -#include "compose.hpp" -#include "audio_buffers.h" -#include "string_text.h" -#include "font.h" -#include "render_text.h" +#include "dcp_content_type.h" +#include "digester.h" +#include "exceptions.h" #include "ffmpeg_image_proxy.h" +#include "filter.h" +#include "font.h" #include "image.h" -#include "text_decoder.h" +#include "job.h" #include "job_manager.h" +#include "ratio.h" +#include "rect.h" +#include "render_text.h" +#include "string_text.h" +#include "text_decoder.h" +#include "util.h" +#include "video_content.h" #include "warnings.h" #include #include @@ -54,14 +58,19 @@ #include #include #include +DCPOMATIC_DISABLE_WARNINGS extern "C" { #include #include #include } +DCPOMATIC_ENABLE_WARNINGS #include #include #include +#include +#include +#include #include #include #include @@ -86,25 +95,23 @@ DCPOMATIC_ENABLE_WARNINGS #include "i18n.h" -using std::string; -using std::wstring; -using std::setfill; -using std::ostream; + +using std::bad_alloc; +using std::cout; using std::endl; -using std::vector; -using std::min; -using std::max; -using std::map; -using std::list; -using std::multimap; using std::istream; +using std::list; +using std::make_pair; +using std::make_shared; +using std::map; +using std::min; +using std::ostream; using std::pair; -using std::cout; -using std::bad_alloc; using std::set_terminate; -using std::make_pair; using std::shared_ptr; -using std::make_shared; +using std::string; +using std::vector; +using std::wstring; using boost::thread; using boost::optional; using boost::lexical_cast; @@ -115,6 +122,7 @@ using dcp::raw_convert; using dcp::locale_convert; using namespace dcpomatic; + /** Path to our executable, required by the stacktrace stuff and filled * in during App::onInit(). */ @@ -362,10 +370,12 @@ dcpomatic_setup () SetUnhandledExceptionFilter(exception_handler); #endif +#ifdef DCPOMATIC_HAVE_AVREGISTER DCPOMATIC_DISABLE_WARNINGS av_register_all (); avfilter_register_all (); DCPOMATIC_ENABLE_WARNINGS +#endif #ifdef DCPOMATIC_OSX /* Add our library directory to the libltdl search path so that @@ -395,8 +405,8 @@ 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); @@ -592,7 +602,7 @@ short_audio_channel_name (int c) _("BsR"), _("DBP"), _("DBS"), - "", + _("Sign"), "" }; @@ -613,7 +623,7 @@ valid_image_file (boost::filesystem::path f) 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" ); } @@ -771,28 +781,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; } @@ -870,11 +872,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 @@ -954,8 +956,8 @@ 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); - auto image = proxy.image().image; + FFmpegImageProxy proxy (sub.png_image()); + auto image = proxy.image(Image::Alignment::PADDED).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)); @@ -1045,7 +1047,7 @@ 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) { auto f = fopen_boost (from, "rb"); if (!f) { @@ -1172,3 +1174,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 +