Bv2.1 8.5: FFOC and LFOC should be present and have particular values.
authorCarl Hetherington <cth@carlh.net>
Sun, 17 Jan 2021 23:27:34 +0000 (00:27 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 17 Jan 2021 23:27:34 +0000 (00:27 +0100)
16 files changed:
src/verify.cc
src/verify.h
test/combine_test.cc
test/dcp_test.cc
test/markers_test.cc
test/ref/DCP/dcp_test1/ASSETMAP.xml
test/ref/DCP/dcp_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml
test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml [new file with mode: 0644]
test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml [deleted file]
test/ref/DCP/dcp_test7/ASSETMAP
test/ref/DCP/dcp_test7/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml
test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml [new file with mode: 0644]
test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml [deleted file]
test/test.cc
test/test.h
test/verify_test.cc

index aa296fec57e7078610081d28622b8d976ca31c52..1cea1a0c40ca0a6d1b387210acae5f52c5ba78dc 100644 (file)
@@ -79,6 +79,7 @@ using std::string;
 using std::cout;
 using std::map;
 using std::max;
+using std::set;
 using std::shared_ptr;
 using std::make_shared;
 using boost::optional;
@@ -1084,10 +1085,7 @@ dcp::verify (
                        size_t fewest_closed_captions = SIZE_MAX;
                        /* most number of closed caption assets seen in a reel */
                        size_t most_closed_captions = 0;
-                       /* true if we've seen a FFEC marker */
-                       auto have_ffec = false;
-                       /* true if we've seen a FFMC marker */
-                       auto have_ffmc = false;
+                       map<Marker, Time> markers_seen;
 
                        for (auto reel: cpl->reels()) {
                                stage ("Checking reel", optional<boost::filesystem::path>());
@@ -1158,11 +1156,8 @@ dcp::verify (
                                }
 
                                if (reel->main_markers()) {
-                                       if (reel->main_markers()->get(Marker::FFEC)) {
-                                               have_ffec = true;
-                                       }
-                                       if (reel->main_markers()->get(Marker::FFMC)) {
-                                               have_ffmc = true;
+                                       for (auto const& i: reel->main_markers()->get()) {
+                                               markers_seen.insert (i);
                                        }
                                }
 
@@ -1181,14 +1176,28 @@ dcp::verify (
                                }
 
                                if (cpl->content_kind() == FEATURE) {
-                                       if (!have_ffec) {
+                                       if (markers_seen.find(dcp::Marker::FFEC) == markers_seen.end()) {
                                                notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_FFEC_IN_FEATURE});
                                        }
-                                       if (!have_ffmc) {
+                                       if (markers_seen.find(dcp::Marker::FFMC) == markers_seen.end()) {
                                                notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_FFMC_IN_FEATURE});
                                        }
                                }
 
+                               auto ffoc = markers_seen.find(dcp::Marker::FFOC);
+                               if (ffoc == markers_seen.end()) {
+                                       notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_FFOC});
+                               } else if (ffoc->second.e != 1) {
+                                       notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_FFOC});
+                               }
+
+                               auto lfoc = markers_seen.find(dcp::Marker::LFOC);
+                               if (lfoc == markers_seen.end()) {
+                                       notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_LFOC});
+                               } else if (lfoc->second.as_editable_units(lfoc->second.tcr) != (cpl->reels().back()->duration() - 1)) {
+                                       notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_LFOC});
+                               }
+
                                check_text_timing (cpl->reels(), notes);
 
                                LinesCharactersResult result;
@@ -1347,6 +1356,14 @@ dcp::note_to_string (dcp::VerificationNote note)
                return "The DCP is marked as a Feature but there is no FFEC (first frame of end credits) marker";
        case dcp::VerificationNote::MISSING_FFMC_IN_FEATURE:
                return "The DCP is marked as a Feature but there is no FFMC (first frame of moving credits) marker";
+       case dcp::VerificationNote::MISSING_FFOC:
+               return "There should be a FFOC (first frame of content) marker";
+       case dcp::VerificationNote::MISSING_LFOC:
+               return "There should be a LFOC (last frame of content) marker";
+       case dcp::VerificationNote::INCORRECT_FFOC:
+               return "The FFOC marker should bet set to 1";
+       case dcp::VerificationNote::INCORRECT_LFOC:
+               return "The LFOC marker should be set to 1 less than the duration of the last reel";
        }
 
        return "";
index 5fb46a1bdf8263f69b34eda61df52b3e994c9e05..05a494172b65c1383132a5ec66cdbb78455901c4 100644 (file)
@@ -157,6 +157,14 @@ public:
                MISSING_FFEC_IN_FEATURE,
                /** If ContentKind is Feature there must be a FFMC marker */
                MISSING_FFMC_IN_FEATURE,
