X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fcpl.h;h=d96181e5b07bc9817ad373584ae37a24c13db23e;hb=bcc07ce5fce539b83fb2469073ed609c75ea9709;hp=eebb3aaf06d99fe5e3f13dbc1128c3057110e6dd;hpb=f9078ac398e0765e39f503cdc5bed406d45e0c36;p=libdcp.git diff --git a/src/cpl.h b/src/cpl.h index eebb3aaf..d96181e5 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2019 Carl Hetherington + Copyright (C) 2014-2021 Carl Hetherington This file is part of libdcp. @@ -31,31 +31,41 @@ files in the program, then also delete it here. */ + /** @file src/cpl.h * @brief CPL class. */ + #ifndef LIBDCP_CPL_H #define LIBDCP_CPL_H -#include "types.h" + +#include "asset.h" #include "certificate.h" #include "key.h" -#include "asset.h" -#include +#include "language_tag.h" +#include "types.h" +#include #include #include -#include -#include +#include +#include + + +struct verify_various_invalid_languages; + namespace dcp { + class ReelMXF; class Reel; class MXFMetadata; class CertificateChain; class DecryptedKDM; + /** @class CPL * @brief A Composition Playlist. */ @@ -66,19 +76,35 @@ public: explicit CPL (boost::filesystem::path file); bool equals ( - boost::shared_ptr other, + std::shared_ptr other, EqualityOptions options, NoteHandler note ) const; - void add (boost::shared_ptr reel); + void add (std::shared_ptr reel); void add (DecryptedKDM const &); - /** @return contents of the <AnnotationText> node */ - std::string annotation_text () const { - return _annotation_text; + /** @return the reels in this CPL */ + std::vector> reels () const { + return _reels; } + /** @return the ReelMXFs in this CPL in all reels */ + std::vector> reel_mxfs () const; + std::vector> reel_mxfs (); + + bool encrypted () const; + + void write_xml ( + boost::filesystem::path file, + Standard standard, + std::shared_ptr + ) const; + + void resolve_refs (std::vector>); + + int64_t duration () const; + void set_issuer (std::string issuer) { _issuer = issuer; } @@ -91,6 +117,11 @@ public: _issue_date = issue_date; } + /** @return contents of the <AnnotationText> node, if present */ + boost::optional annotation_text () const { + return _annotation_text; + } + void set_annotation_text (std::string at) { _annotation_text = at; } @@ -104,14 +135,8 @@ public: _content_title_text = ct; } - /** @return contents of the <Id> node within <ContentVersion> */ - void set_content_version_id (std::string id) { - _content_version_id = id; - } - - /** @return contents of the <LabelText> node within <ContentVersion> */ - void set_content_version_label_text (std::string text) { - _content_version_label_text = text; + void set_content_kind (dcp::ContentKind k) { + _content_kind = k; } /** @return the type of the content, used by media servers @@ -121,42 +146,143 @@ public: return _content_kind; } - /** @return the reels in this CPL */ - std::list > reels () const { - return _reels; + boost::optional content_version () const; + + std::vector content_versions () const { + return _content_versions; } - /** @return the ReelMXFs in this CPL in all reels. - */ - std::list > reel_mxfs () const; - std::list > reel_mxfs (); + void set_content_version (ContentVersion v) { + _content_versions.clear (); + _content_versions.push_back (v); + } - bool encrypted () const; + void set_content_versions (std::vector v); - void write_xml ( - boost::filesystem::path file, - Standard standard, - boost::shared_ptr - ) const; + std::vector ratings () const { + return _ratings; + } - void resolve_refs (std::list >); + void set_ratings (std::vector r) { + _ratings = r; + } - int64_t duration () const; + boost::optional full_content_title_text () const { + return _full_content_title_text; + } - boost::optional standard () const { - return _standard; + void set_full_content_title_text (std::string t) { + _full_content_title_text = t; } - std::list ratings () const { - return _ratings; + boost::optional full_content_title_text_language () const { + return _full_content_title_text_language; } - void set_ratings (std::list r) { - _ratings = r; + void set_full_content_title_text_language (dcp::LanguageTag l) { + _full_content_title_text_language = l.to_string(); + } + + boost::optional release_territory () const { + return _release_territory; } - std::string content_version_label_text () const { - return _content_version_label_text; + void set_release_territory (dcp::LanguageTag::RegionSubtag t) { + _release_territory = t.subtag(); + } + + boost::optional release_territory_scope () const { + return _release_territory_scope; + } + + boost::optional version_number () const { + return _version_number; + } + + void set_version_number (int v); + + void unset_version_number (); + + boost::optional status () const { + return _status; + } + + void set_status (Status s) { + _status = s; + } + + boost::optional chain () const { + return _chain; + } + + void set_chain (std::string c) { + _chain = c; + } + + boost::optional distributor () const { + return _distributor; + } + + void set_distributor (std::string d) { + _distributor = d; + } + + boost::optional facility () const { + return _facility; + } + + void set_facility (std::string f) { + _facility = f; + } + + boost::optional luminance () const { + return _luminance; + } + + void set_luminance (Luminance l) { + _luminance = l; + } + + boost::optional main_sound_configuration () const { + return _main_sound_configuration; + } + + void set_main_sound_configuration (std::string c) { + _main_sound_configuration = c; + } + + boost::optional main_sound_sample_rate () const { + return _main_sound_sample_rate; + } + + void set_main_sound_sample_rate (int r) { + _main_sound_sample_rate = r; + } + + boost::optional main_picture_stored_area () const { + return _main_picture_stored_area; + } + + void set_main_picture_stored_area (dcp::Size s) { + _main_picture_stored_area = s; + } + + boost::optional main_picture_active_area () const { + return _main_picture_active_area; + } + + void set_main_picture_active_area (dcp::Size s) { + _main_picture_active_area = s; + } + + std::vector additional_subtitle_languages () const { + return _additional_subtitle_languages; + } + + void set_additional_subtitle_languages (std::vector const& lang); + + boost::optional standard () const { + return _standard; } static std::string static_pkl_type (Standard standard); @@ -166,21 +292,48 @@ protected: std::string pkl_type (Standard standard) const; private: + friend struct ::verify_various_invalid_languages; + + void maybe_write_composition_metadata_asset (xmlpp::Element* node) const; + void read_composition_metadata_asset (cxml::ConstNodePtr node); + std::string _issuer; std::string _creator; std::string _issue_date; - std::string _annotation_text; + boost::optional _annotation_text; std::string _content_title_text; ///< <ContentTitleText> ContentKind _content_kind; ///< <ContentKind> - std::string _content_version_id; ///< <Id> in <ContentVersion> - std::string _content_version_label_text; ///< <LabelText> in <ContentVersion> - std::list > _reels; - std::list _ratings; + std::vector _content_versions; + std::vector _ratings; + /** Human-readable name of the composition, without any metadata (i.e. no -FTR-EN-XX- etc.) */ + boost::optional _full_content_title_text; + boost::optional _full_content_title_text_language; + /** This is stored and returned as a string so that we can tolerate non-RFC-5646 strings, + * but must be set as a dcp::LanguageTag to try to ensure that we create compliant output. + */ + boost::optional _release_territory; + boost::optional _release_territory_scope; + boost::optional _version_number; + boost::optional _status; + boost::optional _chain; + boost::optional _distributor; + boost::optional _facility; + boost::optional _luminance; + boost::optional _main_sound_configuration; + boost::optional _main_sound_sample_rate; + boost::optional _main_picture_stored_area; + boost::optional _main_picture_active_area; + /* See note for _release_territory above */ + std::vector _additional_subtitle_languages; + + std::vector> _reels; /** Standard of CPL that was read in */ boost::optional _standard; }; + } + #endif