X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fdcp.h;h=7d3d670aa891a4e35e20ea2736d059f70554d64d;hb=refs%2Ftags%2Fv1.8.63;hp=7323de9a33f114b6a5219fa111ec71f399dedb39;hpb=1f284533185a798c0ed36669bd6c9729adf6ec5a;p=libdcp.git diff --git a/src/dcp.h b/src/dcp.h index 7323de9a..7d3d670a 100644 --- a/src/dcp.h +++ b/src/dcp.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2020 Carl Hetherington + Copyright (C) 2012-2021 Carl Hetherington This file is part of libdcp. @@ -31,35 +31,42 @@ files in the program, then also delete it here. */ + /** @file src/dcp.h - * @brief DCP class. + * @brief DCP class */ + #ifndef LIBDCP_DCP_H #define LIBDCP_DCP_H -#include "compose.hpp" -#include "types.h" -#include "util.h" + +#include "asset_map.h" #include "certificate.h" +#include "compose.hpp" #include "metadata.h" #include "name_format.h" +#include "types.h" +#include "util.h" #include "verify.h" #include "version.h" -#include #include +#include #include #include + namespace xmlpp { class Document; class Element; } + /** @brief Namespace for everything in libdcp */ namespace dcp { + class PKL; class Content; class Reel; @@ -69,11 +76,11 @@ class DecryptedKDM; class Asset; class ReadError; + /** @class DCP - * @brief A class to create or read a DCP. + * @brief A class to create or read a DCP */ - -class DCP : public boost::noncopyable +class DCP { public: /** Construct a DCP. You can pass an existing DCP's directory @@ -85,13 +92,31 @@ public: */ explicit DCP (boost::filesystem::path directory); - /** Read the DCP's structure into this object. + DCP (DCP const&) = delete; + DCP& operator= (DCP const&) = delete; + + DCP (DCP &&); + DCP& operator= (DCP &&); + + /** Read a DCP. This method does not do any deep checking of the DCP's validity, but + * if it comes across any bad things it will do one of two things. + * + * Errors that are so serious that they prevent the method from working will result + * in an exception being thrown. For example, a missing ASSETMAP means that the DCP + * can't be read without a lot of guesswork, so this will throw. + * + * Errors that are not fatal will be added to notes, if it's non-null. For example, + * if the DCP contains a mixture of Interop and SMPTE elements this will result + * in a note being added to the vector. + * + * For more thorough checking of a DCP's contents, see dcp::verify(). + * * @param notes List of notes that will be added to if non-0. * @param ignore_incorrect_picture_mxf_type true to try loading MXF files marked as monoscopic * as stereoscopic if the monoscopic load fails; fixes problems some 3D DCPs that (I think) * have an incorrect descriptor in their MXF. */ - void read (std::vector* notes = 0, bool ignore_incorrect_picture_mxf_type = false); + void read (std::vector* notes = nullptr, bool ignore_incorrect_picture_mxf_type = false); /** Compare this DCP with another, according to various options. * @param other DCP to compare this one to. @@ -104,20 +129,34 @@ public: void add (std::shared_ptr cpl); std::vector> cpls () const; + + /** @param ignore_unresolved true to silently ignore unresolved assets, otherwise + * an exception is thrown if they are found. + * @return All assets (including CPLs). + */ std::vector> assets (bool ignore_unresolved = false) const; bool any_encrypted () const; bool all_encrypted () const; + /** Add a KDM to decrypt this DCP. This method must be called after DCP::read() + * or the KDM you specify will be ignored. + * @param kdm KDM to use. + */ void add (DecryptedKDM const &); + void set_issuer(std::string issuer); + void set_creator(std::string creator); + void set_issue_date(std::string issue_date); + void set_annotation_text(std::string annotation_text); + + /** Write all the XML files for this DCP. + * @param standand INTEROP or SMPTE + * @param signer Signer to use + * @param name_format Name format to use for the CPL and PKL filenames + */ void write_xml ( - Standard standard, - std::string issuer = String::compose("libdcp %1", dcp::version), - std::string creator = String::compose("libdcp %1", dcp::version), - std::string issue_date = LocalTime().as_string(), - std::string annotation_text = String::compose("Created by libdcp %1", dcp::version), - std::shared_ptr signer = std::shared_ptr (), + std::shared_ptr signer = std::shared_ptr(), NameFormat name_format = NameFormat("%t") ); @@ -125,7 +164,11 @@ public: /** @return Standard of a DCP that was read in */ boost::optional standard () const { - return _standard; + if (!_asset_map) { + return {}; + } + + return _asset_map->standard(); } boost::filesystem::path directory () const { @@ -139,7 +182,15 @@ public: return _pkls; } - boost::optional asset_map_path () { + boost::optional asset_map_file() const { + if (!_asset_map) { + return {}; + } + + return _asset_map->file(); + } + + boost::optional asset_map() const { return _asset_map; } @@ -149,28 +200,23 @@ private: void write_volindex (Standard standard) const; - /** Write the ASSETMAP file. - * @param pkl_uuid UUID of our PKL. - * @param pkl_path Pathname of our PKL file. - */ - void write_assetmap ( - Standard standard, std::string pkl_uuid, boost::filesystem::path pkl_path, - std::string issuer, std::string creator, std::string issue_date, std::string annotation_text - ) const; - /** The directory that we are writing to */ boost::filesystem::path _directory; /** The CPLs that make up this DCP */ std::vector> _cpls; /** The PKLs that make up this DCP */ std::vector> _pkls; - /** File that the ASSETMAP was read from or last written to */ - mutable boost::optional _asset_map; + boost::optional _asset_map; - /** Standard of DCP that was read in */ - boost::optional _standard; + /* Metadata to use for newly created PKLs and AssetMaps */ + boost::optional _new_issuer; + boost::optional _new_creator; + boost::optional _new_issue_date; + boost::optional _new_annotation_text; }; + } + #endif