From 2d12d76bced748c5f85833ee3e88d96376ee21ec Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 9 Jul 2023 23:18:40 +0200 Subject: [PATCH] Change end() to only do one thing, and copy the required stuff into pause() --- src/lib/dcp_encoder.cc | 2 +- src/lib/j2k_encoder.cc | 82 +++++++++++++++++++++++------------------- src/lib/j2k_encoder.h | 2 +- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/lib/dcp_encoder.cc b/src/lib/dcp_encoder.cc index a03f689b0..1b1b117be 100644 --- a/src/lib/dcp_encoder.cc +++ b/src/lib/dcp_encoder.cc @@ -114,7 +114,7 @@ DCPEncoder::go () } _finishing = true; - _j2k_encoder.end(true); + _j2k_encoder.end(); _writer.finish(_film->dir(_film->dcp_name())); } diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 7480e4541..48883bec4 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -93,37 +93,48 @@ J2KEncoder::begin () void J2KEncoder::pause() { - if (Config::instance()->enable_gpu()) { - end(false); + if (!Config::instance()->enable_gpu()) { + return; } + + { + boost::mutex::scoped_lock lm (_threads_mutex); + terminate_threads (); + } + + /* Something might have been thrown during terminate_threads */ + rethrow (); + + delete _context; + _context = nullptr; } void J2KEncoder::resume() { - if (Config::instance()->enable_gpu()) { - _context = new grk_plugin::GrokContext(_dcpomatic_context); - servers_list_changed(); + if (!Config::instance()->enable_gpu()) { + return; } + + _context = new grk_plugin::GrokContext(_dcpomatic_context); + servers_list_changed(); } void -J2KEncoder::end (bool isFinal) +J2KEncoder::end() { - if (isFinal) { - boost::mutex::scoped_lock lock (_queue_mutex); + boost::mutex::scoped_lock lock (_queue_mutex); - LOG_GENERAL (N_("Clearing queue of %1"), _queue.size ()); + LOG_GENERAL (N_("Clearing queue of %1"), _queue.size ()); - /* Keep waking workers until the queue is empty */ - while (!_queue.empty ()) { - rethrow (); - _empty_condition.notify_all (); - _full_condition.wait (lock); - } - lock.unlock (); - } + /* Keep waking workers until the queue is empty */ + while (!_queue.empty ()) { + rethrow (); + _empty_condition.notify_all (); + _full_condition.wait (lock); + } + lock.unlock (); LOG_GENERAL_NC (N_("Terminating encoder threads")); @@ -145,29 +156,28 @@ J2KEncoder::end (bool isFinal) So just mop up anything left in the queue here. */ - if (isFinal) { - for (auto & i: _queue) { - if (Config::instance()->enable_gpu ()) { - if (!_context->scheduleCompress(i)){ - LOG_GENERAL (N_("[%1] J2KEncoder thread pushes frame %2 back onto queue after failure"), thread_id(), i.index()); - // handle error - } + for (auto & i: _queue) { + if (Config::instance()->enable_gpu ()) { + if (!_context->scheduleCompress(i)){ + LOG_GENERAL (N_("[%1] J2KEncoder thread pushes frame %2 back onto queue after failure"), thread_id(), i.index()); + // handle error } - else { - LOG_GENERAL(N_("Encode left-over frame %1"), i.index()); - try { - _writer.write( - make_shared(i.encode_locally()), - i.index(), - i.eyes() - ); - frame_done (); - } catch (std::exception& e) { - LOG_ERROR (N_("Local encode failed (%1)"), e.what ()); - } + } + else { + LOG_GENERAL(N_("Encode left-over frame %1"), i.index()); + try { + _writer.write( + make_shared(i.encode_locally()), + i.index(), + i.eyes() + ); + frame_done (); + } catch (std::exception& e) { + LOG_ERROR (N_("Local encode failed (%1)"), e.what ()); } } } + delete _context; _context = nullptr; } diff --git a/src/lib/j2k_encoder.h b/src/lib/j2k_encoder.h index 1d31274b3..433a0498f 100644 --- a/src/lib/j2k_encoder.h +++ b/src/lib/j2k_encoder.h @@ -74,7 +74,7 @@ public: void resume(); /** Called when a processing run has finished */ - void end (bool isFinal); + void end(); boost::optional current_encoding_rate () const; int video_frames_enqueued () const; -- 2.30.2