fixup: correct picture hash
authorCarl Hetherington <cth@carlh.net>
Sun, 14 Apr 2024 14:57:56 +0000 (16:57 +0200)
committerCarl Hetherington <cth@carlh.net>
Sun, 14 Apr 2024 15:22:08 +0000 (17:22 +0200)
test/verify_test.cc

index a762c5f9c86d43be9293a4b881684fcdfec099ec..56761770ecdfb735f1af5631c42c2bc3940050e2 100644 (file)
@@ -531,6 +531,7 @@ BOOST_AUTO_TEST_CASE (verify_failed_read_content_kind)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -579,6 +580,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_rate)
 
        std::vector<dcp::VerificationNote> expected =
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -641,6 +643,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_standard)
        auto cpl = std::make_shared<dcp::CPL>(cpl_path);
 
        std::vector<dcp::VerificationNote> expected = {
+                       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::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_STANDARD },
@@ -685,6 +688,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_id)
        auto cpl = std::make_shared<dcp::CPL>(cpl_path);
 
        std::vector<dcp::VerificationNote> expected = {
+                       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::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -709,6 +713,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_issue_date)
        auto cpl = std::make_shared<dcp::CPL>(cpl_path);
 
        std::vector<dcp::VerificationNote> expected = {
+                       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::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
@@ -737,6 +742,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_pkl_id)
        auto cpl = std::make_shared<dcp::CPL>(cpl_path);
 
        std::vector<dcp::VerificationNote> expected = {
+                       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::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -764,6 +770,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_asset_map_id)
        auto cpl = std::make_shared<dcp::CPL>(cpl_path);
 
        std::vector<dcp::VerificationNote> expected = {
+                       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::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -832,6 +839,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl),
                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl)
        };
 
@@ -859,6 +867,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration)
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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 },
                dcp::VerificationNote(
@@ -930,6 +939,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
        };
 
        for (auto i = 0; i < 24; ++i) {
@@ -977,6 +987,7 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
        auto cpl = dcp_from_frame (oversized_frame, dir);
 
        vector<dcp::VerificationNote> expected = {
+               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
        };
@@ -1022,6 +1033,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_picture_frame_size_in_bytes)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl),
@@ -1429,6 +1441,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl),
                        dcp::VerificationNote(
@@ -1587,6 +1600,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language3)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl),
@@ -1673,6 +1687,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::MATCHING_CPL_HASHES, 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)
        };
        check_verify_result(notes, expected);
@@ -1691,6 +1706,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::MATCHING_CPL_HASHES, 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(
                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_SIZE_IN_PIXELS, dcp::String::compose("%1x%2", width, height), canonical(dir / "video.mxf")
@@ -1712,6 +1728,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::MATCHING_CPL_HASHES, 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(
                        dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE, dcp::String::compose("%1/1", frame_rate * (three_d ? 2 : 1))
@@ -1737,6 +1754,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::MATCHING_CPL_HASHES, 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(
                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_4K, dcp::String::compose("%1/1", frame_rate), canonical(dir / "video.mxf")
@@ -1797,6 +1815,7 @@ BOOST_AUTO_TEST_CASE (verify_picture_size)
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D },
        };
@@ -1984,6 +2003,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language)
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf")
@@ -2028,6 +2048,8 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages)
                { path },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video0.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video0.mxf"), cpl),
@@ -2080,6 +2102,8 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed)
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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),
                        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),
                        dcp::VerificationNote(
@@ -2135,6 +2159,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -2194,6 +2219,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SUBTITLE_START_TIME, canonical(dir / "subs.mxf")
@@ -2963,6 +2989,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_sound_frame_rate)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SOUND_FRAME_RATE, string("96000"), canonical(dir / "audiofoo.mxf")
                                ).set_cpl_id(cpl->id()),
@@ -2997,6 +3024,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
@@ -3029,6 +3057,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISMATCHED_CPL_ANNOTATION_TEXT, canonical(cpl->file().get())
@@ -3069,6 +3098,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_DURATION
                                ).set_cpl_id(cpl->id()),
@@ -3149,6 +3179,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_MAIN_SUBTITLE_FROM_SOME_REELS
                                        ).set_cpl_id(cpl->id()),
@@ -3170,6 +3202,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3187,6 +3221,8 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3263,6 +3299,8 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS
                                        ).set_cpl_id(cpl->id()),
@@ -3283,6 +3321,8 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3300,6 +3340,8 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                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),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3348,6 +3390,7 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, code, subs->id()
@@ -3422,6 +3465,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
@@ -3455,6 +3499,7 @@ verify_markers_test (
                note.set_cpl_id(cpl->id());
        }
 
+       test_notes.push_back(ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl));
@@ -3558,6 +3603,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number)
                {dir},
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -3590,6 +3636,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3621,6 +3668,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3653,6 +3701,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3686,6 +3735,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3717,6 +3767,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3749,6 +3800,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3783,6 +3835,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3815,6 +3868,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3849,6 +3903,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), 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()),
@@ -3888,6 +3943,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_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)
@@ -3939,6 +3995,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_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -3985,6 +4042,7 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_unencrypted_content)
                {dir},
                {},
                {
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -4056,6 +4114,7 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED
@@ -4269,6 +4328,7 @@ BOOST_AUTO_TEST_CASE (verify_threed_marked_as_twod)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl),
                        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_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -4308,6 +4368,7 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
@@ -4343,6 +4404,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_content_kind)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
@@ -4376,6 +4438,7 @@ BOOST_AUTO_TEST_CASE(verify_valid_content_kind)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
@@ -4410,6 +4473,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
@@ -4450,6 +4514,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
@@ -4599,7 +4664,9 @@ BOOST_AUTO_TEST_CASE(verify_mismatched_sound_channel_counts)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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),
+                       ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video2.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "video2.mxf"), cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_CHANNEL_COUNTS, canonical(find_file(path, "audio2"))
@@ -4656,6 +4723,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_sound_configuration)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_SOUND_CONFIGURATION, std::string{"MainSoundConfiguration has 6 channels but sound assets have 2"}, canonical(find_cpl(path))
@@ -4716,6 +4784,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
 
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+               ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video.mxf"), cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC
@@ -4767,6 +4836,7 @@ BOOST_AUTO_TEST_CASE(verify_too_many_subtitle_namespaces)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE
@@ -4861,6 +4931,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT).set_id(reel_subs->id()).set_cpl_id(cpl->id())
                });
@@ -4913,6 +4984,7 @@ BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, 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(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_cpl_id(cpl->id())
                });