diff options
| author | Carl Hetherington <cth@carlh.net> | 2021-12-18 14:23:50 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-04-20 19:35:36 +0200 |
| commit | df5228d00d70d68218e7f606131a0c5fa2caba9f (patch) | |
| tree | 7362b301f4693051a8722945378d11d9a0ef4c1d /src/lib/make_dcp.cc | |
| parent | 6e0f867a69cf4e337370edc986347218afde548e (diff) | |
Move make_dcp() out of Film (#2132).
Diffstat (limited to 'src/lib/make_dcp.cc')
| -rw-r--r-- | src/lib/make_dcp.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/lib/make_dcp.cc b/src/lib/make_dcp.cc new file mode 100644 index 000000000..934387fcd --- /dev/null +++ b/src/lib/make_dcp.cc @@ -0,0 +1,105 @@ +/* + Copyright (C) 2021 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "config.h" +#include "dcp_content.h" +#include "dcp_encoder.h" +#include "dcpomatic_log.h" +#include "environment_info.h" +#include "film.h" +#include "job_manager.h" +#include "make_dcp.h" +#include "transcode_job.h" +#include <stdexcept> + +#include "i18n.h" + + +using std::dynamic_pointer_cast; +using std::make_shared; +using std::runtime_error; +using std::shared_ptr; +using std::string; + + +/** Add suitable Jobs to the JobManager to create a DCP for a Film */ +void +make_dcp (shared_ptr<Film> film, TranscodeJob::ChangedBehaviour behaviour) +{ + if (film->dcp_name().find("/") != string::npos) { + throw BadSettingError (_("name"), _("Cannot contain slashes")); + } + + if (film->container() == nullptr) { + throw MissingSettingError (_("container")); + } + + if (film->content().empty()) { + throw runtime_error (_("You must add some content to the DCP before creating it")); + } + + if (film->length() == dcpomatic::DCPTime()) { + throw runtime_error (_("The DCP is empty, perhaps because all the content has zero length.")); + } + + if (film->dcp_content_type() == nullptr) { + throw MissingSettingError (_("content type")); + } + + if (film->name().empty()) { + film->set_name ("DCP"); + } + + for (auto i: film->content()) { + if (!i->paths_valid()) { + throw runtime_error (_("Some of your content is missing")); + } + auto dcp = dynamic_pointer_cast<const DCPContent>(i); + if (dcp && dcp->needs_kdm()) { + throw runtime_error (_("Some of your content needs a KDM")); + } + if (dcp && dcp->needs_assets()) { + throw runtime_error (_("Some of your content needs an OV")); + } + } + + film->set_isdcf_date_today (); + + for (auto info: environment_info()) { + LOG_GENERAL_NC (info); + } + + for (auto content: film->content()) { + LOG_GENERAL ("Content: %1", content->technical_summary()); + } + LOG_GENERAL ("DCP video rate %1 fps", film->video_frame_rate()); + if (Config::instance()->only_servers_encode()) { + LOG_GENERAL_NC ("0 threads: ONLY SERVERS SET TO ENCODE"); + } else { + LOG_GENERAL ("%1 threads", Config::instance()->master_encoding_threads()); + } + LOG_GENERAL ("J2K bandwidth %1", film->j2k_bandwidth()); + + auto tj = make_shared<TranscodeJob>(film, behaviour); + tj->set_encoder (make_shared<DCPEncoder>(film, tj)); + JobManager::instance()->add (tj); +} + |
