X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp.h;h=d4f6aff9aba9a64a377da1caed718eb789b4b1f8;hb=147cbe31f62fd6087a9a70f0ce2cd4a69b06dbbf;hp=27be9ec63bd76c9c45d2b0892321c0b23cfaf720;hpb=7d48446b5efdf795df1ce22d6d9ed3ebe85d3381;p=libdcp.git diff --git a/src/dcp.h b/src/dcp.h index 27be9ec6..d4f6aff9 100644 --- a/src/dcp.h +++ b/src/dcp.h @@ -17,56 +17,173 @@ */ +/** @file src/dcp.h + * @brief A class to create a DCP. + */ + +#ifndef LIBDCP_DCP_H +#define LIBDCP_DCP_H + #include -#include +#include #include +#include +#include "types.h" + +namespace xmlpp { + class Node; +} +/** @brief Namespace for everything in libdcp */ namespace libdcp { class Asset; +class PictureAsset; +class SoundAsset; +class SubtitleAsset; +class Reel; +class AssetMap; -class DCP +class CPL { public: - enum ContentType - { - FEATURE, - SHORT, - TRAILER, - TEST, - TRANSITIONAL, - RATING, - TEASER, - POLICY, - PUBLIC_SERVICE_ANNOUNCEMENT, - ADVERTISEMENT - }; + CPL (std::string directory, std::string name, ContentKind content_kind, int length, int frames_per_second); + CPL (std::string directory, std::string file, boost::shared_ptr asset_map, 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; - DCP (std::string, std::string, ContentType, int, int); + bool equals (CPL const & other, EqualityOptions options, std::list& notes) const; + + void write_xml () const; + void write_to_assetmap (std::ostream& s) const; + void write_to_pkl (std::ostream& s) const; + +private: + 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; - void add_sound_asset (std::list const &); - void add_picture_asset (std::list const &, int, int); + std::string _uuid; + mutable std::string _digest; +}; +/** @class DCP dcp.h libdcp/dcp.h + * @brief A class to create or read a DCP. + */ + +class DCP +{ +public: + /** Construct a DCP. You can pass an existing DCP's directory + * as the parameter, or a non-existant folder to create a new + * DCP in. + * + * @param directory Directory containing the DCP's files. + */ + DCP (std::string directory); + + /** Read an existing DCP's data. + * + * The DCP's XML metadata will be examined, and you can then look at the contents + * of the DCP. + * + * @param require_mxfs true to throw an exception if MXF files are missing; setting to false + * can be useful for testing, but normally it should be set to true. + */ + void read (bool require_mxfs = true); + + /** Write the required XML files to the directory that was + * passed into the constructor. + */ void write_xml () const; + /** Compare this DCP with another, according to various options. + * @param other DCP to compare this one to. + * @param options Options to define just what "equality" means. + * @param notes Filled in with notes about differences. + * @return true if the DCPs are equal according to EqualityOptions, otherwise false. + */ + bool equals (DCP const & other, EqualityOptions options, std::list& notes) const; + + void add_cpl (boost::shared_ptr cpl); + + std::list > cpls () const { + return _cpls; + } + + /** Emitted with a parameter between 0 and 1 to indicate progress + * for long jobs. + */ + boost::signals2::signal Progress; + private: - std::string write_cpl (std::string) const; - std::string write_pkl (std::string, std::string, std::string, int) const; + /** Write the PKL file. + * @param pkl_uuid UUID to use. + */ + std::string write_pkl (std::string pkl_uuid) const; + + /** Write the VOLINDEX file */ void write_volindex () const; - void write_assetmap (std::string, int, std::string, int) const; - static std::string content_type_string (ContentType); + /** Write the ASSETMAP file. + * @param pkl_uuid UUID of our PKL. + * @param pkl_length Length of our PKL in bytes. + */ + void write_assetmap (std::string pkl_uuid, int pkl_length) const; - std::string _directory; - std::string _name; - ContentType _content_type; - int _fps; - int _length; - std::list > _assets; + std::list > assets () const; - std::string _date; + struct Files { + std::list cpls; + std::string pkl; + std::string asset_map; + }; + + /** the directory that we are writing to */ + std::string _directory; + std::list > _cpls; }; } + +#endif