Use get_pixel_size rather than get_size which is slightly nicer as we then don't...
[dcpomatic.git] / src / lib / film.cc
index 4a26ded3d748968c9ebd4029043a31c37077678e..9320cf5d2c8aaa9625cc4d4ca67695c80e07c64b 100644 (file)
@@ -103,8 +103,11 @@ using boost::is_any_of;
  *
  * Bumped to 32 for 2.0 branch; some times are expressed in Times rather
  * than frames now.
+ *
+ * 32 -> 33
+ * Changed <Period> to <Subtitle> in FFmpegSubtitleStream
  */
-int const Film::current_state_version = 32;
+int const Film::current_state_version = 33;
 
 /** Construct a Film object in a given directory.
  *
@@ -135,10 +138,12 @@ Film::Film (boost::filesystem::path dir, bool log)
        set_isdcf_date_today ();
 
        _playlist_changed_connection = _playlist->Changed.connect (bind (&Film::playlist_changed, this));
+       _playlist_order_changed_connection = _playlist->OrderChanged.connect (bind (&Film::playlist_order_changed, this));
        _playlist_content_changed_connection = _playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2, _3));
 
        /* Make state.directory a complete path without ..s (where possible)
           (Code swiped from Adam Bowen on stackoverflow)
+          XXX: couldn't/shouldn't this just be boost::filesystem::canonical?
        */
 
        boost::filesystem::path p (boost::filesystem::system_complete (dir));
@@ -274,7 +279,9 @@ Film::make_dcp ()
 
        set_isdcf_date_today ();
 
-       environment_info (log ());
+       BOOST_FOREACH (string i, environment_info ()) {
+               LOG_GENERAL_NC (i);
+       }
 
        BOOST_FOREACH (shared_ptr<const Content> i, content ()) {
                LOG_GENERAL ("Content: %1", i->technical_summary());
@@ -594,7 +601,27 @@ Film::isdcf_name (bool if_created_now) const
        if (!dm.audio_language.empty ()) {
                d << "_" << dm.audio_language;
                if (!dm.subtitle_language.empty()) {
-                       d << "-" << dm.subtitle_language;
+
+                       bool burnt_in = false;
+                       BOOST_FOREACH (shared_ptr<Content> i, content ()) {
+                               shared_ptr<SubtitleContent> sc = dynamic_pointer_cast<SubtitleContent> (i);
+                               if (!sc) {
+                                       continue;
+                               }
+
+                               if (sc->use_subtitles() && sc->burn_subtitles()) {
+                                       burnt_in = true;
+                               }
+                       }
+
+                       string language = dm.subtitle_language;
+                       if (burnt_in) {
+                               transform (language.begin(), language.end(), language.begin(), ::tolower);
+                       } else {
+                               transform (language.begin(), language.end(), language.begin(), ::toupper);
+                       }
+
+                       d << "-" << language;
                } else {
                        d << "-XX";
                }
@@ -831,6 +858,7 @@ Film::set_reel_type (ReelType t)
        signal_changed (REEL_TYPE);
 }
 
+/** @param r Desired reel length in bytes */
 void
 Film::set_reel_length (int64_t r)
 {
@@ -1068,6 +1096,12 @@ Film::playlist_changed ()
        signal_changed (NAME);
 }
 
+void
+Film::playlist_order_changed ()
+{
+       signal_changed (CONTENT_ORDER);
+}
+
 int
 Film::audio_frame_rate () const
 {
@@ -1113,7 +1147,8 @@ Film::frame_size () const
 
 dcp::EncryptedKDM
 Film::make_kdm (
-       dcp::Certificate target,
+       dcp::Certificate recipient,
+       vector<dcp::Certificate> trusted_devices,
        boost::filesystem::path cpl_file,
        dcp::LocalTime from,
        dcp::LocalTime until,
@@ -1128,7 +1163,7 @@ Film::make_kdm (
 
        return dcp::DecryptedKDM (
                cpl, key(), from, until, "DCP-o-matic", cpl->content_title_text(), dcp::LocalTime().as_string()
-               ).encrypt (signer, target, formulation);
+               ).encrypt (signer, recipient, trusted_devices, formulation);
 }
 
 list<ScreenKDM>
@@ -1143,8 +1178,8 @@ Film::make_kdms (
        list<ScreenKDM> kdms;
 
        BOOST_FOREACH (shared_ptr<Screen> i, screens) {
-               if (i->certificate) {
-                       kdms.push_back (ScreenKDM (i, make_kdm (i->certificate.get(), dcp, from, until, formulation)));
+               if (i->recipient) {
+                       kdms.push_back (ScreenKDM (i, make_kdm (i->recipient.get(), i->trusted_devices, dcp, from, until, formulation)));
                }
        }
 
@@ -1157,12 +1192,12 @@ Film::make_kdms (
 uint64_t
 Film::required_disk_space () const
 {
-       return uint64_t (j2k_bandwidth() / 8) * length().seconds();
+       return _playlist->required_disk_space (j2k_bandwidth(), audio_channels(), audio_frame_rate());
 }
 
 /** This method checks the disk that the Film is on and tries to decide whether or not
  *  there will be enough space to make a DCP for it.  If so, true is returned; if not,
- *  false is returned and required and availabe are filled in with the amount of disk space
+ *  false is returned and required and available are filled in with the amount of disk space
  *  required and available respectively (in Gb).
  *
  *  Note: the decision made by this method isn't, of course, 100% reliable.
@@ -1253,6 +1288,8 @@ Film::audio_output_names () const
                return audio_processor()->input_names ();
        }
 
+       DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16);
+
        vector<string> n;
        n.push_back (_("L"));
        n.push_back (_("R"));
@@ -1266,6 +1303,10 @@ Film::audio_output_names () const
        n.push_back (_("Rc"));
        n.push_back (_("BsL"));
        n.push_back (_("BsR"));
+       n.push_back (_("DBP"));
+       n.push_back (_("DBS"));
+       n.push_back ("");
+       n.push_back ("");
 
        return vector<string> (n.begin(), n.begin() + audio_channels ());
 }
@@ -1292,7 +1333,7 @@ list<DCPTimePeriod>
 Film::reels () const
 {
        list<DCPTimePeriod> p;
-       DCPTime const len = length ();
+       DCPTime const len = length().round_up (video_frame_rate ());
 
        switch (reel_type ()) {
        case REELTYPE_SINGLE: