No-op; fix GPL address and use the explicit-program-name version.
[dcpomatic.git] / src / lib / film.cc
index b80962ead59c47a5bb11f64f5aefae34192d66a9..6b3625d9e727d34faec4effa67da7304aa1d832f 100644 (file)
@@ -1,19 +1,20 @@
 /*
     Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
 
-    This program is free software; you can redistribute it and/or modify
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
 
-    This program is distributed in the hope that it will be useful,
+    DCP-o-matic is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
@@ -245,13 +246,12 @@ Film::audio_analysis_path (shared_ptr<const Playlist> playlist) const
 
        MD5Digester digester;
        BOOST_FOREACH (shared_ptr<Content> i, playlist->content ()) {
-               shared_ptr<AudioContent> ac = dynamic_pointer_cast<AudioContent> (i);
-               if (!ac) {
+               if (!i->audio) {
                        continue;
                }
 
-               digester.add (ac->digest ());
-               digester.add (ac->audio_mapping().digest ());
+               digester.add (i->digest ());
+               digester.add (i->audio->mapping().digest ());
                if (playlist->content().size() != 1) {
                        /* Analyses should be considered equal regardless of gain
                           if they were made from just one piece of content.  This
@@ -259,7 +259,7 @@ Film::audio_analysis_path (shared_ptr<const Playlist> playlist) const
                           analysis at the plotting stage rather than having to
                           recompute it.
                        */
-                       digester.add (ac->audio_gain ());
+                       digester.add (i->audio->gain ());
                }
        }
 
