X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Futil.cc;h=91a8ecb6e6e5c5e17f0647ea181e574bb97c26b6;hp=c1ef4245f16b18713dd008bbb9d212ab858b1674;hb=35409488fd54aacefa6858dce4b02a576170e76e;hpb=15a83d720780d58f905d40f8493cdcb86596eaee diff --git a/src/lib/util.cc b/src/lib/util.cc index c1ef4245f..91a8ecb6e 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -45,12 +45,15 @@ #include "image.h" #include "text_decoder.h" #include "job_manager.h" +#include "warnings.h" +#include #include #include #include #include #include #include +#include extern "C" { #include #include @@ -354,14 +357,16 @@ dcpomatic_setup () SetUnhandledExceptionFilter(exception_handler); #endif +DCPOMATIC_DISABLE_WARNINGS av_register_all (); avfilter_register_all (); +DCPOMATIC_ENABLE_WARNINGS #ifdef DCPOMATIC_OSX /* Add our library directory to the libltdl search path so that xmlsec can find xmlsec1-openssl. */ - boost::filesystem::path lib = app_contents (); + boost::filesystem::path lib = directory_containing_executable().parent_path(); lib /= "Frameworks"; setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1); #endif @@ -726,6 +731,21 @@ audio_asset_filename (shared_ptr asset, int reel_index, int ree return Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + ".mxf"); } + +string +atmos_asset_filename (shared_ptr asset, int reel_index, int reel_count, optional summary) +{ + dcp::NameFormat::Map values; + values['t'] = "atmos"; + values['r'] = raw_convert (reel_index + 1); + values['n'] = raw_convert (reel_count); + if (summary) { + values['c'] = careful_string_filter (summary.get()); + } + return Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + ".mxf"); +} + + float relaxed_string_to_float (string s) { @@ -822,7 +842,9 @@ remap (shared_ptr input, int output_channels, AudioMapping m shared_ptr mapped (new AudioBuffers (output_channels, input->frames())); mapped->make_silent (); - for (int i = 0; i < map.input_channels(); ++i) { + 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 ( @@ -1201,3 +1223,29 @@ scale_for_display (dcp::Size s, dcp::Size display_container, dcp::Size film_cont return s; } + +dcp::DecryptedKDM +decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm) +{ + try { + 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(); + bool on_chain = false; + shared_ptr dc = Config::instance()->decryption_chain(); + BOOST_FOREACH (dcp::Certificate i, dc->root_to_leaf()) { + if (i.subject() == kdm_subject_name) { + on_chain = true; + } + } + if (!on_chain) { + throw KDMError (_("This KDM was not made for DCP-o-matic's decryption certificate."), e.what()); + } else if (on_chain && kdm_subject_name != dc->leaf().subject()) { + throw KDMError (_("This KDM was made for DCP-o-matic but not for its leaf certificate."), e.what()); + } else { + throw; + } + } +} +