X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=9fd8c7400b3f987344927812379ddc5c4ae2a9e2;hb=1104fed9f028f221f58bf1f7287d8cdf63835a47;hp=58d1e50103285b2d0a47126a04c462a04bb2ac00;hpb=a2315091cd9471016e7ed0165d9152a335b8af4f;p=dcpomatic.git diff --git a/src/lib/film.cc b/src/lib/film.cc index 58d1e5010..9fd8c7400 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -99,6 +99,8 @@ Film::Film (string d, bool must_exist) , _with_subtitles (false) , _subtitle_offset (0) , _subtitle_scale (1) + , _colour_lut (0) + , _j2k_bandwidth (200000000) , _frames_per_second (0) , _dirty (false) { @@ -131,15 +133,18 @@ Film::Film (string d, bool must_exist) } _external_audio_stream = ExternalAudioStream::create (); - - read_metadata (); + + if (must_exist) { + read_metadata (); + } _log = new FileLog (file ("log")); set_dci_date_today (); } Film::Film (Film const & o) - : _log (0) + : boost::enable_shared_from_this (o) + , _log (0) , _directory (o._directory) , _name (o._name) , _use_dci_name (o._use_dci_name) @@ -152,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) @@ -163,6 +169,8 @@ Film::Film (Film const & o) , _with_subtitles (o._with_subtitles) , _subtitle_offset (o._subtitle_offset) , _subtitle_scale (o._subtitle_scale) + , _colour_lut (o._colour_lut) + , _j2k_bandwidth (o._j2k_bandwidth) , _audio_language (o._audio_language) , _subtitle_language (o._subtitle_language) , _territory (o._territory) @@ -209,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 (colour_lut()); p /= s.str (); @@ -242,6 +252,11 @@ Film::make_dcp (bool transcode) char buffer[128]; gethostname (buffer, sizeof (buffer)); log()->log (String::compose ("Starting to make DCP on %1", buffer)); + log()->log (String::compose ("Content is %1; type %2", content_path(), (content_type() == STILL ? "still" : "video"))); + log()->log (String::compose ("Content length %1", length().get())); + log()->log (String::compose ("Content digest %1", content_digest())); + log()->log (String::compose ("%1 threads", Config::instance()->num_local_encoding_threads())); + log()->log (String::compose ("J2K bandwidth %1", j2k_bandwidth())); } if (format() == 0) { @@ -267,8 +282,18 @@ Film::make_dcp (bool transcode) oe->video_range = make_pair (dcp_trim_start(), dcp_trim_start() + dcp_length().get()); if (audio_stream()) { oe->audio_range = make_pair ( - video_frames_to_audio_frames (oe->video_range.get().first, audio_stream()->sample_rate(), frames_per_second()), - video_frames_to_audio_frames (oe->video_range.get().second, audio_stream()->sample_rate(), frames_per_second()) + + video_frames_to_audio_frames ( + oe->video_range.get().first, + dcp_audio_sample_rate (audio_stream()->sample_rate()), + dcp_frame_rate (frames_per_second()).frames_per_second + ), + + video_frames_to_audio_frames ( + oe->video_range.get().second, + dcp_audio_sample_rate (audio_stream()->sample_rate()), + dcp_frame_rate (frames_per_second()).frames_per_second + ) ); } @@ -388,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"; @@ -405,6 +433,8 @@ Film::write_metadata () const f << "with_subtitles " << _with_subtitles << "\n"; f << "subtitle_offset " << _subtitle_offset << "\n"; f << "subtitle_scale " << _subtitle_scale << "\n"; + f << "colour_lut " << _colour_lut << "\n"; + f << "j2k_bandwidth " << _j2k_bandwidth << "\n"; f << "audio_language " << _audio_language << "\n"; f << "subtitle_language " << _subtitle_language << "\n"; f << "territory " << _territory << "\n"; @@ -449,8 +479,12 @@ Film::read_metadata () boost::optional audio_sample_rate; boost::optional audio_stream_index; boost::optional subtitle_stream_index; - + ifstream f (file ("metadata").c_str()); + if (!f.good()) { + throw OpenFileError (file("metadata")); + } + multimap kv = read_key_value (f); /* We need version before anything else */ @@ -496,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 (v); } else if (k == "dcp_ab") { _dcp_ab = (v == "1"); } else if (k == "selected_content_audio_stream" || (!version && k == "selected_audio_stream")) { @@ -526,6 +562,10 @@ Film::read_metadata () _subtitle_offset = atoi (v.c_str ()); } else if (k == "subtitle_scale") { _subtitle_scale = atof (v.c_str ()); + } else if (k == "colour_lut") { + _colour_lut = atoi (v.c_str ()); + } else if (k == "j2k_bandwidth") { + _j2k_bandwidth = atoi (v.c_str ()); } else if (k == "audio_language") { _audio_language = v; } else if (k == "subtitle_language") { @@ -675,7 +715,7 @@ Film::target_audio_sample_rate () const return rint (t); } -boost::optional +boost::optional Film::dcp_length () const { if (content_type() == STILL) { @@ -683,7 +723,7 @@ Film::dcp_length () const } if (!length()) { - return boost::optional (); + return boost::optional (); } return length().get() - dcp_trim_start() - dcp_trim_end(); @@ -850,6 +890,9 @@ Film::set_content (string c) _content_audio_stream = shared_ptr (); _subtitle_stream = shared_ptr (); + /* Start off using content audio */ + set_use_content_audio (true); + /* Create a temporary decoder so that we can get information about the content. */ @@ -900,6 +943,11 @@ Film::set_content (string c) set_format (Format::from_id ("185")); break; } + + /* Still image DCPs must use external audio */ + if (content_type() == STILL) { + set_use_content_audio (false); + } } void @@ -1045,6 +1093,26 @@ Film::set_dcp_trim_end (int t) signal_changed (DCP_TRIM_END); } +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 (); + } + signal_changed (REEL_SIZE); +} + void Film::set_dcp_ab (bool a) { @@ -1163,6 +1231,26 @@ Film::set_subtitle_scale (float s) signal_changed (SUBTITLE_SCALE); } +void +Film::set_colour_lut (int i) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _colour_lut = i; + } + signal_changed (COLOUR_LUT); +} + +void +Film::set_j2k_bandwidth (int b) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _j2k_bandwidth = b; + } + signal_changed (J2K_BANDWIDTH); +} + void Film::set_audio_language (string l) {