Force initial update of progress so that the sub-job gets updates straight away.
[dcpomatic.git] / src / lib / writer.cc
index caa37c211b896c03918c148b8ee307f644555970..40f6ed9714baacd1a2bc9bb93b813d651a48225e 100644 (file)
 
 #include <fstream>
 #include <cerrno>
+#include <libdcp/mono_picture_asset.h>
+#include <libdcp/stereo_picture_asset.h>
 #include <libdcp/sound_asset.h>
-#include <libdcp/picture_frame.h>
 #include <libdcp/reel.h>
 #include <libdcp/dcp.h>
 #include <libdcp/cpl.h>
-#include <libdcp/mono_picture_asset.h>
-#include <libdcp/stereo_picture_asset.h>
 #include "writer.h"
 #include "compose.hpp"
 #include "film.h"
@@ -66,9 +65,10 @@ Writer::Writer (shared_ptr<const Film> f, shared_ptr<Job> j)
 {
        /* Remove any old DCP */
        boost::filesystem::remove_all (_film->dir (_film->dcp_name ()));
-       
+
+       _job->sub (_("Checking existing image data"));
        check_existing_picture_mxf ();
-       
+
        /* Create our picture asset in a subdirectory, named according to those
           film's parameters which affect the video output.  We will hard-link
           it into the DCP later.
@@ -81,7 +81,7 @@ Writer::Writer (shared_ptr<const Film> f, shared_ptr<Job> j)
        }
 
        _picture_asset->set_edit_rate (_film->video_frame_rate ());
-       _picture_asset->set_size (_film->container()->size (_film->full_frame ()));
+       _picture_asset->set_size (fit_ratio_within (_film->container()->ratio(), _film->full_frame ()));
 
        if (_film->encrypted ()) {
                _picture_asset->set_key (_film->key ());
@@ -102,7 +102,7 @@ Writer::Writer (shared_ptr<const Film> f, shared_ptr<Job> j)
 
        _thread = new boost::thread (boost::bind (&Writer::thread, this));
 
-       _job->descend (0.9);
+       _job->sub (_("Encoding image data"));
 }
 
 void
@@ -137,7 +137,7 @@ Writer::fake_write (int frame, Eyes eyes)
 {
        boost::mutex::scoped_lock lock (_mutex);
 
-       ifstream ifi (_film->info_path (frame, eyes).c_str());
+       ifstream ifi (_film->info_path (frame, eyes).string().c_str());
        libdcp::FrameInfo info (ifi);
        
        QueueItem qi;
@@ -382,17 +382,11 @@ Writer::finish ()
                                                         )
                               ));
 
-       /* Compute the digests for the assets now so that we can keep track of progress.
-          We did _job->descend (0.9) in our constructor */
-       _job->ascend ();
-
-       _job->descend (0.1);
-       _picture_asset->compute_digest (boost::bind (&Job::set_progress, _job.get(), _1));
-       _job->ascend ();
+       _job->sub (_("Computing image digest"));
+       _picture_asset->compute_digest (boost::bind (&Job::set_progress, _job.get(), _1, false));
 
-       _job->descend (0.1);
-       _sound_asset->compute_digest (boost::bind (&Job::set_progress, _job.get(), _1));
-       _job->ascend ();
+       _job->sub (_("Computing audio digest"));
+       _sound_asset->compute_digest (boost::bind (&Job::set_progress, _job.get(), _1, false));
 
        libdcp::XMLMetadata meta = Config::instance()->dcp_metadata ();
        meta.set_issue_date_now ();
@@ -427,7 +421,7 @@ bool
 Writer::check_existing_picture_mxf_frame (FILE* mxf, int f, Eyes eyes)
 {
        /* Read the frame info as written */
-       ifstream ifi (_film->info_path (f, eyes).c_str());
+       ifstream ifi (_film->info_path (f, eyes).string().c_str());
        libdcp::FrameInfo info (ifi);
        if (info.size == 0) {
                _film->log()->log (String::compose ("Existing frame %1 has no info file", f));
@@ -435,7 +429,11 @@ Writer::check_existing_picture_mxf_frame (FILE* mxf, int f, Eyes eyes)
        }
        
        /* Read the data from the MXF and hash it */
+#ifdef DCPOMATIC_WINDOWS
+       _fseeki64 (mxf, info.offset, SEEK_SET);
+#else  
        fseek (mxf, info.offset, SEEK_SET);
+#endif 
        EncodedData data (info.size);
        size_t const read = fread (data.data(), 1, data.size(), mxf);
        if (read != static_cast<size_t> (data.size ())) {
@@ -465,8 +463,15 @@ Writer::check_existing_picture_mxf ()
                return;
        }
 
+       int N = 0;
+       for (boost::filesystem::directory_iterator i (_film->info_dir ()); i != boost::filesystem::directory_iterator (); ++i) {
+               ++N;
+       }
+
        while (1) {
 
+               _job->set_progress (float (_first_nonexistant_frame) / N);
+
                if (_film->three_d ()) {
                        if (!check_existing_picture_mxf_frame (mxf, _first_nonexistant_frame, EYES_LEFT)) {
                                break;