From b0b5d621c851ea22f5328fcb4d212936d670804f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 10 Jan 2014 14:13:56 +0000 Subject: More windows debug. --- src/lib/writer.cc | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/lib') diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 558eda97e..cfc19a13d 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -45,6 +45,7 @@ using std::pair; using std::string; using std::list; using std::cout; +using std::stringstream; using boost::shared_ptr; using boost::weak_ptr; @@ -91,6 +92,17 @@ Writer::Writer (shared_ptr f, weak_ptr j) _picture_asset->set_key (_film->key ()); } + _picture_asset_writer = _picture_asset->start_write (_first_nonexistant_frame > 0); + + _sound_asset.reset (new libdcp::SoundAsset (_film->directory (), _film->audio_mxf_filename ())); + _sound_asset->set_edit_rate (_film->video_frame_rate ()); + _sound_asset->set_channels (_film->audio_channels ()); + _sound_asset->set_sampling_rate (_film->audio_frame_rate ()); + + if (_film->encrypted ()) { + _sound_asset->set_key (_film->key ()); + } + /* Write the sound asset into the film directory so that we leave the creation of the DCP directory until the last minute. Some versions of windows inexplicably don't like overwriting existing files here, so try to remove it using boost. @@ -98,25 +110,32 @@ Writer::Writer (shared_ptr f, weak_ptr j) boost::system::error_code ec; boost::filesystem::remove_all (_film->file (_film->audio_mxf_filename ()), ec); if (ec) { + + stringstream s; + boost::filesystem::path p = _film->file (_film->audio_mxf_filename ()); + s << p << "\n" + << "exists=" << boost::filesystem::exists (p) << "\n" + << "file_size=" << boost::filesystem::file_size (p) << "\n" + << "hard_link_count=" << boost::filesystem::hard_link_count (p) << "\n" + << "is_directory=" << boost::filesystem::is_directory (p) << "\n" + << "is_empty=" << boost::filesystem::is_empty (p) << "\n" + << "is_other=" << boost::filesystem::is_other (p) << "\n" + << "is_regular_file=" << boost::filesystem::is_regular_file (p) << "\n" + << "last_write_time=" << boost::filesystem::last_write_time (p) << "\n" + << "type=" << boost::filesystem::status (p).type () << "\n" + << "permissions=" << boost::filesystem::status (p).permissions () << "\n"; + + _film->log()->log (s.str ()); + _film->log()->log ( String::compose ( "Could not remove existing audio MXF file %1 (%2)", _film->file (_film->audio_mxf_filename ()), - ec.value ()) + ec.value () + ) ); } - _picture_asset_writer = _picture_asset->start_write (_first_nonexistant_frame > 0); - - _sound_asset.reset (new libdcp::SoundAsset (_film->directory (), _film->audio_mxf_filename ())); - _sound_asset->set_edit_rate (_film->video_frame_rate ()); - _sound_asset->set_channels (_film->audio_channels ()); - _sound_asset->set_sampling_rate (_film->audio_frame_rate ()); - - if (_film->encrypted ()) { - _sound_asset->set_key (_film->key ()); - } - _sound_asset_writer = _sound_asset->start_write (); _thread = new boost::thread (boost::bind (&Writer::thread, this)); -- cgit v1.2.3 From d37c1c35b36a28a3e3bbec6c21721f16f8e4aa48 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 11 Jan 2014 18:37:15 +0000 Subject: Destroy Transcoder when cancelling transcode jobs; this closes the audio MXF so it can be overwritten, even on Windows. --- ChangeLog | 5 ++++ src/lib/encoder.cc | 3 --- src/lib/transcode_job.cc | 9 ++++---- src/lib/writer.cc | 59 +++++++++++++++++------------------------------- src/lib/writer.h | 2 ++ 5 files changed, 32 insertions(+), 46 deletions(-) (limited to 'src/lib') diff --git a/ChangeLog b/ChangeLog index 2972c6caa..0a353e57a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-01-11 Carl Hetherington + + * Hopefully fix error on restarting a cancelled transcode job + on Windows. + 2014-01-10 Carl Hetherington * Version 1.62.2 released. diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index b78bcaeea..fbec3e4d0 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -68,9 +68,6 @@ Encoder::Encoder (shared_ptr f, weak_ptr j) Encoder::~Encoder () { terminate_threads (); - if (_writer) { - _writer->finish (); - } } /** Add a worker thread for a each thread on a remote server. Caller must hold diff --git a/src/lib/transcode_job.cc b/src/lib/transcode_job.cc index fd69b08e7..87fd5daef 100644 --- a/src/lib/transcode_job.cc +++ b/src/lib/transcode_job.cc @@ -64,12 +64,11 @@ TranscodeJob::run () _film->log()->log (N_("Transcode job completed successfully")); - } catch (std::exception& e) { - + } catch (...) { set_progress (1); set_state (FINISHED_ERROR); - _film->log()->log (String::compose (N_("Transcode job failed (%1)"), e.what())); - + _film->log()->log (N_("Transcode job failed or cancelled")); + _transcoder.reset (); throw; } } @@ -78,7 +77,7 @@ string TranscodeJob::status () const { if (!_transcoder) { - return _("0%"); + return Job::status (); } float const fps = _transcoder->current_encoding_rate (); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index cfc19a13d..572a1c3a4 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -104,38 +104,8 @@ Writer::Writer (shared_ptr f, weak_ptr j) } /* Write the sound asset into the film directory so that we leave the creation - of the DCP directory until the last minute. Some versions of windows inexplicably - don't like overwriting existing files here, so try to remove it using boost. + of the DCP directory until the last minute. */ - boost::system::error_code ec; - boost::filesystem::remove_all (_film->file (_film->audio_mxf_filename ()), ec); - if (ec) { - - stringstream s; - boost::filesystem::path p = _film->file (_film->audio_mxf_filename ()); - s << p << "\n" - << "exists=" << boost::filesystem::exists (p) << "\n" - << "file_size=" << boost::filesystem::file_size (p) << "\n" - << "hard_link_count=" << boost::filesystem::hard_link_count (p) << "\n" - << "is_directory=" << boost::filesystem::is_directory (p) << "\n" - << "is_empty=" << boost::filesystem::is_empty (p) << "\n" - << "is_other=" << boost::filesystem::is_other (p) << "\n" - << "is_regular_file=" << boost::filesystem::is_regular_file (p) << "\n" - << "last_write_time=" << boost::filesystem::last_write_time (p) << "\n" - << "type=" << boost::filesystem::status (p).type () << "\n" - << "permissions=" << boost::filesystem::status (p).permissions () << "\n"; - - _film->log()->log (s.str ()); - - _film->log()->log ( - String::compose ( - "Could not remove existing audio MXF file %1 (%2)", - _film->file (_film->audio_mxf_filename ()), - ec.value () - ) - ); - } - _sound_asset_writer = _sound_asset->start_write (); _thread = new boost::thread (boost::bind (&Writer::thread, this)); @@ -143,6 +113,11 @@ Writer::Writer (shared_ptr f, weak_ptr j) job->sub (_("Encoding image data")); } +Writer::~Writer () +{ + terminate_thread (false); +} + void Writer::write (shared_ptr encoded, int frame, Eyes eyes) { @@ -366,23 +341,31 @@ catch (...) } void -Writer::finish () +Writer::terminate_thread (bool can_throw) { - if (!_thread) { - return; - } - boost::mutex::scoped_lock lock (_mutex); _finish = true; _empty_condition.notify_all (); _full_condition.notify_all (); lock.unlock (); - _thread->join (); - rethrow (); + _thread->join (); + if (can_throw) { + rethrow (); + } delete _thread; _thread = 0; +} + +void +Writer::finish () +{ + if (!_thread) { + return; + } + + terminate_thread (true); _picture_asset_writer->finalize (); _sound_asset_writer->finalize (); diff --git a/src/lib/writer.h b/src/lib/writer.h index e2807d712..7af79a417 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -71,6 +71,7 @@ class Writer : public ExceptionStore, public boost::noncopyable { public: Writer (boost::shared_ptr, boost::weak_ptr); + ~Writer (); bool can_fake_write (int) const; @@ -83,6 +84,7 @@ public: private: void thread (); + void terminate_thread (bool); void check_existing_picture_mxf (); bool check_existing_picture_mxf_frame (FILE *, int, Eyes); bool have_sequenced_image_at_queue_head (); -- cgit v1.2.3