X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fwriter.cc;h=6262525c85d3a5777ead7a9dda416d7752622d52;hp=2d6d830cd3eb89f5a65f45e0080e805e92b5af0d;hb=391d85619ac19a2a93696ddc35c222eb9bb5d9d6;hpb=8f6277ad312410efe4187a03d6795f344b433475 diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 2d6d830cd..6262525c8 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include "writer.h" #include "compose.hpp" #include "film.h" @@ -44,12 +45,14 @@ #include "audio_buffers.h" #include "md5_digester.h" #include "encoded_data.h" +#include "version.h" #include "i18n.h" #define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL); #define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING); #define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_WARNING); +#define LOG_ERROR(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_ERROR); /* OS X strikes again */ #undef set_key @@ -59,7 +62,6 @@ using std::pair; using std::string; using std::list; using std::cout; -using std::stringstream; using boost::shared_ptr; using boost::weak_ptr; using boost::dynamic_pointer_cast; @@ -124,6 +126,11 @@ Writer::Writer (shared_ptr f, weak_ptr j) _sound_mxf_writer = _sound_mxf->start_write (_film->directory() / _film->audio_mxf_filename(), _film->interop() ? dcp::INTEROP : dcp::SMPTE); } + /* Check that the signer is OK if we need one */ + if (_film->is_signed() && !Config::instance()->signer()->valid ()) { + throw InvalidSignerError (); + } + _thread = new boost::thread (boost::bind (&Writer::thread, this)); job->sub (_("Encoding image data")); @@ -400,9 +407,12 @@ Writer::finish () boost::system::error_code ec; boost::filesystem::create_hard_link (video_from, video_to, ec); if (ec) { - /* hard link failed; copy instead */ - boost::filesystem::copy_file (video_from, video_to); - LOG_WARNING_NC ("Hard-link failed; fell back to copying"); + LOG_WARNING_NC ("Hard-link failed; copying instead"); + boost::filesystem::copy_file (video_from, video_to, ec); + if (ec) { + LOG_ERROR ("Failed to copy video file from %1 to %2 (%3)", video_from.string(), video_to.string(), ec.message ()); + throw FileError (ec.message(), video_from); + } } _picture_mxf->set_file (video_to); @@ -460,7 +470,7 @@ Writer::finish () new dcp::ReelSubtitleAsset ( _subtitle_content, dcp::Fraction (_film->video_frame_rate(), 1), - _subtitle_content->latest_subtitle_out().to_seconds() * _film->video_frame_rate(), + _picture_mxf->intrinsic_duration (), 0 ) )); @@ -481,10 +491,21 @@ Writer::finish () _sound_mxf->hash (boost::bind (&Job::set_progress, job.get(), _1, false)); } - dcp::XMLMetadata meta = Config::instance()->dcp_metadata (); + dcp::XMLMetadata meta; + meta.issuer = Config::instance()->dcp_issuer (); + meta.creator = String::compose ("DCP-o-matic %1 %2", dcpomatic_version, dcpomatic_git_commit); meta.set_issue_date_now (); - dcp.write_xml (_film->interop () ? dcp::INTEROP : dcp::SMPTE, meta, _film->is_signed() ? make_signer () : shared_ptr ()); + shared_ptr signer; + if (_film->is_signed ()) { + signer = Config::instance()->signer (); + /* We did check earlier, but check again here to be on the safe side */ + if (!signer->valid ()) { + throw InvalidSignerError (); + } + } + + dcp.write_xml (_film->interop () ? dcp::INTEROP : dcp::SMPTE, meta, signer); LOG_GENERAL ( N_("Wrote %1 FULL, %2 FAKE, %3 pushed to disk"), _full_written, _fake_written, _pushed_to_disk @@ -589,7 +610,7 @@ Writer::can_fake_write (int frame) const void Writer::write (PlayerSubtitles subs) { - if (subs.empty ()) { + if (subs.text.empty ()) { return; }