Fixes for new libdcp with multiple content versions.
[dcpomatic.git] / src / lib / dcp_content.cc
index 0ce4945411c3a5e5d0128df437d2dea86d8f2278..0bef73f77d48cf1ce2e40b217af5bd206db07d28 100644 (file)
@@ -158,7 +158,9 @@ DCPContent::DCPContent (cxml::ConstNodePtr node, int version)
                _ratings.push_back (dcp::Rating(i));
        }
 
-       _content_version = node->optional_string_child("ContentVersion").get_value_or("");
+       BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children("ContentVersion")) {
+               _content_versions.push_back (i->content());
+       }
 }
 
 void
@@ -236,8 +238,15 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
        }
 
        if (examiner->has_atmos()) {
-               boost::mutex::scoped_lock lm (_mutex);
-               atmos.reset (new AtmosContent(this));
+               {
+                       boost::mutex::scoped_lock lm (_mutex);
+                       atmos.reset (new AtmosContent(this));
+               }
+               /* Setting length will cause calculations to be made based on edit rate, so that must
+                * be set up first otherwise hard-to-spot exceptions will be thrown.
+                */
+               atmos->set_edit_rate (examiner->atmos_edit_rate());
+               atmos->set_length (examiner->atmos_length());
        }
 
        int texts = 0;
@@ -246,7 +255,11 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                _name = examiner->name ();
                for (int i = 0; i < TEXT_COUNT; ++i) {
                        for (int j = 0; j < examiner->text_count(static_cast<TextType>(i)); ++j) {
-                               text.push_back (shared_ptr<TextContent>(new TextContent(this, static_cast<TextType>(i), static_cast<TextType>(i))));
+                               shared_ptr<TextContent> c(new TextContent(this, static_cast<TextType>(i), static_cast<TextType>(i)));
+                               if (i == TEXT_CLOSED_CAPTION) {
+                                       c->set_dcp_track (examiner->dcp_text_track(j));
+                               }
+                               text.push_back (c);
                        }
                }
                texts = text.size ();
@@ -263,7 +276,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                        _markers[i->first] = ContentTime(i->second.as_editable_units(DCPTime::HZ));
                }
                _ratings = examiner->ratings ();
-               _content_version = examiner->content_version ();
+               _content_versions = examiner->content_versions ();
        }
 
        if (old_texts == texts) {
@@ -379,7 +392,9 @@ DCPContent::as_xml (xmlpp::Node* node, bool with_paths) const
                i.as_xml (rating);
        }
 
-       node->add_child("ContentVersion")->add_child_text (_content_version);
+       BOOST_FOREACH (string i, _content_versions) {
+               node->add_child("ContentVersion")->add_child_text(i);
+       }
 }
 
 DCPTime