X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftools%2Fdcpomatic_create.cc;h=5b5f4dba2455f48739679a9f62a06d80ea3ada26;hb=047f152c76f439d31ed13a0ac2a0f882d270c9aa;hp=a2d5c8e5d2a9f61cb316e6c2bb56de11c89d391a;hpb=28111007e2e6fd62f5810be780706ae1618bd33f;p=dcpomatic.git diff --git a/src/tools/dcpomatic_create.cc b/src/tools/dcpomatic_create.cc index a2d5c8e5d..5b5f4dba2 100644 --- a/src/tools/dcpomatic_create.cc +++ b/src/tools/dcpomatic_create.cc @@ -18,48 +18,53 @@ */ -#include "lib/version.h" -#include "lib/film.h" -#include "lib/util.h" +#include "lib/audio_content.h" +#include "lib/config.h" #include "lib/content_factory.h" -#include "lib/job_manager.h" -#include "lib/signal_manager.h" -#include "lib/job.h" -#include "lib/dcp_content_type.h" -#include "lib/ratio.h" -#include "lib/image_content.h" -#include "lib/video_content.h" +#include "lib/create_cli.h" #include "lib/cross.h" -#include "lib/config.h" #include "lib/dcp_content.h" -#include "lib/create_cli.h" +#include "lib/dcp_content_type.h" +#include "lib/film.h" +#include "lib/image_content.h" +#include "lib/job.h" +#include "lib/job_manager.h" +#include "lib/ratio.h" +#include "lib/signal_manager.h" +#include "lib/util.h" +#include "lib/version.h" #include "lib/version.h" -#include "lib/dcpomatic_log.h" +#include "lib/video_content.h" #include +#include #include #include #include -#include -#include #include +#include #include +#include + -using std::string; -using std::cout; using std::cerr; -using std::list; +using std::cout; +using std::dynamic_pointer_cast; using std::exception; +using std::list; +using std::make_shared; using std::shared_ptr; -using std::dynamic_pointer_cast; +using std::string; +using std::vector; using boost::optional; + class SimpleSignalManager : public SignalManager { public: /* Do nothing in this method so that UI events happen in our thread when we call SignalManager::ui_idle(). */ - void wake_ui () {} + void wake_ui () override {} }; int @@ -84,45 +89,31 @@ main (int argc, char* argv[]) } signal_manager = new SimpleSignalManager (); - JobManager* jm = JobManager::instance (); + auto jm = JobManager::instance (); try { - shared_ptr film (new Film(cc.output_dir)); - dcpomatic_log = film->log (); - dcpomatic_log->set_types (Config::instance()->log_types()); - if (cc.template_name) { - film->use_template (cc.template_name.get()); - } - film->set_name (cc.name); + auto film = cc.make_film(); - if (cc.container_ratio) { - film->set_container (cc.container_ratio); - } - film->set_dcp_content_type (cc.dcp_content_type); - film->set_interop (cc.standard == dcp::Standard::INTEROP); - film->set_use_isdcf_name (!cc.no_use_isdcf_name); - film->set_encrypted (cc.encrypt); - film->set_three_d (cc.threed); - if (cc.fourk) { - film->set_resolution (RESOLUTION_4K); - } - if (cc.j2k_bandwidth) { - film->set_j2k_bandwidth (*cc.j2k_bandwidth); - } + for (auto cli_content: cc.content) { + auto const can = dcp::filesystem::canonical(cli_content.path); + vector> film_content_list; - for (auto i: cc.content) { - boost::filesystem::path const can = boost::filesystem::canonical (i.path); - list > content; - - if (boost::filesystem::exists (can / "ASSETMAP") || (boost::filesystem::exists (can / "ASSETMAP.xml"))) { - content.push_back (shared_ptr(new DCPContent(can))); + if (dcp::filesystem::exists(can / "ASSETMAP") || (dcp::filesystem::exists(can / "ASSETMAP.xml"))) { + auto dcp = make_shared(can); + film_content_list.push_back (dcp); + if (cli_content.kdm) { + dcp->add_kdm (dcp::EncryptedKDM(dcp::file_to_string(*cli_content.kdm))); + } + if (cli_content.cpl) { + dcp->set_cpl(*cli_content.cpl); + } } else { /* I guess it's not a DCP */ - content = content_factory (can); + film_content_list = content_factory (can); } - for (auto j: content) { - film->examine_and_add_content (j); + for (auto film_content: film_content_list) { + film->examine_and_add_content (film_content); } while (jm->work_to_do ()) { @@ -131,9 +122,21 @@ main (int argc, char* argv[]) while (signal_manager->ui_idle() > 0) {} - for (auto j: content) { - if (j->video) { - j->video->set_frame_type (i.frame_type); + for (auto film_content: film_content_list) { + if (film_content->video) { + film_content->video->set_frame_type (cli_content.frame_type); + } + if (film_content->audio && cli_content.channel) { + for (auto stream: film_content->audio->streams()) { + AudioMapping mapping(stream->channels(), film->audio_channels()); + for (int channel = 0; channel < stream->channels(); ++channel) { + mapping.set(channel, *cli_content.channel, 1.0f); + } + stream->set_mapping (mapping); + } + } + if (film_content->audio && cli_content.gain) { + film_content->audio->set_gain (*cli_content.gain); } } } @@ -143,17 +146,19 @@ main (int argc, char* argv[]) } for (auto i: film->content()) { - shared_ptr ic = dynamic_pointer_cast (i); + auto ic = dynamic_pointer_cast (i); if (ic && ic->still()) { - ic->video->set_length (cc.still_length * 24); + ic->video->set_length(cc.still_length.get_value_or(10) * 24); } } if (jm->errors ()) { for (auto i: jm->get()) { if (i->finished_in_error()) { - cerr << i->error_summary() << "\n" - << i->error_details() << "\n"; + cerr << i->error_summary() << "\n"; + if (!i->error_details().empty()) { + cout << i->error_details() << "\n"; + } } } exit (EXIT_FAILURE);