X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fwriter.cc;h=ca9b63df42db31eceeb4a9a105786fd12efbc135;hb=15f23b356b757a9697bf1a9ec30c243ab8070404;hp=306f6d7f4968c387965014baf084e43668bee5f6;hpb=308488324dbc4d8b709d3fb1dc9fee0479346c21;p=dcpomatic.git diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 306f6d7f4..ca9b63df4 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -34,7 +34,7 @@ #include "film.h" #include "ratio.h" #include "log.h" -#include "dcp_video_frame.h" +#include "dcp_video.h" #include "dcp_content_type.h" #include "player.h" #include "audio_mapping.h" @@ -42,9 +42,14 @@ #include "job.h" #include "cross.h" #include "audio_buffers.h" +#include "md5_digester.h" #include "i18n.h" +#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL); +#define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING); +#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_WARNING); + /* OS X strikes again */ #undef set_key @@ -134,6 +139,7 @@ Writer::write (shared_ptr encoded, int frame, Eyes eyes) boost::mutex::scoped_lock lock (_mutex); while (_queued_full_in_memory > _maximum_frames_in_memory) { + /* The queue is too big; wait until that is sorted out */ _full_condition.wait (lock); } @@ -155,7 +161,8 @@ Writer::write (shared_ptr encoded, int frame, Eyes eyes) _queue.push_back (qi); ++_queued_full_in_memory; } - + + /* Now there's something to do: wake anything wait()ing on _empty_condition */ _empty_condition.notify_all (); } @@ -165,6 +172,7 @@ Writer::fake_write (int frame, Eyes eyes) boost::mutex::scoped_lock lock (_mutex); while (_queued_full_in_memory > _maximum_frames_in_memory) { + /* The queue is too big; wait until that is sorted out */ _full_condition.wait (lock); } @@ -186,6 +194,7 @@ Writer::fake_write (int frame, Eyes eyes) _queue.push_back (qi); } + /* Now there's something to do: wake anything wait()ing on _empty_condition */ _empty_condition.notify_all (); } @@ -232,19 +241,21 @@ void Writer::thread () try { - while (1) + while (true) { boost::mutex::scoped_lock lock (_mutex); - while (1) { + while (true) { if (_finish || _queued_full_in_memory > _maximum_frames_in_memory || have_sequenced_image_at_queue_head ()) { + /* We've got something to do: go and do it */ break; } - TIMING (N_("writer sleeps with a queue of %1"), _queue.size()); + /* Nothing to do: wait until something happens which may indicate that we do */ + LOG_TIMING (N_("writer sleeps with a queue of %1"), _queue.size()); _empty_condition.wait (lock); - TIMING (N_("writer wakes with a queue of %1"), _queue.size()); + LOG_TIMING (N_("writer wakes with a queue of %1"), _queue.size()); } if (_finish && _queue.empty()) { @@ -263,7 +274,7 @@ try switch (qi.type) { case QueueItem::FULL: { - _film->log()->log (String::compose (N_("Writer FULL-writes %1 to MXF"), qi.frame)); + LOG_GENERAL (N_("Writer FULL-writes %1 to MXF"), qi.frame); if (!qi.encoded) { qi.encoded.reset (new EncodedData (_film->j2c_path (qi.frame, qi.eyes, false))); } @@ -275,7 +286,7 @@ try break; } case QueueItem::FAKE: - _film->log()->log (String::compose (N_("Writer FAKE-writes %1 to MXF"), qi.frame)); + LOG_GENERAL (N_("Writer FAKE-writes %1 to MXF"), qi.frame); _picture_mxf_writer->fake_write (qi.size); _last_written[qi.eyes].reset (); ++_fake_written; @@ -319,11 +330,10 @@ try lock.unlock (); - _film->log()->log ( - String::compose ( - "Writer full (awaiting %1 [last eye was %2]); pushes %3 to disk", - _last_written_frame + 1, - _last_written_eyes, qi.frame) + LOG_GENERAL ( + "Writer full (awaiting %1 [last eye was %2]); pushes %3 to disk", + _last_written_frame + 1, + _last_written_eyes, qi.frame ); qi.encoded->write (_film, qi.frame, qi.eyes); @@ -332,6 +342,7 @@ try --_queued_full_in_memory; } + /* The queue has probably just gone down a bit; notify anything wait()ing on _full_condition */ _full_condition.notify_all (); } } @@ -390,7 +401,7 @@ Writer::finish () if (ec) { /* hard link failed; copy instead */ boost::filesystem::copy_file (video_from, video_to); - _film->log()->log ("Hard-link failed; fell back to copying"); + LOG_WARNING_NC ("Hard-link failed; fell back to copying"); } _picture_mxf->set_file (video_to); @@ -460,8 +471,8 @@ Writer::finish () dcp.write_xml (_film->interop () ? dcp::INTEROP : dcp::SMPTE, meta, _film->is_signed() ? make_signer () : shared_ptr ()); - _film->log()->log ( - String::compose (N_("Wrote %1 FULL, %2 FAKE, %3 pushed to disk"), _full_written, _fake_written, _pushed_to_disk) + LOG_GENERAL ( + N_("Wrote %1 FULL, %2 FAKE, %3 pushed to disk"), _full_written, _fake_written, _pushed_to_disk ); } @@ -471,14 +482,14 @@ Writer::check_existing_picture_mxf_frame (FILE* mxf, int f, Eyes eyes) /* Read the frame info as written */ FILE* ifi = fopen_boost (_film->info_path (f, eyes), "r"); if (!ifi) { - _film->log()->log (String::compose ("Existing frame %1 has no info file", f)); + LOG_GENERAL ("Existing frame %1 has no info file", f); return false; } dcp::FrameInfo info (ifi); fclose (ifi); if (info.size == 0) { - _film->log()->log (String::compose ("Existing frame %1 has no info file", f)); + LOG_GENERAL ("Existing frame %1 has no info file", f); return false; } @@ -487,13 +498,14 @@ Writer::check_existing_picture_mxf_frame (FILE* mxf, int f, Eyes eyes) EncodedData data (info.size); size_t const read = fread (data.data(), 1, data.size(), mxf); if (read != static_cast (data.size ())) { - _film->log()->log (String::compose ("Existing frame %1 is incomplete", f)); + LOG_GENERAL ("Existing frame %1 is incomplete", f); return false; } - - string const existing_hash = md5_digest (data.data(), data.size()); - if (existing_hash != info.hash) { - _film->log()->log (String::compose ("Existing frame %1 failed hash check", f)); + + MD5Digester digester; + digester.add (data.data(), data.size()); + if (digester.get() != info.hash) { + LOG_GENERAL ("Existing frame %1 failed hash check", f); return false; } @@ -509,7 +521,7 @@ Writer::check_existing_picture_mxf () p /= _film->internal_video_mxf_filename (); FILE* mxf = fopen_boost (p, "rb"); if (!mxf) { - _film->log()->log (String::compose ("Could not open existing MXF at %1 (errno=%2)", p.string(), errno)); + LOG_GENERAL ("Could not open existing MXF at %1 (errno=%2)", p.string(), errno); return; } @@ -518,7 +530,7 @@ Writer::check_existing_picture_mxf () ++N; } - while (1) { + while (true) { shared_ptr job = _job.lock (); assert (job); @@ -540,7 +552,7 @@ Writer::check_existing_picture_mxf () } } - _film->log()->log (String::compose ("Have existing frame %1", _first_nonexistant_frame)); + LOG_GENERAL ("Have existing frame %1", _first_nonexistant_frame); ++_first_nonexistant_frame; }