#include "job.h"
#include "cross.h"
#include "audio_buffers.h"
-#include "md5_digester.h"
#include "version.h"
#include "font.h"
#include "util.h"
using std::string;
using std::list;
using std::cout;
+using std::map;
+using std::min;
+using std::max;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
dcp.add (cpl);
+ /* Calculate digests for each reel in parallel */
+
+ shared_ptr<Job> job = _job.lock ();
+ job->sub (_("Computing digests"));
+
+ boost::asio::io_service service;
+ boost::thread_group pool;
+
+ shared_ptr<boost::asio::io_service::work> work (new boost::asio::io_service::work (service));
+
+ int const threads = max (1, Config::instance()->num_local_encoding_threads ());
+
+ for (int i = 0; i < threads; ++i) {
+ pool.create_thread (boost::bind (&boost::asio::io_service::run, &service));
+ }
+
BOOST_FOREACH (ReelWriter& i, _reels) {
+ boost::function<void (float)> set_progress = boost::bind (&Writer::set_digest_progress, this, job.get(), _1);
+ service.post (boost::bind (&ReelWriter::calculate_digests, &i, set_progress));
+ }
- shared_ptr<Job> job = _job.lock ();
- DCPOMATIC_ASSERT (job);
- i.calculate_digests (job);
+ work.reset ();
+ pool.join_all ();
+ service.stop ();
+ /* Add reels to CPL */
+
+ BOOST_FOREACH (ReelWriter& i, _reels) {
cpl->add (i.create_reel (_reel_assets, _fonts));
}
}
}
- dcp.write_xml (_film->interop () ? dcp::INTEROP : dcp::SMPTE, meta, signer);
+ dcp.write_xml (_film->interop () ? dcp::INTEROP : dcp::SMPTE, meta, signer, Config::instance()->dcp_filename_format());
LOG_GENERAL (
N_("Wrote %1 FULL, %2 FAKE, %3 REPEAT, %4 pushed to disk"), _full_written, _fake_written, _repeat_written, _pushed_to_disk
DCPOMATIC_ASSERT (i < _reels.size ());
return i;
}
+
+void
+Writer::set_digest_progress (Job* job, float progress)
+{
+ /* I believe this is thread-safe */
+ _digest_progresses[boost::this_thread::get_id()] = progress;
+
+ boost::mutex::scoped_lock lm (_digest_progresses_mutex);
+ float min_progress = 0;
+ for (map<boost::thread::id, float>::const_iterator i = _digest_progresses.begin(); i != _digest_progresses.end(); ++i) {
+ min_progress = min (min_progress, i->second);
+ }
+
+ job->set_progress (min_progress);
+}