+               /** There should be a FFOC */
+               MISSING_FFOC,
+               /** There should be a LFOC */
+               MISSING_LFOC,
+               /** The FFOC should be 1 */
+               INCORRECT_FFOC,
+               /** The LFOC should be the last frame in the reel */
+               INCORRECT_LFOC,
        };
 
        VerificationNote (Type type, Code code)
index 54e908d40b2f83aeba54ee178ea1d9cb821e7447..92949cf26ca867f15a4999e6f92cb6e36222a5e4 100644 (file)
@@ -42,6 +42,7 @@
 #include "test.h"
 #include "types.h"
 #include "verify.h"
+#include "reel_markers_asset.h"
 #include <boost/algorithm/string.hpp>
 #include <boost/foreach.hpp>
 #include <boost/optional.hpp>
 
 using std::list;
 using std::string;
+using std::make_shared;
 using std::vector;
-using boost::optional;
 using std::shared_ptr;
+using boost::optional;
 
 
 static void
@@ -319,7 +321,9 @@ BOOST_AUTO_TEST_CASE (combine_two_dcps_with_shared_asset)
 
        shared_ptr<dcp::ReelMonoPictureAsset> pic(new dcp::ReelMonoPictureAsset(simple_picture("build/test/combine_input2", ""), 0));
        shared_ptr<dcp::ReelSoundAsset> sound(new dcp::ReelSoundAsset(first->cpls().front()->reels().front()->main_sound()->asset(), 0));
-       cpl->add (shared_ptr<dcp::Reel>(new dcp::Reel(pic, sound)));
+       auto reel = make_shared<dcp::Reel>(pic, sound);
+       reel->add (simple_markers());
+       cpl->add (reel);
        second->add (cpl);
        second->write_xml (dcp::SMPTE);
 
index b22202ea1827c5b1c602c06e9cc0c9c9ef62bf40..dc24483eaa7ce0921a67b3862068a4ec649ad78e 100644 (file)
@@ -227,6 +227,7 @@ test_rewriting_sound(string name, bool modify)
        writer->finalize();
 
        reel->add(make_shared<dcp::ReelSoundAsset>(sound, 0));
+       reel->add(simple_markers());
 
        auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::TRAILER);
        cpl->add (reel);
index e7cb3a5ded3efb5ae196f5535ca3d5fab70c5307..07ba5a801bd1993c6a789556e6c3c38f0b3015f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2019-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of libdcp.
 
 
 using std::string;
 using std::shared_ptr;
+using std::make_shared;
 
 BOOST_AUTO_TEST_CASE (markers_write_test)
 {
        dcp::CPL cpl("Markers test", dcp::TEST);
 
-       shared_ptr<dcp::ReelMarkersAsset> asset (new dcp::ReelMarkersAsset(dcp::Fraction(24, 1), 0));
+       auto asset = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 432000, 0);
        asset->set (dcp::Marker::FFOC, dcp::Time(1, 1, 9, 16, 24));
        asset->set (dcp::Marker::LFOC, dcp::Time(2, 5, 3, 0, 24));
        asset->set (dcp::Marker::FFTC, dcp::Time(0, 6, 4, 2, 24));
@@ -103,6 +104,6 @@ BOOST_AUTO_TEST_CASE (markers_read_test, * boost::unit_test::depends_on("markers
 
        BOOST_CHECK (markers->equals(markers, dcp::EqualityOptions(), boost::bind(&note_handler, _1, _2)));
 
-       shared_ptr<dcp::ReelMarkersAsset> markers2 (new dcp::ReelMarkersAsset(dcp::Fraction(24, 1), 0));
+       auto markers2 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 432000, 0);
        BOOST_CHECK (!markers->equals(markers2, dcp::EqualityOptions(), boost::bind(&note_handler, _1, _2)));
 }
index 5879f0335fbc45aedab3f0e86df1c0b74f6732f1..fcb38592f6899288184eea40bbdfe429daef5250 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <AssetMap xmlns="http://www.smpte-ra.org/schemas/429-9/2007/AM">
-  <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
+  <Id>urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95</Id>
   <AnnotationText>Created by libdcp</AnnotationText>
   <Creator>OpenDCP 0.0.25</Creator>
   <VolumeCount>1</VolumeCount>
@@ -8,11 +8,11 @@
   <Issuer>OpenDCP 0.0.25</Issuer>
   <AssetList>
     <Asset>
-      <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
+      <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
       <PackingList>true</PackingList>
       <ChunkList>
         <Chunk>
