X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmake_dcp_job.cc;h=fcfce4b07bccc6ada73799e79e2f68e8dc6064db;hb=44b57d623dec97a3f9955082f0b8a7a8d27b7518;hp=998d1f9c350dc8c91c375ebd452797c4f0bb1b6f;hpb=c7c8c894df8c2bb98aeed84011dd28da94afa392;p=dcpomatic.git diff --git a/src/lib/make_dcp_job.cc b/src/lib/make_dcp_job.cc index 998d1f9c3..fcfce4b07 100644 --- a/src/lib/make_dcp_job.cc +++ b/src/lib/make_dcp_job.cc @@ -22,6 +22,10 @@ */ #include +#include +#include +#include +#include extern "C" { #include } @@ -29,6 +33,8 @@ extern "C" { #include "film_state.h" #include "dcp_content_type.h" #include "exceptions.h" +#include "options.h" +#include "imagemagick_decoder.h" using namespace std; using namespace boost; @@ -37,8 +43,9 @@ using namespace boost; * @param o Options. * @param l Log. */ -MakeDCPJob::MakeDCPJob (shared_ptr s, shared_ptr o, Log* l) - : Job (s, o, l) +MakeDCPJob::MakeDCPJob (shared_ptr s, shared_ptr o, Log* l, shared_ptr req) + : Job (s, l, req) + , _opt (o) { } @@ -46,53 +53,91 @@ MakeDCPJob::MakeDCPJob (shared_ptr s, shared_ptr string MakeDCPJob::name () const { - stringstream s; - s << "Make DCP for " << _fs->name; - return s.str (); + return String::compose ("Make DCP for %1", _fs->name()); } -void -MakeDCPJob::run () +string +MakeDCPJob::j2c_path (int f) const { - set_progress_unknown (); - - string const dcp_path = _fs->dir (_fs->name); - - /* Check that we have our prerequisites */ + return _opt->frame_out_path (f, false); +} - if (!filesystem::exists (filesystem::path (_fs->file ("video.mxf")))) { - throw EncodeError ("missing video.mxf"); - } +string +MakeDCPJob::wav_path (libdcp::Channel c) const +{ + return _opt->multichannel_audio_out_path (int (c), false); +} - bool const have_audio = filesystem::exists (filesystem::path (_fs->file ("audio.mxf"))); +void +MakeDCPJob::run () +{ + string const dcp_path = _fs->dir (_fs->dcp_name()); /* Remove any old DCP */ filesystem::remove_all (dcp_path); - DCP dcp (_fs->dir (_fs->name())); - dcp.add_asset ( - shared_ptr (new MainPictureAsset ("video.mxf", rint (_fs->frames_per_second), _fs->length, _opt->out_size)) - ); + int frames = 0; + switch (_fs->content_type ()) { + case VIDEO: + frames = _fs->dcp_length (); + break; + case STILL: + frames = _fs->still_duration() * ImageMagickDecoder::static_frames_per_second (); + break; + } + + libdcp::DCP dcp (_fs->dir (_fs->dcp_name())); + dcp.Progress.connect (sigc::mem_fun (*this, &MakeDCPJob::dcp_progress)); - if (filesystem::exists (filesystem::path (_fs->file ("audio.mxf")))) { - dcp.add_asset ( - shared_ptr (new MainSoundAsset ("audio.mxf", rint (_fs->frames_per_second), _fs->length)) + shared_ptr cpl ( + new libdcp::CPL (_fs->dir (_fs->dcp_name()), _fs->dcp_name(), _fs->dcp_content_type()->libdcp_kind (), frames, rint (_fs->frames_per_second())) + ); + + dcp.add_cpl (cpl); + + descend (0.9); + shared_ptr pa ( + new libdcp::MonoPictureAsset ( + sigc::mem_fun (*this, &MakeDCPJob::j2c_path), + _fs->dir (_fs->dcp_name()), + "video.mxf", + &dcp.Progress, + rint (_fs->frames_per_second()), + frames, + _opt->out_size.width, + _opt->out_size.height + ) + ); + + ascend (); + + shared_ptr sa; + + if (_fs->audio_channels() > 0) { + descend (0.1); + sa.reset ( + new libdcp::SoundAsset ( + sigc::mem_fun (*this, &MakeDCPJob::wav_path), + _fs->dir (_fs->dcp_name()), + "audio.mxf", + &dcp.Progress, + rint (_fs->frames_per_second()), + frames, + _fs->audio_channels() + ) ); + ascend (); } - - dcp.write_xml (); - - - add_pkl (); - add_cpl (pkl[0]); - - add_reel (pkl[0].cpl[0]); - - write_cpl (); - write_pkl (); - write_volindex (); - write_assetmap (); + cpl->add_reel (shared_ptr (new libdcp::Reel (pa, sa, shared_ptr ()))); + dcp.write_xml (); set_progress (1); + set_state (FINISHED_OK); +} + +void +MakeDCPJob::dcp_progress (float p) +{ + set_progress (p); }