diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-01-12 21:09:23 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-01-12 21:09:23 +0000 |
| commit | 61153e191b98a68e0ca6466ed260a632a584b619 (patch) | |
| tree | 9e43533f1a2849529d7f230ac38f356bf46e3b4f /src/lib | |
| parent | ae118502865c95f15317716aef8d26641b9e9c3f (diff) | |
Untested support for splitting into multiple reels. Use J2K bandwidth and colour LUT in the J2K path.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/film.cc | 30 | ||||
| -rw-r--r-- | src/lib/film.h | 10 | ||||
| -rw-r--r-- | src/lib/make_dcp_job.cc | 88 | ||||
| -rw-r--r-- | src/lib/make_dcp_job.h | 2 |
4 files changed, 100 insertions, 30 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc index 4e48a0e73..3985baf04 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -157,6 +157,7 @@ Film::Film (Film const & o) , _scaler (o._scaler) , _dcp_trim_start (o._dcp_trim_start) , _dcp_trim_end (o._dcp_trim_end) + , _reel_size (o._reel_size) , _dcp_ab (o._dcp_ab) , _content_audio_stream (o._content_audio_stream) , _external_audio (o._external_audio) @@ -216,7 +217,9 @@ Film::j2k_dir () const << "_" << content_digest() << "_" << crop().left << "_" << crop().right << "_" << crop().top << "_" << crop().bottom << "_" << f.first << "_" << f.second - << "_" << scaler()->id(); + << "_" << scaler()->id() + << "_" << j2k_bandwidth() + << "_" << boost::lexical_cast<int> (colour_lut()); p /= s.str (); @@ -410,6 +413,9 @@ Film::write_metadata () const f << "scaler " << _scaler->id () << "\n"; f << "dcp_trim_start " << _dcp_trim_start << "\n"; f << "dcp_trim_end " << _dcp_trim_end << "\n"; + if (_reel_size) { + f << "reel_size " << _reel_size.get() << "\n"; + } f << "dcp_ab " << (_dcp_ab ? "1" : "0") << "\n"; if (_content_audio_stream) { f << "selected_content_audio_stream " << _content_audio_stream->to_string() << "\n"; @@ -524,6 +530,8 @@ Film::read_metadata () _dcp_trim_start = atoi (v.c_str ()); } else if (k == "dcp_trim_end") { _dcp_trim_end = atoi (v.c_str ()); + } else if (k == "reel_size") { + _reel_size = boost::lexical_cast<uint64_t> (v); } else if (k == "dcp_ab") { _dcp_ab = (v == "1"); } else if (k == "selected_content_audio_stream" || (!version && k == "selected_audio_stream")) { @@ -1086,6 +1094,26 @@ Film::set_dcp_trim_end (int t) } void +Film::set_reel_size (uint64_t s) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _reel_size = s; + } + signal_changed (REEL_SIZE); +} + +void +Film::unset_reel_size () +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _reel_size = boost::optional<uint64_t> (); + } + signal_changed (REEL_SIZE); +} + +void Film::set_dcp_ab (bool a) { { diff --git a/src/lib/film.h b/src/lib/film.h index 467573ae1..02d9cf7d0 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -113,6 +113,7 @@ public: SCALER, DCP_TRIM_START, DCP_TRIM_END, + REEL_SIZE, DCP_AB, CONTENT_AUDIO_STREAM, EXTERNAL_AUDIO, @@ -196,6 +197,11 @@ public: boost::mutex::scoped_lock lm (_state_mutex); return _dcp_trim_end; } + + boost::optional<uint64_t> reel_size () const { + boost::mutex::scoped_lock lm (_state_mutex); + return _reel_size; + } bool dcp_ab () const { boost::mutex::scoped_lock lm (_state_mutex); @@ -357,6 +363,8 @@ public: void set_scaler (Scaler const *); void set_dcp_trim_start (int); void set_dcp_trim_end (int); + void set_reel_size (uint64_t); + void unset_reel_size (); void set_dcp_ab (bool); void set_content_audio_stream (boost::shared_ptr<AudioStream>); void set_external_audio (std::vector<std::string>); @@ -435,6 +443,8 @@ private: int _dcp_trim_start; /** Frames to trim off the end of the DCP */ int _dcp_trim_end; + /** Approximate target reel size in bytes; if not set, use a single reel */ + boost::optional<uint64_t> _reel_size; /** true to create an A/B comparison DCP, where the left half of the image is the video without any filters or post-processing, and the right half has the specified filters and post-processing. diff --git a/src/lib/make_dcp_job.cc b/src/lib/make_dcp_job.cc index 5272d6bad..34b3e5124 100644 --- a/src/lib/make_dcp_job.cc +++ b/src/lib/make_dcp_job.cc @@ -37,6 +37,7 @@ extern "C" { #include "film.h" using std::string; +using std::cout; using boost::shared_ptr; /** @param f Film we are making the DCP for. @@ -57,9 +58,9 @@ MakeDCPJob::name () const /** @param f DCP frame index */ string -MakeDCPJob::j2c_path (int f) const +MakeDCPJob::j2c_path (int f, int offset) const { - SourceFrame const s = (f * dcp_frame_rate(_film->frames_per_second()).skip) + _film->dcp_trim_start(); + SourceFrame const s = ((f + offset) * dcp_frame_rate(_film->frames_per_second()).skip) + _film->dcp_trim_start(); return _opt->frame_out_path (s, false); } @@ -75,6 +76,8 @@ MakeDCPJob::run () if (!_film->dcp_length()) { throw EncodeError ("cannot make a DCP when the source length is not known"); } + + descend (0.9); string const dcp_path = _film->dir (_film->dcp_name()); @@ -103,45 +106,74 @@ MakeDCPJob::run () dcp.add_cpl (cpl); - descend (0.8); - shared_ptr<libdcp::MonoPictureAsset> pa ( - new libdcp::MonoPictureAsset ( - boost::bind (&MakeDCPJob::j2c_path, this, _1), - _film->dir (_film->dcp_name()), - "video.mxf", - &dcp.Progress, - dfr.frames_per_second, - frames, - _opt->out_size.width, - _opt->out_size.height - ) - ); - - ascend (); + int frames_per_reel = 0; + if (_film->reel_size()) { + frames_per_reel = (_film->reel_size().get() / (_film->j2k_bandwidth() / 8)) * dfr.frames_per_second; + } else { + frames_per_reel = frames; + } - shared_ptr<libdcp::SoundAsset> sa; + int frames_done = 0; + int reel = 0; - if (_film->audio_channels() > 0) { - descend (0.1); - sa.reset ( - new libdcp::SoundAsset ( - boost::bind (&MakeDCPJob::wav_path, this, _1), + while (frames_done < frames) { + + descend (float (frames_per_reel) / frames); + + int this_time = std::min (frames_per_reel, (frames - frames_done)); + + descend (0.8); + + shared_ptr<libdcp::MonoPictureAsset> pa ( + new libdcp::MonoPictureAsset ( + boost::bind (&MakeDCPJob::j2c_path, this, _1, frames_done), _film->dir (_film->dcp_name()), - "audio.mxf", + String::compose ("video_%1.mxf", reel), &dcp.Progress, dfr.frames_per_second, - frames, - dcp_audio_channels (_film->audio_channels()) + this_time, + _opt->out_size.width, + _opt->out_size.height ) ); + + ascend (); + + shared_ptr<libdcp::SoundAsset> sa; + + if (_film->audio_channels() > 0) { + descend (0.1); + sa.reset ( + new libdcp::SoundAsset ( + boost::bind (&MakeDCPJob::wav_path, this, _1), + _film->dir (_film->dcp_name()), + String::compose ("audio_%1.mxf", reel), + &dcp.Progress, + dfr.frames_per_second, + this_time, + frames_done, + dcp_audio_channels (_film->audio_channels()) + ) + ); + ascend (); + } + + descend (0.1); + cpl->add_reel (shared_ptr<libdcp::Reel> (new libdcp::Reel (pa, sa, shared_ptr<libdcp::SubtitleAsset> ()))); + ascend (); + + frames_done += frames_per_reel; + ++reel; + ascend (); } + ascend (); + descend (0.1); - cpl->add_reel (shared_ptr<libdcp::Reel> (new libdcp::Reel (pa, sa, shared_ptr<libdcp::SubtitleAsset> ()))); dcp.write_xml (); ascend (); - + set_progress (1); set_state (FINISHED_OK); } diff --git a/src/lib/make_dcp_job.h b/src/lib/make_dcp_job.h index 1aa906b0a..5e4f78a25 100644 --- a/src/lib/make_dcp_job.h +++ b/src/lib/make_dcp_job.h @@ -38,7 +38,7 @@ public: private: void dcp_progress (float); - std::string j2c_path (int) const; + std::string j2c_path (int, int) const; std::string wav_path (libdcp::Channel) const; boost::shared_ptr<const EncodeOptions> _opt; |
