X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fcpl.h;h=95bcd03fb8d9ee217ee0b32f8da97806bf851b4f;hb=127c14300f1d2df9fc2b9dd4ffb5218ea6a717c3;hp=8f5682da71ed516903a803250310875c17991b57;hpb=28ad2d566af1f59274fd1e16f6ba5da7479fc197;p=libdcp.git diff --git a/src/cpl.h b/src/cpl.h index 8f5682da..95bcd03f 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -17,135 +17,117 @@ */ -/** @file src/cpl.h - * @brief Classes used to parse a CPL. - */ +#ifndef LIBDCP_CPL_H +#define LIBDCP_CPL_H -#include +#include #include -#include "xml.h" +#include +#include +#include +#include +#include "types.h" +#include "certificates.h" namespace libdcp { -class Picture : public XMLNode -{ -public: - Picture () {} - Picture (xmlpp::Node const * node); - - std::string id; - std::string annotation_text; - Fraction edit_rate; - int64_t intrinsic_duration; - int64_t entry_point; - int64_t duration; - Fraction frame_rate; - Fraction screen_aspect_ratio; -}; - - -/** CPL MainPicture node */ -class MainPicture : public Picture -{ -public: - MainPicture () {} - MainPicture (xmlpp::Node const * node); -}; - -/** CPL MainStereoscopicPicture node */ -class MainStereoscopicPicture : public Picture -{ -public: - MainStereoscopicPicture () {} - MainStereoscopicPicture (xmlpp::Node const * node); -}; - -/** CPL MainSound node */ -class MainSound : public XMLNode -{ -public: - MainSound () {} - MainSound (xmlpp::Node const * node); - - std::string id; - std::string annotation_text; - Fraction edit_rate; - int64_t intrinsic_duration; - int64_t entry_point; - int64_t duration; -}; - -/** CPL MainSubtitle node */ -class MainSubtitle : public XMLNode -{ -public: - MainSubtitle () {} - MainSubtitle (xmlpp::Node const * node); - - std::string id; - std::string annotation_text; - Fraction edit_rate; - int64_t intrinsic_duration; - int64_t entry_point; - int64_t duration; -}; - -/** CPL AssetList node */ -class CPLAssetList : public XMLNode -{ -public: - CPLAssetList () {} - CPLAssetList (xmlpp::Node const * node); - - boost::shared_ptr main_picture; - boost::shared_ptr main_stereoscopic_picture; - boost::shared_ptr main_sound; - boost::shared_ptr main_subtitle; -}; - -/** CPL Reel node */ -class CPLReel : public XMLNode -{ -public: - CPLReel () {} - CPLReel (xmlpp::Node const * node); - - std::string id; - boost::shared_ptr asset_list; -}; - -/** CPL ContentVersion node */ -class ContentVersion : public XMLNode -{ -public: - ContentVersion () {} - ContentVersion (xmlpp::Node const * node); - - std::string id; - std::string label_text; -}; - -/** @class CPL - * @brief Class to parse a CPL - * - * This class is used to parse XML CPL files. It is rarely necessary - * for the caller to use it outside libdcp. - */ -class CPL : public XMLFile +namespace parse { + class AssetMap; + class AssetMapAsset; +} + +class Asset; +class Reel; +class XMLMetadata; +class MXFMetadata; +class Encryption; +class KDM; + +/** @brief A CPL within a DCP */ +class CPL { public: - /** Parse a CPL XML file into our member variables */ - CPL (std::string file); - - std::string id; - std::string annotation_text; - std::string issue_date; - std::string creator; - std::string content_title_text; - ContentKind content_kind; - boost::shared_ptr content_version; - std::list > reels; + CPL (std::string directory, std::string name, ContentKind content_kind, int length, int frames_per_second); + CPL (std::string directory, std::string file, std::list asset_maps, bool require_mxfs = true); + + void add_reel (boost::shared_ptr reel); + + /** @return the length in frames */ + int length () const { + return _length; + } + + /** @return the type of the content, used by media servers + * to categorise things (e.g. feature, trailer, etc.) + */ + ContentKind content_kind () const { + return _content_kind; + } + + std::list > reels () const { + return _reels; + } + + /** @return the CPL's name, as will be presented on projector + * media servers and theatre management systems. + */ + std::string name () const { + return _name; + } + + /** @return the number of frames per second */ + int frames_per_second () const { + return _fps; + } + + std::list > assets () const; + + bool encrypted () const; + + std::string id () const { + return _id; + } + + bool equals (CPL const & other, EqualityOptions options, boost::function note) const; + + void write_xml (bool, XMLMetadata const &, boost::shared_ptr) const; + void write_to_assetmap (xmlpp::Node *) const; + void write_to_pkl (xmlpp::Node *) const; + + boost::shared_ptr make_kdm ( + CertificateChain const &, + std::string const &, + boost::shared_ptr, + boost::posix_time::ptime from, + boost::posix_time::ptime until, + bool, + MXFMetadata const &, + XMLMetadata const & + ) const; + + void add_kdm (KDM const &); + +private: + std::pair > asset_from_id (std::list, std::string id) const; + + std::string _directory; + /** the name of the DCP */ + std::string _name; + /** the content kind of the CPL */ + ContentKind _content_kind; + /** length in frames */ + mutable int _length; + /** frames per second */ + int _fps; + /** reels */ + std::list > _reels; + + /** our UUID */ + std::string _id; + /** a SHA1 digest of our XML */ + mutable std::string _digest; }; } +#endif