-          <Path>pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml</Path>
+          <Path>pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml</Path>
           <VolumeIndex>1</VolumeIndex>
           <Offset>0</Offset>
           <Length>1186</Length>
@@ -26,7 +26,7 @@
           <Path>cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml</Path>
           <VolumeIndex>1</VolumeIndex>
           <Offset>0</Offset>
-          <Length>1589</Length>
+          <Length>2170</Length>
         </Chunk>
       </ChunkList>
     </Asset>
index 256c3a394a851f59172a3a8e2678cd0dcc3bdddb..9f626dd60daf982d2de4d0e791af62836d824824 100644 (file)
     <Reel>
       <Id>urn:uuid:48db27c3-4964-46a2-8b02-3e5570efb42d</Id>
       <AssetList>
+        <MainMarkers>
+          <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
+          <AnnotationText></AnnotationText>
+          <EditRate>24 1</EditRate>
+          <IntrinsicDuration>24</IntrinsicDuration>
+          <EntryPoint>0</EntryPoint>
+          <Duration>24</Duration>
+          <MarkerList>
+            <Marker>
+              <Label>FFOC</Label>
+              <Offset>1</Offset>
+            </Marker>
+            <Marker>
+              <Label>LFOC</Label>
+              <Offset>23</Offset>
+            </Marker>
+          </MarkerList>
+        </MainMarkers>
         <MainPicture>
           <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
           <AnnotationText></AnnotationText>
diff --git a/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml b/test/ref/DCP/dcp_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml
new file mode 100644 (file)
index 0000000..1280ed9
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
+  <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
+  <AnnotationText>Created by libdcp</AnnotationText>
+  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
+  <Issuer>OpenDCP 0.0.25</Issuer>
+  <Creator>OpenDCP 0.0.25</Creator>
+  <AssetList>
+    <Asset>
+      <Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b</Id>
+      <AnnotationText>81fb54df-e1bf-4647-8788-ea7ba154375b</AnnotationText>
+      <Hash>jWh8hMgamta5Q9sW88wHfI7TS/I=</Hash>
+      <Size>2170</Size>
+      <Type>text/xml</Type>
+    </Asset>
+    <Asset>
+      <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
+      <AnnotationText>1fab8bb0-cfaf-4225-ad6d-01768bc10470</AnnotationText>
+      <Hash>XGhFVrqZqapOJx5Fh2SLjj48Yjg=</Hash>
+      <Size>40144</Size>
+      <Type>application/mxf</Type>
+    </Asset>
+    <Asset>
+      <Id>urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9</Id>
+      <AnnotationText>9482e87d-292d-4e0e-a98d-c61822b60fe9</AnnotationText>
+      <Hash>cb1OLhgHG9svy7G8hoTSPpltzhw=</Hash>
+      <Size>161326</Size>
+      <Type>application/mxf</Type>
+    </Asset>
+  </AssetList>
+</PackingList>
diff --git a/test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml b/test/ref/DCP/dcp_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml
deleted file mode 100644 (file)
index 9338645..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<PackingList xmlns="http://www.smpte-ra.org/schemas/429-8/2007/PKL">
-  <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
-  <AnnotationText>Created by libdcp</AnnotationText>
-  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
-  <Issuer>OpenDCP 0.0.25</Issuer>
-  <Creator>OpenDCP 0.0.25</Creator>
-  <AssetList>
-    <Asset>
-      <Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b</Id>
-      <AnnotationText>81fb54df-e1bf-4647-8788-ea7ba154375b</AnnotationText>
-      <Hash>QqphASVaO8SqRvmlJ0acJP6c0GE=</Hash>
-      <Size>1589</Size>
-      <Type>text/xml</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
-      <AnnotationText>1fab8bb0-cfaf-4225-ad6d-01768bc10470</AnnotationText>
-      <Hash>XGhFVrqZqapOJx5Fh2SLjj48Yjg=</Hash>
-      <Size>40144</Size>
-      <Type>application/mxf</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9</Id>
-      <AnnotationText>9482e87d-292d-4e0e-a98d-c61822b60fe9</AnnotationText>
-      <Hash>cb1OLhgHG9svy7G8hoTSPpltzhw=</Hash>
-      <Size>161326</Size>
-      <Type>application/mxf</Type>
-    </Asset>
-  </AssetList>
-</PackingList>
index 2558a5a4838366c01ef4fd2761ab029583485ef3..85222f75422a45a26a9dbecaa81a32c9bddc3e37 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <AssetMap xmlns="http://www.digicine.com/PROTO-ASDCP-AM-20040311#">
-  <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
+  <Id>urn:uuid:2b9b857f-ab4a-440e-a313-1ace0f1cfc95</Id>
   <AnnotationText>Created by libdcp</AnnotationText>
   <VolumeCount>1</VolumeCount>
   <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
