Add option to analyse audio automatically when content is added (#673).
[dcpomatic.git] / src / lib / film.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 /** @file  src/film.h
21  *  @brief A representation of some audio and video content, and details of
22  *  how they should be presented in a DCP.
23  */
24
25 #ifndef DCPOMATIC_FILM_H
26 #define DCPOMATIC_FILM_H
27
28 #include "util.h"
29 #include "types.h"
30 #include "isdcf_metadata.h"
31 #include "frame_rate_change.h"
32 #include "signaller.h"
33 #include <dcp/key.h>
34 #include <dcp/encrypted_kdm.h>
35 #include <boost/signals2.hpp>
36 #include <boost/enable_shared_from_this.hpp>
37 #include <boost/filesystem.hpp>
38 #include <string>
39 #include <vector>
40 #include <inttypes.h>
41
42 namespace xmlpp {
43         class Document;
44 }
45
46 class DCPContentType;
47 class Log;
48 class Content;
49 class Player;
50 class Playlist;
51 class AudioContent;
52 class Screen;
53 class AudioProcessor;
54 class AudioMapping;
55 class Ratio;
56 class Job;
57 struct isdcf_name_test;
58
59 /** @class Film
60  *
61  *  @brief A representation of some audio and video content, and details of
62  *  how they should be presented in a DCP.
63  *
64  *  The content of a Film is held in a Playlist (created and managed by the Film).
65  */
66 class Film : public boost::enable_shared_from_this<Film>, public Signaller, public boost::noncopyable
67 {
68 public:
69         Film (boost::filesystem::path, bool log = true);
70         ~Film ();
71
72         boost::filesystem::path info_file () const;
73         boost::filesystem::path j2c_path (int, Eyes, bool) const;
74         boost::filesystem::path internal_video_asset_dir () const;
75         boost::filesystem::path internal_video_asset_filename () const;
76
77         boost::filesystem::path audio_analysis_path (boost::shared_ptr<const Playlist>) const;
78
79         void send_dcp_to_tms ();
80         void make_dcp ();
81
82         /** @return Logger.
83          *  It is safe to call this from any thread.
84          */
85         boost::shared_ptr<Log> log () const {
86                 return _log;
87         }
88
89         boost::filesystem::path file (boost::filesystem::path f) const;
90         boost::filesystem::path dir (boost::filesystem::path d) const;
91
92         std::list<std::string> read_metadata ();
93         void write_metadata () const;
94         boost::shared_ptr<xmlpp::Document> metadata () const;
95
96         std::string isdcf_name (bool if_created_now) const;
97         std::string dcp_name (bool if_created_now = false) const;
98
99         /** @return true if our state has changed since we last saved it */
100         bool dirty () const {
101                 return _dirty;
102         }
103
104         dcp::Size full_frame () const;
105         dcp::Size frame_size () const;
106
107         std::vector<CPLSummary> cpls () const;
108
109         int audio_frame_rate () const;
110
111         uint64_t required_disk_space () const;
112         bool should_be_enough_disk_space (double& required, double& available, bool& can_hard_link) const;
113
114         /* Proxies for some Playlist methods */
115
116         ContentList content () const;
117         DCPTime length () const;
118         int best_video_frame_rate () const;
119         FrameRateChange active_frame_rate_change (DCPTime) const;
120
121         dcp::EncryptedKDM
122         make_kdm (
123                 dcp::Certificate target,
124                 boost::filesystem::path cpl_file,
125                 dcp::LocalTime from,
126                 dcp::LocalTime until,
127                 dcp::Formulation formulation
128                 ) const;
129
130         std::list<dcp::EncryptedKDM> make_kdms (
131                 std::list<boost::shared_ptr<Screen> >,
132                 boost::filesystem::path cpl_file,
133                 dcp::LocalTime from,
134                 dcp::LocalTime until,
135                 dcp::Formulation formulation
136                 ) const;
137
138         int state_version () const {
139                 return _state_version;
140         }
141
142         std::string subtitle_language () const;
143
144         void make_audio_mapping_default (AudioMapping & mapping) const;
145         std::vector<std::string> audio_output_names () const;
146
147         void repeat_content (ContentList, int);
148
149         boost::shared_ptr<const Playlist> playlist () const {
150                 return _playlist;
151         }
152
153         /** Identifiers for the parts of our state;
154             used for signalling changes.
155         */
156         enum Property {
157                 NONE,
158                 NAME,
159                 USE_ISDCF_NAME,
160                 /** The playlist's content list has changed (i.e. content has been added or removed) */
161                 CONTENT,
162                 DCP_CONTENT_TYPE,
163                 CONTAINER,
164                 RESOLUTION,
165                 SIGNED,
166                 ENCRYPTED,
167                 KEY,
168                 J2K_BANDWIDTH,
169                 ISDCF_METADATA,
170                 VIDEO_FRAME_RATE,
171                 AUDIO_CHANNELS,
172                 /** The setting of _three_d has changed */
173                 THREE_D,
174                 SEQUENCE_VIDEO,
175                 INTEROP,
176                 AUDIO_PROCESSOR,
177         };
178
179
180         /* GET */
181
182         boost::filesystem::path directory () const {
183                 return _directory;
184         }
185
186         std::string name () const {
187                 return _name;
188         }
189
190         bool use_isdcf_name () const {
191                 return _use_isdcf_name;
192         }
193
194         DCPContentType const * dcp_content_type () const {
195                 return _dcp_content_type;
196         }
197
198         Ratio const * container () const {
199                 return _container;
200         }
201
202         Resolution resolution () const {
203                 return _resolution;
204         }
205
206         /* signed is a reserved word */
207         bool is_signed () const {
208                 return _signed;
209         }
210
211         bool encrypted () const {
212                 return _encrypted;
213         }
214
215         dcp::Key key () const {
216                 return _key;
217         }
218
219         int j2k_bandwidth () const {
220                 return _j2k_bandwidth;
221         }
222
223         ISDCFMetadata isdcf_metadata () const {
224                 return _isdcf_metadata;
225         }
226
227         /** @return The frame rate of the DCP */
228         int video_frame_rate () const {
229                 return _video_frame_rate;
230         }
231
232         int audio_channels () const {
233                 return _audio_channels;
234         }
235
236         bool three_d () const {
237                 return _three_d;
238         }
239
240         bool sequence_video () const {
241                 return _sequence_video;
242         }
243
244         bool interop () const {
245                 return _interop;
246         }
247
248         AudioProcessor const * audio_processor () const {
249                 return _audio_processor;
250         }
251
252
253         /* SET */
254
255         void set_directory (boost::filesystem::path);
256         void set_name (std::string);
257         void set_use_isdcf_name (bool);
258         void examine_content (boost::shared_ptr<Content>);
259         void examine_and_add_content (boost::shared_ptr<Content>);
260         void add_content (boost::shared_ptr<Content>);
261         void remove_content (boost::shared_ptr<Content>);
262         void remove_content (ContentList);
263         void move_content_earlier (boost::shared_ptr<Content>);
264         void move_content_later (boost::shared_ptr<Content>);
265         void set_dcp_content_type (DCPContentType const *);
266         void set_container (Ratio const *);
267         void set_resolution (Resolution);
268         void set_signed (bool);
269         void set_encrypted (bool);
270         void set_key (dcp::Key key);
271         void set_j2k_bandwidth (int);
272         void set_isdcf_metadata (ISDCFMetadata);
273         void set_video_frame_rate (int);
274         void set_audio_channels (int);
275         void set_three_d (bool);
276         void set_isdcf_date_today ();
277         void set_sequence_video (bool);
278         void set_interop (bool);
279         void set_audio_processor (AudioProcessor const * processor);
280
281         /** Emitted when some property has of the Film has changed */
282         mutable boost::signals2::signal<void (Property)> Changed;
283
284         /** Emitted when some property of our content has changed */
285         mutable boost::signals2::signal<void (boost::weak_ptr<Content>, int, bool)> ContentChanged;
286
287         /** Current version number of the state file */
288         static int const current_state_version;
289
290 private:
291
292         friend struct ::isdcf_name_test;
293
294         void signal_changed (Property);
295         std::string video_identifier () const;
296         void playlist_changed ();
297         void playlist_content_changed (boost::weak_ptr<Content>, int, bool frequent);
298         void maybe_add_content (boost::weak_ptr<Job>, boost::weak_ptr<Content>);
299         void audio_analysis_finished ();
300
301         /** Log to write to */
302         boost::shared_ptr<Log> _log;
303         boost::shared_ptr<Playlist> _playlist;
304
305         /** Complete path to directory containing the film metadata;
306          *  must not be relative.
307          */
308         boost::filesystem::path _directory;
309
310         /** Name for DCP-o-matic */
311         std::string _name;
312         /** True if a auto-generated ISDCF-compliant name should be used for our DCP */
313         bool _use_isdcf_name;
314         /** The type of content that this Film represents (feature, trailer etc.) */
315         DCPContentType const * _dcp_content_type;
316         /** The container to put this Film in (flat, scope, etc.) */
317         Ratio const * _container;
318         /** DCP resolution (2K or 4K) */
319         Resolution _resolution;
320         bool _signed;
321         bool _encrypted;
322         dcp::Key _key;
323         /** bandwidth for J2K files in bits per second */
324         int _j2k_bandwidth;
325         /** ISDCF naming stuff */
326         ISDCFMetadata _isdcf_metadata;
327         /** Frames per second to run our DCP at */
328         int _video_frame_rate;
329         /** The date that we should use in a ISDCF name */
330         boost::gregorian::date _isdcf_date;
331         /** Number of audio channels requested for the DCP */
332         int _audio_channels;
333         /** If true, the DCP will be written in 3D mode; otherwise in 2D.
334             This will be regardless of what content is on the playlist.
335         */
336         bool _three_d;
337         bool _sequence_video;
338         bool _interop;
339         AudioProcessor const * _audio_processor;
340
341         int _state_version;
342
343         /** true if our state has changed since we last saved it */
344         mutable bool _dirty;
345
346         boost::signals2::scoped_connection _playlist_changed_connection;
347         boost::signals2::scoped_connection _playlist_content_changed_connection;
348         std::list<boost::signals2::connection> _job_connections;
349         std::list<boost::signals2::connection> _audio_analysis_connections;
350
351         friend struct paths_test;
352         friend struct film_metadata_test;
353 };
354
355 #endif