diff options
Diffstat (limited to 'src/lib/util.cc')
| -rw-r--r-- | src/lib/util.cc | 92 |
1 files changed, 69 insertions, 23 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc index 8b767cd15..bf753d04d 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -49,17 +49,19 @@ #include "string_text.h" #include "text_decoder.h" #include "util.h" +#include "variant.h" #include "video_content.h" #include <dcp/atmos_asset.h> #include <dcp/decrypted_kdm.h> #include <dcp/file.h> #include <dcp/filesystem.h> #include <dcp/locale_convert.h> +#include <dcp/mpeg2_picture_asset.h> #include <dcp/picture_asset.h> #include <dcp/raw_convert.h> #include <dcp/scope_guard.h> #include <dcp/sound_asset.h> -#include <dcp/subtitle_asset.h> +#include <dcp/text_asset.h> #include <dcp/util.h> #include <dcp/warnings.h> LIBDCP_DISABLE_WARNINGS @@ -87,10 +89,11 @@ LIBDCP_ENABLE_WARNINGS #include <dbghelp.h> #endif #include <signal.h> +#include <climits> #include <iomanip> #include <iostream> #include <fstream> -#include <climits> +#include <numeric> #include <stdexcept> #ifdef DCPOMATIC_POSIX #include <execinfo.h> @@ -102,6 +105,7 @@ LIBDCP_ENABLE_WARNINGS using std::bad_alloc; using std::cout; +using std::dynamic_pointer_cast; using std::endl; using std::istream; using std::list; @@ -118,9 +122,6 @@ using std::vector; using std::wstring; using boost::thread; using boost::optional; -using boost::lexical_cast; -using boost::bad_lexical_cast; -using boost::scoped_array; using dcp::Size; using dcp::raw_convert; using dcp::locale_convert; @@ -243,6 +244,7 @@ addr2line (void const * const addr) { char addr2line_cmd[512] = { 0 }; sprintf (addr2line_cmd, "addr2line -f -p -e %.256s %p > %s", program_name.c_str(), addr, backtrace_file.string().c_str()); + std::cout << addr2line_cmd << "\n"; return system(addr2line_cmd); } @@ -428,6 +430,11 @@ dcpomatic_setup () SetUnhandledExceptionFilter(exception_handler); #endif +#ifdef DCPOMATIC_GROK + /* This makes grok support work with CUDA 12.2 */ + setenv("CUDA_MODULE_LOADING", "EAGER", 1); +#endif + #ifdef DCPOMATIC_HAVE_AVREGISTER LIBDCP_DISABLE_WARNINGS av_register_all (); @@ -468,7 +475,7 @@ LIBDCP_ENABLE_WARNINGS #if defined(DCPOMATIC_WINDOWS) || defined(DCPOMATIC_OSX) /* Render something to fontconfig to create its cache */ vector<StringText> subs; - dcp::SubtitleString ss( + dcp::TextString ss( 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, std::vector<dcp::Ruby>() ); @@ -509,7 +516,7 @@ mo_path () boost::filesystem::path mo_path () { - return "DCP-o-matic 2.app/Contents/Resources"; + return variant::dcpomatic_app() + "/Contents/Resources"; } #endif @@ -741,9 +748,10 @@ asset_filename (shared_ptr<dcp::Asset> asset, string type, int reel_index, int r string -video_asset_filename (shared_ptr<dcp::PictureAsset> asset, int reel_index, int reel_count, optional<string> summary) +video_asset_filename(shared_ptr<dcp::PictureAsset> asset, int reel_index, int reel_count, optional<string> summary) { - return asset_filename(asset, "j2c", reel_index, reel_count, summary, ".mxf"); + string type = dynamic_pointer_cast<dcp::MPEG2PictureAsset>(asset) ? "mpeg2" : "j2c"; + return asset_filename(asset, type, reel_index, reel_count, summary, ".mxf"); } @@ -755,7 +763,7 @@ audio_asset_filename (shared_ptr<dcp::SoundAsset> asset, int reel_index, int ree string -subtitle_asset_filename (shared_ptr<dcp::SubtitleAsset> asset, int reel_index, int reel_count, optional<string> summary, string extension) +subtitle_asset_filename (shared_ptr<dcp::TextAsset> asset, int reel_index, int reel_count, optional<string> summary, string extension) { return asset_filename(asset, "sub", reel_index, reel_count, summary, extension); } @@ -879,16 +887,6 @@ remap (shared_ptr<const AudioBuffers> input, int output_channels, AudioMapping m return mapped; } -Eyes -increment_eyes (Eyes e) -{ - if (e == Eyes::LEFT) { - return Eyes::RIGHT; - } - - return Eyes::LEFT; -} - size_t utf8_strlen (string s) @@ -912,7 +910,7 @@ utf8_strlen (string s) /** @param size Size of picture that the subtitle will be overlaid onto */ void -emit_subtitle_image (ContentTimePeriod period, dcp::SubtitleImage sub, dcp::Size size, shared_ptr<TextDecoder> decoder) +emit_subtitle_image(ContentTimePeriod period, dcp::TextImage sub, dcp::Size size, shared_ptr<TextDecoder> decoder) { /* XXX: this is rather inefficient; decoding the image just to get its size */ FFmpegImageProxy proxy (sub.png_image()); @@ -1024,9 +1022,9 @@ decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm) } } if (!on_chain) { - throw KDMError (_("This KDM was not made for DCP-o-matic's decryption certificate."), e.what()); + throw KDMError(variant::insert_dcpomatic(_("This KDM was not made for %1's decryption certificate.")), e.what()); } else if (kdm_subject_name != dc->leaf().subject()) { - throw KDMError (_("This KDM was made for DCP-o-matic but not for its leaf certificate."), e.what()); + throw KDMError(variant::insert_dcpomatic(_("This KDM was made for %1 but not for its leaf certificate.")), e.what()); } else { throw; } @@ -1126,6 +1124,34 @@ word_wrap(string input, int columns) } +#ifdef DCPOMATIC_GROK +void +setup_grok_library_path() +{ + static std::string old_path; + if (old_path.empty()) { + auto const old = getenv("LD_LIRARY_PATH"); + if (old) { + old_path = old; + } + } + auto const grok = Config::instance()->grok(); + if (!grok || grok->binary_location.empty()) { + setenv("LD_LIRARY_PATH", old_path.c_str(), 1); + return; + } + + std::string new_path = old_path; + if (!new_path.empty()) { + new_path += ":"; + } + new_path += grok->binary_location.string(); + + setenv("LD_LIBRARY_PATH", new_path.c_str(), 1); +} +#endif + + string screen_names_to_string(vector<string> names) { @@ -1153,3 +1179,23 @@ screen_names_to_string(vector<string> names) return result.substr(0, result.length() - 2); } + +string +report_problem() +{ + return String::compose(_("Please report this problem by using Help -> Report a problem or via email to %1"), variant::report_problem_email()); +} + + +string +join_strings(vector<string> const& in, string const& separator) +{ + if (in.empty()) { + return {}; + } + + return std::accumulate(std::next(in.begin()), in.end(), in.front(), [separator](string a, string b) { + return a + separator + b; + }); +} + |