@@ -8,11 +8,11 @@
   <Creator>OpenDCP 0.0.25</Creator>
   <AssetList>
     <Asset>
-      <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
+      <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
       <PackingList>true</PackingList>
       <ChunkList>
         <Chunk>
-          <Path>pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml</Path>
+          <Path>pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml</Path>
           <VolumeIndex>1</VolumeIndex>
           <Offset>0</Offset>
           <Length>1253</Length>
@@ -26,7 +26,7 @@
           <Path>cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml</Path>
           <VolumeIndex>1</VolumeIndex>
           <Offset>0</Offset>
-          <Length>1587</Length>
+          <Length>2168</Length>
         </Chunk>
       </ChunkList>
     </Asset>
index 9e307a2f0188066d7004353b0d1cd9c7074a03b0..f78c3711022490ed1a6a4a24c8d9b137d8d72bbd 100644 (file)
     <Reel>
       <Id>urn:uuid:48db27c3-4964-46a2-8b02-3e5570efb42d</Id>
       <AssetList>
+        <MainMarkers>
+          <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
+          <AnnotationText></AnnotationText>
+          <EditRate>24 1</EditRate>
+          <IntrinsicDuration>24</IntrinsicDuration>
+          <EntryPoint>0</EntryPoint>
+          <Duration>24</Duration>
+          <MarkerList>
+            <Marker>
+              <Label>FFOC</Label>
+              <Offset>1</Offset>
+            </Marker>
+            <Marker>
+              <Label>LFOC</Label>
+              <Offset>23</Offset>
+            </Marker>
+          </MarkerList>
+        </MainMarkers>
         <MainPicture>
           <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
           <AnnotationText></AnnotationText>
diff --git a/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml b/test/ref/DCP/dcp_test7/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml
new file mode 100644 (file)
index 0000000..ca2c865
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PackingList xmlns="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#">
+  <Id>urn:uuid:63c3aece-c581-4603-b612-75e43f0c0430</Id>
+  <AnnotationText>Created by libdcp</AnnotationText>
+  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
+  <Issuer>OpenDCP 0.0.25</Issuer>
+  <Creator>OpenDCP 0.0.25</Creator>
+  <AssetList>
+    <Asset>
+      <Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b</Id>
+      <AnnotationText>81fb54df-e1bf-4647-8788-ea7ba154375b</AnnotationText>
+      <Hash>tc+MzIDj0cjUXzAGaE5mmse4DVM=</Hash>
+      <Size>2168</Size>
+      <Type>text/xml;asdcpKind=CPL</Type>
+    </Asset>
+    <Asset>
+      <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
+      <AnnotationText>1fab8bb0-cfaf-4225-ad6d-01768bc10470</AnnotationText>
+      <Hash>XGhFVrqZqapOJx5Fh2SLjj48Yjg=</Hash>
+      <Size>40144</Size>
+      <Type>application/x-smpte-mxf;asdcpKind=Picture</Type>
+    </Asset>
+    <Asset>
+      <Id>urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9</Id>
+      <AnnotationText>9482e87d-292d-4e0e-a98d-c61822b60fe9</AnnotationText>
+      <Hash>cb1OLhgHG9svy7G8hoTSPpltzhw=</Hash>
+      <Size>161326</Size>
+      <Type>application/x-smpte-mxf;asdcpKind=Sound</Type>
+    </Asset>
+  </AssetList>
+</PackingList>
diff --git a/test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml b/test/ref/DCP/dcp_test7/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml
deleted file mode 100644 (file)
index fdb0c16..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<PackingList xmlns="http://www.digicine.com/PROTO-ASDCP-PKL-20040311#">
-  <Id>urn:uuid:cd49971e-bf4c-4594-8474-54ebef09a40c</Id>
-  <AnnotationText>Created by libdcp</AnnotationText>
-  <IssueDate>2012-07-17T04:45:18+00:00</IssueDate>
-  <Issuer>OpenDCP 0.0.25</Issuer>
-  <Creator>OpenDCP 0.0.25</Creator>
-  <AssetList>
-    <Asset>
-      <Id>urn:uuid:81fb54df-e1bf-4647-8788-ea7ba154375b</Id>
-      <AnnotationText>81fb54df-e1bf-4647-8788-ea7ba154375b</AnnotationText>
-      <Hash>WSXYtHMlxzMuhrEmXrRctm9Ij04=</Hash>
-      <Size>1587</Size>
-      <Type>text/xml;asdcpKind=CPL</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:1fab8bb0-cfaf-4225-ad6d-01768bc10470</Id>
-      <AnnotationText>1fab8bb0-cfaf-4225-ad6d-01768bc10470</AnnotationText>
-      <Hash>XGhFVrqZqapOJx5Fh2SLjj48Yjg=</Hash>
-      <Size>40144</Size>
-      <Type>application/x-smpte-mxf;asdcpKind=Picture</Type>
-    </Asset>
-    <Asset>
-      <Id>urn:uuid:9482e87d-292d-4e0e-a98d-c61822b60fe9</Id>
-      <AnnotationText>9482e87d-292d-4e0e-a98d-c61822b60fe9</AnnotationText>
-      <Hash>cb1OLhgHG9svy7G8hoTSPpltzhw=</Hash>
-      <Size>161326</Size>
-      <Type>application/x-smpte-mxf;asdcpKind=Sound</Type>
-    </Asset>
-  </AssetList>
-</PackingList>
index e43e5a70f9e922320a6a406cd423d137ac1ca44d..38ff565edb8e46ca99fe8885f23b70be021be187 100644 (file)
@@ -55,6 +55,7 @@
 #include "reel_asset.h"
 #include "test.h"
 #include "util.h"
