Missing finalize() in dcpdecryptmxf.
[libdcp.git] / src / combine.cc
index 65cd3d0b6453afc628b0176c36f1decfdad2e3c4..e974c4074ab8ef778e89e7bf1545b37358ab0bce 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
 */
 
 
+/** @file  src/combine.cc
+ *  @brief Method to combine DCPs
+ */
+
+
 #include "asset.h"
 #include "combine.h"
 #include "cpl.h"
 #include "interop_subtitle_asset.h"
 #include "raw_convert.h"
 #include <boost/filesystem.hpp>
-#include <boost/foreach.hpp>
 #include <set>
 #include <string>
 #include <vector>
 
 
-using std::list;
 using std::map;
 using std::set;
 using std::string;
 using std::vector;
-using boost::dynamic_pointer_cast;
+using std::dynamic_pointer_cast;
 using boost::optional;
-using boost::shared_ptr;
+using std::shared_ptr;
 
 
 boost::filesystem::path
@@ -111,7 +114,7 @@ dcp::combine (
        DCP output_dcp (output);
        optional<dcp::Standard> standard;
 
-       BOOST_FOREACH (path i, inputs) {
+       for (auto i: inputs) {
                DCP dcp (i);
                dcp.read ();
                if (!standard) {
@@ -121,47 +124,37 @@ dcp::combine (
                }
        }
 
-       list<path> paths;
-       list<shared_ptr<dcp::Asset> > assets;
+       vector<path> paths;
+       vector<shared_ptr<dcp::Asset>> assets;
 
-       BOOST_FOREACH (path i, inputs) {
+       for (auto i: inputs) {
                DCP dcp (i);
                dcp.read ();
 
-               BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) {
+               for (auto j: dcp.cpls()) {
                        output_dcp.add (j);
                }
 
-               BOOST_FOREACH (shared_ptr<dcp::Asset> j, dcp.assets(true)) {
+               for (auto j: dcp.assets(true)) {
                        if (dynamic_pointer_cast<dcp::CPL>(j)) {
                                continue;
                        }
 
-                       optional<path> file = j->file();
-                       DCP_ASSERT (file);
-                       path new_path = make_unique(output / file->filename());
-
-                       shared_ptr<dcp::InteropSubtitleAsset> sub = dynamic_pointer_cast<dcp::InteropSubtitleAsset>(j);
+                       auto sub = dynamic_pointer_cast<dcp::InteropSubtitleAsset>(j);
                        if (sub) {
                                /* Interop fonts are really fiddly.  The font files are assets (in the ASSETMAP)
                                 * and also linked from the font XML by filename.  We have to fix both these things,
                                 * and re-write the font XML file since the font URI might have changed if it's a duplicate
                                 * with another DCP.
                                 */
-                               map<string, path> fonts = sub->font_filenames ();
-                               for (map<string, path>::const_iterator k = fonts.begin(); k != fonts.end(); ++k) {
-                                       sub->set_font_file (k->first, make_unique(output / k->second.filename()));
+                               auto fonts = sub->font_filenames ();
+                               for (auto const& k: fonts) {
+                                       sub->set_font_file (k.first, make_unique(output / k.second.filename()));
                                }
-                               sub->write (new_path);
-                       } else if (!dynamic_pointer_cast<dcp::FontAsset>(j)) {
-                               /* Take care of everything else that's not a Interop subtitle asset, Interop font file
-                                * or CPL.
-                                */
-                               optional<path> file = j->file();
+                               auto file = sub->file();
                                DCP_ASSERT (file);
                                path new_path = make_unique(output / file->filename());
-                               create_hard_link_or_copy (*file, new_path);
-                               j->set_file (new_path);
+                               sub->write (new_path);
                        }
 
                        assets.push_back (j);
@@ -169,5 +162,16 @@ dcp::combine (
        }
 
        output_dcp.resolve_refs (assets);
-       output_dcp.write_xml (*standard, issuer, creator, issue_date, annotation_text, signer);
+
+       for (auto i: output_dcp.assets()) {
+               if (!dynamic_pointer_cast<dcp::FontAsset>(i) && !dynamic_pointer_cast<dcp::CPL>(i)) {
+                       auto file = i->file();
+                       DCP_ASSERT (file);
+                       path new_path = make_unique(output / file->filename());
+                       create_hard_link_or_copy (*file, new_path);
+                       i->set_file (new_path);
+               }
+       }
+
+       output_dcp.write_xml (issuer, creator, issue_date, annotation_text, signer);
 }