Hand-apply 97dde0e6d77b874742161703944d60524023664e from master.
[dcpomatic.git] / src / lib / film.cc
index 0b48bf7b12d34eefcd280c06add697e1b56aecd9..3aed4d9657ff088b6464ca5ede71e78abf2d2bf0 100644 (file)
@@ -31,7 +31,6 @@
 #include "log.h"
 #include "exceptions.h"
 #include "examine_content_job.h"
-#include "scaler.h"
 #include "config.h"
 #include "ui_signaller.h"
 #include "playlist.h"
@@ -120,7 +119,6 @@ Film::Film (boost::filesystem::path dir, bool log)
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
        , _container (Config::instance()->default_container ())
        , _resolution (RESOLUTION_2K)
-       , _scaler (Scaler::from_id ("bicubic"))
        , _signed (true)
        , _encrypted (false)
        , _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ())
@@ -186,7 +184,6 @@ Film::video_identifier () const
          << "_" << resolution_to_string (_resolution)
          << "_" << _playlist->video_identifier()
          << "_" << _video_frame_rate
-         << "_" << scaler()->id()
          << "_" << j2k_bandwidth();
 
        if (encrypted ()) {
@@ -359,7 +356,6 @@ Film::metadata () const
        }
 
        root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution));
-       root->add_child("Scaler")->add_child_text (_scaler->id ());
        root->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
        _isdcf_metadata.as_xml (root->add_child ("ISDCFMetadata"));
        root->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
@@ -431,12 +427,19 @@ Film::read_metadata ()
        }
 
        _resolution = string_to_resolution (f.string_child ("Resolution"));
-       _scaler = Scaler::from_id (f.string_child ("Scaler"));
        _j2k_bandwidth = f.number_child<int> ("J2KBandwidth");
        _video_frame_rate = f.number_child<int> ("VideoFrameRate");
        _signed = f.optional_bool_child("Signed").get_value_or (true);
        _encrypted = f.bool_child ("Encrypted");
        _audio_channels = f.number_child<int> ("AudioChannels");
+       /* We used to allow odd numbers (and zero) channels, but it's just not worth
+          the pain.
+       */
+       if (_audio_channels == 0) {
+               _audio_channels = 2;
+       } else if ((_audio_channels % 2) == 1) {
+               _audio_channels++;
+       }
        _sequence_video = f.bool_child ("SequenceVideo");
        _three_d = f.bool_child ("ThreeD");
        _interop = f.bool_child ("Interop");
@@ -578,11 +581,12 @@ Film::isdcf_name (bool if_created_now) const
                d << "_" << container()->isdcf_name();
        }
 
+       ContentList cl = content ();
+       
        /* XXX: this uses the first bit of content only */
 
        /* 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) {
-               ContentList cl = content ();
                Ratio const * content_ratio = 0;
                for (ContentList::iterator i = cl.begin(); i != cl.end(); ++i) {
                        shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (*i);
@@ -618,25 +622,34 @@ Film::isdcf_name (bool if_created_now) const
                }
        }
 
-       switch (audio_channels ()) {
-       case 1:
-               d << "_10";
-               break;
-       case 2:
-               d << "_20";
-               break;
-       case 3:
-               d << "_30";
-               break;
-       case 4:
-               d << "_40";
-               break;
-       case 5:
-               d << "_50";
-               break;
-       case 6:
-               d << "_51";
-               break;
+       /* Find all mapped channels */
+
+       list<dcp::Channel> mapped;
+       for (ContentList::const_iterator i = cl.begin(); i != cl.end(); ++i) {
+               shared_ptr<const AudioContent> ac = dynamic_pointer_cast<const AudioContent> (*i);
+               if (ac) {
+                       list<dcp::Channel> c = ac->audio_mapping().mapped_dcp_channels ();
+                       copy (c.begin(), c.end(), back_inserter (mapped));
+               }
+       }
+
+       mapped.sort ();
+       mapped.unique ();
+       
+       /* Count them */
+                       
+       int non_lfe = 0;
+       int lfe = 0;
+       for (list<dcp::Channel>::const_iterator i = mapped.begin(); i != mapped.end(); ++i) {
+               if ((*i) == dcp::LFE) {
+                       ++lfe;
+               } else {
+                       ++non_lfe;
+               }
+       }
+
+       if (non_lfe) {
+               d << "_" << non_lfe << lfe;
        }
 
        /* XXX: HI/VI */
@@ -727,13 +740,6 @@ Film::set_resolution (Resolution r)
        signal_changed (RESOLUTION);
 }
 
-void
-Film::set_scaler (Scaler const * s)
-{
-       _scaler = s;
-       signal_changed (SCALER);
-}
-
 void
 Film::set_j2k_bandwidth (int b)
 {
@@ -1018,7 +1024,11 @@ Film::playlist_content_changed (boost::weak_ptr<Content> c, int p)
 {
        if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
                set_video_frame_rate (_playlist->best_dcp_frame_rate ());
-       } 
+       } else if (
+               p == AudioContentProperty::AUDIO_MAPPING ||
+               p == AudioContentProperty::AUDIO_CHANNELS) {
+               signal_changed (NAME);
+       }
 
        if (ui_signaller) {
                ui_signaller->emit (boost::bind (boost::ref (ContentChanged), c, p));
@@ -1029,6 +1039,7 @@ void
 Film::playlist_changed ()
 {
        signal_changed (CONTENT);
+       signal_changed (NAME);
 }      
 
 int