+#include "reel_markers_asset.h"
 #include <asdcp/KM_util.h>
 #include <asdcp/KM_prng.h>
 #include <sndfile.h>
@@ -67,6 +68,7 @@ using std::string;
 using std::min;
 using std::vector;
 using std::shared_ptr;
+using std::make_shared;
 using boost::optional;
 
 
@@ -337,12 +339,21 @@ make_simple (boost::filesystem::path path, int reels, int frames)
                shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (path, suffix, frames);
                shared_ptr<dcp::SoundAsset> ms = simple_sound (path, suffix, mxf_meta, "en-US", frames);
 
-               cpl->add (shared_ptr<dcp::Reel> (
-                                 new dcp::Reel (
-                                         shared_ptr<dcp::ReelMonoPictureAsset>(new dcp::ReelMonoPictureAsset(mp, 0)),
-                                         shared_ptr<dcp::ReelSoundAsset>(new dcp::ReelSoundAsset(ms, 0))
-                                         )
-                                 ));
+               auto reel = make_shared<dcp::Reel>(
+                       shared_ptr<dcp::ReelMonoPictureAsset>(new dcp::ReelMonoPictureAsset(mp, 0)),
+                       shared_ptr<dcp::ReelSoundAsset>(new dcp::ReelSoundAsset(ms, 0))
+                       );
+
+               auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), frames, 0);
+               if (i == 0) {
+                       markers->set (dcp::Marker::FFOC, dcp::Time(0, 0, 0, 1, 24));
+               }
+               if (i == reels - 1) {
+                       markers->set (dcp::Marker::LFOC, dcp::Time(0, 0, 0, frames - 1, 24));
+               }
+               reel->add (markers);
+
+               cpl->add (reel);
        }
 
        d->add (cpl);
@@ -379,6 +390,16 @@ simple_subtitle ()
 }
 
 
