Merge master.
[dcpomatic.git] / src / lib / writer.cc
index 2d6d830cd3eb89f5a65f45e0080e805e92b5af0d..6262525c85d3a5777ead7a9dda416d7752622d52 100644 (file)
@@ -30,6 +30,7 @@
 #include <dcp/reel_subtitle_asset.h>
 #include <dcp/dcp.h>
 #include <dcp/cpl.h>
+#include <dcp/signer.h>
 #include "writer.h"
 #include "compose.hpp"
 #include "film.h"
 #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<const Film> f, weak_ptr<Job> 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<const dcp::Signer> ());
+       shared_ptr<const dcp::Signer> 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;
        }