X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fwriter.cc;h=3aca2ab89c96328445907dbbd88ae64156b722ac;hp=8fa9fbbca8b76893e913f63ac866ec5964095e42;hb=8a8c977c12fc65f1f50ea05099387e0fc8840e7d;hpb=e4b693f2e7b7dc2afb4e9ec3e96e317fff851c5b diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 8fa9fbbca..3aca2ab89 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -54,13 +54,9 @@ using std::cout; using std::dynamic_pointer_cast; -using std::list; -using std::make_pair; using std::make_shared; -using std::map; using std::max; using std::min; -using std::pair; using std::shared_ptr; using std::string; using std::vector; @@ -74,14 +70,6 @@ using dcp::ArrayData; using namespace dcpomatic; -static -void -ignore_progress (float) -{ - -} - - /** @param j Job to report progress to, or 0. * @param text_only true to enable only the text (subtitle/ccap) parts of the writer. */ @@ -554,11 +542,13 @@ Writer::calculate_digests () pool.create_thread (boost::bind (&boost::asio::io_service::run, &service)); } - boost::function set_progress; + std::function set_progress; if (job) { set_progress = boost::bind (&Writer::set_digest_progress, this, job.get(), _1); } else { - set_progress = &ignore_progress; + set_progress = [](float) { + boost::this_thread::interruption_point(); + }; } for (auto& i: _reels) { @@ -568,7 +558,13 @@ Writer::calculate_digests () work.reset (); - { + try { + pool.join_all (); + } catch (boost::thread_interrupted) { + /* join_all was interrupted, so we need to interrupt the threads + * in our pool then try again to join them. + */ + pool.interrupt_all (); pool.join_all (); } @@ -624,12 +620,18 @@ Writer::finish (boost::filesystem::path output_dcp) issuer = String::compose("DCP-o-matic %1 %2", dcpomatic_version, dcpomatic_git_commit); } + cpl->set_creator (creator); + cpl->set_issuer (issuer); + cpl->set_ratings (film()->ratings()); vector cv; for (auto i: film()->content_versions()) { cv.push_back (dcp::ContentVersion(i)); } + if (cv.empty()) { + cv = { dcp::ContentVersion("1") }; + } cpl->set_content_versions (cv); cpl->set_full_content_title_text (film()->name()); @@ -651,6 +653,9 @@ Writer::finish (boost::filesystem::path output_dcp) if (film()->luminance()) { cpl->set_luminance (*film()->luminance()); } + if (film()->sign_language_video_language()) { + cpl->set_sign_language_video_language (*film()->sign_language_video_language()); + } auto ac = film()->mapped_audio_channels(); dcp::MCASoundField field = ( @@ -687,14 +692,11 @@ Writer::finish (boost::filesystem::path output_dcp) throw InvalidSignerError (reason); } - dcp.write_xml ( - issuer, - creator, - dcp::LocalTime().as_string(), - film()->dcp_name(), - signer, - Config::instance()->dcp_metadata_filename_format() - ); + dcp.set_issuer(issuer); + dcp.set_creator(creator); + dcp.set_annotation_text(film()->dcp_name()); + + dcp.write_xml (signer, Config::instance()->dcp_metadata_filename_format()); LOG_GENERAL ( N_("Wrote %1 FULL, %2 FAKE, %3 REPEAT, %4 pushed to disk"), _full_written, _fake_written, _repeat_written, _pushed_to_disk @@ -708,19 +710,23 @@ void Writer::write_cover_sheet (boost::filesystem::path output_dcp) { auto const cover = film()->file("COVER_SHEET.txt"); - auto f = fopen_boost (cover, "w"); + dcp::File f(cover, "w"); if (!f) { throw OpenFileError (cover, errno, OpenFileError::WRITE); } auto text = Config::instance()->cover_sheet (); boost::algorithm::replace_all (text, "$CPL_NAME", film()->name()); + auto cpls = film()->cpls(); + if (!cpls.empty()) { + boost::algorithm::replace_all (text, "$CPL_FILENAME", cpls[0].cpl_file.filename().string()); + } boost::algorithm::replace_all (text, "$TYPE", film()->dcp_content_type()->pretty_name()); boost::algorithm::replace_all (text, "$CONTAINER", film()->container()->container_nickname()); - auto audio_languages = film()->audio_languages(); - if (!audio_languages.empty()) { - boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", audio_languages.front().description()); + auto audio_language = film()->audio_language(); + if (audio_language) { + boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", audio_language->description()); } else { boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", _("None")); } @@ -772,8 +778,7 @@ Writer::write_cover_sheet (boost::filesystem::path output_dcp) boost::algorithm::replace_all (text, "$LENGTH", length); - checked_fwrite (text.c_str(), text.length(), f, cover); - fclose (f); + f.checked_write(text.c_str(), text.length()); } @@ -941,12 +946,15 @@ Writer::set_digest_progress (Job* job, float progress) Waker waker; waker.nudge (); + + boost::this_thread::interruption_point(); } /** Calculate hashes for any referenced MXF assets which do not already have one */ void -Writer::calculate_referenced_digests (boost::function set_progress) +Writer::calculate_referenced_digests (std::function set_progress) +try { for (auto const& i: _reel_assets) { auto file = dynamic_pointer_cast(i.asset); @@ -955,6 +963,10 @@ Writer::calculate_referenced_digests (boost::function set_progress file->set_hash (file->asset_ref().asset()->hash()); } } +} catch (boost::thread_interrupted) { + /* set_progress contains an interruption_point, so any of these methods + * may throw thread_interrupted, at which point we just give up. + */ }