X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fwriter.cc;h=c1b66cd4c1b6ab96fa196cba6041764ae495f5db;hp=5b24d7491b85751734a01bc71887351c6aac8959;hb=f515b8daea9d28200be803bb64ff17e9f30343c4;hpb=ab0e8cdcafdcb83096012380f674b8280474e851 diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 5b24d7491..c1b66cd4c 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -68,7 +68,6 @@ using namespace dcpomatic; Writer::Writer (shared_ptr film, weak_ptr j) : _film (film) , _job (j) - , _thread (0) , _finish (false) , _queued_full_in_memory (0) /* These will be reset to sensible values when J2KEncoder is created */ @@ -107,9 +106,9 @@ Writer::Writer (shared_ptr film, weak_ptr j) void Writer::start () { - _thread = new boost::thread (boost::bind (&Writer::thread, this)); + _thread = boost::thread (boost::bind(&Writer::thread, this)); #ifdef DCPOMATIC_LINUX - pthread_setname_np (_thread->native_handle(), "writer"); + pthread_setname_np (_thread.native_handle(), "writer"); #endif } @@ -217,16 +216,14 @@ Writer::fake_write (Frame frame, Eyes eyes) size_t const reel = video_reel (frame); Frame const reel_frame = frame - _reels[reel].start (); - FILE* file = fopen_boost (_film->info_file(_reels[reel].period()), "rb"); - if (!file) { - throw ReadFileError (_film->info_file(_reels[reel].period())); - } - dcp::FrameInfo info = _reels[reel].read_frame_info (file, reel_frame, eyes); - fclose (file); - QueueItem qi; qi.type = QueueItem::FAKE; - qi.size = info.size; + + { + shared_ptr info_file = _film->info_file_handle(_reels[reel].period(), true); + qi.size = _reels[reel].read_frame_info(info_file, reel_frame, eyes).size; + } + qi.reel = reel; qi.frame = reel_frame; if (_film->three_d() && eyes == EYES_BOTH) { @@ -271,8 +268,11 @@ Writer::write (shared_ptr audio, DCPTime const time) /* Easy case: we can write all the audio to this reel */ _audio_reel->write (audio); t = end; + } else if (_audio_reel->period().to <= t) { + /* This reel is entirely before the start of our audio; just skip the reel */ + ++_audio_reel; } else { - /* Split the audio into two and write the first part */ + /* This audio is over a reel boundary; split the audio into two and write the first part */ DCPTime part_lengths[2] = { _audio_reel->period().to - t, end - _audio_reel->period().to @@ -284,15 +284,12 @@ Writer::write (shared_ptr audio, DCPTime const time) }; if (part_frames[0]) { - shared_ptr part (new AudioBuffers (audio->channels(), part_frames[0])); - part->copy_from (audio.get(), part_frames[0], 0, 0); + shared_ptr part (new AudioBuffers(audio, part_frames[0], 0)); _audio_reel->write (part); } if (part_frames[1]) { - shared_ptr part (new AudioBuffers (audio->channels(), part_frames[1])); - part->copy_from (audio.get(), part_frames[1], part_frames[0], 0); - audio = part; + audio.reset (new AudioBuffers(audio, part_frames[1], part_frames[0])); } else { audio.reset (); } @@ -464,7 +461,7 @@ void Writer::terminate_thread (bool can_throw) { boost::mutex::scoped_lock lock (_state_mutex); - if (_thread == 0) { + if (!_thread.joinable()) { return; } @@ -473,22 +470,17 @@ Writer::terminate_thread (bool can_throw) _full_condition.notify_all (); lock.unlock (); - if (_thread->joinable ()) { - _thread->join (); - } + _thread.join (); if (can_throw) { rethrow (); } - - delete _thread; - _thread = 0; } void Writer::finish () { - if (!_thread) { + if (!_thread.joinable()) { return; } @@ -560,6 +552,7 @@ Writer::finish () cpl->set_metadata (meta); cpl->set_ratings (vector_to_list(_film->ratings())); + cpl->set_content_version_label_text (_film->content_version()); shared_ptr signer; if (_film->is_signed ()) { @@ -779,4 +772,7 @@ Writer::set_digest_progress (Job* job, float progress) } job->set_progress (min_progress); + + Waker waker; + waker.nudge (); }