Don't disable forensic marking by default.
[dcpomatic.git] / src / lib / film.cc
index 3b8199f301ce75d56ec5bde0c730229b4a1b913d..23c83d037ba7b2432fe671127d89c80b9d249d32 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2017 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -151,7 +151,7 @@ Film::Film (optional<boost::filesystem::path> dir)
        , _audio_processor (0)
        , _reel_type (REELTYPE_SINGLE)
        , _reel_length (2000000000)
-       , _upload_after_make_dcp (false)
+       , _upload_after_make_dcp (Config::instance()->default_upload_after_make_dcp())
        , _state_version (current_state_version)
        , _dirty (false)
 {
@@ -309,7 +309,7 @@ Film::make_dcp ()
        }
 
        if (name().empty()) {
-               _name = "DCP";
+               set_name ("DCP");
        }
 
        BOOST_FOREACH (shared_ptr<const Content> i, content ()) {
@@ -514,7 +514,7 @@ Film::read_metadata (optional<boost::filesystem::path> path)
 }
 
 /** Given a directory name, return its full path within the Film's directory.
- *  @param d directory name within the Filn's directory.
+ *  @param d directory name within the Film's directory.
  *  @param create true to create the directory (and its parents) if they do not exist.
  */
 boost::filesystem::path
@@ -669,7 +669,7 @@ Film::isdcf_name (bool if_created_now) const
 
        /* XXX: this uses the first bit of content only */
 
-       /* The standard says we don't do this for trailers, for some strange reason */
+       /* Interior aspect ratio.  The standard says we don't do this for trailers, for some strange reason */
        if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::TRAILER) {
                Ratio const * content_ratio = 0;
                BOOST_FOREACH (shared_ptr<Content> i, content ()) {
@@ -685,7 +685,8 @@ Film::isdcf_name (bool if_created_now) const
                }
 
                if (content_ratio && content_ratio != container()) {
-                       d += "-" + content_ratio->isdcf_name();
+                       /* This needs to be the numeric version of the ratio, and ::id() is close enough */
+                       d += "-" + content_ratio->id();
                }
        }
 
@@ -1027,24 +1028,27 @@ Film::content () const
        return _playlist->content ();
 }
 
+/** @param content Content to add.
+ *  @param disable_audio_analysis true to never do automatic audio analysis, even if it is enabled in configuration.
+ */
 void
-Film::examine_and_add_content (shared_ptr<Content> c)
+Film::examine_and_add_content (shared_ptr<Content> content, bool disable_audio_analysis)
 {
-       if (dynamic_pointer_cast<FFmpegContent> (c) && _directory) {
-               run_ffprobe (c->path(0), file ("ffprobe.log"), _log);
+       if (dynamic_pointer_cast<FFmpegContent> (content) && _directory) {
+               run_ffprobe (content->path(0), file ("ffprobe.log"), _log);
        }
 
-       shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
+       shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), content));
 
        _job_connections.push_back (
-               j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr<Job> (j), weak_ptr<Content> (c)))
+               j->Finished.connect (bind (&Film::maybe_add_content, this, weak_ptr<Job>(j), weak_ptr<Content>(content), disable_audio_analysis))
                );
 
        JobManager::instance()->add (j);
 }
 
 void