+shared_ptr<dcp::ReelMarkersAsset>
+simple_markers (int frames)
+{
+       auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), frames, 0);
+       markers->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24));
+       markers->set (dcp::Marker::LFOC, dcp::Time(frames - 1, 24, 24));
+       return markers;
+}
+
+
 shared_ptr<dcp::DCP>
 make_simple_with_interop_subs (boost::filesystem::path path)
 {
index 5ed424bc0ec5c0a000ba0cb530acd25ce7098003..155c78981d4a6ad31294bd1d8751e49537bd94c7 100644 (file)
@@ -46,6 +46,7 @@ extern void check_file (boost::filesystem::path ref, boost::filesystem::path che
 extern std::shared_ptr<dcp::MonoPictureAsset> simple_picture (boost::filesystem::path path, std::string suffix, int frames = 24);
 extern std::shared_ptr<dcp::SoundAsset> simple_sound (boost::filesystem::path path, std::string suffix, dcp::MXFMetadata mxf_meta, std::string language, int frames = 24, int sample_rate = 48000);
 extern std::shared_ptr<dcp::Subtitle> simple_subtitle ();
+extern std::shared_ptr<dcp::ReelMarkersAsset> simple_markers (int frames = 24);
 extern std::shared_ptr<dcp::DCP> make_simple (boost::filesystem::path path, int reels = 1, int frames = 24);
 extern std::shared_ptr<dcp::DCP> make_simple_with_interop_subs (boost::filesystem::path path);
 extern std::shared_ptr<dcp::DCP> make_simple_with_smpte_subs (boost::filesystem::path path);
index edb37cfbc684314c69a7c83d7ca3659f3b8712cf..777339723de776c670c59018351b24ae8ebef057 100644 (file)
@@ -109,6 +109,8 @@ write_dcp_with_single_asset (boost::filesystem::path dir, shared_ptr<dcp::ReelAs
 {
        auto reel = make_shared<dcp::Reel>();
        reel->add (reel_asset);
+       reel->add (simple_markers());
+
        auto cpl = make_shared<dcp::CPL>("hello", dcp::TRAILER);
        cpl->add (reel);
        auto dcp = make_shared<dcp::DCP>(dir);
@@ -210,7 +212,7 @@ BOOST_AUTO_TEST_CASE (verify_test1)
        auto notes = dcp::verify (directories, &stage, &progress, xsd_test);
 
        boost::filesystem::path const cpl_file = "build/test/verify_test1/cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml";
-       boost::filesystem::path const pkl_file = "build/test/verify_test1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml";
+       boost::filesystem::path const pkl_file = "build/test/verify_test1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml";
        boost::filesystem::path const assetmap_file = "build/test/verify_test1/ASSETMAP.xml";
 
        auto st = stages.begin();
@@ -287,7 +289,7 @@ BOOST_AUTO_TEST_CASE (verify_test3)
        auto directories = setup (1, 3);
 
        {
-               Editor e ("build/test/verify_test3/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml");
+               Editor e ("build/test/verify_test3/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml");
                e.replace ("<Hash>", "<Hash>x");
        }
 
@@ -331,7 +333,7 @@ static
 boost::filesystem::path
 pkl (int n)
 {
-       return dcp::String::compose("build/test/verify_test%1/pkl_cd49971e-bf4c-4594-8474-54ebef09a40c.xml", n);
+       return dcp::String::compose("build/test/verify_test%1/pkl_63c3aece-c581-4603-b612-75e43f0c0430.xml", n);
 }
 
 static
@@ -418,7 +420,7 @@ BOOST_AUTO_TEST_CASE (verify_test11)
 {
        check_verify_result_after_replace (
                11, &pkl,
-               "<Id>urn:uuid:cd4", "<Id>urn:uuid:xd4",
+               "<Id>urn:uuid:63c", "<Id>urn:uuid:x3c",
                { dcp::VerificationNote::XML_VALIDATION_ERROR }
                );
 }
@@ -639,8 +641,7 @@ BOOST_AUTO_TEST_CASE (verify_test20)
        auto reel_asset = make_shared<dcp::ReelSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
        write_dcp_with_single_asset (dir, reel_asset);
 
-       auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test);
-       BOOST_REQUIRE_EQUAL (notes.size(), 0);
+       check_verify_result ({dir}, {});
 }
 
 
@@ -701,6 +702,9 @@ BOOST_AUTO_TEST_CASE (verify_test23)
 
        auto reel = make_shared<dcp::Reel>();
        reel->add (reel_asset);
+
+       reel->add (simple_markers(16 * 24 - 1));
+
        auto cpl = make_shared<dcp::CPL>("hello", dcp::TRAILER);
        cpl->add (reel);
        cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-");
@@ -712,8 +716,7 @@ BOOST_AUTO_TEST_CASE (verify_test23)
        dcp.add (cpl);
        dcp.write_xml (dcp::SMPTE);
 
-       auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test);
-       BOOST_CHECK (notes.empty());
+       check_verify_result ({dir}, {});
 }
 
 
@@ -745,6 +748,8 @@ BOOST_AUTO_TEST_CASE (verify_test24)
        cpl->set_main_picture_stored_area (dcp::Size(1998, 1080));
        cpl->set_main_picture_active_area (dcp::Size(1440, 1080));
 
+       reel->add (simple_markers());
+
        dcp::DCP dcp (dir);
        dcp.add (cpl);
        dcp.write_xml (dcp::SMPTE);
@@ -863,6 +868,8 @@ BOOST_AUTO_TEST_CASE (verify_various_invalid_languages)
        auto sound = simple_sound (dir, "foo", dcp::MXFMetadata(), "frobozz");
        auto reel_sound = make_shared<dcp::ReelSoundAsset>(sound, 0);
        reel->add (reel_sound);
+       reel->add (simple_markers());
+
        auto cpl = make_shared<dcp::CPL>("hello", dcp::TRAILER);
        cpl->add (reel);
        cpl->_additional_subtitle_languages.push_back("this-is-wrong");
@@ -937,6 +944,8 @@ check_picture_size (int width, int height, int frame_rate, bool three_d)
                reel->add (make_shared<dcp::ReelMonoPictureAsset>(std::dynamic_pointer_cast<dcp::MonoPictureAsset>(mp), 0));
        }
 
