X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fverify_test.cc;h=35c087e7f08891e09e4b744b72c59ac28d47c2ea;hb=c59e6c0e64f95afc7c33168e7c7562502411bd01;hp=cb7c539d6e525a56eefebd61864636f6f156fb6d;hpb=b9c5e3f74550917676e14324791d6ba4d0c07cac;p=libdcp.git diff --git a/test/verify_test.cc b/test/verify_test.cc index cb7c539d..35c087e7 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -191,6 +191,7 @@ private: }; +#if 0 static void dump_notes (vector const & notes) @@ -199,6 +200,7 @@ dump_notes (vector const & notes) std::cout << dcp::note_to_string(i) << "\n"; } } +#endif static @@ -206,7 +208,6 @@ void check_verify_result (vector dir, vector test_notes) { auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test); - dump_notes (notes); BOOST_REQUIRE_EQUAL (notes.size(), test_notes.size()); for (auto i = 0U; i < notes.size(); ++i) { BOOST_REQUIRE_EQUAL (notes[i], test_notes[i]); @@ -525,10 +526,13 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard) ++st; BOOST_REQUIRE (st == stages.end()); - BOOST_REQUIRE_EQUAL (notes.size(), 1U); + BOOST_REQUIRE_EQUAL (notes.size(), 2U); auto i = notes.begin (); BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR); BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_STANDARD); + ++i; + BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR); + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K); } /* DCP with a short asset */ @@ -542,7 +546,8 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration) { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") }, { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") }, { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") }, - { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") } + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") }, + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") } }); } @@ -585,6 +590,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes) check_verify_result ( { dir }, { + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte") }, { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") }, { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } }); @@ -612,6 +618,7 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes) check_verify_result ( { dir }, { + { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte") }, { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") }, { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } }); @@ -684,7 +691,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles) prepare_directory (dir); copy_file ("test/data/subs.mxf", dir / "subs.mxf"); auto asset = make_shared(dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(25, 1), 300 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 6046, 0); auto cpl = write_dcp_with_single_asset (dir, reel_asset); check_verify_result ({dir}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }}); @@ -699,7 +706,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_smpte_subtitles) prepare_directory (dir); copy_file ("test/data/broken_smpte.mxf", dir / "subs.mxf"); auto asset = make_shared(dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 300 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 6046, 0); auto cpl = write_dcp_with_single_asset (dir, reel_asset); check_verify_result ( @@ -897,7 +904,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language1) auto asset = make_shared(dir / "subs.mxf"); asset->_language = "wrong-andbad"; asset->write (dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 300 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 6046, 0); reel_asset->_language = "badlang"; auto cpl = write_dcp_with_single_asset (dir, reel_asset); @@ -920,7 +927,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language2) auto asset = make_shared(dir / "subs.mxf"); asset->_language = "wrong-andbad"; asset->write (dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 300 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 6046, 0); reel_asset->_language = "badlang"; auto cpl = write_dcp_with_single_asset (dir, reel_asset); @@ -1047,7 +1054,6 @@ void check_picture_size_ok (int width, int height, int frame_rate, bool three_d) { auto notes = check_picture_size(width, height, frame_rate, three_d); - dump_notes (notes); BOOST_CHECK_EQUAL (notes.size(), 0U); } @@ -1115,7 +1121,7 @@ BOOST_AUTO_TEST_CASE (verify_picture_size) check_picture_size_bad_frame_size (2050, 858, 24, false); check_picture_size_bad_frame_size (2048, 658, 25, false); check_picture_size_bad_frame_size (1920, 1080, 48, true); - check_picture_size_bad_frame_size (4000, 3000, 24, true); + check_picture_size_bad_frame_size (4000, 2000, 24, true); /* Bad 2K frame rate */ check_picture_size_bad_2k_frame_rate (2048, 858, 26, false); @@ -1175,7 +1181,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_xml_size_in_bytes) } asset->set_language (dcp::LanguageTag("de-DE")); asset->write (dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 2049 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 49148, 0); auto cpl = write_dcp_with_single_asset (dir, reel_asset); check_verify_result ( @@ -1215,11 +1221,11 @@ verify_timed_text_asset_too_large (string name) auto const dir = path("build/test") / name; prepare_directory (dir); auto asset = make_large_subtitle_asset (dir / "font.ttf"); - add_test_subtitle (asset, 0, 20); + add_test_subtitle (asset, 0, 240); asset->set_language (dcp::LanguageTag("de-DE")); asset->write (dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 16 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 240, 0); auto cpl = write_dcp_with_single_asset (dir, reel_asset); check_verify_result ( @@ -1245,7 +1251,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language) { path dir = "build/test/verify_missing_subtitle_language"; prepare_directory (dir); - auto dcp = make_simple (dir, 1, 240); + auto dcp = make_simple (dir, 1, 106); string const xml = "" @@ -1255,8 +1261,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language) "Annotation" "2018-10-02T12:25:14+02:00" "1" - "25 1" - "25" + "24 1" + "24" "00:00:00:00" "urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6" "" @@ -1275,7 +1281,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language) auto subs = make_shared(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 106, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml ( dcp::Standard::SMPTE, @@ -1297,7 +1303,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language) BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages) { path path ("build/test/verify_mismatched_subtitle_languages"); - auto dcp = make_simple (path, 2, 240); + auto constexpr reel_length = 192; + auto dcp = make_simple (path, 2, reel_length); auto cpl = dcp->cpls()[0]; { @@ -1305,7 +1312,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages) subs->set_language (dcp::LanguageTag("de-DE")); subs->add (simple_subtitle()); subs->write (path / "subs1.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), reel_length, 0); cpl->reels()[0]->add(reel_subs); } @@ -1314,7 +1321,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages) subs->set_language (dcp::LanguageTag("en-US")); subs->add (simple_subtitle()); subs->write (path / "subs2.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), reel_length, 0); cpl->reels()[1]->add(reel_subs); } @@ -1339,7 +1346,8 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages) BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed) { path path ("build/test/verify_multiple_closed_caption_languages_allowed"); - auto dcp = make_simple (path, 2, 240); + auto constexpr reel_length = 192; + auto dcp = make_simple (path, 2, reel_length); auto cpl = dcp->cpls()[0]; { @@ -1347,7 +1355,7 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed) ccaps->set_language (dcp::LanguageTag("de-DE")); ccaps->add (simple_subtitle()); ccaps->write (path / "subs1.mxf"); - auto reel_ccaps = make_shared(ccaps, dcp::Fraction(24, 1), 240, 0); + auto reel_ccaps = make_shared(ccaps, dcp::Fraction(24, 1), reel_length, 0); cpl->reels()[0]->add(reel_ccaps); } @@ -1356,7 +1364,7 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed) ccaps->set_language (dcp::LanguageTag("en-US")); ccaps->add (simple_subtitle()); ccaps->write (path / "subs2.mxf"); - auto reel_ccaps = make_shared(ccaps, dcp::Fraction(24, 1), 240, 0); + auto reel_ccaps = make_shared(ccaps, dcp::Fraction(24, 1), reel_length, 0); cpl->reels()[1]->add(reel_ccaps); } @@ -1381,7 +1389,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time) { path dir = "build/test/verify_missing_subtitle_start_time"; prepare_directory (dir); - auto dcp = make_simple (dir, 1, 240); + auto dcp = make_simple (dir, 1, 106); string const xml = "" @@ -1392,8 +1400,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time) "2018-10-02T12:25:14+02:00" "1" "de-DE" - "25 1" - "25" + "24 1" + "24" "urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6" "" "" @@ -1411,7 +1419,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time) auto subs = make_shared(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 106, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml ( dcp::Standard::SMPTE, @@ -1434,7 +1442,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time) { path dir = "build/test/verify_invalid_subtitle_start_time"; prepare_directory (dir); - auto dcp = make_simple (dir, 1, 240); + auto dcp = make_simple (dir, 1, 106); string const xml = "" @@ -1445,8 +1453,8 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time) "2018-10-02T12:25:14+02:00" "1" "de-DE" - "25 1" - "25" + "24 1" + "24" "00:00:02:00" "urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6" "" @@ -1465,7 +1473,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time) auto subs = make_shared(dir / "subs.xml"); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 106, 0); dcp->cpls().front()->reels().front()->add(reel_subs); dcp->write_xml ( dcp::Standard::SMPTE, @@ -1514,7 +1522,7 @@ dcp_with_text (path dir, vector subs) asset->set_language (dcp::LanguageTag("de-DE")); asset->write (dir / "subs.mxf"); - auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), 16 * 24, 0); + auto reel_asset = make_shared(asset, dcp::Fraction(24, 1), asset->intrinsic_duration(), 0); return write_dcp_with_single_asset (dir, reel_asset); } @@ -1554,24 +1562,24 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time_on_second_reel) add_test_subtitle (asset1, 4 * 24, 5 * 24); asset1->set_language (dcp::LanguageTag("de-DE")); asset1->write (dir / "subs1.mxf"); - auto reel_asset1 = make_shared(asset1, dcp::Fraction(24, 1), 16 * 24, 0); + auto reel_asset1 = make_shared(asset1, dcp::Fraction(24, 1), 5 * 24, 0); auto reel1 = make_shared(); reel1->add (reel_asset1); - auto markers1 = make_shared(dcp::Fraction(24, 1), 16 * 24, 0); + auto markers1 = make_shared(dcp::Fraction(24, 1), 5 * 24, 0); markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); reel1->add (markers1); auto asset2 = make_shared(); asset2->set_start_time (dcp::Time()); /* This would be too early on first reel but should be OK on the second */ - add_test_subtitle (asset2, 0, 4 * 24); + add_test_subtitle (asset2, 3, 4 * 24); asset2->set_language (dcp::LanguageTag("de-DE")); asset2->write (dir / "subs2.mxf"); - auto reel_asset2 = make_shared(asset2, dcp::Fraction(24, 1), 16 * 24, 0); + auto reel_asset2 = make_shared(asset2, dcp::Fraction(24, 1), 4 * 24, 0); auto reel2 = make_shared(); reel2->add (reel_asset2); - auto markers2 = make_shared(dcp::Fraction(24, 1), 16 * 24, 0); - markers2->set (dcp::Marker::LFOC, dcp::Time(16 * 24 - 1, 24, 24)); + auto markers2 = make_shared(dcp::Fraction(24, 1), 4 * 24, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(4 * 24 - 1, 24, 24)); reel2->add (markers2); auto cpl = make_shared("hello", dcp::ContentKind::TRAILER); @@ -1659,6 +1667,7 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_overlapping_reel_boundary) check_verify_result ( {dir}, { + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get()) }, { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::SUBTITLE_OVERLAPS_REEL_BOUNDARY }, { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } @@ -1996,39 +2005,41 @@ verify_subtitles_must_be_in_all_reels_check (path dir, bool add_to_reel1, bool a auto dcp = make_shared(dir); auto cpl = make_shared("A Test DCP", dcp::ContentKind::TRAILER); + auto constexpr reel_length = 192; + auto subs = make_shared(); subs->set_language (dcp::LanguageTag("de-DE")); subs->set_start_time (dcp::Time()); subs->add (simple_subtitle()); subs->write (dir / "subs.mxf"); - auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_subs = make_shared(subs, dcp::Fraction(24, 1), reel_length, 0); auto reel1 = make_shared( - make_shared(simple_picture(dir, "", 240), 0), - make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + make_shared(simple_picture(dir, "", reel_length), 0), + make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0) ); if (add_to_reel1) { - reel1->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); + reel1->add (make_shared(subs, dcp::Fraction(24, 1), reel_length, 0)); } - auto markers1 = make_shared(dcp::Fraction(24, 1), 240, 0); + auto markers1 = make_shared(dcp::Fraction(24, 1), reel_length, 0); markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); reel1->add (markers1); cpl->add (reel1); auto reel2 = make_shared( - make_shared(simple_picture(dir, "", 240), 0), - make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + make_shared(simple_picture(dir, "", reel_length), 0), + make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0) ); if (add_to_reel2) { - reel2->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); + reel2->add (make_shared(subs, dcp::Fraction(24, 1), reel_length, 0)); } - auto markers2 = make_shared(dcp::Fraction(24, 1), 240, 0); - markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24)); + auto markers2 = make_shared(dcp::Fraction(24, 1), reel_length, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(reel_length - 1, 24, 24)); reel2->add (markers2); cpl->add (reel2); @@ -2082,6 +2093,8 @@ verify_closed_captions_must_be_in_all_reels_check (path dir, int caps_in_reel1, auto dcp = make_shared(dir); auto cpl = make_shared("A Test DCP", dcp::ContentKind::TRAILER); + auto constexpr reel_length = 192; + auto subs = make_shared(); subs->set_language (dcp::LanguageTag("de-DE")); subs->set_start_time (dcp::Time()); @@ -2089,31 +2102,31 @@ verify_closed_captions_must_be_in_all_reels_check (path dir, int caps_in_reel1, subs->write (dir / "subs.mxf"); auto reel1 = make_shared( - make_shared(simple_picture(dir, "", 240), 0), - make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + make_shared(simple_picture(dir, "", reel_length), 0), + make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0) ); for (int i = 0; i < caps_in_reel1; ++i) { - reel1->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); + reel1->add (make_shared(subs, dcp::Fraction(24, 1), reel_length, 0)); } - auto markers1 = make_shared(dcp::Fraction(24, 1), 240, 0); + auto markers1 = make_shared(dcp::Fraction(24, 1), reel_length, 0); markers1->set (dcp::Marker::FFOC, dcp::Time(1, 24, 24)); reel1->add (markers1); cpl->add (reel1); auto reel2 = make_shared( - make_shared(simple_picture(dir, "", 240), 0), - make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + make_shared(simple_picture(dir, "", reel_length), 0), + make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0) ); for (int i = 0; i < caps_in_reel2; ++i) { - reel2->add (make_shared(subs, dcp::Fraction(24, 1), 240, 0)); + reel2->add (make_shared(subs, dcp::Fraction(24, 1), reel_length, 0)); } - auto markers2 = make_shared(dcp::Fraction(24, 1), 240, 0); - markers2->set (dcp::Marker::LFOC, dcp::Time(239, 24, 24)); + auto markers2 = make_shared(dcp::Fraction(24, 1), reel_length, 0); + markers2->set (dcp::Marker::LFOC, dcp::Time(reel_length - 1, 24, 24)); reel2->add (markers2); cpl->add (reel2); @@ -2166,22 +2179,24 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost auto dcp = make_shared(dir); auto cpl = make_shared("A Test DCP", dcp::ContentKind::TRAILER); + auto constexpr reel_length = 192; + auto subs = make_shared(); subs->set_language (dcp::LanguageTag("de-DE")); subs->set_start_time (dcp::Time()); subs->add (simple_subtitle()); subs->write (dir / "subs.mxf"); - auto reel_text = make_shared(subs, dcp::Fraction(24, 1), 240, 0); + auto reel_text = make_shared(subs, dcp::Fraction(24, 1), reel_length, 0); adjust (reel_text); auto reel = make_shared( - make_shared(simple_picture(dir, "", 240), 0), - make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", 240), 0) + make_shared(simple_picture(dir, "", reel_length), 0), + make_shared(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0) ); reel->add (reel_text); - reel->add (simple_markers(240)); + reel->add (simple_markers(reel_length)); cpl->add (reel); @@ -2793,7 +2808,11 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted) d.write_xml (dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "A Test DCP", signer); - check_verify_result ({dir}, {{dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED}}); + check_verify_result ( + {dir}, + { + {dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED}, + }); } @@ -2804,7 +2823,7 @@ BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_2k) auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k (frame, notes); - dump_notes (notes); + BOOST_REQUIRE_EQUAL (notes.size(), 0U); } @@ -2815,7 +2834,7 @@ BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_4k) auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k (frame, notes); - dump_notes (notes); + BOOST_REQUIRE_EQUAL (notes.size(), 0U); } @@ -2830,6 +2849,133 @@ BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_libdcp) auto reader = picture.start_read (); auto frame = reader->get_frame (0); verify_j2k (frame, notes); - dump_notes (notes); + BOOST_REQUIRE_EQUAL (notes.size(), 0U); } + +/** Check that ResourceID and the XML ID being different is spotted */ +BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_resource_id) +{ + boost::filesystem::path const dir = "build/test/verify_mismatched_subtitle_resource_id"; + prepare_directory (dir); + + ASDCP::WriterInfo writer_info; + writer_info.LabelSetType = ASDCP::LS_MXF_SMPTE; + + unsigned int c; + auto mxf_id = dcp::make_uuid (); + Kumu::hex2bin (mxf_id.c_str(), writer_info.AssetUUID, Kumu::UUID_Length, &c); + BOOST_REQUIRE (c == Kumu::UUID_Length); + + auto resource_id = dcp::make_uuid (); + ASDCP::TimedText::TimedTextDescriptor descriptor; + Kumu::hex2bin (resource_id.c_str(), descriptor.AssetID, Kumu::UUID_Length, &c); + DCP_ASSERT (c == Kumu::UUID_Length); + + auto xml_id = dcp::make_uuid (); + ASDCP::TimedText::MXFWriter writer; + auto subs_mxf = dir / "subs.mxf"; + auto r = writer.OpenWrite(subs_mxf.c_str(), writer_info, descriptor, 4096); + BOOST_REQUIRE (ASDCP_SUCCESS(r)); + writer.WriteTimedTextResource (dcp::String::compose( + "" + "" + "urn:uuid:%1" + "Content" + "Annotation" + "2018-10-02T12:25:14+02:00" + "1" + "en-US" + "25 1" + "25" + "00:00:00:00" + "" + "" + "" + "Hello world" + "" + "" + "" + "", + xml_id).c_str()); + + writer.Finalize(); + + auto subs_asset = make_shared(subs_mxf); + auto subs_reel = make_shared(subs_asset, dcp::Fraction(24, 1), 240, 0); + + auto cpl = write_dcp_with_single_asset (dir, subs_reel); + + check_verify_result ( + { dir }, + { + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) }, + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_RESOURCE_ID }, + { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + }); +} + + +/** Check that ResourceID and the MXF ID being the same is spotted */ +BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id) +{ + boost::filesystem::path const dir = "build/test/verify_incorrect_timed_text_id"; + prepare_directory (dir); + + ASDCP::WriterInfo writer_info; + writer_info.LabelSetType = ASDCP::LS_MXF_SMPTE; + + unsigned int c; + auto mxf_id = dcp::make_uuid (); + Kumu::hex2bin (mxf_id.c_str(), writer_info.AssetUUID, Kumu::UUID_Length, &c); + BOOST_REQUIRE (c == Kumu::UUID_Length); + + auto resource_id = mxf_id; + ASDCP::TimedText::TimedTextDescriptor descriptor; + Kumu::hex2bin (resource_id.c_str(), descriptor.AssetID, Kumu::UUID_Length, &c); + DCP_ASSERT (c == Kumu::UUID_Length); + + auto xml_id = resource_id; + ASDCP::TimedText::MXFWriter writer; + auto subs_mxf = dir / "subs.mxf"; + auto r = writer.OpenWrite(subs_mxf.c_str(), writer_info, descriptor, 4096); + BOOST_REQUIRE (ASDCP_SUCCESS(r)); + writer.WriteTimedTextResource (dcp::String::compose( + "" + "" + "urn:uuid:%1" + "Content" + "Annotation" + "2018-10-02T12:25:14+02:00" + "1" + "en-US" + "25 1" + "25" + "00:00:00:00" + "" + "" + "" + "Hello world" + "" + "" + "" + "", + xml_id).c_str()); + + writer.Finalize(); + + auto subs_asset = make_shared(subs_mxf); + auto subs_reel = make_shared(subs_asset, dcp::Fraction(24, 1), 240, 0); + + auto cpl = write_dcp_with_single_asset (dir, subs_reel); + + check_verify_result ( + { dir }, + { + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) }, + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INCORRECT_TIMED_TEXT_ASSET_ID }, + { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }, + { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() } + }); +}