@@ -505,9 +505,8 @@ Film::mapped_audio_channels () const
                }
        } else {
                BOOST_FOREACH (shared_ptr<Content> i, content ()) {
-                       shared_ptr<const AudioContent> ac = dynamic_pointer_cast<const AudioContent> (i);
-                       if (ac) {
-                               list<int> c = ac->audio_mapping().mapped_output_channels ();
+                       if (i->audio) {
+                               list<int> c = i->audio->mapping().mapped_output_channels ();
                                copy (c.begin(), c.end(), back_inserter (mapped));
                        }
                }
@@ -617,13 +616,12 @@ Film::isdcf_name (bool if_created_now) const
        if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::TRAILER) {
                Ratio const * content_ratio = 0;
                BOOST_FOREACH (shared_ptr<Content> i, content ()) {
-                       shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (i);
-                       if (vc) {
+                       if (i->video) {
                                /* Here's the first piece of video content */
-                               if (vc->scale().ratio ()) {
-                                       content_ratio = vc->scale().ratio ();
+                               if (i->video->scale().ratio ()) {
+                                       content_ratio = i->video->scale().ratio ();
                                } else {
-                                       content_ratio = Ratio::from_ratio (vc->video_size().ratio ());
+                                       content_ratio = Ratio::from_ratio (i->video->size().ratio ());
                                }
                                break;
                        }
@@ -638,20 +636,19 @@ Film::isdcf_name (bool if_created_now) const
                d << "_" << dm.audio_language;
                if (!dm.subtitle_language.empty()) {
 
-                       bool burnt_in = false;
+                       bool burnt_in = true;
                        BOOST_FOREACH (shared_ptr<Content> i, content ()) {
-                               shared_ptr<SubtitleContent> sc = dynamic_pointer_cast<SubtitleContent> (i);
-                               if (!sc) {
+                               if (!i->subtitle) {
                                        continue;
                                }
 
-                               if (sc->use_subtitles() && sc->burn_subtitles()) {
-                                       burnt_in = true;
+                               if (i->subtitle->use() && !i->subtitle->burn()) {
+                                       burnt_in = false;
                                }
                        }
 
                        string language = dm.subtitle_language;
-                       if (burnt_in) {
+                       if (burnt_in && language != "XX") {
                                transform (language.begin(), language.end(), language.begin(), ::tolower);
                        } else {
                                transform (language.begin(), language.end(), language.begin(), ::toupper);
@@ -891,7 +888,7 @@ Film::signal_changed (Property p)
 
        switch (p) {
        case Film::CONTENT:
-               set_video_frame_rate (_playlist->best_dcp_frame_rate ());
+               set_video_frame_rate (_playlist->best_video_frame_rate ());
                break;
        case Film::VIDEO_FRAME_RATE:
        case Film::SEQUENCE:
@@ -1034,7 +1031,7 @@ Film::maybe_add_content (weak_ptr<Job> j, weak_ptr<Content> c)
        }
 
        add_content (content);
-       if (Config::instance()->automatic_audio_analysis() && dynamic_pointer_cast<AudioContent> (content)) {
+       if (Config::instance()->automatic_audio_analysis() && content->audio) {
                shared_ptr<Playlist> playlist (new Playlist);
                playlist->add (content);
                boost::signals2::connection c;
@@ -1049,9 +1046,9 @@ void
 Film::add_content (shared_ptr<Content> c)
 {
        /* Add {video,subtitle} content after any existing {video,subtitle} content */
-       if (dynamic_pointer_cast<VideoContent> (c)) {
+       if (c->video) {
                c->set_position (_playlist->video_end ());
-       } else if (dynamic_pointer_cast<SubtitleContent> (c)) {
+       } else if (c->subtitle) {
                c->set_position (_playlist->subtitle_end ());
        }
 
@@ -1086,7 +1083,7 @@ Film::length () const
 int
 Film::best_video_frame_rate () const
 {
-       return _playlist->best_dcp_frame_rate ();
+       return _playlist->best_video_frame_rate ();
 }
 
 FrameRateChange
@@ -1100,9 +1097,9 @@ Film::playlist_content_changed (weak_ptr<Content> c, int p, bool frequent)
 {
        _dirty = true;
 
-       if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
-               set_video_frame_rate (_playlist->best_dcp_frame_rate ());
-       } else if (p == AudioContentProperty::AUDIO_STREAMS) {
+       if (p == ContentProperty::VIDEO_FRAME_RATE) {
+               set_video_frame_rate (_playlist->best_video_frame_rate ());
+       } else if (p == AudioContentProperty::STREAMS) {
                signal_changed (NAME);
        }
 
@@ -1126,8 +1123,7 @@ int
 Film::audio_frame_rate () const
 {
        BOOST_FOREACH (shared_ptr<Content> i, content ()) {
-               shared_ptr<AudioContent> a = dynamic_pointer_cast<AudioContent> (i);
-               if (a && a->has_rate_above_48k ()) {
+               if (i->audio && i->audio->has_rate_above_48k ()) {
                        return 96000;
                }
        }
@@ -1185,7 +1181,7 @@ Film::make_kdm (
        }
 
        return dcp::DecryptedKDM (
-               cpl, key(), from, until, "DCP-o-matic", cpl->content_title_text(), dcp::LocalTime().as_string()
+               cpl, key(), from, until, cpl->content_title_text(), cpl->content_title_text(), dcp::LocalTime().as_string()
                ).encrypt (signer, recipient, trusted_devices, formulation);
 }
 
@@ -1272,9 +1268,8 @@ Film::subtitle_language () const
 
        ContentList cl = content ();
        BOOST_FOREACH (shared_ptr<Content>& c, cl) {
-               shared_ptr<SubtitleContent> sc = dynamic_pointer_cast<SubtitleContent> (c);
-               if (sc) {
-                       languages.insert (sc->subtitle_language ());
+               if (c->subtitle) {
+                       languages.insert (c->subtitle->language ());
                }
        }
 
@@ -1377,18 +1372,17 @@ Film::reels () const
        case REELTYPE_BY_VIDEO_CONTENT:
        {
                optional<DCPTime> last_split;
-               shared_ptr<VideoContent> last_video;
+               shared_ptr<Content> last_video;
                ContentList cl = content ();
                BOOST_FOREACH (shared_ptr<Content> c, content ()) {
-                       shared_ptr<VideoContent> v = dynamic_pointer_cast<VideoContent> (c);
-                       if (v) {
-                               BOOST_FOREACH (DCPTime t, v->reel_split_points()) {
+                       if (c->video) {
+                               BOOST_FOREACH (DCPTime t, c->reel_split_points()) {
                                        if (last_split) {
                                                p.push_back (DCPTimePeriod (last_split.get(), t));
                                        }
                                        last_split = t;
                                }
-                               last_video = v;
+                               last_video = c;
                        }
                }