+       reel->add (simple_markers(frame_rate));
+
        cpl->add (reel);
 
        d->add (cpl);
@@ -1386,6 +1395,9 @@ BOOST_AUTO_TEST_CASE (verify_text_early_on_second_reel)
        auto reel_asset1 = make_shared<dcp::ReelSubtitleAsset>(asset1, dcp::Fraction(24, 1), 16 * 24, 0);
        auto reel1 = make_shared<dcp::Reel>();
        reel1->add (reel_asset1);
+       auto markers1 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 16 * 24, 0);
+       markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24));
+       reel1->add (markers1);
 
        auto asset2 = make_shared<dcp::SMPTESubtitleAsset>();
        asset2->set_start_time (dcp::Time());
@@ -1396,6 +1408,9 @@ BOOST_AUTO_TEST_CASE (verify_text_early_on_second_reel)
        auto reel_asset2 = make_shared<dcp::ReelSubtitleAsset>(asset2, dcp::Fraction(24, 1), 16 * 24, 0);
        auto reel2 = make_shared<dcp::Reel>();
        reel2->add (reel_asset2);
+       auto markers2 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 16 * 24, 0);
+       markers2->set (dcp::Marker::LFOC, dcp::Time(16 * 24 - 1, 24, 24));
+       reel2->add (markers2);
 
        auto cpl = make_shared<dcp::CPL>("hello", dcp::TRAILER);
        cpl->add (reel1);
@@ -1623,6 +1638,7 @@ BOOST_AUTO_TEST_CASE (verify_sound_sampling_rate_must_be_48k)
        auto sound = simple_sound (dir, "foo", dcp::MXFMetadata(), "de-DE", 24, 96000);
        auto reel_sound = make_shared<dcp::ReelSoundAsset>(sound, 0);
        reel->add (reel_sound);
+       reel->add (simple_markers());
        auto cpl = make_shared<dcp::CPL>("hello", dcp::TRAILER);
        cpl->add (reel);
        auto dcp = make_shared<dcp::DCP>(dir);
@@ -1688,12 +1704,13 @@ BOOST_AUTO_TEST_CASE (verify_reel_assets_durations_must_match)
        shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (dir, "", 24);
        shared_ptr<dcp::SoundAsset> ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25);
 
-       cpl->add (
-               make_shared<dcp::Reel>(
-                       make_shared<dcp::ReelMonoPictureAsset>(mp, 0),
-                       make_shared<dcp::ReelSoundAsset>(ms, 0)
-                       )
-                );
+       auto reel = make_shared<dcp::Reel>(
+               make_shared<dcp::ReelMonoPictureAsset>(mp, 0),
+               make_shared<dcp::ReelSoundAsset>(ms, 0)
+               );
+
+       reel->add (simple_markers());
+       cpl->add (reel);
 
        dcp->add (cpl);
        dcp->write_xml (dcp::SMPTE);
@@ -1728,8 +1745,11 @@ verify_subtitles_must_be_in_all_reels_check (boost::filesystem::path dir, bool a
                reel1->add (make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 240, 0));
        }
 
-       cpl->add (reel1);
+       auto markers1 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 240, 0);
+       markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24));
+       reel1->add (markers1);
 
+       cpl->add (reel1);
 
        auto reel2 = make_shared<dcp::Reel>(
                make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", 240), 0),
@@ -1740,6 +1760,10 @@ verify_subtitles_must_be_in_all_reels_check (boost::filesystem::path dir, bool a
                reel2->add (make_shared<dcp::ReelSubtitleAsset>(subs, dcp::Fraction(24, 1), 240, 0));
        }
 
+       auto markers2 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 240, 0);
+       markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24));
+       reel2->add (markers2);
+
        cpl->add (reel2);
 
        dcp->add (cpl);
@@ -1795,6 +1819,10 @@ verify_closed_captions_must_be_in_all_reels_check (boost::filesystem::path dir,
                reel1->add (make_shared<dcp::ReelClosedCaptionAsset>(subs, dcp::Fraction(24, 1), 240, 0));
        }
 
+       auto markers1 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 240, 0);
+       markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24));
+       reel1->add (markers1);
+
        cpl->add (reel1);
 
        auto reel2 = make_shared<dcp::Reel>(
@@ -1806,6 +1834,10 @@ verify_closed_captions_must_be_in_all_reels_check (boost::filesystem::path dir,
                reel2->add (make_shared<dcp::ReelClosedCaptionAsset>(subs, dcp::Fraction(24, 1), 240, 0));
        }
 
+       auto markers2 = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 240, 0);
+       markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24));
+       reel2->add (markers2);
+
        cpl->add (reel2);
 
        dcp->add (cpl);
