Apply the same rules to closed captions.
[libdcp.git] / src / dcp.cc
index 2929b5d85bf81d45c2cdec4e92c10d6a60446e83..381adde4546d2622804185b35cee6e8ef35ebf49 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
@@ -117,7 +117,7 @@ DCP::read (list<dcp::VerificationNote>* notes, bool ignore_incorrect_picture_mxf
        } else if (boost::filesystem::exists (_directory / "ASSETMAP.xml")) {
                _asset_map = _directory / "ASSETMAP.xml";
        } else {
-               boost::throw_exception (ReadError (String::compose ("could not find ASSETMAP nor ASSETMAP.xml in `%1'", _directory.string())));
+               boost::throw_exception (ReadError(String::compose("Could not find ASSETMAP nor ASSETMAP.xml in '%1'", _directory.string())));
        }
 
        cxml::Document asset_map ("AssetMap");
@@ -213,7 +213,12 @@ DCP::read (list<dcp::VerificationNote>* notes, bool ignore_incorrect_picture_mxf
                        }
                }
 
-               DCP_ASSERT (pkl_type);
+               if (!pkl_type) {
+                       /* This asset is in the ASSETMAP but not mentioned in any PKL so we don't
+                        * need to worry about it.
+                        */
+                       continue;
+               }
 
                if (*pkl_type == CPL::static_pkl_type(*_standard) || *pkl_type == InteropSubtitleAsset::static_pkl_type(*_standard)) {
                        xmlpp::DomParser* p = new xmlpp::DomParser;
@@ -234,7 +239,7 @@ DCP::read (list<dcp::VerificationNote>* notes, bool ignore_incorrect_picture_mxf
                                }
                                _cpls.push_back (cpl);
                        } else if (root == "DCSubtitle") {
-                               if (_standard && _standard.get() == SMPTE) {
+                               if (_standard && _standard.get() == SMPTE && notes) {
                                        notes->push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::MISMATCHED_STANDARD));
                                }
                                other_assets.push_back (shared_ptr<InteropSubtitleAsset> (new InteropSubtitleAsset (path)));
@@ -263,7 +268,7 @@ DCP::read (list<dcp::VerificationNote>* notes, bool ignore_incorrect_picture_mxf
                BOOST_FOREACH (shared_ptr<CPL> i, cpls()) {
                        BOOST_FOREACH (shared_ptr<const ReelMXF> j, i->reel_mxfs()) {
                                if (!j->asset_ref().resolved() && paths.find(j->asset_ref().id()) == paths.end()) {
-                                       notes->push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::EXTERNAL_ASSET));
+                                       notes->push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::EXTERNAL_ASSET, j->asset_ref().id()));
                                }
                        }
                }
@@ -378,7 +383,10 @@ DCP::write_volindex (Standard standard) const
 }
 
 void
-DCP::write_assetmap (Standard standard, string pkl_uuid, boost::filesystem::path pkl_path, XMLMetadata metadata) const
+DCP::write_assetmap (
+       Standard standard, string pkl_uuid, boost::filesystem::path pkl_path,
+       string issuer, string creator, string issue_date, string annotation_text
+       ) const
 {
        boost::filesystem::path p = _directory;
 
@@ -408,20 +416,20 @@ DCP::write_assetmap (Standard standard, string pkl_uuid, boost::filesystem::path
        }
 
        root->add_child("Id")->add_child_text ("urn:uuid:" + make_uuid());
-       root->add_child("AnnotationText")->add_child_text (metadata.annotation_text);
+       root->add_child("AnnotationText")->add_child_text (annotation_text);
 
        switch (standard) {
        case INTEROP:
                root->add_child("VolumeCount")->add_child_text ("1");
-               root->add_child("IssueDate")->add_child_text (metadata.issue_date);
-               root->add_child("Issuer")->add_child_text (metadata.issuer);
-               root->add_child("Creator")->add_child_text (metadata.creator);
+               root->add_child("IssueDate")->add_child_text (issue_date);
+               root->add_child("Issuer")->add_child_text (issuer);
+               root->add_child("Creator")->add_child_text (creator);
                break;
        case SMPTE:
-               root->add_child("Creator")->add_child_text (metadata.creator);
+               root->add_child("Creator")->add_child_text (creator);
                root->add_child("VolumeCount")->add_child_text ("1");
-               root->add_child("IssueDate")->add_child_text (metadata.issue_date);
-               root->add_child("Issuer")->add_child_text (metadata.issuer);
+               root->add_child("IssueDate")->add_child_text (issue_date);
+               root->add_child("Issuer")->add_child_text (issuer);
                break;
        default:
                DCP_ASSERT (false);
@@ -455,7 +463,10 @@ DCP::write_assetmap (Standard standard, string pkl_uuid, boost::filesystem::path
 void
 DCP::write_xml (
        Standard standard,
-       XMLMetadata metadata,
+       string issuer,
+       string creator,
+       string issue_date,
+       string annotation_text,
        shared_ptr<const CertificateChain> signer,
        NameFormat name_format
        )
@@ -469,7 +480,7 @@ DCP::write_xml (
        shared_ptr<PKL> pkl;
 
        if (_pkls.empty()) {
-               pkl.reset (new PKL (standard, metadata.annotation_text, metadata.issue_date, metadata.issuer, metadata.creator));
+               pkl.reset (new PKL(standard, annotation_text, issue_date, issuer, creator));
                _pkls.push_back (pkl);
                BOOST_FOREACH (shared_ptr<Asset> i, assets ()) {
                        i->add_to_pkl (pkl, _directory);
@@ -484,7 +495,7 @@ DCP::write_xml (
        pkl->write (pkl_path, signer);
 
        write_volindex (standard);
-       write_assetmap (standard, pkl->id(), pkl_path, metadata);
+       write_assetmap (standard, pkl->id(), pkl_path, issuer, creator, issue_date, annotation_text);
 }
 
 list<shared_ptr<CPL> >
@@ -507,12 +518,23 @@ DCP::assets (bool ignore_unresolved) const
                        if (ignore_unresolved && !j->asset_ref().resolved()) {
                                continue;
                        }
-                       shared_ptr<Asset> o = j->asset_ref().asset ();
-                       assets.push_back (o);
-                       /* More Interop special-casing */
-                       shared_ptr<InteropSubtitleAsset> sub = dynamic_pointer_cast<InteropSubtitleAsset> (o);
-                       if (sub) {
-                               sub->add_font_assets (assets);
+
+                       string const id = j->asset_ref().id();
+                       bool already_got = false;
+                       BOOST_FOREACH (shared_ptr<Asset> k, assets) {
+                               if (k->id() == id) {
+                                       already_got = true;
+                               }
+                       }
+
+                       if (!already_got) {
+                               shared_ptr<Asset> o = j->asset_ref().asset();
+                               assets.push_back (o);
+                               /* More Interop special-casing */
+                               shared_ptr<InteropSubtitleAsset> sub = dynamic_pointer_cast<InteropSubtitleAsset> (o);
+                               if (sub) {
+                                       sub->add_font_assets (assets);
+                               }
                        }
                }
        }