Add OK note when <ContentKind> is valid.
authorCarl Hetherington <cth@carlh.net>
Sun, 7 Jan 2024 23:43:10 +0000 (00:43 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 15 Apr 2024 08:59:34 +0000 (10:59 +0200)
src/verify.cc
src/verify.h
test/verify_test.cc

index 17b751e6ed79526af7319cd73384e16aff80b7cd..e5959f238a041d8599908f63a4cb71da85f49f5b 100644 (file)
@@ -1569,6 +1569,8 @@ verify_cpl(Context& context, shared_ptr<const CPL> cpl)
                auto iter = std::find_if(all.begin(), all.end(), [name](ContentKind const& k) { return !k.scope() && k.name() == name; });
                if (iter == all.end()) {
                        context.error(VerificationNote::Code::INVALID_CONTENT_KIND, cpl->content_kind().name());
+               } else {
+                       context.ok(VerificationNote::Code::VALID_CONTENT_KIND, cpl->content_kind().name());
                }
        }
 
@@ -2155,6 +2157,8 @@ dcp::note_to_string (VerificationNote note)
                return "There is an <Duration> node inside a <MainMarkers>.";
        case VerificationNote::Code::INVALID_CONTENT_KIND:
                return String::compose("<ContentKind> has an invalid value %1.", note.note().get());
+       case VerificationNote::Code::VALID_CONTENT_KIND:
+               return String::compose("Valid <ContentKind> %1.", note.note().get());
        case VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA:
                return String::compose("<MainPictureActiveaArea> has an invalid value: %1", note.note().get());
        case VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA:
index df515d19a8d7e86ceac84d616da5738b26f6fd77..071a3e0cb61bef0833e268f265aa76280f9dd5d6 100644 (file)
@@ -420,6 +420,7 @@ public:
                UNEXPECTED_DURATION,
                /** A <ContentKind> has been specified with either no scope or the SMPTE 429-7 scope, but which is not one of those allowed */
                INVALID_CONTENT_KIND,