@@ -1862,6 +1894,8 @@ verify_text_entry_point_check (boost::filesystem::path dir, dcp::VerificationNot
 
        reel->add (reel_text);
 
+       reel->add (simple_markers(240));
+
        cpl->add (reel);
 
        dcp->add (cpl);
@@ -1931,60 +1965,105 @@ BOOST_AUTO_TEST_CASE (verify_assets_must_have_hashes)
 }
 
 
-
-BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc1)
+static
+void
+verify_markers_test (
+       boost::filesystem::path dir,
+       vector<pair<dcp::Marker, dcp::Time>> markers,
+       vector<std::pair<dcp::VerificationNote::Type, dcp::VerificationNote::Code>> types_and_codes
+       )
 {
-       boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc1");
        auto dcp = make_simple (dir);
        dcp->cpls()[0]->set_content_kind (dcp::FEATURE);
-       auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 0);
-       markers->set (dcp::Marker::FFEC, dcp::Time(0, 0, 4, 0, 24));
-       markers->set (dcp::Marker::FFMC, dcp::Time(0, 0, 5, 0, 24));
-       dcp->cpls()[0]->reels()[0]->add(markers);
+       auto markers_asset = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 24, 0);
+       for (auto const& i: markers) {
+               markers_asset->set (i.first, i.second);
+       }
+       dcp->cpls()[0]->reels()[0]->add(markers_asset);
        dcp->write_xml (dcp::SMPTE);
-       check_verify_result ({dir}, {});
+       check_verify_result ({dir}, types_and_codes);
 }
 
 
-BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc2)
+BOOST_AUTO_TEST_CASE (verify_markers)
 {
-       boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc2");
-       auto dcp = make_simple (dir);
-       dcp->cpls()[0]->set_content_kind (dcp::FEATURE);
-       auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 0);
-       markers->set (dcp::Marker::FFEC, dcp::Time(0, 0, 4, 0, 24));
-       dcp->cpls()[0]->reels()[0]->add(markers);
-       dcp->write_xml (dcp::SMPTE);
-       check_verify_result ({dir}, {{dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE}});
-}
+       verify_markers_test (
+               "build/test/verify_markers_all_correct",
+               {
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(1, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
+               },
+               {}
+               );
 
+       verify_markers_test (
+               "build/test/verify_markers_missing_ffec",
+               {
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(1, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE }
+               });
 
-BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc3)
-{
-       boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc3");
-       auto dcp = make_simple (dir);
-       dcp->cpls()[0]->set_content_kind (dcp::FEATURE);
-       auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 0);
-       markers->set (dcp::Marker::FFMC, dcp::Time(0, 0, 4, 0, 24));
-       dcp->cpls()[0]->reels()[0]->add(markers);
-       dcp->write_xml (dcp::SMPTE);
-       check_verify_result ({dir}, {{dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE}});
-}
+       verify_markers_test (
+               "build/test/verify_markers_missing_ffmc",
+               {
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(1, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE }
+               });
+
+       verify_markers_test (
+               "build/test/verify_markers_missing_ffoc",
+               {
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_FFOC}
+               });
 
+       verify_markers_test (
+               "build/test/verify_markers_missing_lfoc",
+               {
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(1, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_LFOC }
+               });
 
-BOOST_AUTO_TEST_CASE (verify_features_must_have_ffec_ffmc4)
-{
-       boost::filesystem::path const dir("build/test/verify_features_must_have_ffec_ffmc4");
-       auto dcp = make_simple (dir);
-       dcp->cpls()[0]->set_content_kind (dcp::FEATURE);
-       auto markers = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 0);
-       dcp->cpls()[0]->reels()[0]->add(markers);
-       dcp->write_xml (dcp::SMPTE);
-       check_verify_result (
-               {dir},
+       verify_markers_test (
+               "build/test/verify_markers_incorrect_ffoc",
                {
-                       { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE },
-                       { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE }
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(3, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_FFOC }
+               });
+
+       verify_markers_test (
+               "build/test/verify_markers_incorrect_lfoc",
+               {
+                       { dcp::Marker::FFEC, dcp::Time(12, 24, 24) },
+                       { dcp::Marker::FFMC, dcp::Time(13, 24, 24) },
+                       { dcp::Marker::FFOC, dcp::Time(1, 24, 24) },
+                       { dcp::Marker::LFOC, dcp::Time(18, 24, 24) }
+               },
+               {
+                       { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_LFOC }
                });
 }