-Film::maybe_add_content (weak_ptr<Job> j, weak_ptr<Content> c)
+Film::maybe_add_content (weak_ptr<Job> j, weak_ptr<Content> c, bool disable_audio_analysis)
 {
        shared_ptr<Job> job = j.lock ();
        if (!job || !job->finished_ok ()) {
@@ -1058,12 +1062,12 @@ Film::maybe_add_content (weak_ptr<Job> j, weak_ptr<Content> c)
 
        add_content (content);
 
-       if (Config::instance()->automatic_audio_analysis() && content->audio) {
+       if (Config::instance()->automatic_audio_analysis() && content->audio && !disable_audio_analysis) {
                shared_ptr<Playlist> playlist (new Playlist);
                playlist->add (content);
                boost::signals2::connection c;
                JobManager::instance()->analyse_audio (
-                       shared_from_this (), playlist, c, bind (&Film::audio_analysis_finished, this)
+                       shared_from_this(), playlist, false, c, bind (&Film::audio_analysis_finished, this)
                        );
                _audio_analysis_connections.push_back (c);
        }
@@ -1082,9 +1086,7 @@ Film::add_content (shared_ptr<Content> c)
        if (_template_film) {
                /* Take settings from the first piece of content of c's type in _template */
                BOOST_FOREACH (shared_ptr<Content> i, _template_film->content()) {
-                       if (typeid(i.get()) == typeid(c.get())) {
-                               c->use_template (i);
-                       }
+                       c->take_settings_from (i);
                }
        }
 
@@ -1211,9 +1213,15 @@ Film::make_kdm (
        boost::filesystem::path cpl_file,
        dcp::LocalTime from,
        dcp::LocalTime until,
-       dcp::Formulation formulation
+       dcp::Formulation formulation,
+       int disable_forensic_marking_picture,
+       int disable_forensic_marking_audio
        ) const
 {
+       if (!_encrypted) {
+               throw runtime_error (_("Cannot make a KDM as this project is not encrypted."));
+       }
+
        shared_ptr<const dcp::CPL> cpl (new dcp::CPL (cpl_file));
        shared_ptr<const dcp::CertificateChain> signer = Config::instance()->signer_chain ();
        if (!signer->valid ()) {
@@ -1258,7 +1266,7 @@ Film::make_kdm (
 
        return dcp::DecryptedKDM (
                cpl->id(), keys, from, until, cpl->content_title_text(), cpl->content_title_text(), dcp::LocalTime().as_string()
-               ).encrypt (signer, recipient, trusted_devices, formulation);
+               ).encrypt (signer, recipient, trusted_devices, formulation, disable_forensic_marking_picture, disable_forensic_marking_audio);
 }
 
 /** @param screens Screens to make KDMs for.
@@ -1273,7 +1281,9 @@ Film::make_kdms (
        boost::filesystem::path cpl_file,
        boost::posix_time::ptime from,
        boost::posix_time::ptime until,
-       dcp::Formulation formulation
+       dcp::Formulation formulation,
+       int disable_forensic_marking_picture,
+       int disable_forensic_marking_audio
        ) const
 {
        list<ScreenKDM> kdms;
@@ -1286,7 +1296,9 @@ Film::make_kdms (
                                cpl_file,
                                dcp::LocalTime (from, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()),
                                dcp::LocalTime (until, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()),
-                               formulation
+                               formulation,
+                               disable_forensic_marking_picture,
+                               disable_forensic_marking_audio
                                );
 
                        kdms.push_back (ScreenKDM (i, kdm));
@@ -1516,42 +1528,6 @@ Film::content_summary (DCPTimePeriod period) const
        return _playlist->content_summary (period);
 }
 
-list<string>
-Film::fix_conflicting_settings ()
-{
-       list<string> notes;
-
-       list<boost::filesystem::path> was_referencing;
-       BOOST_FOREACH (shared_ptr<Content> i, content()) {
-               shared_ptr<DCPContent> d = dynamic_pointer_cast<DCPContent> (i);
-               if (d) {
-                       list<string> reasons;
-                       bool was = false;
-                       if (!d->can_reference_video(reasons) && d->reference_video()) {
-                               d->set_reference_video (false);
-                               was = true;
-                       }
-                       if (!d->can_reference_audio(reasons) && d->reference_audio()) {
-                               d->set_reference_audio (false);
-                               was = true;
-                       }
-                       if (!d->can_reference_subtitle(reasons) && d->reference_subtitle()) {
-                               d->set_reference_subtitle (false);
-                               was = true;
-                       }
-                       if (was) {
-                               was_referencing.push_back (d->path(0).parent_path().filename());
-                       }
-               }
-       }
-
-       BOOST_FOREACH (boost::filesystem::path d, was_referencing) {
-               notes.push_back (String::compose (_("The DCP %1 was being referred to by this film.  This not now possible because the reel sizes in the film no longer agree with those in the imported DCP.\n\nSetting the 'Reel type' to 'split by video content' will probably help.\n\nAfter doing that you would need to re-tick the appropriate 'refer to existing DCP' checkboxes."), d.string()));
-       }
-
-       return notes;
-}
-
 void
 Film::use_template (string name)
 {
@@ -1586,3 +1562,29 @@ Film::copy_from (shared_ptr<const Film> film)
 {
        read_metadata (film->file (metadata_file));
 }
+
+bool
+Film::references_dcp_video () const
+{
+       BOOST_FOREACH (shared_ptr<Content> i, _playlist->content()) {
+               shared_ptr<DCPContent> d = dynamic_pointer_cast<DCPContent>(i);
+               if (d && d->reference_video()) {
+                       return true;
+               }
+       }
+
+       return false;
+}
+
+bool
+Film::references_dcp_audio () const
+{
+       BOOST_FOREACH (shared_ptr<Content> i, _playlist->content()) {
+               shared_ptr<DCPContent> d = dynamic_pointer_cast<DCPContent>(i);
+               if (d && d->reference_audio()) {
+                       return true;
+               }
+       }
+
+       return false;
+}