for (auto const& i: reel->main_markers()->get()) {
markers_seen.insert (i);
}
+ if (reel->main_markers()->entry_point()) {
+ notes.push_back ({VerificationNote::Type::ERROR, VerificationNote::Code::UNEXPECTED_ENTRY_POINT});
+ }
+ if (reel->main_markers()->duration()) {
+ notes.push_back ({VerificationNote::Type::ERROR, VerificationNote::Code::UNEXPECTED_DURATION});
+ }
}
fewest_closed_captions = std::min (fewest_closed_captions, reel->closed_captions().size());
return "Some closed <Text> or <Image> nodes have different vertical alignments within a <Subtitle>.";
case VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING:
return "Some closed captions are not listed in the order of their vertical position.";
+ case VerificationNote::Code::UNEXPECTED_ENTRY_POINT:
+ return "There is an <EntryPoint> node inside a <MainMarkers>.";
+ case VerificationNote::Code::UNEXPECTED_DURATION:
+ return "There is an <Duration> node inside a <MainMarkers>.";
}
return "";
* - MISMATCHED: two things, which should be the same, are not.
* - EMPTY: something, which should have a value, has no value.
* - MISSING: something, which should be present, is not.
+ * - UNEXPECTED: something, which is present, should not be.
* - FAILED: some part of the verification failed in some serious way.
*
* Comments should clarify meaning and also say which of the optional fields (e.g. file)
MISMATCHED_CLOSED_CAPTION_VALIGN,
/** Some closed captions are not listed in the XML in the order of their vertical position */
INCORRECT_CLOSED_CAPTION_ORDERING,
+ /** Some <MainMarkers> asset has an <EntryPoint> that should not be there */
+ UNEXPECTED_ENTRY_POINT,
+ /** Some <MainMarkers> asset has an <Duration> that should not be there */
+ UNEXPECTED_DURATION
};
VerificationNote (Type type, Code code)
BOOST_REQUIRE (_content != old_content);
}
+ void insert (string after, string line)
+ {
+ vector<string> lines;
+ boost::algorithm::split (lines, _content, boost::is_any_of("\r\n"), boost::token_compress_on);
+ auto old_content = _content;
+ _content = "";
+ bool replaced = false;
+ for (auto i: lines) {
+ _content += i;
+ if (!replaced && i.find(after) != string::npos) {
+ _content += line;
+ replaced = true;
+ }
+ }
+ BOOST_REQUIRE (_content != old_content);
+ }
+
private:
path _path;
std::string _content;
}
+
+BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
+{
+ path dir = "build/test/verify_unexpected_things_in_main_markers";
+ prepare_directory (dir);
+ auto dcp = make_simple (dir, 1, 24);
+ dcp->write_xml (
+ dcp::String::compose("libdcp %1", dcp::version),
+ dcp::String::compose("libdcp %1", dcp::version),
+ dcp::LocalTime().as_string(),
+ "A Test DCP"
+ );
+
+ {
+ Editor e (find_cpl(dir));
+ e.insert(
+ " <IntrinsicDuration>24</IntrinsicDuration>",
+ "<EntryPoint>0</EntryPoint><Duration>24</Duration>"
+ );
+ }
+
+ dcp::CPL cpl (find_cpl(dir));
+
+ check_verify_result (
+ { dir },
+ {
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) },
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_ENTRY_POINT },
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_DURATION },
+ });
+}
+