X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fwriter.cc;h=c34a6a66d7350cd624f526b8de4b4689b2a11523;hb=5ea52a08f45b0cb8b8fe7221244cdcdeeaca0ed7;hp=489135b846e8cb7d9d20e32d00a928c8a8117256;hpb=05654d0e1799746a9df3ccab040c92e0ed825cac;p=dcpomatic.git diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 489135b84..c34a6a66d 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -27,22 +27,24 @@ #include #include #include +#include #include #include +#include #include "writer.h" #include "compose.hpp" #include "film.h" #include "ratio.h" #include "log.h" -#include "dcp_video_frame.h" +#include "dcp_video.h" #include "dcp_content_type.h" -#include "player.h" #include "audio_mapping.h" #include "config.h" #include "job.h" #include "cross.h" #include "audio_buffers.h" #include "md5_digester.h" +#include "encoded_data.h" #include "i18n.h" @@ -123,6 +125,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")); @@ -452,6 +459,20 @@ Writer::finish () reel->add (shared_ptr (new dcp::ReelSoundAsset (_sound_mxf, 0))); dcp.add (_sound_mxf); } + + if (_subtitle_content) { + _subtitle_content->write_xml (_film->dir (_film->dcp_name ()) / _film->subtitle_xml_filename ()); + reel->add (shared_ptr ( + new dcp::ReelSubtitleAsset ( + _subtitle_content, + dcp::Fraction (_film->video_frame_rate(), 1), + _subtitle_content->latest_subtitle_out().to_seconds() * _film->video_frame_rate(), + 0 + ) + )); + + dcp.add (_subtitle_content); + } cpl->add (reel); @@ -469,7 +490,16 @@ Writer::finish () dcp::XMLMetadata meta = Config::instance()->dcp_metadata (); 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 @@ -571,6 +601,24 @@ Writer::can_fake_write (int frame) const return (frame != 0 && frame < _first_nonexistant_frame); } +void +Writer::write (PlayerSubtitles subs) +{ + if (subs.text.empty ()) { + return; + } + + if (!_subtitle_content) { + _subtitle_content.reset ( + new dcp::SubtitleContent (_film->name(), _film->isdcf_metadata().subtitle_language) + ); + } + + for (list::const_iterator i = subs.text.begin(); i != subs.text.end(); ++i) { + _subtitle_content->add (*i); + } +} + bool operator< (QueueItem const & a, QueueItem const & b) {