Bv2.1 7.2.3: Check that subtitle <StartTime> exists and is 0.
[libdcp.git] / src / reel_mxf.h
index 5e8aa84eacf5a2e72f3b0078a6af2f0839172be4..0751418994fdd6e7e091c61d3ddd02fcd44458e5 100644 (file)
@@ -1,31 +1,46 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
-    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 <http://www.gnu.org/licenses/>.
+
+    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/reel_mxf.h
  *  @brief ReelMXF
  */
 
-#ifndef LIBDCP_REEL_ENCRYPTABLE_ASSET_H
-#define LIBDCP_REEL_ENCRYPTABLE_ASSET_H
+#ifndef LIBDCP_REEL_MXF_H
+#define LIBDCP_REEL_MXF_H
 
+#include "ref.h"
 #include <boost/optional.hpp>
-#include <boost/shared_ptr.hpp>
+#include <memory>
 #include <string>
 
 namespace cxml {
@@ -40,18 +55,39 @@ namespace dcp {
 class ReelMXF
 {
 public:
-       ReelMXF () {}
-       ReelMXF (boost::optional<std::string> key_id);
-       ReelMXF (boost::shared_ptr<const cxml::Node>);
+       explicit ReelMXF (std::shared_ptr<Asset> asset, boost::optional<std::string> key_id);
+       explicit ReelMXF (std::shared_ptr<const cxml::Node>);
+       virtual ~ReelMXF () {}
 
        /** @return the 4-character key type for this MXF (MDIK, MDAK, etc.) */
        virtual std::string key_type () const = 0;
-       
+
+       /** @return a Ref to our actual asset */
+       Ref const & asset_ref () const {
+               return _asset_ref;
+       }
+
+       /** @return a Ref to our actual asset */
+       Ref & asset_ref () {
+               return _asset_ref;
+       }
+
+       /** @return the asset's hash, if this ReelMXF has been created from one,
+        *  otherwise the hash written to the CPL for this asset (if present).
+        */
+       boost::optional<std::string> hash () const {
+               return _hash;
+       }
+
+       void set_hash (std::string h) {
+               _hash = h;
+       }
+
        /** @return true if a KeyId is specified for this asset, implying
         *  that its content is encrypted.
         */
        bool encrypted () const {
-               return _key_id;
+               return static_cast<bool>(_key_id);
        }
 
        /** @return Key ID to describe the key that encrypts this asset's
@@ -61,8 +97,31 @@ public:
                return _key_id;
        }
 
+       bool mxf_equals (std::shared_ptr<const ReelMXF> other, EqualityOptions opt, NoteHandler note) const;
+
+protected:
+
+       template <class T>
+       std::shared_ptr<T> asset_of_type () const {
+               return std::dynamic_pointer_cast<T> (_asset_ref.asset ());
+       }
+
+       template <class T>
+       std::shared_ptr<T> asset_of_type () {
+               return std::dynamic_pointer_cast<T> (_asset_ref.asset ());
+       }
+
+       void write_to_cpl_mxf (xmlpp::Node* node) const;
+
+       /** Reference to the asset (MXF or XML file) that this reel entry
+        *  applies to.
+        */
+       Ref _asset_ref;
+
 private:
        boost::optional<std::string> _key_id; ///< The &lt;KeyId&gt; from the reel's entry for this asset, if there is one
+       /** Either our asset's computed hash or the hash read in from the CPL, if it's present */
+       boost::optional<std::string> _hash;
 };
 
 }