From 0a8f009ceb86417704b2e2d2bb377c850d9e042e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 28 Aug 2020 00:05:46 +0200 Subject: [PATCH] Use a vector instead of just one, to support the new metadata. --- src/cpl.cc | 42 +++++++++++++++++++++++++++++-------- src/cpl.h | 15 ++++++++----- test/write_subtitle_test.cc | 2 +- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/cpl.cc b/src/cpl.cc index ac442333..6c5610d8 100644 --- a/src/cpl.cc +++ b/src/cpl.cc @@ -54,6 +54,7 @@ using std::list; using std::pair; using std::make_pair; using std::cout; +using std::vector; using boost::shared_ptr; using boost::optional; using boost::dynamic_pointer_cast; @@ -71,12 +72,9 @@ CPL::CPL (string annotation_text, ContentKind content_kind) , _content_title_text (annotation_text) , _content_kind (content_kind) { - /* default _content_version_id to a random ID and _content_version_label to - a random ID and the current time. - */ - string const uuid = make_uuid(); - _content_version.id = "urn:uuid:" + uuid; - _content_version.label_text = uuid + LocalTime().as_string (); + ContentVersion cv; + cv.label_text = cv.id + LocalTime().as_string(); + _content_versions.push_back (cv); } /** Construct a CPL object from a XML file */ @@ -104,8 +102,13 @@ CPL::CPL (boost::filesystem::path file) _content_kind = content_kind_from_string (f.string_child ("ContentKind")); shared_ptr content_version = f.optional_node_child ("ContentVersion"); if (content_version) { - _content_version.id = content_version->optional_string_child("Id").get_value_or(""); - _content_version.label_text = content_version->string_child("LabelText"); + /* XXX: SMPTE should insist that Id is present */ + _content_versions.push_back ( + ContentVersion ( + content_version->optional_string_child("Id").get_value_or(""), + content_version->string_child("LabelText") + ) + ); content_version->done (); } else if (_standard == SMPTE) { /* ContentVersion is required in SMPTE */ @@ -158,7 +161,8 @@ CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptradd_child("Creator")->add_child_text (_creator); root->add_child("ContentTitleText")->add_child_text (_content_title_text); root->add_child("ContentKind")->add_child_text (content_kind_to_string (_content_kind)); - _content_version.as_xml (root); + DCP_ASSERT (!_content_versions.empty()); + _content_versions[0].as_xml (root); xmlpp::Element* rating_list = root->add_child("RatingList"); BOOST_FOREACH (Rating i, _ratings) { @@ -333,3 +337,23 @@ CPL::duration () const } return d; } +void +CPL::set_content_versions (vector v) +{ + set ids; + BOOST_FOREACH (ContentVersion i, v) { + if (!ids.insert(i.id).second) { + throw DuplicateIdError ("Duplicate ID in ContentVersion list"); + } + } + + _content_versions = v; +} + + +ContentVersion +CPL::content_version () const +{ + DCP_ASSERT (!_content_versions.empty()); + return _content_versions[0]; +} diff --git a/src/cpl.h b/src/cpl.h index b7055e5d..ba1e8196 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -50,6 +50,7 @@ #include #include #include +#include namespace dcp { @@ -138,15 +139,19 @@ public: return _content_kind; } - ContentVersion content_version () const { - return _content_version; + ContentVersion content_version () const; + + std::vector content_versions () const { + return _content_versions; } - /** Set the contents of the ContentVersion tag */ void set_content_version (ContentVersion v) { - _content_version = v; + _content_versions.clear (); + _content_versions.push_back (v); } + void set_content_versions (std::vector v); + std::list ratings () const { return _ratings; } @@ -172,8 +177,8 @@ private: std::string _annotation_text; std::string _content_title_text; ///< <ContentTitleText> ContentKind _content_kind; ///< <ContentKind> - ContentVersion _content_version; ///< <ContentVersion> std::list _ratings; + std::vector _content_versions; std::list > _reels; diff --git a/test/write_subtitle_test.cc b/test/write_subtitle_test.cc index 0a6e6a82..b7d8119a 100644 --- a/test/write_subtitle_test.cc +++ b/test/write_subtitle_test.cc @@ -372,7 +372,7 @@ BOOST_AUTO_TEST_CASE (write_interop_subtitle_test3) cpl->set_creator (creator); cpl->set_issue_date (issue_date); cpl->set_annotation_text (annotation_text); - dcp::ContentVersion cv = cpl->content_version (); + dcp::ContentVersion cv = cpl->content_version(); cv.label_text = "foo"; cpl->set_content_version (cv); -- 2.30.2