Remove ReelEncryptableAsset and tidy up a bit.
[libdcp.git] / src / cpl.h
1 /*
2     Copyright (C) 2014-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
18
19     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34
35 /** @file  src/cpl.h
36  *  @brief CPL class
37  */
38
39
40 #ifndef LIBDCP_CPL_H
41 #define LIBDCP_CPL_H
42
43
44 #include "asset.h"
45 #include "certificate.h"
46 #include "key.h"
47 #include "language_tag.h"
48 #include "types.h"
49 #include <boost/filesystem.hpp>
50 #include <boost/function.hpp>
51 #include <boost/optional.hpp>
52 #include <memory>
53 #include <vector>
54
55
56 struct verify_invalid_language3;
57
58
59 namespace dcp {
60
61
62 class ReelFileAsset;
63 class Reel;
64 class MXFMetadata;
65 class CertificateChain;
66 class DecryptedKDM;
67
68
69 /** @class CPL
70  *  @brief A Composition Playlist
71  */
72 class CPL : public Asset
73 {
74 public:
75         CPL (std::string annotation_text, ContentKind content_kind, Standard standard);
76
77         /** Construct a CPL object from a XML file */
78         explicit CPL (boost::filesystem::path file);
79
80         bool equals (
81                 std::shared_ptr<const Asset> other,
82                 EqualityOptions options,
83                 NoteHandler note
84                 ) const;
85
86         /** Add a reel to this CPL
87          *  @param reel Reel to add
88          */
89         void add (std::shared_ptr<Reel> reel);
90
91         /** Add a KDM to this CPL.  If the KDM is for any of this CPLs assets it will be used
92          *  to decrypt those assets.
93          *  @param kdm KDM.
94          */
95         void add (DecryptedKDM const &);
96
97         /** @return the reels in this CPL */
98         std::vector<std::shared_ptr<Reel>> reels () const {
99                 return _reels;
100         }
101
102         /** @return the ReelFileAssets in this CPL in all reels */
103         std::vector<std::shared_ptr<const ReelFileAsset>> reel_file_assets () const;
104         std::vector<std::shared_ptr<ReelFileAsset>> reel_file_assets ();
105
106         /** @return true if we have any encrypted content */
107         bool any_encrypted () const;
108
109         /** @return true if we have all our encryptable content is encrypted */
110         bool all_encrypted () const;
111
112         /** Write an CompositonPlaylist XML file
113          *
114          *  @param file Filename to write
115          *  @param signer Signer to sign the CPL, or 0 to add no signature
116          */
117         void write_xml (
118                 boost::filesystem::path file,
119                 std::shared_ptr<const CertificateChain>
120                 ) const;
121
122         void resolve_refs (std::vector<std::shared_ptr<Asset>>);
123
124         int64_t duration () const;
125
126         void set_issuer (std::string issuer) {
127                 _issuer = issuer;
128         }
129
130         void set_creator (std::string creator) {
131                 _creator = creator;
132         }
133
134         void set_issue_date (std::string issue_date) {
135                 _issue_date = issue_date;
136         }
137
138         /** @return contents of the &lt;AnnotationText&gt; node, if present */
139         boost::optional<std::string> annotation_text () const {
140                 return _annotation_text;
141         }
142
143         void set_annotation_text (std::string at) {
144                 _annotation_text = at;
145         }
146
147         /** @return contents of the &lt;ContentTitleText&gt; node */
148         std::string content_title_text () const {
149                 return _content_title_text;
150         }
151
152         void set_content_title_text (std::string ct) {
153                 _content_title_text = ct;
154         }
155
156         void set_content_kind (dcp::ContentKind k) {
157                 _content_kind = k;
158         }
159
160         /** @return the type of the content, used by media servers
161          *  to categorise things (e.g. feature, trailer, etc.)
162          */
163         ContentKind content_kind () const {
164                 return _content_kind;
165         }
166
167         boost::optional<ContentVersion> content_version () const;
168
169         std::vector<ContentVersion> content_versions () const {
170                 return _content_versions;
171         }
172
173         void set_content_version (ContentVersion v) {
174                 _content_versions.clear ();
175                 _content_versions.push_back (v);
176         }
177
178         void set_content_versions (std::vector<ContentVersion> v);
179
180         std::vector<Rating> ratings () const {
181                 return _ratings;
182         }
183
184         void set_ratings (std::vector<Rating> r) {
185                 _ratings = r;
186         }
187
188         boost::optional<std::string> full_content_title_text () const {
189                 return _full_content_title_text;
190         }
191
192         void set_full_content_title_text (std::string t) {
193                 _full_content_title_text = t;
194         }
195
196         boost::optional<std::string> full_content_title_text_language () const {
197                 return _full_content_title_text_language;
198         }
199
200         void set_full_content_title_text_language (dcp::LanguageTag l) {
201                 _full_content_title_text_language = l.to_string();
202         }
203
204         boost::optional<std::string> release_territory () const {
205                 return _release_territory;
206         }
207
208         void set_release_territory (dcp::LanguageTag::RegionSubtag t) {
209                 _release_territory = t.subtag();
210         }
211
212         boost::optional<std::string> release_territory_scope () const {
213                 return _release_territory_scope;
214         }
215
216         boost::optional<int> version_number () const {
217                 return _version_number;
218         }
219
220         void set_version_number (int v);
221
222         void unset_version_number ();
223
224         boost::optional<Status> status () const {
225                 return _status;
226         }
227
228         void set_status (Status s) {
229                 _status = s;
230         }
231
232         boost::optional<std::string> chain () const {
233                 return _chain;
234         }
235
236         void set_chain (std::string c) {
237                 _chain = c;
238         }
239
240         boost::optional<std::string> distributor () const {
241                 return _distributor;
242         }
243
244         void set_distributor (std::string d) {
245                 _distributor = d;
246         }
247
248         boost::optional<std::string> facility () const {
249                 return _facility;
250         }
251
252         void set_facility (std::string f) {
253                 _facility = f;
254         }
255
256         boost::optional<Luminance> luminance () const {
257                 return _luminance;
258         }
259
260         void set_luminance (Luminance l) {
261                 _luminance = l;
262         }
263
264         boost::optional<std::string> main_sound_configuration () const {
265                 return _main_sound_configuration;
266         }
267
268         void set_main_sound_configuration (std::string c) {
269                 _main_sound_configuration = c;
270         }
271
272         boost::optional<int> main_sound_sample_rate () const {
273                 return _main_sound_sample_rate;
274         }
275
276         void set_main_sound_sample_rate (int r) {
277                 _main_sound_sample_rate = r;
278         }
279
280         boost::optional<dcp::Size> main_picture_stored_area () const {
281                 return _main_picture_stored_area;
282         }
283
284         void set_main_picture_stored_area (dcp::Size s) {
285                 _main_picture_stored_area = s;
286         }
287
288         boost::optional<dcp::Size> main_picture_active_area () const {
289                 return _main_picture_active_area;
290         }
291
292         void set_main_picture_active_area (dcp::Size s) {
293                 _main_picture_active_area = s;
294         }
295
296         std::vector<std::string> additional_subtitle_languages () const {
297                 return _additional_subtitle_languages;
298         }
299
300         void set_additional_subtitle_languages (std::vector<dcp::LanguageTag> const& lang);
301
302         Standard standard () const {
303                 return _standard;
304         }
305
306         static std::string static_pkl_type (Standard standard);
307
308 protected:
309         /** @return type string for PKLs for this asset */
310         std::string pkl_type (Standard standard) const;
311
312 private:
313         friend struct ::verify_invalid_language3;
314
315         void maybe_write_composition_metadata_asset (xmlpp::Element* node) const;
316         void read_composition_metadata_asset (cxml::ConstNodePtr node);
317
318         std::string _issuer;
319         std::string _creator;
320         std::string _issue_date;
321         boost::optional<std::string> _annotation_text;
322         std::string _content_title_text;            ///< &lt;ContentTitleText&gt;
323         ContentKind _content_kind;                  ///< &lt;ContentKind&gt;
324         std::vector<ContentVersion> _content_versions;
325         std::vector<Rating> _ratings;
326         /** Human-readable name of the composition, without any metadata (i.e. no -FTR-EN-XX- etc.) */
327         boost::optional<std::string> _full_content_title_text;
328         boost::optional<std::string> _full_content_title_text_language;
329         /** This is stored and returned as a string so that we can tolerate non-RFC-5646 strings,
330          *  but must be set as a dcp::LanguageTag to try to ensure that we create compliant output.
331          */
332         boost::optional<std::string> _release_territory;
333         boost::optional<std::string> _release_territory_scope;
334         boost::optional<int> _version_number;
335         boost::optional<Status> _status;
336         boost::optional<std::string> _chain;
337         boost::optional<std::string> _distributor;
338         boost::optional<std::string> _facility;
339         boost::optional<Luminance> _luminance;
340         boost::optional<std::string> _main_sound_configuration;
341         boost::optional<int> _main_sound_sample_rate;
342         boost::optional<dcp::Size> _main_picture_stored_area;
343         boost::optional<dcp::Size> _main_picture_active_area;
344         /* See note for _release_territory above */
345         std::vector<std::string> _additional_subtitle_languages;
346
347         std::vector<std::shared_ptr<Reel>> _reels;
348
349         /** Standard of CPL that was read in */
350         Standard _standard;
351 };
352
353
354 }
355
356
357 #endif