03e35a4e3220b3a08257572dac1642a9da047067
[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 ReelEncryptableAsset;
63 class ReelFileAsset;
64 class Reel;
65 class MXFMetadata;
66 class CertificateChain;
67 class DecryptedKDM;
68
69
70 /** @class CPL
71  *  @brief A Composition Playlist
72  */
73 class CPL : public Asset
74 {
75 public:
76         CPL (std::string annotation_text, ContentKind content_kind, Standard standard);
77
78         /** Construct a CPL object from a XML file */
79         explicit CPL (boost::filesystem::path file);
80
81         bool equals (
82                 std::shared_ptr<const Asset> other,
83                 EqualityOptions options,
84                 NoteHandler note
85                 ) const;
86
87         /** Add a reel to this CPL
88          *  @param reel Reel to add
89          */
90         void add (std::shared_ptr<Reel> reel);
91
92         /** Add a KDM to this CPL.  If the KDM is for any of this CPLs assets it will be used
93          *  to decrypt those assets.
94          *  @param kdm KDM.
95          */
96         void add (DecryptedKDM const &);
97
98         /** @return the reels in this CPL */
99         std::vector<std::shared_ptr<Reel>> reels () const {
100                 return _reels;
101         }
102
103         /** @return the ReelFileAssets in this CPL in all reels */
104         std::vector<std::shared_ptr<const ReelFileAsset>> reel_file_assets () const;
105         std::vector<std::shared_ptr<ReelFileAsset>> reel_file_assets ();
106
107         /** @return the ReelEncryptableAssets in this CPL in all reels */
108         std::vector<std::shared_ptr<const ReelEncryptableAsset>> reel_encryptable_assets () const;
109         std::vector<std::shared_ptr<ReelEncryptableAsset>> reel_encryptable_assets ();
110
111         /** @return true if we have any encrypted content */
112         bool any_encrypted () const;
113
114         /** @return true if we have all our encryptable content is encrypted */
115         bool all_encrypted () const;
116
117         /** Write an CompositonPlaylist XML file
118          *
119          *  @param file Filename to write
120          *  @param signer Signer to sign the CPL, or 0 to add no signature
121          */
122         void write_xml (
123                 boost::filesystem::path file,
124                 std::shared_ptr<const CertificateChain>
125                 ) const;
126
127         void resolve_refs (std::vector<std::shared_ptr<Asset>>);
128
129         int64_t duration () const;
130
131         void set_issuer (std::string issuer) {
132                 _issuer = issuer;
133         }
134
135         void set_creator (std::string creator) {
136                 _creator = creator;
137         }
138
139         void set_issue_date (std::string issue_date) {
140                 _issue_date = issue_date;
141         }
142
143         /** @return contents of the &lt;AnnotationText&gt; node, if present */
144         boost::optional<std::string> annotation_text () const {
145                 return _annotation_text;
146         }
147
148         void set_annotation_text (std::string at) {
149                 _annotation_text = at;
150         }
151
152         /** @return contents of the &lt;ContentTitleText&gt; node */
153         std::string content_title_text () const {
154                 return _content_title_text;
155         }
156
157         void set_content_title_text (std::string ct) {
158                 _content_title_text = ct;
159         }
160
161         void set_content_kind (dcp::ContentKind k) {
162                 _content_kind = k;
163         }
164
165         /** @return the type of the content, used by media servers
166          *  to categorise things (e.g. feature, trailer, etc.)
167          */
168         ContentKind content_kind () const {
169                 return _content_kind;
170         }
171
172         boost::optional<ContentVersion> content_version () const;
173
174         std::vector<ContentVersion> content_versions () const {
175                 return _content_versions;
176         }
177
178         void set_content_version (ContentVersion v) {
179                 _content_versions.clear ();
180                 _content_versions.push_back (v);
181         }
182
183         void set_content_versions (std::vector<ContentVersion> v);
184
185         std::vector<Rating> ratings () const {
186                 return _ratings;
187         }
188
189         void set_ratings (std::vector<Rating> r) {
190                 _ratings = r;
191         }
192
193         boost::optional<std::string> full_content_title_text () const {
194                 return _full_content_title_text;
195         }
196
197         void set_full_content_title_text (std::string t) {
198                 _full_content_title_text = t;
199         }
200
201         boost::optional<std::string> full_content_title_text_language () const {
202                 return _full_content_title_text_language;
203         }
204
205         void set_full_content_title_text_language (dcp::LanguageTag l) {
206                 _full_content_title_text_language = l.to_string();
207         }
208
209         boost::optional<std::string> release_territory () const {
210                 return _release_territory;
211         }
212
213         void set_release_territory (dcp::LanguageTag::RegionSubtag t) {
214                 _release_territory = t.subtag();
215         }
216
217         boost::optional<std::string> release_territory_scope () const {
218                 return _release_territory_scope;
219         }
220
221         boost::optional<int> version_number () const {
222                 return _version_number;
223         }
224
225         void set_version_number (int v);
226
227         void unset_version_number ();
228
229         boost::optional<Status> status () const {
230                 return _status;
231         }
232
233         void set_status (Status s) {
234                 _status = s;
235         }
236
237         boost::optional<std::string> chain () const {
238                 return _chain;
239         }
240
241         void set_chain (std::string c) {
242                 _chain = c;
243         }
244
245         boost::optional<std::string> distributor () const {
246                 return _distributor;
247         }
248
249         void set_distributor (std::string d) {
250                 _distributor = d;
251         }
252
253         boost::optional<std::string> facility () const {
254                 return _facility;
255         }
256
257         void set_facility (std::string f) {
258                 _facility = f;
259         }
260
261         boost::optional<Luminance> luminance () const {
262                 return _luminance;
263         }
264
265         void set_luminance (Luminance l) {
266                 _luminance = l;
267         }
268
269         boost::optional<std::string> main_sound_configuration () const {
270                 return _main_sound_configuration;
271         }
272
273         void set_main_sound_configuration (std::string c) {
274                 _main_sound_configuration = c;
275         }
276
277         boost::optional<int> main_sound_sample_rate () const {
278                 return _main_sound_sample_rate;
279         }
280
281         void set_main_sound_sample_rate (int r) {
282                 _main_sound_sample_rate = r;
283         }
284
285         boost::optional<dcp::Size> main_picture_stored_area () const {
286                 return _main_picture_stored_area;
287         }
288
289         void set_main_picture_stored_area (dcp::Size s) {
290                 _main_picture_stored_area = s;
291         }
292
293         boost::optional<dcp::Size> main_picture_active_area () const {
294                 return _main_picture_active_area;
295         }
296
297         void set_main_picture_active_area (dcp::Size s) {
298                 _main_picture_active_area = s;
299         }
300
301         std::vector<std::string> additional_subtitle_languages () const {
302                 return _additional_subtitle_languages;
303         }
304
305         void set_additional_subtitle_languages (std::vector<dcp::LanguageTag> const& lang);
306
307         Standard standard () const {
308                 return _standard;
309         }
310
311         static std::string static_pkl_type (Standard standard);
312
313 protected:
314         /** @return type string for PKLs for this asset */
315         std::string pkl_type (Standard standard) const;
316
317 private:
318         friend struct ::verify_invalid_language3;
319
320         void maybe_write_composition_metadata_asset (xmlpp::Element* node) const;
321         void read_composition_metadata_asset (cxml::ConstNodePtr node);
322
323         std::string _issuer;
324         std::string _creator;
325         std::string _issue_date;
326         boost::optional<std::string> _annotation_text;
327         std::string _content_title_text;            ///< &lt;ContentTitleText&gt;
328         ContentKind _content_kind;                  ///< &lt;ContentKind&gt;
329         std::vector<ContentVersion> _content_versions;
330         std::vector<Rating> _ratings;
331         /** Human-readable name of the composition, without any metadata (i.e. no -FTR-EN-XX- etc.) */
332         boost::optional<std::string> _full_content_title_text;
333         boost::optional<std::string> _full_content_title_text_language;
334         /** This is stored and returned as a string so that we can tolerate non-RFC-5646 strings,
335          *  but must be set as a dcp::LanguageTag to try to ensure that we create compliant output.
336          */
337         boost::optional<std::string> _release_territory;
338         boost::optional<std::string> _release_territory_scope;
339         boost::optional<int> _version_number;
340         boost::optional<Status> _status;
341         boost::optional<std::string> _chain;
342         boost::optional<std::string> _distributor;
343         boost::optional<std::string> _facility;
344         boost::optional<Luminance> _luminance;
345         boost::optional<std::string> _main_sound_configuration;
346         boost::optional<int> _main_sound_sample_rate;
347         boost::optional<dcp::Size> _main_picture_stored_area;
348         boost::optional<dcp::Size> _main_picture_active_area;
349         /* See note for _release_territory above */
350         std::vector<std::string> _additional_subtitle_languages;
351
352         std::vector<std::shared_ptr<Reel>> _reels;
353
354         /** Standard of CPL that was read in */
355         Standard _standard;
356 };
357
358
359 }
360
361
362 #endif