From f11ff8d4d961d92e994ef0f9beb456aa8ec7c4cb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 3 Jan 2021 00:31:40 +0100 Subject: [PATCH 1/1] Bv2.1 7.2.3: Check that subtitle exists and is 0. --- BRANCH | 2 +- src/verify.cc | 16 +++ src/verify.h | 4 + .../822bd341-c751-45b1-94d2-410e4ffcff1b.png | Bin 44935 -> 44861 bytes test/data/sub.png | Bin 44935 -> 44861 bytes test/data/subs.mxf | Bin 62859 -> 62954 bytes .../ref/write_interop_subtitle_test3/ASSETMAP | 2 +- .../d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png | Bin 44935 -> 44861 bytes test/ref/write_interop_subtitle_test3/pkl.xml | 31 ++++- ...l_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml | 30 ----- test/test.cc | 2 + test/verify_test.cc | 123 ++++++++++++++++-- 12 files changed, 169 insertions(+), 41 deletions(-) mode change 120000 => 100644 test/ref/write_interop_subtitle_test3/pkl.xml delete mode 100644 test/ref/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml diff --git a/BRANCH b/BRANCH index 7b9aab02..103b734b 100644 --- a/BRANCH +++ b/BRANCH @@ -25,5 +25,5 @@ Mark things with [Bv2.1_paragraph] - Timed text total track asset must be <= 115MB [/] - Font resource <= 10MB [/] 7.2.2 Language Element shall be present [/] and contiguous across all MainSubtitles [/] - +7.2.3 StartTime element shall be present and equal to 00:00:00:00 [/] diff --git a/src/verify.cc b/src/verify.cc index 0b7def3c..bbae1ba4 100644 --- a/src/verify.cc +++ b/src/verify.cc @@ -704,6 +704,18 @@ verify_subtitle_asset ( ) ); } + + if (!smpte->start_time()) { + notes.push_back ( + VerificationNote( + VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_START_TIME, *asset->file()) + ); + } else if (smpte->start_time() != dcp::Time()) { + notes.push_back ( + VerificationNote( + VerificationNote::VERIFY_BV21_ERROR, VerificationNote::SUBTITLE_START_TIME_NON_ZERO, *asset->file()) + ); + } } } @@ -912,6 +924,10 @@ dcp::note_to_string (dcp::VerificationNote note) return String::compose("The XML for a SMPTE subtitle asset has no tag, which is required by Bv2.1", note.file()->filename()); case dcp::VerificationNote::SUBTITLE_LANGUAGES_DIFFER: return String::compose("Some subtitle assets have different tags than others", note.file()->filename()); + case dcp::VerificationNote::MISSING_SUBTITLE_START_TIME: + return String::compose("The XML for a SMPTE subtitle asset has no tag, which is required by Bv2.1", note.file()->filename()); + case dcp::VerificationNote::SUBTITLE_START_TIME_NON_ZERO: + return String::compose("The XML for a SMPTE subtitle asset has a non-zero tag, which is disallowed by Bv2.1", note.file()->filename()); } return ""; diff --git a/src/verify.h b/src/verify.h index 170aeb8b..2957654f 100644 --- a/src/verify.h +++ b/src/verify.h @@ -112,6 +112,10 @@ public: MISSING_SUBTITLE_LANGUAGE, /** Not all subtitle assets specify the same tag [Bv2.1_7.2.2] */ SUBTITLE_LANGUAGES_DIFFER, + /** Some SMPTE subtitle XML has no tag [Bv2.1_7.2.3] */ + MISSING_SUBTITLE_START_TIME, + /** Some SMPTE subtitle XML has a non-zero tag [Bv2.1_7.2.3] */ + SUBTITLE_START_TIME_NON_ZERO, }; VerificationNote (Type type, Code code) diff --git a/test/data/822bd341-c751-45b1-94d2-410e4ffcff1b.png b/test/data/822bd341-c751-45b1-94d2-410e4ffcff1b.png index 89b53cf2ce9074c1e908c8b7a2473eaccfa61c5a..9d8f298892fe8de21b515c65c63f5fc6f25ebab6 100644 GIT binary patch delta 12 TcmZp_&$Ra*(*)&>xl-!^CaDFW delta 85 zcmdmckE#7W(*$J?29{zc&kznEsNqQIU|?Y2EbxddW?h*rdD+Fui3O>8`9xl-!^CaDFW delta 85 zcmdmckE#7W(*$J?29{zc&kznEsNqQIU|?Y2EbxddW?h*rdD+Fui3O>8`9Sz6*Go0fz`G`Pll<*Cj0;J7hVRQq`V$wC&Em4nI8y`158E zPEbq~(E9-n!qM}9ue(a`5727IhL{7gXPt+V+wullN5y(BkT5BPInloga^Ef*N$=V3 zyV>XSR7a2A2cSXAB#eB~a=!Q8fO%VY!$*2PK)C_2gfD_{ga`*g;fP;$6uUBkQJom? zI%S?quj#w~5{`)$KECWYzcIm$#e4rcIz(4w}` zYhz|(+CEeB+0a(|45WEm#q7mNn8^!7r*F3uowr!{S4(zG1}+h4@GG9$u!fuTT}My) ztnZ`udUEc?dV}n}1?!@4GEj8;`wpFMl>DPto_HngyI35GHcC*o2-f%$Xk}|d<(Ici zA?*ui7tQqW4Yp z+iuZL1fWwLd&j>XH&1oahm*3GYa%?**@YhHFaOZ5UHZk;^68`en9hV|H}*SKWv@ zq-QS&N<^uyN!rqS;U!bkhgD0>ha@X;mt9 zaavs*0rjSIKSvE_%Z5ixrI9pMM_VhZ9Z5K@TRRfu_R@M0S8uWhg3Ut+$SOf$Im90Lo<1SAo@Lq_&hP`+m@dz;l%u@upwp=foCePCU=kK-BXzV2CuO=MF0Q* delta 1597 zcmai!4NMzl7{}i$(C@;*29^b+gSsK(=v}|N;wYts@?l}nEo{zdDOUvVT;Mtao)tb~W)y-b?Oz|Ia=D z`#pE>&od!MWqi>uJ3JO2pSOw z^kIO7u=E@dN>}N*05zoUYvrTu>xIUKv#(tH zP@vR@0JQDMmF@L|nbvno-yQQ!*YxRm0A+`7QidW3ON6ix6pno=wKly8ug7H^>2AJ zU;DvqXQDJ`_kHN$Bu6rvo8VT?8Z`Od+?m{qmdVERk7Kv^dvoDcj@qz-+Z4Kr-W0O> z9zFBZ3Qk=?dE=%iK}3dYLV?&9vaH6uZsduK4Yk5z7$Fp+OcAW+DpA*P`F=!EaHFN9 zh*cat#e&N`JUE#klEA0=LNrBJQ=|XWJb1>veths;`|~i3Ck{>~h-C0Jo&*hYaX_R+ z&s7wEw&$h1;rH?QA9o%s8VNKEO1AUY!gb+d?fygYsxRv-Q=NY-E{|N=R{1dWOd7h4 zhR)Q%c7ACjbDIAE4w?lfc*FL8fJ=X~cg0+@w7?&VyE<^LtXD9HTk>->14Ev<*72mv zIS4@8vD5@nPafVm_Qi(EORnw!bY@`y`gF>Znwk6gEloXtHILr0GzJ(1C0C%2%`Wr~ zHCc?GJ}W%EYqI)i0D4d|K~#t`T|pZ7t@!u)iOYtsdlP>tevv!w3^WT$t^j|_8*}q> zO(Eg??)Thd7f!kV1NZ?NI8#RfPlYYvTL~Y%%S7S#ul`4wcZa7A-OJVW*S~!Grkec| z6h{;|nM3g}13uUWY#O?Taifv?ALds zt=+O?JCvXV;vBG}PvNi@6~JLb5>iH;b21o_S%7fhuFQ|6YNcAE)HoHGiXcf$sUaPh z9kv>2|zaGed8Z&u)&aWy<{w6e@r zc*p2~-mK#=)f6YyISHLgtFvP`L8>q%u2W!TazzMlQZFkex4LHmh=OZPQmI~8@Zu1g2Fkg%IMDO!WOypN}4;3xQ at}He{#X@U*8KvU~)c?xqyLkz9vHT4kDd36f4bb3-c4fa-4a95-9915-6fec3110cd71.png 1 0 - 44935 + 44861 diff --git a/test/ref/write_interop_subtitle_test3/d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png b/test/ref/write_interop_subtitle_test3/d36f4bb3-c4fa-4a95-9915-6fec3110cd71.png index 89b53cf2ce9074c1e908c8b7a2473eaccfa61c5a..9d8f298892fe8de21b515c65c63f5fc6f25ebab6 100644 GIT binary patch delta 12 TcmZp_&$Ra*(*)&>xl-!^CaDFW delta 85 zcmdmckE#7W(*$J?29{zc&kznEsNqQIU|?Y2EbxddW?h*rdD+Fui3O>8`9 + + urn:uuid:6a9e31a6-50a4-4ecb-8683-fa667848470a + Created by libdcp + 2018-09-02T04:45:18+00:00 + libdcp + libdcp + + + urn:uuid:46c3eb45-15e5-47d6-8684-d8641e4dc516 + 46c3eb45-15e5-47d6-8684-d8641e4dc516 + hu0RaV4ZgrcqQQtgOW4r/YznVo0= + 1105 + text/xml;asdcpKind=CPL + + + urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6 + a6c58cff-3e1e-4b38-acec-a42224475ef6 + cVnFjMLTQnSIAlIzJpNB/p7B230= + 414 + text/xml;asdcpKind=Subtitle + + + urn:uuid:d36f4bb3-c4fa-4a95-9915-6fec3110cd71 + 2vTylSKQ5MCQHbKPT4X+rlwfHk4= + 44861 + image/png + + + diff --git a/test/ref/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml b/test/ref/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml deleted file mode 100644 index 5e721188..00000000 --- a/test/ref/write_interop_subtitle_test3/pkl_6a9e31a6-50a4-4ecb-8683-fa667848470a.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - urn:uuid:6a9e31a6-50a4-4ecb-8683-fa667848470a - Created by libdcp - 2018-09-02T04:45:18+00:00 - libdcp - libdcp - - - urn:uuid:46c3eb45-15e5-47d6-8684-d8641e4dc516 - 46c3eb45-15e5-47d6-8684-d8641e4dc516 - hu0RaV4ZgrcqQQtgOW4r/YznVo0= - 1105 - text/xml;asdcpKind=CPL - - - urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6 - a6c58cff-3e1e-4b38-acec-a42224475ef6 - cVnFjMLTQnSIAlIzJpNB/p7B230= - 414 - text/xml;asdcpKind=Subtitle - - - urn:uuid:d36f4bb3-c4fa-4a95-9915-6fec3110cd71 - w0Xc4TUYpao08I0yPSDfFkaEwdg= - 44935 - image/png - - - diff --git a/test/test.cc b/test/test.cc index 7a08cfc3..1d336806 100644 --- a/test/test.cc +++ b/test/test.cc @@ -404,6 +404,7 @@ make_simple_with_smpte_subs (boost::filesystem::path path) shared_ptr subs(new dcp::SMPTESubtitleAsset()); subs->set_language (dcp::LanguageTag("de-DE")); + subs->set_start_time (dcp::Time()); subs->add (simple_subtitle()); subs->write (path / "subs.mxf"); @@ -438,6 +439,7 @@ make_simple_with_smpte_ccaps (boost::filesystem::path path) shared_ptr subs(new dcp::SMPTESubtitleAsset()); subs->set_language (dcp::LanguageTag("de-DE")); + subs->set_start_time (dcp::Time()); subs->add (simple_subtitle()); subs->write (path / "ccap.mxf"); diff --git a/test/verify_test.cc b/test/verify_test.cc index 9bb3859a..4cde3966 100644 --- a/test/verify_test.cc +++ b/test/verify_test.cc @@ -729,9 +729,13 @@ BOOST_AUTO_TEST_CASE (verify_test21) vector dirs; dirs.push_back (dir); list notes = dcp::verify (dirs, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 2); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::XML_VALIDATION_ERROR); - BOOST_CHECK_EQUAL (notes.back().code(), dcp::VerificationNote::XML_VALIDATION_ERROR); + BOOST_REQUIRE_EQUAL (notes.size(), 3); + list::const_iterator i = notes.begin(); + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::XML_VALIDATION_ERROR); + ++i; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::XML_VALIDATION_ERROR); + ++i; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); } @@ -1206,9 +1210,12 @@ BOOST_AUTO_TEST_CASE (verify_closed_caption_xml_too_large) vector dirs; dirs.push_back (dir); list notes = dcp::verify (dirs, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 1U); - BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::VERIFY_BV21_ERROR); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::CLOSED_CAPTION_XML_TOO_LARGE_IN_BYTES); + BOOST_REQUIRE_EQUAL (notes.size(), 2U); + list::const_iterator i = notes.begin(); + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); + ++i; + BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::VERIFY_BV21_ERROR); + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::CLOSED_CAPTION_XML_TOO_LARGE_IN_BYTES); } @@ -1273,13 +1280,15 @@ verify_timed_text_asset_too_large (string name) vector dirs; dirs.push_back (dir); list notes = dcp::verify (dirs, &stage, &progress, xsd_test); - BOOST_REQUIRE_EQUAL (notes.size(), 2U); + BOOST_REQUIRE_EQUAL (notes.size(), 3U); list::const_iterator i = notes.begin(); BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::VERIFY_BV21_ERROR); BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::TIMED_TEXT_ASSET_TOO_LARGE_IN_BYTES); ++i; BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::VERIFY_BV21_ERROR); BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::TIMED_TEXT_FONTS_TOO_LARGE_IN_BYTES); + ++i; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); } @@ -1366,8 +1375,106 @@ BOOST_AUTO_TEST_CASE (verify_inconsistent_subtitle_languages) vector dirs; dirs.push_back (path); list notes = dcp::verify (dirs, &stage, &progress, xsd_test); + BOOST_REQUIRE_EQUAL (notes.size(), 3U); + list::const_iterator i = notes.begin(); + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); + ++i; + BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::VERIFY_BV21_ERROR); + ++i; + BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); +} + + +BOOST_AUTO_TEST_CASE (verify_missing_start_time_tag_in_subtitle_xml) +{ + boost::filesystem::path dir = "build/test/verify_missing_start_time_tag_in_subtitle_xml"; + prepare_directory (dir); + shared_ptr dcp = make_simple (dir, 1); + + string const xml = + "" + "" + "urn:uuid:e6a8ae03-ebbf-41ed-9def-913a87d1493a" + "Content" + "Annotation" + "2018-10-02T12:25:14+02:00" + "1" + "de-DE" + "25 1" + "25" + "urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6" + "" + "" + "" + "Hello world" + "" + "" + "" + ""; + + FILE* xml_file = dcp::fopen_boost (dir / "subs.xml", "w"); + BOOST_REQUIRE (xml_file); + fwrite (xml.c_str(), xml.size(), 1, xml_file); + fclose (xml_file); + shared_ptr subs (new dcp::SMPTESubtitleAsset(dir / "subs.xml")); + subs->write (dir / "subs.mxf"); + + shared_ptr reel_subs (new dcp::ReelSubtitleAsset(subs, dcp::Fraction(24, 1), 100, 0)); + dcp->cpls().front()->reels().front()->add (reel_subs); + dcp->write_xml (dcp::SMPTE); + + vector dirs; + dirs.push_back (dir); + list notes = dcp::verify (dirs, &stage, &progress, xsd_test); BOOST_REQUIRE_EQUAL (notes.size(), 1U); BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::VERIFY_BV21_ERROR); - BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::SUBTITLE_LANGUAGES_DIFFER); + BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::MISSING_SUBTITLE_START_TIME); } + +BOOST_AUTO_TEST_CASE (verify_non_zero_start_time_tag_in_subtitle_xml) +{ + boost::filesystem::path dir = "build/test/verify_non_zero_start_time_tag_in_subtitle_xml"; + prepare_directory (dir); + shared_ptr dcp = make_simple (dir, 1); + + string const xml = + "" + "" + "urn:uuid:e6a8ae03-ebbf-41ed-9def-913a87d1493a" + "Content" + "Annotation" + "2018-10-02T12:25:14+02:00" + "1" + "de-DE" + "25 1" + "25" + "00:00:02:00" + "urn:uuid:e4f0ff0a-9eba-49e0-92ee-d89a88a575f6" + "" + "" + "" + "Hello world" + "" + "" + "" + ""; + + FILE* xml_file = dcp::fopen_boost (dir / "subs.xml", "w"); + BOOST_REQUIRE (xml_file); + fwrite (xml.c_str(), xml.size(), 1, xml_file); + fclose (xml_file); + shared_ptr subs (new dcp::SMPTESubtitleAsset(dir / "subs.xml")); + subs->write (dir / "subs.mxf"); + + shared_ptr reel_subs (new dcp::ReelSubtitleAsset(subs, dcp::Fraction(24, 1), 100, 0)); + dcp->cpls().front()->reels().front()->add (reel_subs); + dcp->write_xml (dcp::SMPTE); + + vector dirs; + dirs.push_back (dir); + list notes = dcp::verify (dirs, &stage, &progress, xsd_test); + BOOST_REQUIRE_EQUAL (notes.size(), 1U); + BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::VERIFY_BV21_ERROR); + BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::SUBTITLE_START_TIME_NON_ZERO); +} -- 2.30.2