Change end() to only do one thing, and copy the required stuff into pause()
authorCarl Hetherington <cth@carlh.net>
Sun, 9 Jul 2023 21:18:40 +0000 (23:18 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 18 Oct 2023 11:46:37 +0000 (13:46 +0200)
src/lib/dcp_encoder.cc
src/lib/j2k_encoder.cc
src/lib/j2k_encoder.h

index a03f689b03b757ea5802309bc94b732962efd701..1b1b117be6d9e93741c6e1cf38f53c2ef2466a13 100644 (file)
@@ -114,7 +114,7 @@ DCPEncoder::go ()
        }
 
        _finishing = true;
-       _j2k_encoder.end(true);
+       _j2k_encoder.end();
        _writer.finish(_film->dir(_film->dcp_name()));
 }
 
index 7480e4541895fc8ca424ac4ba57bc6513d892dbd..48883bec49e30072e7db7c4a851863723e1973e6 100644 (file)
@@ -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<dcp::ArrayData>(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<dcp::ArrayData>(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;
 }
index 1d31274b3f545741f323ada3c37152a7fa4af951..433a0498f6e32b8f56c80fd66c9844cab1fbca55 100644 (file)
@@ -74,7 +74,7 @@ public:
        void resume();
 
        /** Called when a processing run has finished */
-       void end (bool isFinal);
+       void end();
 
        boost::optional<float> current_encoding_rate () const;
        int video_frames_enqueued () const;