Merge master.
[dcpomatic.git] / src / lib / film.cc
index 75ec700e0092e5bb35487f43556e4c93b1600b4e..fa75ab1f1d444905dc61a0d864db5fe7a9a8cf6c 100644 (file)
@@ -36,7 +36,6 @@
 #include "filter.h"
 #include "util.h"
 #include "job_manager.h"
-#include "ab_transcode_job.h"
 #include "transcode_job.h"
 #include "scp_dcp_job.h"
 #include "log.h"
@@ -46,7 +45,6 @@
 #include "config.h"
 #include "version.h"
 #include "ui_signaller.h"
-#include "analyse_audio_job.h"
 #include "playlist.h"
 #include "player.h"
 #include "ffmpeg_content.h"
@@ -73,6 +71,7 @@ using std::endl;
 using std::cout;
 using std::list;
 using boost::shared_ptr;
+using boost::weak_ptr;
 using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
 using boost::to_upper_copy;
@@ -94,15 +93,15 @@ Film::Film (string d)
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
        , _container (Config::instance()->default_container ())
        , _scaler (Scaler::from_id ("bicubic"))
-       , _ab (false)
        , _with_subtitles (false)
        , _subtitle_offset (0)
        , _subtitle_scale (1)
        , _colour_lut (0)
        , _j2k_bandwidth (200000000)
        , _dci_metadata (Config::instance()->default_dci_metadata ())
-       , _dcp_video_frame_rate (0)
+       , _dcp_video_frame_rate (24)
        , _dcp_audio_channels (MAX_AUDIO_CHANNELS)
+       , _minimum_audio_channels (0)
        , _dirty (false)
 {
        set_dci_date_today ();
@@ -129,7 +128,6 @@ Film::Film (string d)
        }
 
        set_directory (result.string ());
-       _log.reset (new FileLog (file ("log")));
 }
 
 Film::Film (Film const & o)
@@ -143,7 +141,6 @@ Film::Film (Film const & o)
        , _dcp_content_type  (o._dcp_content_type)
        , _container         (o._container)
        , _scaler            (o._scaler)
-       , _ab                (o._ab)
        , _with_subtitles    (o._with_subtitles)
        , _subtitle_offset   (o._subtitle_offset)
        , _subtitle_scale    (o._subtitle_scale)
@@ -152,6 +149,7 @@ Film::Film (Film const & o)
        , _dci_metadata      (o._dci_metadata)
        , _dcp_video_frame_rate (o._dcp_video_frame_rate)
        , _dci_date          (o._dci_date)
+       , _minimum_audio_channels (o._minimum_audio_channels)
        , _dirty             (o._dirty)
 {
        _playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2));
@@ -171,11 +169,6 @@ Film::video_state_identifier () const
          << "_" << j2k_bandwidth()
          << "_" << lexical_cast<int> (colour_lut());
 
-       if (ab()) {
-               pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
-               s << "ab_" << Config::instance()->reference_scaler()->id() << "_" << fa.first << "_" << fa.second;
-       }
-
        return s.str ();
 }
          
@@ -192,7 +185,6 @@ Film::info_dir () const
 string
 Film::internal_video_mxf_dir () const
 {
-       boost::filesystem::path p;
        return dir ("video");
 }
 
@@ -230,13 +222,12 @@ Film::filename_safe_name () const
        return o;
 }
 
-string
-Film::audio_analysis_path () const
+boost::filesystem::path
+Film::audio_analysis_path (shared_ptr<const AudioContent> c) const
 {
-       boost::filesystem::path p;
-       p /= "analysis";
-       p /= _playlist->audio_digest();
-       return file (p.string ());
+       boost::filesystem::path p = dir ("analysis");
+       p /= c->digest();
+       return p;
 }
 
 /** Add suitable Jobs to the JobManager to create a DCP for this Film */
@@ -277,6 +268,10 @@ Film::make_dcp ()
 #endif
        pair<string, int> const c = cpu_info ();
        log()->log (String::compose ("CPU: %1, %2 processors", c.first, c.second));
+       list<pair<string, string> > const m = mount_info ();
+       for (list<pair<string, string> >::const_iterator i = m.begin(); i != m.end(); ++i) {
+               log()->log (String::compose ("Mount: %1 %2", i->first, i->second));
+       }
        
        if (container() == 0) {
                throw MissingSettingError (_("container"));
@@ -294,38 +289,7 @@ Film::make_dcp ()
                throw MissingSettingError (_("name"));
        }
 
