diff options
Diffstat (limited to 'src/lib/j2k_encoder.h')
| -rw-r--r-- | src/lib/j2k_encoder.h | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/src/lib/j2k_encoder.h b/src/lib/j2k_encoder.h index 63228a6b8..5c8ad030d 100644 --- a/src/lib/j2k_encoder.h +++ b/src/lib/j2k_encoder.h @@ -32,7 +32,9 @@ #include "enum_indexed_vector.h" #include "event_history.h" #include "exception_store.h" +#include "j2k_encoder_thread.h" #include "writer.h" +#include "video_encoder.h" #include <boost/optional.hpp> #include <boost/signals2.hpp> #include <boost/thread.hpp> @@ -48,6 +50,15 @@ class Film; class Job; class PlayerVideo; +namespace grk_plugin { + struct DcpomaticContext; + struct GrokContext; +} + +struct local_threads_created_and_destroyed; +struct remote_threads_created_and_destroyed; +struct frames_not_lost_when_threads_disappear; + /** @class J2KEncoder * @brief Class to manage encoding to J2K. @@ -55,7 +66,7 @@ class PlayerVideo; * This class keeps a queue of frames to be encoded and distributes * the work around threads and encoding servers. */ -class J2KEncoder : public ExceptionStore +class J2KEncoder : public VideoEncoder, public ExceptionStore { public: J2KEncoder(std::shared_ptr<const Film> film, Writer& writer); @@ -65,33 +76,33 @@ public: J2KEncoder& operator= (J2KEncoder const&) = delete; /** Called to indicate that a processing run is about to begin */ - void begin (); + void begin() override; - /** Called to pass a bit of video to be encoded as the next DCP frame */ - void encode (std::shared_ptr<PlayerVideo> pv, dcpomatic::DCPTime time); + /** Called to pass a video frame to be encoded as the next DCP frame */ + void encode (std::shared_ptr<PlayerVideo> pv, dcpomatic::DCPTime time) override; - /** Called when a processing run has finished */ - void end (); + void pause() override; + void resume() override; - boost::optional<float> current_encoding_rate () const; - int video_frames_enqueued () const; + /** Called when a processing run has finished */ + void end() override; - void servers_list_changed (); + DCPVideo pop(); + void retry(DCPVideo frame); + void write(std::shared_ptr<const dcp::Data> data, int index, Eyes eyes); private: + friend struct ::local_threads_created_and_destroyed; + friend struct ::remote_threads_created_and_destroyed; + friend struct ::frames_not_lost_when_threads_disappear; void frame_done (); - - void encoder_thread (boost::optional<EncodeServerDescription>); + void servers_list_changed (); + void remake_threads(int cpu, int gpu, std::list<EncodeServerDescription> servers); void terminate_threads (); - /** Film that we are encoding */ - std::shared_ptr<const Film> _film; - - EventHistory _history; - boost::mutex _threads_mutex; - std::shared_ptr<boost::thread_group> _threads; + std::vector<std::shared_ptr<J2KEncoderThread>> _threads; mutable boost::mutex _queue_mutex; std::list<DCPVideo> _queue; @@ -100,13 +111,19 @@ private: /** condition to manage thread wakeups when we have too much to do */ boost::condition _full_condition; - Writer& _writer; Waker _waker; EnumIndexedVector<std::shared_ptr<PlayerVideo>, Eyes> _last_player_video; - boost::optional<dcpomatic::DCPTime> _last_player_video_time; boost::signals2::scoped_connection _server_found_connection; + +#ifdef DCPOMATIC_GROK + grk_plugin::DcpomaticContext* _dcpomatic_context = nullptr; + grk_plugin::GrokContext *_context = nullptr; + std::atomic<bool> _give_up; +#endif + + bool _ending = false; }; |
