X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fmake_dcp_job.cc;h=4f42e13f13f2881939de89ea3d5097338b174423;hb=75be8cbd1d3307ea62fe8e79543ca518f4ee7bc2;hp=21b8549be4e16e869769249317acaed814e3f59e;hpb=c13377e0eb28a29c3d22e02a8b3ee40ca5e11ad1;p=dcpomatic.git diff --git a/src/lib/make_dcp_job.cc b/src/lib/make_dcp_job.cc index 21b8549be..4f42e13f1 100644 --- a/src/lib/make_dcp_job.cc +++ b/src/lib/make_dcp_job.cc @@ -22,6 +22,7 @@ */ #include +#include extern "C" { #include } @@ -29,6 +30,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; @@ -38,7 +41,7 @@ using namespace boost; * @param l Log. */ MakeDCPJob::MakeDCPJob (shared_ptr s, shared_ptr o, Log* l) - : ShellCommandJob (s, o, l) + : Job (s, o, l) { } @@ -51,44 +54,57 @@ MakeDCPJob::name () const return s.str (); } +string +MakeDCPJob::j2c_path (int f) const +{ + return _opt->frame_out_path (f, false); +} + +string +MakeDCPJob::wav_path (libdcp::Channel c) const +{ + return _opt->multichannel_audio_out_path (int (c), false); +} + void MakeDCPJob::run () { - set_progress_unknown (); - string const dcp_path = _fs->dir (_fs->name); - - /* Check that we have our prerequisites */ - - if (!filesystem::exists (filesystem::path (_fs->file ("video.mxf")))) { - throw EncodeError ("missing video.mxf"); - } - - bool const have_audio = filesystem::exists (filesystem::path (_fs->file ("audio.mxf"))); /* Remove any old DCP */ filesystem::remove_all (dcp_path); - /* Re-make the DCP directory */ - _fs->dir (_fs->name); - - stringstream c; - c << "cd \"" << dcp_path << "\" && " - << " opendcp_xml -d -a \"" << _fs->name << "\"" - << " -t \"" << _fs->name << "\"" - << " -k " << _fs->dcp_content_type->opendcp_name() - << " --reel \"" << _fs->file ("video.mxf") << "\""; - - if (have_audio) { - c << " \"" << _fs->file ("audio.mxf") << "\""; + int frames = 0; + switch (_fs->content_type ()) { + case VIDEO: + frames = _fs->dcp_frames ? _fs->dcp_frames : _fs->length; + break; + case STILL: + frames = _fs->still_duration * ImageMagickDecoder::static_frames_per_second (); + break; } + + libdcp::DCP dcp (_fs->dir (_fs->name), _fs->name, _fs->dcp_content_type->libdcp_kind (), rint (_fs->frames_per_second), frames); + dcp.Progress.connect (sigc::mem_fun (*this, &MakeDCPJob::dcp_progress)); - command (c.str ()); + descend (0.9); + dcp.add_picture_asset (sigc::mem_fun (*this, &MakeDCPJob::j2c_path), _opt->out_size.width, _opt->out_size.height); + ascend (); - filesystem::rename (filesystem::path (_fs->file ("video.mxf")), filesystem::path (dcp_path + "/video.mxf")); - if (have_audio) { - filesystem::rename (filesystem::path (_fs->file ("audio.mxf")), filesystem::path (dcp_path + "/audio.mxf")); + if (_fs->audio_channels > 0) { + descend (0.1); + dcp.add_sound_asset (sigc::mem_fun (*this, &MakeDCPJob::wav_path), _fs->audio_channels); + ascend (); } + dcp.write_xml (); + set_progress (1); + set_state (FINISHED_OK); +} + +void +MakeDCPJob::dcp_progress (float p) +{ + set_progress (p); }