-       shared_ptr<Job> r;
-
-       if (ab()) {
-               r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this())));
-       } else {
-               r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this())));
-       }
-}
-
-/** Start a job to analyse the audio in our Playlist */
-void
-Film::analyse_audio ()
-{
-       if (_analyse_audio_job) {
-               return;
-       }
-
-       _analyse_audio_job.reset (new AnalyseAudioJob (shared_from_this()));
-       _analyse_audio_job->Finished.connect (bind (&Film::analyse_audio_finished, this));
-       JobManager::instance()->add (_analyse_audio_job);
-}
-
-void
-Film::analyse_audio_finished ()
-{
-       ensure_ui_thread ();
-
-       if (_analyse_audio_job->finished_ok ()) {
-               AudioAnalysisSucceeded ();
-       }
-       
-       _analyse_audio_job.reset ();
+       JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this())));
 }
 
 /** Start a job to send our DCP to the configured TMS */
@@ -384,7 +348,6 @@ Film::write_metadata () const
        }
 
        root->add_child("Scaler")->add_child_text (_scaler->id ());
-       root->add_child("AB")->add_child_text (_ab ? "1" : "0");
        root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
        root->add_child("SubtitleOffset")->add_child_text (lexical_cast<string> (_subtitle_offset));
        root->add_child("SubtitleScale")->add_child_text (lexical_cast<string> (_subtitle_scale));
@@ -394,6 +357,7 @@ Film::write_metadata () const
        root->add_child("DCPVideoFrameRate")->add_child_text (lexical_cast<string> (_dcp_video_frame_rate));
        root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
        root->add_child("DCPAudioChannels")->add_child_text (lexical_cast<string> (_dcp_audio_channels));
+       root->add_child("MinimumAudioChannels")->add_child_text (lexical_cast<string> (_minimum_audio_channels));
        _playlist->as_xml (root->add_child ("Playlist"));
 
        doc.write_to_file_formatted (file ("metadata.xml"));
@@ -432,7 +396,6 @@ Film::read_metadata ()
        }
 
        _scaler = Scaler::from_id (f.string_child ("Scaler"));
-       _ab = f.bool_child ("AB");
        _with_subtitles = f.bool_child ("WithSubtitles");
        _subtitle_offset = f.number_child<float> ("SubtitleOffset");
        _subtitle_scale = f.number_child<float> ("SubtitleScale");
@@ -442,6 +405,7 @@ Film::read_metadata ()
        _dcp_video_frame_rate = f.number_child<int> ("DCPVideoFrameRate");
        _dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
        _dcp_audio_channels = f.number_child<int> ("DCPAudioChannels");
+       _minimum_audio_channels = f.number_child<int> ("MinimumAudioChannels");
 
        _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"));
 
@@ -622,16 +586,6 @@ Film::set_scaler (Scaler const * s)
        signal_changed (SCALER);
 }
 
-void
-Film::set_ab (bool a)
-{
-       {
-               boost::mutex::scoped_lock lm (_state_mutex);
-               _ab = a;
-       }
-       signal_changed (AB);
-}
-
 void
 Film::set_with_subtitles (bool w)
 {
@@ -693,6 +647,16 @@ Film::set_dci_metadata (DCIMetadata m)
 }
 
 
+void
+Film::set_minimum_audio_channels (int c)
+{
+       {
+               boost::mutex::scoped_lock lm (_state_mutex);
+               _minimum_audio_channels = c;
+       }
+       signal_changed (MINIMUM_AUDIO_CHANNELS);
+}
+                       
 void
 Film::set_dcp_video_frame_rate (int f)
 {
@@ -808,9 +772,19 @@ void
 Film::examine_and_add_content (shared_ptr<Content> c)
 {
        shared_ptr<Job> j (new ExamineContentJob (shared_from_this(), c));
+       j->Finished.connect (bind (&Film::add_content_weak, this, boost::weak_ptr<Content> (c)));
        JobManager::instance()->add (j);
 }
 
+void
+Film::add_content_weak (weak_ptr<Content> c)
+{
+       shared_ptr<Content> content = c.lock ();
+       if (content) {
+               add_content (content);
+       }
+}
+
 void
 Film::add_content (shared_ptr<Content> c)
 {