EncodeOptions can go.
[dcpomatic.git] / src / lib / film.cc
index ad9f6525650e5cdebe54e70edb5349d796ce3d9c..4bf6606a932ce4bd983fc37e25d65c527f14f39e 100644 (file)
@@ -255,7 +255,9 @@ Film::make_dcp (bool transcode)
        }
        
        log()->log (String::compose ("Content is %1; type %2", content_path(), (content_type() == STILL ? "still" : "video")));
-       log()->log (String::compose ("Content length %1", length().get()));
+       if (length()) {
+               log()->log (String::compose ("Content length %1", length().get()));
+       }
        log()->log (String::compose ("Content digest %1", content_digest()));
        log()->log (String::compose ("%1 threads", Config::instance()->num_local_encoding_threads()));
        log()->log (String::compose ("J2K bandwidth %1", j2k_bandwidth()));
@@ -269,6 +271,8 @@ Film::make_dcp (bool transcode)
 #else
        log()->log ("libdcp built in optimised mode.");
 #endif
+       pair<string, int> const c = cpu_info ();
+       log()->log (String::compose ("CPU: %1, %2 processors", c.first, c.second));
        
        if (format() == 0) {
                throw MissingSettingError ("format");
@@ -286,32 +290,6 @@ Film::make_dcp (bool transcode)
                throw MissingSettingError ("name");
        }
 
-       shared_ptr<EncodeOptions> oe (new EncodeOptions (j2k_dir(), ".j2c", dir ("wavs")));
-       oe->out_size = format()->dcp_size ();
-       oe->padding = format()->dcp_padding (shared_from_this ());
-       if (dcp_length ()) {
-               oe->video_range = make_pair (dcp_trim_start(), dcp_trim_start() + dcp_length().get());
-               if (audio_stream()) {
-                       oe->audio_range = make_pair (
-
-                               video_frames_to_audio_frames (
-                                       oe->video_range.get().first,
-                                       dcp_audio_sample_rate (audio_stream()->sample_rate()),
-                                       dcp_frame_rate (frames_per_second()).frames_per_second
-                                       ),
-                               
-                               video_frames_to_audio_frames (
-                                       oe->video_range.get().second,
-                                       dcp_audio_sample_rate (audio_stream()->sample_rate()),
-                                       dcp_frame_rate (frames_per_second()).frames_per_second
-                                       )
-                               );
-               }
-                       
-       }
-       
-       oe->video_skip = dcp_frame_rate (frames_per_second()).skip;
-
        shared_ptr<DecodeOptions> od (new DecodeOptions);
        od->decode_subtitles = with_subtitles ();
 
@@ -319,14 +297,14 @@ Film::make_dcp (bool transcode)
 
        if (transcode) {
                if (dcp_ab()) {
-                       r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this(), od, oe, shared_ptr<Job> ())));
+                       r = JobManager::instance()->add (shared_ptr<Job> (new ABTranscodeJob (shared_from_this(), od, shared_ptr<Job> ())));
                } else {
-                       r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this(), od, oe, shared_ptr<Job> ())));
+                       r = JobManager::instance()->add (shared_ptr<Job> (new TranscodeJob (shared_from_this(), od, shared_ptr<Job> ())));
                }
        }
 
-       r = JobManager::instance()->add (shared_ptr<Job> (new CheckHashesJob (shared_from_this(), od, oe, r)));
-       JobManager::instance()->add (shared_ptr<Job> (new MakeDCPJob (shared_from_this(), oe, r)));
+       r = JobManager::instance()->add (shared_ptr<Job> (new CheckHashesJob (shared_from_this(), od, r)));
+       JobManager::instance()->add (shared_ptr<Job> (new MakeDCPJob (shared_from_this(), r)));
 }
 
 /** Start a job to examine our content file */
@@ -348,18 +326,6 @@ Film::examine_content_finished ()
        _examine_content_job.reset ();
 }
 
-/** @return full paths to any audio files that this Film has */
-vector<string>
-Film::audio_files () const
-{
-       vector<string> f;
-       for (boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (dir("wavs")); i != boost::filesystem::directory_iterator(); ++i) {
-               f.push_back (i->path().string ());
-       }
-
-       return f;
-}
-
 /** Start a job to send our DCP to the configured TMS */
 void
 Film::send_dcp_to_tms ()
@@ -714,13 +680,16 @@ Film::target_audio_sample_rate () const
        /* Resample to a DCI-approved sample rate */
        double t = dcp_audio_sample_rate (audio_stream()->sample_rate());
 
-       DCPFrameRate dfr = dcp_frame_rate (frames_per_second ());
+       DCPFrameRate dfr (frames_per_second ());
 
-       /* Compensate for the fact that video will be rounded to the
-          nearest integer number of frames per second.
+       /* Compensate if the DCP is being run at a different frame rate
+          to the source; that is, if the video is run such that it will
+          look different in the DCP compared to the source (slower or faster).
+          skip/repeat doesn't come into effect here.
        */
-       if (dfr.run_fast) {
-               t *= _frames_per_second * dfr.skip / dfr.frames_per_second;
+
+       if (dfr.change_speed) {
+               t *= _frames_per_second * dfr.factor() / dfr.frames_per_second;
        }
 
        return rint (t);
@@ -1441,3 +1410,79 @@ Film::audio_stream () const
 
        return _external_audio_stream;
 }
+
+/** @param f Source frame index.
+ *  @param t true to return a temporary file path, otherwise a permanent one.
+ *  @return The path to write this video frame to.
+ */
+string
+Film::frame_out_path (SourceFrame f, bool t) const
+{
+       stringstream s;
+       s << j2k_dir() << "/";
+       s.width (8);
+       s << std::setfill('0') << f << ".j2c";
+
+       if (t) {
+               s << ".tmp";
+       }
+
+       return s.str ();
+}
+
+string
+Film::hash_out_path (SourceFrame f, bool t) const
+{
+       return frame_out_path (f, t) + ".md5";
+}
+
+/** @param c Audio channel index.
+ *  @param t true to return a temporary file path, otherwise a permanent one.
+ *  @return The path to write this audio file to.
+ */
+string
+Film::multichannel_audio_out_path (int c, bool t) const
+{
+       stringstream s;
+       s << dir ("wavs") << "/" << (c + 1) << ".wav";
+       if (t) {
+               s << ".tmp";
+       }
+       
+       return s.str ();
+}
+
+boost::optional<pair<SourceFrame, SourceFrame> >
+Film::video_range () const
+{
+       if (!dcp_length()) {
+               return boost::optional<pair<SourceFrame, SourceFrame> > ();
+       }
+       
+       return make_pair (dcp_trim_start(), dcp_trim_start() + dcp_length().get());
+}
+
+boost::optional<pair<int64_t, int64_t> >
+Film::audio_range () const
+{
+       boost::optional<pair<SourceFrame, SourceFrame> > vr = video_range ();
+       if (!vr || !audio_stream()) {
+               return boost::optional<pair<int64_t, int64_t> > ();
+       }
+
+       DCPFrameRate dfr (frames_per_second ());
+       return make_pair (
+               
+               video_frames_to_audio_frames (
+                       vr.get().first,
+                       dcp_audio_sample_rate (audio_stream()->sample_rate()),
+                       dfr.frames_per_second
+                       ),
+               
+               video_frames_to_audio_frames (
+                       vr.get().second,
+                       dcp_audio_sample_rate (audio_stream()->sample_rate()),
+                       dfr.frames_per_second
+                       )
+               );
+}