+               VALID_CONTENT_KIND,
                /** Either the width or height of a <MainPictureActiveArea> in a CPL is either not an even number, or bigger than the corresponding asset dimension.
                 *  note contains details of what is wrong
                 *  file contains the CPL filename
index 12cc953b7b04aace5ecaf098e15b9b77a3e4ea14..baffebc6c9ae705619d04a924f243eddf677150f 100644 (file)
@@ -478,6 +478,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(dcp_test1_cpl_id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -516,6 +517,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -617,6 +619,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_rate)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -650,6 +653,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_asset)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_ASSET, canonical(dir) / "video.mxf" }
                });
@@ -676,6 +680,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_asset_path)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_ASSET_PATH }
                };
@@ -705,6 +710,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_standard)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_STANDARD },
                        dcp::VerificationNote(
@@ -758,6 +764,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_id)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -792,6 +799,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_issue_date)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path)
@@ -829,6 +837,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_pkl_id)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -865,6 +874,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_asset_map_id)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -931,6 +941,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl),
@@ -962,6 +973,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration)
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl),
                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl),
                { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
@@ -1035,6 +1047,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
        };
@@ -1088,6 +1101,7 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
        };
 
@@ -1136,6 +1150,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_picture_frame_size_in_bytes)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl),
                        dcp::VerificationNote(dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()).set_cpl_id(cpl->id())
@@ -1159,6 +1174,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_interop_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
@@ -1183,6 +1199,7 @@ BOOST_AUTO_TEST_CASE(verify_catch_missing_font_file_with_interop_ccap)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
@@ -1214,6 +1231,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 5
@@ -1248,6 +1266,7 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get())
@@ -1276,6 +1295,7 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_single_space_subtitle)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"Arial"}
@@ -1301,6 +1321,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
@@ -1334,6 +1355,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_smpte_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 2
@@ -1377,6 +1399,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT
@@ -1417,6 +1440,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_child_nodes)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"}
@@ -1442,6 +1466,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_empty_child_nodes
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get())
                                ).set_cpl_id(cpl->id()),
@@ -1482,6 +1507,7 @@ BOOST_AUTO_TEST_CASE (verify_external_asset)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, picture->asset()->id() },
                        dcp::VerificationNote(
@@ -1566,6 +1592,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
                                string{"1440x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl),
                        dcp::VerificationNote(
@@ -1644,6 +1671,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang")
@@ -1678,6 +1706,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang")
@@ -1738,6 +1767,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language3)
                                string{"1440x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl),
                        dcp::VerificationNote(
@@ -1823,6 +1853,7 @@ check_picture_size_ok (int width, int height, int frame_rate, bool three_d)
 
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -1850,6 +1881,7 @@ check_picture_size_bad_frame_size (int width, int height, int frame_rate, bool t
 
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -1880,6 +1912,7 @@ check_picture_size_bad_2k_frame_rate (int width, int height, int frame_rate, boo
 
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -1914,6 +1947,7 @@ check_picture_size_bad_4k_frame_rate (int width, int height, int frame_rate, boo
 
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -1983,6 +2017,7 @@ BOOST_AUTO_TEST_CASE (verify_picture_size)
 
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -2054,6 +2089,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_xml_size_in_bytes)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf")
@@ -2109,6 +2145,7 @@ verify_timed_text_asset_too_large (string name)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_SIZE_IN_BYTES, string("121698284"), canonical(dir / "subs.mxf")
@@ -2191,6 +2228,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -2248,6 +2286,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video0.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl),
@@ -2306,6 +2345,7 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video0.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
@@ -2374,6 +2414,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -2434,6 +2475,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2544,6 +2586,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_first_text_time)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
                                ).set_cpl_id(cpl->id()),
@@ -2568,6 +2611,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2624,6 +2668,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time_on_second_reel)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2648,6 +2693,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_spacing)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING
                                ).set_cpl_id(cpl->id()),
@@ -2676,6 +2722,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_spacing)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2695,6 +2742,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_duration)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION
                                ).set_cpl_id(cpl->id()),
@@ -2718,6 +2766,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_duration)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2746,6 +2795,7 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_overlapping_reel_boundary)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get())
                                ).set_cpl_id(cpl->id()),
@@ -2782,6 +2832,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2811,6 +2862,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2837,6 +2889,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2867,6 +2920,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2890,6 +2944,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -2916,6 +2971,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -2945,6 +3001,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2974,6 +3031,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3000,6 +3058,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_count3)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -3030,6 +3089,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count4)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3054,6 +3114,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_length)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3077,6 +3138,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_length)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -3105,6 +3167,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3130,6 +3193,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN
                                ).set_cpl_id(cpl->id()),
@@ -3159,6 +3223,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering1)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3185,6 +3250,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering2)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3204,6 +3270,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering3)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING
                                ).set_cpl_id(cpl->id()),
@@ -3227,6 +3294,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering4)
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3262,6 +3330,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_sound_frame_rate)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl),
@@ -3305,6 +3374,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
@@ -3340,6 +3410,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -3387,6 +3458,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -3469,6 +3541,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3494,6 +3567,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3515,6 +3589,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3595,6 +3670,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
@@ -3619,6 +3695,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
@@ -3640,6 +3717,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
@@ -3697,6 +3775,7 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, code, subs->id()
                                ).set_cpl_id(cpl->id()),
@@ -3777,6 +3856,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash)
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
@@ -3824,8 +3904,10 @@ verify_markers_test (
                        cpl->file().get()
                        ).set_cpl_id(cpl->id())
                );
+       test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl));
+
        check_verify_result({dir}, {}, test_notes);
 }
 
@@ -3936,6 +4018,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -3976,6 +4059,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4016,6 +4100,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4057,6 +4142,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl->file().get(), 70
                                ).set_cpl_id(cpl->id()),
@@ -4099,6 +4185,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4139,6 +4226,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4180,6 +4268,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl->file().get(), 74
                                ).set_cpl_id(cpl->id()),
@@ -4223,6 +4312,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4264,6 +4354,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl->file().get(), 72
                                ).set_cpl_id(cpl->id()),
@@ -4307,6 +4398,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl->file().get(), 71
                                ).set_cpl_id(cpl->id()),
@@ -4348,6 +4440,7 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_cpl_with_encrypted_content)
                        ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path)
@@ -4401,6 +4494,7 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_encrypted_content)
                        ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -4457,6 +4551,7 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_unencrypted_content)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                });
@@ -4535,6 +4630,7 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -4643,6 +4739,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_resource_id)
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf)
                                ).set_cpl_id(cpl->id()),
@@ -4721,6 +4818,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id)
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf)
                                ).set_cpl_id(cpl->id()),
@@ -4757,6 +4855,7 @@ BOOST_AUTO_TEST_CASE (verify_threed_marked_as_twod)
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING,
                                dcp::VerificationNote::Code::THREED_ASSET_MARKED_AS_TWOD, boost::filesystem::canonical(find_file(path, "j2c"))
@@ -4794,6 +4893,7 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -4923,6 +5023,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4966,6 +5067,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -5015,6 +5117,7 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_pkl_asset_ids)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_PKL, pkl.id(), canonical(find_pkl(dir)) },
@@ -5052,6 +5155,7 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_assetmap_asset_ids)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
@@ -5141,6 +5245,7 @@ BOOST_AUTO_TEST_CASE(verify_mismatched_sound_channel_counts)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl),
@@ -5202,6 +5307,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_sound_configuration)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video1.mxf"), cpl),
@@ -5278,6 +5384,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
                        ).set_cpl_id(cpl->id()),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video.mxf"), cpl),
                ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+               ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
@@ -5331,6 +5438,7 @@ BOOST_AUTO_TEST_CASE(verify_too_many_subtitle_namespaces)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"feature"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"Dcp_FTR-1_F_XX-XX_MOS_2K_20230407_SMPTE_OV"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_42b34dcd-caa5-4c7b-aa0f-66a590947ba1.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_42b34dcd-caa5-4c7b-aa0f-66a590947ba1.mxf"), cpl),
@@ -5376,6 +5484,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font_for_font)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT_FOR_FONT).set_id("theFontId").set_cpl_id(cpl->id())
                });
@@ -5435,6 +5544,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -5474,6 +5584,7 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset)
                                string{"1998x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_MAP_ID).set_id(asset_1).set_other_id(asset_2)
                });
@@ -5504,6 +5615,7 @@ BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -5532,6 +5644,7 @@ BOOST_AUTO_TEST_CASE(verify_encrypted_smpte_dcp)
                {
                        ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl),
                        dcp::VerificationNote(