X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Ffilm.cc;h=c8aee7a0aa6bdf6bc6b925209a6ae92043f72098;hp=67605ffcaba2c6836fd69be1be20d7202db5792a;hb=147cca5876dfbdf56e21289c3a36bec4b4850191;hpb=50dd871c5a924660499b3fd599f1c68af5e3dbc1 diff --git a/src/lib/film.cc b/src/lib/film.cc index 67605ffca..c8aee7a0a 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -98,6 +98,7 @@ Film::Film (string d, bool must_exist) , _scaler (Scaler::from_id ("bicubic")) , _trim_start (0) , _trim_end (0) + , _trim_type (CPL) , _ab (false) , _audio_gain (0) , _audio_delay (0) @@ -165,6 +166,7 @@ Film::Film (Film const & o) , _scaler (o._scaler) , _trim_start (o._trim_start) , _trim_end (o._trim_end) + , _trim_type (o._trim_type) , _ab (o._ab) , _audio_gain (o._audio_gain) , _audio_delay (o._audio_delay) @@ -223,18 +225,46 @@ Film::info_dir () const } string -Film::video_mxf_dir () const +Film::internal_video_mxf_dir () const { boost::filesystem::path p; return dir ("video"); } string -Film::video_mxf_filename () const +Film::internal_video_mxf_filename () const { return video_state_identifier() + ".mxf"; } +string +Film::dcp_video_mxf_filename () const +{ + return filename_safe_name() + "_video.mxf"; +} + +string +Film::dcp_audio_mxf_filename () const +{ + return filename_safe_name() + "_audio.mxf"; +} + +string +Film::filename_safe_name () const +{ + string const n = name (); + string o; + for (size_t i = 0; i < n.length(); ++i) { + if (isalnum (n[i])) { + o += n[i]; + } else { + o += "_"; + } + } + + return o; +} + string Film::audio_analysis_path () const { @@ -385,12 +415,23 @@ Film::write_metadata () const root->add_child("Name")->add_child_text (_name); root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0"); root->add_child("TrustContentHeaders")->add_child_text (_trust_content_headers ? "1" : "0"); + if (_dcp_content_type) { root->add_child("DCPContentType")->add_child_text (_dcp_content_type->dci_name ()); } + if (_format) { root->add_child("Format")->add_child_text (_format->id ()); } + + switch (_trim_type) { + case CPL: + root->add_child("TrimType")->add_child_text ("CPL"); + break; + case ENCODE: + root->add_child("TrimType")->add_child_text ("Encode"); + } + root->add_child("LeftCrop")->add_child_text (boost::lexical_cast (_crop.left)); root->add_child("RightCrop")->add_child_text (boost::lexical_cast (_crop.right)); root->add_child("TopCrop")->add_child_text (boost::lexical_cast (_crop.top)); @@ -455,6 +496,15 @@ Film::read_metadata () } } + { + optional c = f.optional_string_child ("TrimType"); + if (!c || c.get() == "CPL") { + _trim_type = CPL; + } else if (c && c.get() == "Encode") { + _trim_type = ENCODE; + } + } + _crop.left = f.number_child ("LeftCrop"); _crop.right = f.number_child ("RightCrop"); _crop.top = f.number_child ("TopCrop"); @@ -847,6 +897,16 @@ Film::set_trim_end (int t) signal_changed (TRIM_END); } +void +Film::set_trim_type (TrimType t) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _trim_type = t; + } + signal_changed (TRIM_TYPE); +} + void Film::set_ab (bool a) {