Split test compile up into individual files.
[dcpomatic.git] / src / lib / film.cc
index 295f80ccbaedc7fcedb74e31d2dbd352d8dfee26..b78622a90871a641d8238541b003a85929ad4214 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2013 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -33,7 +33,6 @@
 #include <libcxml/cxml.h>
 #include "film.h"
 #include "job.h"
-#include "filter.h"
 #include "util.h"
 #include "job_manager.h"
 #include "transcode_job.h"
@@ -47,9 +46,6 @@
 #include "ui_signaller.h"
 #include "playlist.h"
 #include "player.h"
-#include "ffmpeg_content.h"
-#include "imagemagick_content.h"
-#include "sndfile_content.h"
 #include "dcp_content_type.h"
 #include "ratio.h"
 #include "cross.h"
@@ -92,9 +88,10 @@ Film::Film (string d)
        , _use_dci_name (true)
        , _dcp_content_type (Config::instance()->default_dcp_content_type ())
        , _container (Config::instance()->default_container ())
+       , _resolution (RESOLUTION_2K)
        , _scaler (Scaler::from_id ("bicubic"))
        , _with_subtitles (false)
-       , _j2k_bandwidth (200000000)
+       , _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ())
        , _dci_metadata (Config::instance()->default_dci_metadata ())
        , _dcp_video_frame_rate (24)
        , _dcp_audio_channels (MAX_AUDIO_CHANNELS)
@@ -127,27 +124,6 @@ Film::Film (string d)
        _log.reset (new FileLog ("log"));
 }
 
-Film::Film (Film const & o)
-       : boost::enable_shared_from_this<Film> (o)
-       /* note: the copied film shares the original's log */
-       , _log               (o._log)
-       , _playlist          (new Playlist (o._playlist))
-       , _directory         (o._directory)
-       , _name              (o._name)
-       , _use_dci_name      (o._use_dci_name)
-       , _dcp_content_type  (o._dcp_content_type)
-       , _container         (o._container)
-       , _scaler            (o._scaler)
-       , _with_subtitles    (o._with_subtitles)
-       , _j2k_bandwidth     (o._j2k_bandwidth)
-       , _dci_metadata      (o._dci_metadata)
-       , _dcp_video_frame_rate (o._dcp_video_frame_rate)
-       , _dci_date          (o._dci_date)
-       , _dirty             (o._dirty)
-{
-       _playlist->ContentChanged.connect (bind (&Film::playlist_content_changed, this, _1, _2));
-}
-
 string
 Film::video_identifier () const
 {
@@ -156,6 +132,7 @@ Film::video_identifier () const
 
        stringstream s;
        s << container()->id()
+         << "_" << resolution_to_string (_resolution)
          << "_" << _playlist->video_identifier()
          << "_" << _dcp_video_frame_rate
          << "_" << scaler()->id()
@@ -339,6 +316,7 @@ Film::write_metadata () const
                root->add_child("Container")->add_child_text (_container->id ());
        }
 
+       root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution));
        root->add_child("Scaler")->add_child_text (_scaler->id ());
        root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
        root->add_child("J2KBandwidth")->add_child_text (lexical_cast<string> (_j2k_bandwidth));
@@ -383,6 +361,7 @@ Film::read_metadata ()
                }
        }
 
+       _resolution = string_to_resolution (f.string_child ("Resolution"));
        _scaler = Scaler::from_id (f.string_child ("Scaler"));
        _with_subtitles = f.bool_child ("WithSubtitles");
        _j2k_bandwidth = f.number_child<int> ("J2KBandwidth");
@@ -463,7 +442,7 @@ Film::dci_name (bool if_created_now) const
 
        if (!dm.audio_language.empty ()) {
                d << "_" << dm.audio_language;
-               if (!dm.subtitle_language.empty()) {
+               if (!dm.subtitle_language.empty() && with_subtitles()) {
                        d << "-" << dm.subtitle_language;
                } else {
                        d << "-XX";
@@ -477,7 +456,28 @@ Film::dci_name (bool if_created_now) const
                }
        }
 
-       d << "_51_2K";
+       switch (dcp_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;
+       }
+
+       d << "_" << resolution_to_string (_resolution);
 
        if (!dm.studio.empty ()) {
                d << "_" << dm.studio;
@@ -560,6 +560,16 @@ Film::set_container (Ratio const * c)
        signal_changed (CONTAINER);
 }
 
+void
+Film::set_resolution (Resolution r)
+{
+       {
+               boost::mutex::scoped_lock lm (_state_mutex);
+               _resolution = r;
+       }
+       signal_changed (RESOLUTION);
+}
+
 void
 Film::set_scaler (Scaler const * s)
 {
@@ -706,7 +716,7 @@ Film::have_dcp () const
 }
 
 shared_ptr<Player>
-Film::player () const
+Film::make_player () const
 {
        return shared_ptr<Player> (new Player (shared_from_this (), _playlist));
 }
@@ -846,5 +856,13 @@ Film::set_sequence_video (bool s)
 libdcp::Size
 Film::full_frame () const
 {
-       return libdcp::Size (2048, 1080);
+       switch (_resolution) {
+       case RESOLUTION_2K:
+               return libdcp::Size (2048, 1080);
+       case RESOLUTION_4K:
+               return libdcp::Size (4096, 2160);
+       }
+
+       assert (false);
+       return libdcp::Size ();
 }