Include tidying src/lib/a-j*.h
[dcpomatic.git] / src / lib / encoder.h
1 /*
2     Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef DCPOMATIC_ENCODER_H
21 #define DCPOMATIC_ENCODER_H
22
23 /** @file  src/encoder.h
24  *  @brief Encoder class.
25  */
26
27 #include "util.h"
28 #include "cross.h"
29 #include <boost/shared_ptr.hpp>
30 #include <boost/thread/mutex.hpp>
31 #include <boost/thread/condition.hpp>
32 #include <boost/thread.hpp>
33 #include <boost/optional.hpp>
34 #include <boost/signals2.hpp>
35 #include <list>
36 #include <stdint.h>
37
38 class Film;
39 class ServerDescription;
40 class DCPVideo;
41 class Writer;
42 class Job;
43 class PlayerVideo;
44
45 /** @class Encoder
46  *  @brief Class to manage encoding to JPEG2000.
47  *
48  *  This class keeps a queue of frames to be encoded and distributes
49  *  the work around threads and encoding servers.
50  */
51
52 class Encoder : public boost::noncopyable, public ExceptionStore
53 {
54 public:
55         Encoder (boost::shared_ptr<const Film>, boost::weak_ptr<Job>, boost::shared_ptr<Writer>);
56         virtual ~Encoder ();
57
58         /** Called to indicate that a processing run is about to begin */
59         void begin ();
60
61         /** Call with a frame of video.
62          *  @param f Video frame.
63          */
64         void enqueue (boost::shared_ptr<PlayerVideo> f);
65
66         /** Called when a processing run has finished */
67         void end ();
68
69         float current_encoding_rate () const;
70         int video_frames_out () const;
71
72 private:
73
74         void frame_done ();
75
76         void encoder_thread (boost::optional<ServerDescription>);
77         void terminate_threads ();
78         void servers_list_changed ();
79
80         /** Film that we are encoding */
81         boost::shared_ptr<const Film> _film;
82         boost::weak_ptr<Job> _job;
83
84         /** Mutex for _time_history and _last_frame */
85         mutable boost::mutex _state_mutex;
86         /** List of the times of completion of the last _history_size frames;
87             first is the most recently completed.
88         */
89         std::list<struct timeval> _time_history;
90         /** Number of frames that we should keep history for */
91         static int const _history_size;
92
93         /** Number of video frames enqueued so far */
94         int _video_frames_enqueued;
95         bool _left_done;
96         bool _right_done;
97
98         bool _terminate;
99         std::list<boost::shared_ptr<DCPVideo> > _queue;
100         std::list<boost::thread *> _threads;
101         mutable boost::mutex _mutex;
102         /** condition to manage thread wakeups when we have nothing to do */
103         boost::condition _empty_condition;
104         /** condition to manage thread wakeups when we have too much to do */
105         boost::condition _full_condition;
106
107         boost::shared_ptr<Writer> _writer;
108         Waker _waker;
109
110         boost::shared_ptr<PlayerVideo> _last_player_video;
111
112         boost::signals2::scoped_connection _server_found_connection;
113 };
114
115 #endif