X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fcpl.h;h=4219c523268d6326fc6d0aceba6bcb7ed5fbe685;hb=880c6f67ca3637c54c97c51081e0649743292af3;hp=0005219a8ae98a6c4f32e6f351b2cc87b2f0cbe4;hpb=4d91615b49a3246654baaf7a08f10f303b79b85a;p=libdcp.git diff --git a/src/cpl.h b/src/cpl.h index 0005219a..4219c523 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -1,129 +1,157 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2014 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libdcp. + + libdcp is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + libdcp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + along with libdcp. If not, see . + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. */ /** @file src/cpl.h - * @brief Classes used to parse a CPL. + * @brief CPL class. */ -#include -#include -#include "xml.h" +#ifndef LIBDCP_CPL_H +#define LIBDCP_CPL_H -namespace libdcp { - -/** CPL MainPicture node */ -class MainPicture : public XMLNode -{ -public: - MainPicture () {} - MainPicture (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 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_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 to parse a CPL */ -class CPL : public XMLFile +#include "types.h" +#include "certificate.h" +#include "key.h" +#include "asset.h" +#include "metadata.h" +#include +#include +#include +#include +#include + +namespace dcp { + +class ReelAsset; +class Reel; +class XMLMetadata; +class MXFMetadata; +class CertificateChain; +class DecryptedKDM; + +/** @class CPL + * @brief A Composition Playlist. + */ +class CPL : public Asset { 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 annotation_text, ContentKind content_kind); + explicit CPL (boost::filesystem::path file); + + bool equals ( + boost::shared_ptr other, + EqualityOptions options, + NoteHandler note + ) const; + + void add (boost::shared_ptr reel); + void add (DecryptedKDM const &); + + /** @return contents of the <AnnotationText> node */ + std::string annotation_text () const { + return _annotation_text; + } + + /** @return contents of the <ContentTitleText> node */ + std::string content_title_text () const { + return _content_title_text; + } + + /** @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; + } + + /** @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; + } + + /** @return the reels in this CPL */ + std::list > reels () const { + return _reels; + } + + /** @return the ReelAssets in this CPL in all reels. + */ + std::list > reel_assets () const; + + bool encrypted () const; + + void set_metadata (XMLMetadata m) { + _metadata = m; + } + + void write_xml ( + boost::filesystem::path file, + Standard standard, + boost::shared_ptr + ) const; + + void resolve_refs (std::list >); + + int64_t duration () const; + + boost::optional standard () const { + return _standard; + } + +protected: + /** @return type string for PKLs for this asset */ + std::string pkl_type (Standard standard) const; + +private: + std::string _annotation_text; ///< <AnnotationText> + /** <Issuer>, <Creator> and <IssueDate>. These are grouped + * because they occur together in a few places. + */ + XMLMetadata _metadata; + 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; + + /** Standard of CPL that was read in */ + boost::optional _standard; }; } +#endif