Move asset refs and hash from ReelAsset to ReelMXF.
authorCarl Hetherington <cth@carlh.net>
Fri, 15 Mar 2019 00:49:41 +0000 (00:49 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 17 Mar 2019 00:24:27 +0000 (00:24 +0000)
19 files changed:
src/cpl.cc
src/cpl.h
src/dcp.cc
src/decrypted_kdm.cc
src/reel_asset.cc
src/reel_asset.h
src/reel_atmos_asset.cc
src/reel_atmos_asset.h
src/reel_closed_caption_asset.cc
src/reel_closed_caption_asset.h
src/reel_mxf.cc
src/reel_mxf.h
src/reel_picture_asset.cc
src/reel_picture_asset.h
src/reel_sound_asset.cc
src/reel_sound_asset.h
src/reel_subtitle_asset.cc
src/reel_subtitle_asset.h
src/verify.cc

index 3eeb102c196b28ac83af9736ec1c997800ddded9..0bf1582490155786f9727acc45e3c199a62acf79 100644 (file)
@@ -175,10 +175,10 @@ CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr<cons
        set_file (file);
 }
 
-list<shared_ptr<ReelAsset> >
-CPL::reel_assets ()
+list<shared_ptr<ReelMXF> >
+CPL::reel_mxfs ()
 {
-       list<shared_ptr<ReelAsset> > c;
+       list<shared_ptr<ReelMXF> > c;
 
        BOOST_FOREACH (shared_ptr<Reel> i, _reels) {
                if (i->main_picture ()) {
@@ -201,10 +201,10 @@ CPL::reel_assets ()
        return c;
 }
 
-list<shared_ptr<const ReelAsset> >
-CPL::reel_assets () const
+list<shared_ptr<const ReelMXF> >
+CPL::reel_mxfs () const
 {
-       list<shared_ptr<const ReelAsset> > c;
+       list<shared_ptr<const ReelMXF> > c;
 
        BOOST_FOREACH (shared_ptr<Reel> i, _reels) {
                if (i->main_picture ()) {
index 259281dc3e958b5df692ca9836b952e18464a988..553f54928795cb40bcfeffe10ce26b8ad337bd2f 100644 (file)
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -51,7 +51,7 @@
 
 namespace dcp {
 
-class ReelAsset;
+class ReelMXF;
 class Reel;
 class XMLMetadata;
 class MXFMetadata;
@@ -116,10 +116,10 @@ public:
                return _reels;
        }
 
-       /** @return the ReelAssets in this CPL in all reels.
+       /** @return the ReelMXFs in this CPL in all reels.
         */
-       std::list<boost::shared_ptr<const ReelAsset> > reel_assets () const;
-       std::list<boost::shared_ptr<ReelAsset> > reel_assets ();
+       std::list<boost::shared_ptr<const ReelMXF> > reel_mxfs () const;
+       std::list<boost::shared_ptr<ReelMXF> > reel_mxfs ();
 
        bool encrypted () const;
 
index 5d908530edc43561f5e8d1231a1f4837fbd6c4b4..52598610a808defa0031f8379e75c4cc89b01dc5 100644 (file)
@@ -476,7 +476,7 @@ DCP::assets (bool ignore_unresolved) const
        list<shared_ptr<Asset> > assets;
        BOOST_FOREACH (shared_ptr<CPL> i, cpls ()) {
                assets.push_back (i);
-               BOOST_FOREACH (shared_ptr<const ReelAsset> j, i->reel_assets ()) {
+               BOOST_FOREACH (shared_ptr<const ReelMXF> j, i->reel_mxfs()) {
                        if (ignore_unresolved && !j->asset_ref().resolved()) {
                                continue;
                        }
index 756028d15e18d6f563e3aa989a0fd3a4d5470d4e..4bd9a9d5bf7b655a2f62a102d82221bd32fe78cb 100644 (file)
@@ -271,10 +271,9 @@ DecryptedKDM::DecryptedKDM (
 {
        /* Create DecryptedKDMKey objects for each encryptable asset */
        bool did_one = false;
-       BOOST_FOREACH(shared_ptr<const ReelAsset> i, cpl->reel_assets ()) {
-               shared_ptr<const ReelMXF> mxf = boost::dynamic_pointer_cast<const ReelMXF> (i);
-               if (mxf && mxf->key_id ()) {
-                       add_key (mxf->key_type(), mxf->key_id().get(), key, cpl->id(), SMPTE);
+       BOOST_FOREACH(shared_ptr<const ReelMXF> i, cpl->reel_mxfs()) {
+               if (i->key_id()) {
+                       add_key (i->key_type(), i->key_id().get(), key, cpl->id(), SMPTE);
                        did_one = true;
                }
        }
index 797d1c40d91a8ff951c97f8ef20fe1e3f8ab6794..225832239c84e9e6d280dba1e7e62d13210206a8 100644 (file)
@@ -46,6 +46,7 @@ using std::pair;
 using std::string;
 using std::make_pair;
 using boost::shared_ptr;
+using boost::optional;
 using namespace dcp;
 
 /** Construct a ReelAsset.
@@ -56,12 +57,10 @@ using namespace dcp;
  */
 ReelAsset::ReelAsset (shared_ptr<Asset> asset, Fraction edit_rate, int64_t intrinsic_duration, int64_t entry_point)
        : Object (asset->id ())
-       , _asset_ref (asset)
        , _edit_rate (edit_rate)
        , _intrinsic_duration (intrinsic_duration)
        , _entry_point (entry_point)
        , _duration (intrinsic_duration - entry_point)
-       , _hash (asset->hash ())
 {
        /* default _annotation_text to the leaf name of our file */
        if (asset->file ()) {
@@ -71,19 +70,17 @@ ReelAsset::ReelAsset (shared_ptr<Asset> asset, Fraction edit_rate, int64_t intri
 
 ReelAsset::ReelAsset (shared_ptr<const cxml::Node> node)
        : Object (remove_urn_uuid (node->string_child ("Id")))
-       , _asset_ref (_id)
        , _annotation_text (node->optional_string_child ("AnnotationText").get_value_or (""))
        , _edit_rate (Fraction (node->string_child ("EditRate")))
        , _intrinsic_duration (node->number_child<int64_t> ("IntrinsicDuration"))
        , _entry_point (node->number_child<int64_t> ("EntryPoint"))
        , _duration (node->number_child<int64_t> ("Duration"))
-       , _hash (node->optional_string_child ("Hash"))
 {
 
 }
 
 xmlpp::Node*
-ReelAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
+ReelAsset::write_to_cpl_base (xmlpp::Node* node, Standard standard, optional<string> hash) const
 {
         xmlpp::Element* a = node->add_child (cpl_node_name (standard));
         pair<string, string> const attr = cpl_node_attribute (standard);
@@ -100,8 +97,8 @@ ReelAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
         a->add_child("IntrinsicDuration")->add_child_text (raw_convert<string> (_intrinsic_duration));
         a->add_child("EntryPoint")->add_child_text (raw_convert<string> (_entry_point));
         a->add_child("Duration")->add_child_text (raw_convert<string> (_duration));
-       if (_hash) {
-               a->add_child("Hash")->add_child_text (_hash.get());
+       if (hash) {
+               a->add_child("Hash")->add_child_text (hash.get());
        }
        return a;
 }
@@ -119,7 +116,7 @@ ReelAsset::cpl_node_namespace (Standard) const
 }
 
 bool
-ReelAsset::equals (shared_ptr<const ReelAsset> other, EqualityOptions opt, NoteHandler note) const
+ReelAsset::asset_equals (shared_ptr<const ReelAsset> other, EqualityOptions opt, NoteHandler note) const
 {
        if (_annotation_text != other->_annotation_text) {
                string const s = "Reel: annotation texts differ (" + _annotation_text + " vs " + other->_annotation_text + ")\n";
@@ -151,18 +148,5 @@ ReelAsset::equals (shared_ptr<const ReelAsset> other, EqualityOptions opt, NoteH
                return false;
        }
 
-       if (_hash != other->_hash) {
-               if (!opt.reel_hashes_can_differ) {
-                       note (DCP_ERROR, "Reel: hashes differ");
-                       return false;
-               } else {
-                       note (DCP_NOTE, "Reel: hashes differ");
-               }
-       }
-
-       if (_asset_ref.resolved () && other->_asset_ref.resolved ()) {
-               return _asset_ref->equals (other->_asset_ref.asset(), opt, note);
-       }
-
        return true;
 }
index 974d9af0299b6f59124e117a5183649c410d26cc..9f02423903cac215e8cc7eb9e0300f9895901f46 100644 (file)
@@ -68,18 +68,7 @@ public:
        ReelAsset (boost::shared_ptr<Asset> asset, Fraction edit_rate, int64_t intrinsic_duration, int64_t entry_point);
        explicit ReelAsset (boost::shared_ptr<const cxml::Node>);
 
-       virtual xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
-       virtual bool equals (boost::shared_ptr<const ReelAsset>, EqualityOptions, NoteHandler) const;
-
-       /** @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;
-       }
+       virtual xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const = 0;
 
        Fraction edit_rate () const {
                return _edit_rate;
@@ -105,13 +94,6 @@ public:
                return _duration;
        }
 
-       /** @return the asset's hash, if this ReelAsset 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;
-       }
-
        std::string annotation_text () const {
                return _annotation_text;
        }
@@ -120,17 +102,9 @@ public:
                _annotation_text = at;
        }
 
-protected:
-
-       template <class T>
-       boost::shared_ptr<T> asset_of_type () const {
-               return boost::dynamic_pointer_cast<T> (_asset_ref.asset ());
-       }
+       bool asset_equals (boost::shared_ptr<const ReelAsset>, EqualityOptions, NoteHandler) const;
 
-       template <class T>
-       boost::shared_ptr<T> asset_of_type () {
-               return boost::dynamic_pointer_cast<T> (_asset_ref.asset ());
-       }
+protected:
 
        /** @return the node name that this asset uses in the CPL's &lt;Reel&gt; node
         *  e.g. MainPicture, MainSound etc.
@@ -143,10 +117,7 @@ protected:
        /** @return Any namespace that should be used on the asset's node in the CPL */
        virtual std::pair<std::string, std::string> cpl_node_namespace (Standard) const;
 
-       /** Reference to the asset (MXF or XML file) that this reel entry
-        *  applies to.
-        */
-       Ref _asset_ref;
+       xmlpp::Node* write_to_cpl_base (xmlpp::Node* node, Standard standard, boost::optional<std::string> hash) const;
 
 private:
        std::string _annotation_text; ///< The &lt;AnnotationText&gt; from the reel's entry for this asset
@@ -154,8 +125,6 @@ private:
        int64_t _intrinsic_duration;  ///< The &lt;IntrinsicDuration&gt; from the reel's entry for this asset
        int64_t _entry_point;         ///< The &lt;EntryPoint&gt; from the reel's entry for this asset
        int64_t _duration;            ///< The &lt;Duration&gt; from the reel's entry for this asset
-       /** Either our asset's computed hash or the hash read in from the CPL, if it's present */
-       boost::optional<std::string> _hash;
 };
 
 }
index 636a7a79641a0ab47a47d1e3c44908ab0aa8e2aa..f5dbc9fa7e33f5f0e1512dfb88f8cc4855ac52c2 100644 (file)
@@ -48,6 +48,7 @@ using namespace dcp;
 
 ReelAtmosAsset::ReelAtmosAsset (boost::shared_ptr<AtmosAsset> asset, int64_t entry_point)
        : ReelAsset (asset, asset->edit_rate(), asset->intrinsic_duration(), entry_point)
+       , ReelMXF (asset, asset->key_id())
 {
 
 }
@@ -81,7 +82,20 @@ ReelAtmosAsset::key_type () const
 xmlpp::Node *
 ReelAtmosAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 {
-       xmlpp::Node* asset = ReelAsset::write_to_cpl (node, standard);
+       xmlpp::Node* asset = write_to_cpl_base (node, standard, hash());
        asset->add_child("axd:DataType")->add_child_text("urn:smpte:ul:060e2b34.04010105.0e090604.00000000");
        return asset;
 }
+
+bool
+ReelAtmosAsset::equals (shared_ptr<const ReelAtmosAsset> other, EqualityOptions opt, NoteHandler note) const
+{
+       if (!asset_equals (other, opt, note)) {
+               return false;
+       }
+       if (!mxf_equals (other, opt, note)) {
+               return false;
+       }
+
+       return true;
+}
index e93a54148a4fe9ff75ba4cbca49ef777a036e5d1..6fb4bf5162665ad5960e429df05bc11d7819644b 100644 (file)
@@ -60,6 +60,7 @@ public:
        }
 
        xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
+       bool equals (boost::shared_ptr<const ReelAtmosAsset>, EqualityOptions, NoteHandler) const;
 
 private:
        std::string key_type () const;
index b7629011694253325f45798b94dc01e5ab3fc7bf..f71c39f62066e03ee4225f09dfbfedfb15df6679 100644 (file)
@@ -51,7 +51,7 @@ using namespace dcp;
 
 ReelClosedCaptionAsset::ReelClosedCaptionAsset (boost::shared_ptr<SubtitleAsset> asset, Fraction edit_rate, int64_t intrinsic_duration, int64_t entry_point)
        : ReelAsset (asset, edit_rate, intrinsic_duration, entry_point)
-       , ReelMXF (dynamic_pointer_cast<SMPTESubtitleAsset>(asset) ? dynamic_pointer_cast<SMPTESubtitleAsset>(asset)->key_id() : optional<string>())
+       , ReelMXF (asset, dynamic_pointer_cast<SMPTESubtitleAsset>(asset) ? dynamic_pointer_cast<SMPTESubtitleAsset>(asset)->key_id() : optional<string>())
 {
 
 }
@@ -99,7 +99,7 @@ ReelClosedCaptionAsset::key_type () const
 xmlpp::Node *
 ReelClosedCaptionAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 {
-       xmlpp::Node* asset = ReelAsset::write_to_cpl (node, standard);
+       xmlpp::Node* asset = write_to_cpl_base (node, standard, hash());
 
         if (key_id()) {
                /* Find <Hash> */
@@ -113,3 +113,16 @@ ReelClosedCaptionAsset::write_to_cpl (xmlpp::Node* node, Standard standard) cons
 
        return asset;
 }
+
+bool
+ReelClosedCaptionAsset::equals (shared_ptr<const ReelClosedCaptionAsset> other, EqualityOptions opt, NoteHandler note) const
+{
+       if (!asset_equals (other, opt, note)) {
+               return false;
+       }
+       if (!mxf_equals (other, opt, note)) {
+               return false;
+       }
+
+       return true;
+}
index 80e444d9391315c1ccad073665485f90046f3195..6ed50ae01125a2d4f1dbf32673ae8056fd7160b7 100644 (file)
@@ -56,6 +56,7 @@ public:
        explicit ReelClosedCaptionAsset (boost::shared_ptr<const cxml::Node>);
 
        xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
+       bool equals (boost::shared_ptr<const ReelClosedCaptionAsset>, EqualityOptions, NoteHandler) const;
 
        boost::shared_ptr<SubtitleAsset> asset () const {
                return asset_of_type<SubtitleAsset> ();
index 9c2d3b60d062d7aefa976c4724e89287cb2b1aee..f170157ec0465b4cf464f4d0139b01e492028c5f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -43,16 +43,39 @@ using boost::shared_ptr;
 using boost::optional;
 using namespace dcp;
 
-ReelMXF::ReelMXF (optional<string> key_id)
-       : _key_id (key_id)
+ReelMXF::ReelMXF (shared_ptr<Asset> asset, optional<string> key_id)
+       : _asset_ref (asset)
+       , _key_id (key_id)
+       , _hash (asset->hash())
 {
 
 }
 
 ReelMXF::ReelMXF (shared_ptr<const cxml::Node> node)
-       : _key_id (node->optional_string_child ("KeyId"))
+       : _asset_ref (remove_urn_uuid(node->string_child("Id")))
+       , _key_id (node->optional_string_child ("KeyId"))
+       , _hash (node->optional_string_child ("Hash"))
 {
        if (_key_id) {
                _key_id = remove_urn_uuid (*_key_id);
        }
 }
+
+bool
+ReelMXF::mxf_equals (shared_ptr<const ReelMXF> other, EqualityOptions opt, NoteHandler note) const
+{
+       if (_hash != other->_hash) {
+               if (!opt.reel_hashes_can_differ) {
+                       note (DCP_ERROR, "Reel: hashes differ");
+                       return false;
+               } else {
+                       note (DCP_NOTE, "Reel: hashes differ");
+               }
+       }
+
+       if (_asset_ref.resolved() && other->_asset_ref.resolved()) {
+               return _asset_ref->equals (other->_asset_ref.asset(), opt, note);
+       }
+
+       return true;
+}
index 916255790846314250b8a98457cbec96c1ea1f5f..7bc8f75b3dea771115d99498ba7cf7f7fcf61d8b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
  *  @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 <string>
@@ -54,14 +55,30 @@ namespace dcp {
 class ReelMXF
 {
 public:
-       ReelMXF () {}
-       explicit ReelMXF (boost::optional<std::string> key_id);
+       explicit ReelMXF (boost::shared_ptr<Asset> asset, boost::optional<std::string> key_id);
        explicit ReelMXF (boost::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;
+       }
+
        /** @return true if a KeyId is specified for this asset, implying
         *  that its content is encrypted.
         */
@@ -76,8 +93,29 @@ public:
                return _key_id;
        }
 
+       bool mxf_equals (boost::shared_ptr<const ReelMXF> other, EqualityOptions opt, NoteHandler note) const;
+
+protected:
+
+       template <class T>
+       boost::shared_ptr<T> asset_of_type () const {
+               return boost::dynamic_pointer_cast<T> (_asset_ref.asset ());
+       }
+
+       template <class T>
+       boost::shared_ptr<T> asset_of_type () {
+               return boost::dynamic_pointer_cast<T> (_asset_ref.asset ());
+       }
+
+       /** 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;
 };
 
 }
index 5eaf915728afba39c0d2b63ed248640f0e505fb6..d2ba358f006710266feb170170d510ed28ae369a 100644 (file)
@@ -54,7 +54,7 @@ using namespace dcp;
 
 ReelPictureAsset::ReelPictureAsset (shared_ptr<PictureAsset> asset, int64_t entry_point)
        : ReelAsset (asset, asset->edit_rate(), asset->intrinsic_duration(), entry_point)
-       , ReelMXF (asset->key_id())
+       , ReelMXF (asset, asset->key_id())
        , _frame_rate (asset->frame_rate ())
        , _screen_aspect_ratio (asset->screen_aspect_ratio ())
 {
@@ -82,7 +82,7 @@ ReelPictureAsset::ReelPictureAsset (shared_ptr<const cxml::Node> node)
 xmlpp::Node*
 ReelPictureAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 {
-       xmlpp::Node* asset = ReelAsset::write_to_cpl (node, standard);
+       xmlpp::Node* asset = write_to_cpl_base (node, standard, hash());
 
        asset->add_child("FrameRate")->add_child_text(String::compose("%1 %2", _frame_rate.numerator, _frame_rate.denominator));
        if (standard == INTEROP) {
@@ -128,9 +128,12 @@ ReelPictureAsset::key_type () const
 }
 
 bool
-ReelPictureAsset::equals (shared_ptr<const ReelAsset> other, EqualityOptions opt, NoteHandler note) const
+ReelPictureAsset::equals (shared_ptr<const ReelPictureAsset> other, EqualityOptions opt, NoteHandler note) const
 {
-       if (!ReelAsset::equals (other, opt, note)) {
+       if (!asset_equals (other, opt, note)) {
+               return false;
+       }
+       if (!mxf_equals (other, opt, note)) {
                return false;
        }
 
index 20cf02555b8644e98c499328f52a285482581238..88729148c6fa9713e6447be1f9102ae333d12942 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -54,7 +54,7 @@ public:
        explicit ReelPictureAsset (boost::shared_ptr<const cxml::Node>);
 
        virtual xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
-       virtual bool equals (boost::shared_ptr<const ReelAsset>, EqualityOptions, NoteHandler) const;
+       bool equals (boost::shared_ptr<const ReelPictureAsset>, EqualityOptions, NoteHandler) const;
 
        /** @return the PictureAsset that this object refers to */
        boost::shared_ptr<const PictureAsset> asset () const {
index baacfe720ff77b29e4718938c3d19cbfc4aab98a..ab763cb33f3b3afc69469c5ba085b582888adc2c 100644 (file)
@@ -46,7 +46,7 @@ using namespace dcp;
 
 ReelSoundAsset::ReelSoundAsset (shared_ptr<SoundAsset> asset, int64_t entry_point)
        : ReelAsset (asset, asset->edit_rate(), asset->intrinsic_duration(), entry_point)
-       , ReelMXF (asset->key_id())
+       , ReelMXF (asset, asset->key_id())
 {
 
 }
@@ -74,7 +74,7 @@ ReelSoundAsset::key_type () const
 xmlpp::Node *
 ReelSoundAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 {
-       xmlpp::Node* asset = ReelAsset::write_to_cpl (node, standard);
+       xmlpp::Node* asset = write_to_cpl_base (node, standard, hash());
 
         if (key_id ()) {
                /* Find <Hash> */
@@ -84,3 +84,16 @@ ReelSoundAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 
        return asset;
 }
+
+bool
+ReelSoundAsset::equals (shared_ptr<const ReelSoundAsset> other, EqualityOptions opt, NoteHandler note) const
+{
+       if (!asset_equals (other, opt, note)) {
+               return false;
+       }
+       if (!mxf_equals (other, opt, note)) {
+               return false;
+       }
+
+       return true;
+}
index 2fb01c8d110c06a6c06c87a9fb7a5d07794babf1..57d14bc6ed54a652915e52274e8a39ba76e96c19 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -53,6 +53,7 @@ public:
        explicit ReelSoundAsset (boost::shared_ptr<const cxml::Node>);
 
        xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
+       bool equals (boost::shared_ptr<const ReelSoundAsset>, EqualityOptions, NoteHandler) const;
 
        /** @return the SoundAsset that this object refers to */
        boost::shared_ptr<SoundAsset> asset () {
index 75116b2b6782202a58497d990bc480d41fd0b034..1bb8cccac7bfbceab43651c71c531e604d911b57 100644 (file)
@@ -48,7 +48,7 @@ using namespace dcp;
 
 ReelSubtitleAsset::ReelSubtitleAsset (boost::shared_ptr<SubtitleAsset> asset, Fraction edit_rate, int64_t intrinsic_duration, int64_t entry_point)
        : ReelAsset (asset, edit_rate, intrinsic_duration, entry_point)
-       , ReelMXF (dynamic_pointer_cast<SMPTESubtitleAsset>(asset) ? dynamic_pointer_cast<SMPTESubtitleAsset>(asset)->key_id() : optional<string>())
+       , ReelMXF (asset, dynamic_pointer_cast<SMPTESubtitleAsset>(asset) ? dynamic_pointer_cast<SMPTESubtitleAsset>(asset)->key_id() : optional<string>())
 {
 
 }
@@ -76,7 +76,7 @@ ReelSubtitleAsset::key_type () const
 xmlpp::Node *
 ReelSubtitleAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 {
-       xmlpp::Node* asset = ReelAsset::write_to_cpl (node, standard);
+       xmlpp::Node* asset = write_to_cpl_base (node, standard, hash());
 
        if (key_id ()) {
                /* Find <Hash> */
@@ -86,3 +86,16 @@ ReelSubtitleAsset::write_to_cpl (xmlpp::Node* node, Standard standard) const
 
        return asset;
 }
+
+bool
+ReelSubtitleAsset::equals (shared_ptr<const ReelSubtitleAsset> other, EqualityOptions opt, NoteHandler note) const
+{
+       if (!asset_equals (other, opt, note)) {
+               return false;
+       }
+       if (!mxf_equals (other, opt, note)) {
+               return false;
+       }
+
+       return true;
+}
index 8e0edc49567c59d56c93fb77935ce4f31eac7b2e..4cc03cf1a7d2ffcc0fee741a267d94a0b3cdddbf 100644 (file)
@@ -56,6 +56,7 @@ public:
        explicit ReelSubtitleAsset (boost::shared_ptr<const cxml::Node>);
 
        xmlpp::Node* write_to_cpl (xmlpp::Node* node, Standard standard) const;
+       bool equals (boost::shared_ptr<const ReelSubtitleAsset>, EqualityOptions, NoteHandler) const;
 
        boost::shared_ptr<SubtitleAsset> asset () const {
                return asset_of_type<SubtitleAsset> ();
index 4a6568743597f2fc49452c57fcefd3ef2c850da4..9ab9b15031209cd431e97b451942dd2f7ebf5396 100644 (file)
@@ -61,19 +61,19 @@ enum Result {
 };
 
 static Result
-verify_asset (shared_ptr<DCP> dcp, shared_ptr<ReelAsset> reel_asset, function<void (float)> progress)
+verify_asset (shared_ptr<DCP> dcp, shared_ptr<ReelMXF> reel_mxf, function<void (float)> progress)
 {
-       string const actual_hash = reel_asset->asset_ref()->hash(progress);
+       string const actual_hash = reel_mxf->asset_ref()->hash(progress);
 
        list<shared_ptr<PKL> > pkls = dcp->pkls();
        /* We've read this DCP in so it must have at least one PKL */
        DCP_ASSERT (!pkls.empty());
 
-       shared_ptr<Asset> asset = reel_asset->asset_ref().asset();
+       shared_ptr<Asset> asset = reel_mxf->asset_ref().asset();
 
        optional<string> pkl_hash;
        BOOST_FOREACH (shared_ptr<PKL> i, pkls) {
-               pkl_hash = i->hash (reel_asset->asset_ref()->id());
+               pkl_hash = i->hash (reel_mxf->asset_ref()->id());
                if (pkl_hash) {
                        break;
                }
@@ -81,7 +81,7 @@ verify_asset (shared_ptr<DCP> dcp, shared_ptr<ReelAsset> reel_asset, function<vo
 
        DCP_ASSERT (pkl_hash);
 
-       optional<string> cpl_hash = reel_asset->hash();
+       optional<string> cpl_hash = reel_mxf->hash();
        if (cpl_hash && *cpl_hash != *pkl_hash) {
                return RESULT_CPL_PKL_DIFFER;
        }