summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/combine_test.cc12
-rw-r--r--test/cpl_sar_test.cc4
-rw-r--r--test/data/text_formatter.txt8
-rw-r--r--test/data/text_formatter_windows.txt8
-rw-r--r--test/dcp_test.cc26
-rw-r--r--test/decryption_test.cc14
-rw-r--r--test/encryption_test.cc8
-rw-r--r--test/frame_info_hash_test.cc16
-rw-r--r--test/kdm_test.cc12
-rw-r--r--test/mca_test.cc3
-rw-r--r--test/mono_mpeg2_picture_read_test.cc62
-rw-r--r--test/mono_mpeg2_picture_write_test.cc101
-rw-r--r--test/recovery_test.cc16
-rw-r--r--test/ref/DCP/dcp_test1/ASSETMAP.xml2
-rw-r--r--test/ref/DCP/dcp_test1/audio.mxfbin881326 -> 881326 bytes
-rw-r--r--test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml4
-rw-r--r--test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml8
-rw-r--r--test/ref/DCP/dcp_test1/video.mxfbin49240 -> 31648 bytes
-rw-r--r--test/ref/DCP/dcp_test2/audio.mxfbin161326 -> 161326 bytes
-rw-r--r--test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml4
-rw-r--r--test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml6
-rw-r--r--test/ref/DCP/dcp_test2/video.mxfbin63160 -> 63160 bytes
-rw-r--r--test/ref/DCP/dcp_test5/audio.mxfbin161326 -> 161326 bytes
-rw-r--r--test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml4
-rw-r--r--test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml6
-rw-r--r--test/ref/DCP/dcp_test5/video.mxfbin40144 -> 40144 bytes
-rw-r--r--test/ref/DCP/dcp_test7/ASSETMAP2
-rw-r--r--test/ref/DCP/dcp_test7/audio.mxfbin881326 -> 881326 bytes
-rw-r--r--test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml4
-rw-r--r--test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml8
-rw-r--r--test/ref/DCP/dcp_test7/video.mxfbin49240 -> 31648 bytes
-rw-r--r--test/ref/DCP/encryption_test/audio.mxfbin165454 -> 165454 bytes
-rw-r--r--test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml18
-rw-r--r--test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml20
-rw-r--r--test/ref/DCP/encryption_test/video.mxfbin44008 -> 44008 bytes
-rw-r--r--test/round_trip_test.cc14
-rw-r--r--test/shared_subtitle_test.cc12
-rw-r--r--test/stream_operators.cc3
-rw-r--r--test/test.cc30
-rw-r--r--test/test.h4
-rw-r--r--test/verify_report_test.cc67
-rw-r--r--test/verify_test.cc2816
-rw-r--r--test/wscript9
43 files changed, 2713 insertions, 618 deletions
diff --git a/test/combine_test.cc b/test/combine_test.cc
index 12cbb6e2..a5f6a57f 100644
--- a/test/combine_test.cc
+++ b/test/combine_test.cc
@@ -87,10 +87,12 @@ check_no_errors (boost::filesystem::path path)
{
vector<boost::filesystem::path> directories;
directories.push_back (path);
- auto notes = dcp::verify(directories, {}, &stage, &progress, {}, xsd_test);
+ auto notes = dcp::verify(directories, {}, &stage, &progress, {}, xsd_test).notes;
vector<dcp::VerificationNote> filtered_notes;
std::copy_if (notes.begin(), notes.end(), std::back_inserter(filtered_notes), [](dcp::VerificationNote const& i) {
- return i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && i.code() != dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION;
+ return i.type() != dcp::VerificationNote::Type::OK &&
+ i.code() != dcp::VerificationNote::Code::INVALID_STANDARD &&
+ i.code() != dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION;
});
dump_notes (filtered_notes);
BOOST_CHECK (filtered_notes.empty());
@@ -475,10 +477,12 @@ BOOST_AUTO_TEST_CASE(combine_multi_reel_subtitles)
check_combined({in}, out);
- auto notes = dcp::verify({out}, {}, &stage, &progress, {}, xsd_test);
+ auto notes = dcp::verify({out}, {}, &stage, &progress, {}, xsd_test).notes;
vector<dcp::VerificationNote> filtered_notes;
std::copy_if(notes.begin(), notes.end(), std::back_inserter(filtered_notes), [](dcp::VerificationNote const& i) {
- return i.code() != dcp::VerificationNote::Code::INVALID_STANDARD && i.code() != dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL;
+ return i.type() != dcp::VerificationNote::Type::OK &&
+ i.code() != dcp::VerificationNote::Code::INVALID_STANDARD &&
+ i.code() != dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL;
});
dump_notes(filtered_notes);
BOOST_CHECK(filtered_notes.empty());
diff --git a/test/cpl_sar_test.cc b/test/cpl_sar_test.cc
index 0ecc87e0..ab1ef182 100644
--- a/test/cpl_sar_test.cc
+++ b/test/cpl_sar_test.cc
@@ -33,7 +33,7 @@
#include "cpl.h"
-#include "mono_picture_asset.h"
+#include "mono_j2k_picture_asset.h"
#include "reel_mono_picture_asset.h"
#include "warnings.h"
#include <libcxml/cxml.h>
@@ -68,7 +68,7 @@ check (shared_ptr<dcp::ReelMonoPictureAsset> pa, dcp::Fraction frac, string sar)
BOOST_AUTO_TEST_CASE (cpl_sar)
{
auto pa = make_shared<dcp::ReelMonoPictureAsset>(
- make_shared<dcp::MonoPictureAsset>("test/ref/DCP/dcp_test1/video.mxf"), 0
+ make_shared<dcp::MonoJ2KPictureAsset>("test/ref/DCP/dcp_test1/video.mxf"), 0
);
/* Easy ones */
diff --git a/test/data/text_formatter.txt b/test/data/text_formatter.txt
new file mode 100644
index 00000000..8861db99
--- /dev/null
+++ b/test/data/text_formatter.txt
@@ -0,0 +1,8 @@
+Heading
+
+Subheading
+ * Foo
+ * Bar
+ * Fred
+ * Jim
+ * Sheila
diff --git a/test/data/text_formatter_windows.txt b/test/data/text_formatter_windows.txt
new file mode 100644
index 00000000..16d78d84
--- /dev/null
+++ b/test/data/text_formatter_windows.txt
@@ -0,0 +1,8 @@
+Heading
+
+Subheading
+ * Foo
+ * Bar
+ * Fred
+ * Jim
+ * Sheila
diff --git a/test/dcp_test.cc b/test/dcp_test.cc
index 5456092c..63de990f 100644
--- a/test/dcp_test.cc
+++ b/test/dcp_test.cc
@@ -38,8 +38,8 @@
#include "dcp.h"
#include "equality_options.h"
#include "metadata.h"
-#include "mono_picture_asset.h"
-#include "picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
+#include "j2k_picture_asset_writer.h"
#include "reel.h"
#include "reel_atmos_asset.h"
#include "reel_markers_asset.h"
@@ -49,7 +49,7 @@
#include "reel_stereo_picture_asset.h"
#include "sound_asset.h"
#include "sound_asset_writer.h"
-#include "stereo_picture_asset.h"
+#include "stereo_j2k_picture_asset.h"
#include "test.h"
#include <asdcp/KM_util.h>
#include <sndfile.h>
@@ -105,9 +105,9 @@ BOOST_AUTO_TEST_CASE (dcp_test2)
cpl->set_issue_date ("2012-07-17T04:45:18+00:00");
cpl->set_annotation_text ("A Test DCP");
- auto mp = make_shared<dcp::StereoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto mp = make_shared<dcp::StereoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
mp->set_metadata (mxf_meta);
- auto picture_writer = mp->start_write("build/test/DCP/dcp_test2/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto picture_writer = mp->start_write("build/test/DCP/dcp_test2/video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData j2c ("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
/* Left */
@@ -203,10 +203,10 @@ test_rewriting_sound(string name, bool modify)
dcp::DCP B ("build/test/" + name);
auto reel = make_shared<dcp::Reel>();
- BOOST_REQUIRE (A_picture->mono_asset());
- BOOST_REQUIRE (A_picture->mono_asset()->file());
- copy_file (A_picture->mono_asset()->file().get(), path("build") / "test" / name / picture);
- reel->add(make_shared<dcp::ReelMonoPictureAsset>(make_shared<dcp::MonoPictureAsset>(path("build") / "test" / name / picture), 0));
+ BOOST_REQUIRE(A_picture->mono_j2k_asset());
+ BOOST_REQUIRE(A_picture->mono_j2k_asset()->file());
+ copy_file(A_picture->mono_j2k_asset()->file().get(), path("build") / "test" / name / picture);
+ reel->add(make_shared<dcp::ReelMonoPictureAsset>(make_shared<dcp::MonoJ2KPictureAsset>(path("build") / "test" / name / picture), 0));
auto reader = A_sound->asset()->start_read();
auto sound = make_shared<dcp::SoundAsset>(A_sound->asset()->edit_rate(), A_sound->asset()->sampling_rate(), A_sound->asset()->channels(), dcp::LanguageTag("en-US"), dcp::Standard::SMPTE);
@@ -290,9 +290,9 @@ BOOST_AUTO_TEST_CASE (dcp_test5)
cpl->set_issue_date ("2012-07-17T04:45:18+00:00");
cpl->set_annotation_text ("A Test DCP");
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
mp->set_metadata (mxf_meta);
- auto picture_writer = mp->start_write("build/test/DCP/dcp_test5/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto picture_writer = mp->start_write("build/test/DCP/dcp_test5/video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData j2c ("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
picture_writer->write (j2c.data (), j2c.size ());
@@ -510,8 +510,8 @@ BOOST_AUTO_TEST_CASE(hashes_preserved_when_loading_corrupted_dcp)
auto dcp = make_simple(dir / "1");
dcp->write_xml();
- auto asset_1_id = dcp::MonoPictureAsset(dir / "1" / "video.mxf").id();
- auto asset_1_hash = dcp::MonoPictureAsset(dir / "1" / "video.mxf").hash();
+ auto asset_1_id = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").id();
+ auto asset_1_hash = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").hash();
/* Replace the hash in the CPL (the one that corresponds to the actual file)
* with an incorrect one new_hash.
diff --git a/test/decryption_test.cc b/test/decryption_test.cc
index 8f3dbff7..1aadc461 100644
--- a/test/decryption_test.cc
+++ b/test/decryption_test.cc
@@ -36,11 +36,11 @@
#include "dcp.h"
#include "decrypted_kdm.h"
#include "encrypted_kdm.h"
-#include "mono_picture_asset.h"
-#include "mono_picture_asset_reader.h"
-#include "mono_picture_frame.h"
+#include "mono_j2k_picture_asset.h"
+#include "mono_j2k_picture_asset_reader.h"
+#include "mono_j2k_picture_frame.h"
#include "openjpeg_image.h"
-#include "picture_asset_writer.h"
+#include "j2k_picture_asset_writer.h"
#include "reel.h"
#include "reel_file_asset.h"
#include "reel_mono_picture_asset.h"
@@ -80,7 +80,7 @@ get_frame (dcp::DCP const & dcp)
auto picture = reel->main_picture()->asset();
BOOST_CHECK (picture);
- auto mono_picture = dynamic_pointer_cast<const dcp::MonoPictureAsset>(picture);
+ auto mono_picture = dynamic_pointer_cast<const dcp::MonoJ2KPictureAsset>(picture);
auto reader = mono_picture->start_read();
auto j2k_frame = reader->get_frame(0);
auto xyz = j2k_frame->xyz_image();
@@ -152,10 +152,10 @@ BOOST_AUTO_TEST_CASE (decryption_test2)
auto context_id = dcp::make_uuid();
dcp::Key key;
- auto picture_asset = std::make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
+ auto picture_asset = std::make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
picture_asset->set_key (key);
picture_asset->set_context_id (context_id);
- auto picture_writer = picture_asset->start_write(dir / "picture.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto picture_writer = picture_asset->start_write(dir / "picture.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData picture("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
picture_writer->write(picture);
diff --git a/test/encryption_test.cc b/test/encryption_test.cc
index 358a3fd9..a927a5df 100644
--- a/test/encryption_test.cc
+++ b/test/encryption_test.cc
@@ -37,8 +37,8 @@
#include "certificate_chain.h"
#include "cpl.h"
#include "filesystem.h"
-#include "mono_picture_asset.h"
-#include "picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
+#include "j2k_picture_asset_writer.h"
#include "sound_asset_writer.h"
#include "sound_asset.h"
#include "reel.h"
@@ -90,11 +90,11 @@ BOOST_AUTO_TEST_CASE (encryption_test)
dcp::Key key;
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
mp->set_metadata (mxf_metadata);
mp->set_key (key);
- auto writer = mp->start_write("build/test/DCP/encryption_test/video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto writer = mp->start_write("build/test/DCP/encryption_test/video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData j2c ("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
writer->write (j2c.data (), j2c.size ());
diff --git a/test/frame_info_hash_test.cc b/test/frame_info_hash_test.cc
index c19172c6..331eabf1 100644
--- a/test/frame_info_hash_test.cc
+++ b/test/frame_info_hash_test.cc
@@ -33,8 +33,8 @@
#include "j2k_transcode.h"
-#include "mono_picture_asset.h"
-#include "mono_picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
+#include "mono_j2k_picture_asset_writer.h"
#include "openjpeg_image.h"
#include <boost/random.hpp>
#include <boost/test/unit_test.hpp>
@@ -47,7 +47,7 @@ using std::string;
static void
-check (shared_ptr<dcp::PictureAssetWriter> writer, boost::random::uniform_int_distribution<>& dist, boost::random::mt19937& rng, string hash)
+check (shared_ptr<dcp::J2KPictureAssetWriter> writer, boost::random::uniform_int_distribution<>& dist, boost::random::mt19937& rng, string hash)
{
auto xyz = make_shared<dcp::OpenJPEGImage>(dcp::Size(1998, 1080));
for (int c = 0; c < 3; ++c) {
@@ -66,14 +66,14 @@ check (shared_ptr<dcp::PictureAssetWriter> writer, boost::random::uniform_int_di
/** Test the hashing of data written to JPEG2000 MXFs with some random inputs */
BOOST_AUTO_TEST_CASE (frame_info_hash_test)
{
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
- auto writer = mp->start_write("build/test/frame_info_hash_test.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto writer = mp->start_write("build/test/frame_info_hash_test.mxf", dcp::Behaviour::MAKE_NEW);
boost::random::mt19937 rng(1);
boost::random::uniform_int_distribution<> dist(0, 4095);
/* Check a few random frames */
- check(writer, dist, rng, "a9e772602a2fd3135d940cfd727ab8ff");
- check(writer, dist, rng, "b075369922e42b23e1852a586ec43224");
- check(writer, dist, rng, "402395e76152db05b03c8f24ddfd7732");
+ check(writer, dist, rng, "8f3dc7321d6dff3d5691011de31fc713");
+ check(writer, dist, rng, "a305b83a40367fda1b5cf0efa096fd18");
+ check(writer, dist, rng, "1abc71e011ced46d9928a4b2d22e20f6");
}
diff --git a/test/kdm_test.cc b/test/kdm_test.cc
index 6f06b4c9..75a6019e 100644
--- a/test/kdm_test.cc
+++ b/test/kdm_test.cc
@@ -36,8 +36,8 @@
#include "cpl.h"
#include "decrypted_kdm.h"
#include "encrypted_kdm.h"
-#include "mono_picture_asset.h"
-#include "picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
+#include "j2k_picture_asset_writer.h"
#include "reel.h"
#include "reel_mono_picture_asset.h"
#include "reel_sound_asset.h"
@@ -256,9 +256,9 @@ BOOST_AUTO_TEST_CASE (validity_period_test1)
auto signer = make_shared<dcp::CertificateChain>(dcp::file_to_string("test/data/certificate_chain"));
signer->set_key(dcp::file_to_string("test/data/private.key"));
- auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
+ auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
asset->set_key (dcp::Key());
- auto writer = asset->start_write("build/test/validity_period_test1.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto writer = asset->start_write("build/test/validity_period_test1.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData frame ("test/data/flat_red.j2c");
writer->write (frame.data(), frame.size());
writer->finalize ();
@@ -320,7 +320,7 @@ BOOST_AUTO_TEST_CASE (vf_kdm_test)
ov->write_xml ();
auto ov_reel = ov->cpls()[0]->reels()[0];
- auto ov_reel_picture = make_shared<dcp::ReelMonoPictureAsset>(dynamic_pointer_cast<dcp::ReelMonoPictureAsset>(ov_reel->main_picture())->mono_asset(), 0);
+ auto ov_reel_picture = make_shared<dcp::ReelMonoPictureAsset>(dynamic_pointer_cast<dcp::ReelMonoPictureAsset>(ov_reel->main_picture())->mono_j2k_asset(), 0);
auto ov_reel_sound = make_shared<dcp::ReelSoundAsset>(ov_reel->main_sound()->asset(), 0);
/* Make VF */
@@ -376,7 +376,7 @@ BOOST_AUTO_TEST_CASE (vf_kdm_test)
BOOST_REQUIRE_EQUAL(reload_vf.cpls()[0]->reels().size(), 1U);
BOOST_REQUIRE(reload_vf.cpls()[0]->reels()[0]->main_picture());
BOOST_REQUIRE(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset());
- auto mono_asset = dynamic_pointer_cast<dcp::MonoPictureAsset>(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset());
+ auto mono_asset = dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(reload_vf.cpls()[0]->reels()[0]->main_picture()->asset());
BOOST_REQUIRE(mono_asset);
auto reader = mono_asset->start_read();
reader->set_check_hmac(false);
diff --git a/test/mca_test.cc b/test/mca_test.cc
index bdfc9484..1cd95732 100644
--- a/test/mca_test.cc
+++ b/test/mca_test.cc
@@ -168,7 +168,8 @@ check_mca_descriptors(int suffix, vector<dcp::Channel> extra_active_channels, ve
/* Check MXF */
- auto reader = new ASDCP::PCM::MXFReader();
+ Kumu::FileReaderFactory factory;
+ auto reader = new ASDCP::PCM::MXFReader(factory);
reader->OpenRead(boost::filesystem::path(dir / "mxf.mxf").string());
list<ASDCP::MXF::InterchangeObject*> channels;
diff --git a/test/mono_mpeg2_picture_read_test.cc b/test/mono_mpeg2_picture_read_test.cc
new file mode 100644
index 00000000..f0d4aac0
--- /dev/null
+++ b/test/mono_mpeg2_picture_read_test.cc
@@ -0,0 +1,62 @@
+/*
+ Copyright (C) 2023 Carl Hetherington <cth@carlh.net>
+
+ This file is part of libdcp.
+
+ libdcp is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ libdcp is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libdcp. If not, see <http://www.gnu.org/licenses/>.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of portions of this program with the
+ OpenSSL library under certain conditions as described in each
+ individual source file, and distribute linked combinations
+ including the two.
+
+ You must obey the GNU General Public License in all respects
+ for all of the code used other than OpenSSL. If you modify
+ file(s) with this exception, you may extend this exception to your
+ version of the file(s), but you are not obligated to do so. If you
+ do not wish to do so, delete this exception statement from your
+ version. If you delete this exception statement from all source
+ files in the program, then also delete it here.
+*/
+
+
+#include "mono_mpeg2_picture_asset.h"
+#include "mpeg2_transcode.h"
+#include "test.h"
+#include <boost/test/unit_test.hpp>
+
+extern "C" {
+#include <libavcodec/avcodec.h>
+}
+
+
+BOOST_AUTO_TEST_CASE(mpeg_mono_picture_read_test)
+{
+ dcp::MonoMPEG2PictureAsset asset(private_test / "data" / "mas" / "r2.mxf" );
+ std::cout << "frame rate " << asset.frame_rate().numerator << "\n";
+ std::cout << "duration " << asset.intrinsic_duration() << "\n";
+
+ auto reader = asset.start_read();
+
+ dcp::MPEG2Decompressor decompressor;
+ for (auto i = 0; i < asset.intrinsic_duration(); ++i) {
+ auto images = decompressor.decompress_frame(reader->get_frame(i));
+ BOOST_CHECK_EQUAL(images.size(), i == 0 ? 0U : 1U);
+ }
+
+ auto images = decompressor.flush();
+ BOOST_CHECK_EQUAL(images.size(), 1U);
+}
+
diff --git a/test/mono_mpeg2_picture_write_test.cc b/test/mono_mpeg2_picture_write_test.cc
new file mode 100644
index 00000000..44ce5ae4
--- /dev/null
+++ b/test/mono_mpeg2_picture_write_test.cc
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2023 Carl Hetherington <cth@carlh.net>
+
+ This file is part of libdcp.
+
+ libdcp is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ libdcp is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with libdcp. If not, see <http://www.gnu.org/licenses/>.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of portions of this program with the
+ OpenSSL library under certain conditions as described in each
+ individual source file, and distribute linked combinations
+ including the two.
+
+ You must obey the GNU General Public License in all respects
+ for all of the code used other than OpenSSL. If you modify
+ file(s) with this exception, you may extend this exception to your
+ version of the file(s), but you are not obligated to do so. If you
+ do not wish to do so, delete this exception statement from your
+ version. If you delete this exception statement from all source
+ files in the program, then also delete it here.
+*/
+
+
+#include "mono_mpeg2_picture_asset.h"
+#include "mpeg2_transcode.h"
+#include "test.h"
+#include <boost/test/unit_test.hpp>
+
+extern "C" {
+#include <libavcodec/avcodec.h>
+}
+
+
+BOOST_AUTO_TEST_CASE(mpeg_mono_picture_write_test)
+{
+ boost::filesystem::path dir = "build/test/mpeg2_mono_picture_write_test";
+
+ boost::system::error_code ec;
+ boost::filesystem::remove_all(dir);
+ boost::filesystem::create_directories(dir);
+
+ dcp::MonoMPEG2PictureAsset asset(dcp::Fraction{24, 1});
+ auto writer = asset.start_write(dir / "test.mxf", dcp::Behaviour::MAKE_NEW);
+
+ dcp::MPEG2Compressor compressor({1920, 1080}, 24, 50000000);
+ dcp::FFmpegImage image(int64_t(0));
+ for (auto y = 0; y < 1080; ++y) {
+ uint8_t* py = image.y() + y * image.y_stride();
+ for (auto x = 0; x < 1920; ++x) {
+ if (x < 640) {
+ *py++ = 76;
+ } else if (x < 1280) {
+ *py++ = 149;
+ } else {
+ *py++ = 29;
+ }
+ }
+ }
+
+ for (auto y = 0; y < 540; ++y) {
+ uint8_t* pu = image.u() + y * image.u_stride();
+ uint8_t* pv = image.v() + y * image.v_stride();
+ for (auto x = 0; x < 960; ++x) {
+ if (x < 320) {
+ *pu++ = 84;
+ *pv++ = 255;
+ } else if (x < 640) {
+ *pu++ = 43;
+ *pv++ = 21;
+ } else {
+ *pu++ = 255;
+ *pv++ = 107;
+ }
+ }
+ }
+
+ for (auto i = 0; i < 24; ++i) {
+ image.set_pts(int64_t(i));
+ if (auto compressed = compressor.compress_frame(image)) {
+ writer->write(compressed->first->data(), compressed->first->size());
+ }
+ }
+
+ if (auto compressed = compressor.flush()) {
+ writer->write(compressed->first->data(), compressed->first->size());
+ }
+
+ writer->finalize();
+}
+
diff --git a/test/recovery_test.cc b/test/recovery_test.cc
index eaf34f81..327c248a 100644
--- a/test/recovery_test.cc
+++ b/test/recovery_test.cc
@@ -32,8 +32,8 @@
*/
-#include "mono_picture_asset_writer.h"
-#include "mono_picture_asset.h"
+#include "mono_j2k_picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
#include "test.h"
#include <asdcp/KM_util.h>
#include <boost/filesystem.hpp>
@@ -55,10 +55,10 @@ BOOST_AUTO_TEST_CASE (recovery)
boost::filesystem::remove_all ("build/test/baz");
boost::filesystem::create_directories ("build/test/baz");
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
- auto writer = mp->start_write("build/test/baz/video1.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto writer = mp->start_write("build/test/baz/video1.mxf", dcp::Behaviour::MAKE_NEW);
- int written_size = 0;
+ uint64_t written_size = 0;
for (int i = 0; i < 24; ++i) {
auto info = writer->write (data.data(), data.size());
BOOST_CHECK_EQUAL (info.hash, "c3c9a3adec09baf2b0bcb65806fbeac8");
@@ -82,13 +82,13 @@ BOOST_AUTO_TEST_CASE (recovery)
Kumu::ResetTestRNG ();
- mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
- writer = mp->start_write("build/test/baz/video2.mxf", dcp::PictureAsset::Behaviour::OVERWRITE_EXISTING);
+ mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ writer = mp->start_write("build/test/baz/video2.mxf", dcp::Behaviour::OVERWRITE_EXISTING);
writer->write (data.data(), data.size());
for (int i = 1; i < 4; ++i) {
- writer->fake_write (written_size);
+ writer->fake_write(dcp::J2KFrameInfo{0, written_size, "xxx"});
}
for (int i = 4; i < 24; ++i) {
diff --git a/test/ref/DCP/dcp_test1/ASSETMAP.xml b/test/ref/DCP/dcp_test1/ASSETMAP.xml
index 4e0d1e5a..dc811f79 100644
--- a/test/ref/DCP/dcp_test1/ASSETMAP.xml
+++ b/test/ref/DCP/dcp_test1/ASSETMAP.xml
@@ -37,7 +37,7 @@
<Path>video.mxf</Path>
<VolumeIndex>1</VolumeIndex>
<Offset>0</Offset>
- <Length>49240</Length>
+ <Length>31648</Length>
</Chunk>
</ChunkList>
</Asset>
diff --git a/test/ref/DCP/dcp_test1/audio.mxf b/test/ref/DCP/dcp_test1/audio.mxf
index 5e08f74f..1f5f7987 100644
--- a/test/ref/DCP/dcp_test1/audio.mxf
+++ b/test/ref/DCP/dcp_test1/audio.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
index 15cda9a1..26d41070 100644
--- a/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
+++ b/test/ref/DCP/dcp_test1/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
@@ -37,7 +37,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash>
+ <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash>
<FrameRate>24 1</FrameRate>
<ScreenAspectRatio>1998 1080</ScreenAspectRatio>
</MainPicture>
@@ -47,7 +47,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash>
+ <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash>
</MainSound>
<meta:CompositionMetadataAsset xmlns:meta="http://www.smpte-ra.org/schemas/429-16/2014/CPL-Metadata">
<Id>urn:uuid:dd015243-ab77-435c-a13d-690566885121</Id>
diff --git a/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml b/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
index cedbb15b..6a1392f3 100644
--- a/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
+++ b/test/ref/DCP/dcp_test1/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
@@ -9,7 +9,7 @@
<Asset>
<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id>
<AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText>
- <Hash>tfX1mVIKJCVr1m7Y32Nzxf0+Rpw=</Hash>
+ <Hash>skI+5b/9LA/y6h0mcyxysJYanxI=</Hash>
<Size>8559</Size>
<Type>text/xml</Type>
<OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName>
@@ -17,15 +17,15 @@
<Asset>
<Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id>
<AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText>
- <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash>
- <Size>49240</Size>
+ <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash>
+ <Size>31648</Size>
<Type>application/mxf</Type>
<OriginalFileName>video.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id>
<AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText>
- <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash>
+ <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash>
<Size>881326</Size>
<Type>application/mxf</Type>
<OriginalFileName>audio.mxf</OriginalFileName>
diff --git a/test/ref/DCP/dcp_test1/video.mxf b/test/ref/DCP/dcp_test1/video.mxf
index 27ba41cf..cd0e43af 100644
--- a/test/ref/DCP/dcp_test1/video.mxf
+++ b/test/ref/DCP/dcp_test1/video.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test2/audio.mxf b/test/ref/DCP/dcp_test2/audio.mxf
index e8bd446f..6a95baf3 100644
--- a/test/ref/DCP/dcp_test2/audio.mxf
+++ b/test/ref/DCP/dcp_test2/audio.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
index 52a7779a..0e233325 100644
--- a/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
+++ b/test/ref/DCP/dcp_test2/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
@@ -22,7 +22,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>NzWhEbTccUIh1sSXIbU+8POVui0=</Hash>
+ <Hash>X+4lOvviLTQeP28hyzhCOGjraiE=</Hash>
</MainSound>
<msp-cpl:MainStereoscopicPicture xmlns:msp-cpl="http://www.smpte-ra.org/schemas/429-10/2008/Main-Stereo-Picture-CPL">
<Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id>
@@ -30,7 +30,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>BUpeFS6X9j+X0z2TZWSsLMT4pE0=</Hash>
+ <Hash>dU+tcR6bZ5BQ/TXKtBY03ejjUmc=</Hash>
<FrameRate>48 1</FrameRate>
<ScreenAspectRatio>1998 1080</ScreenAspectRatio>
</msp-cpl:MainStereoscopicPicture>
diff --git a/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml b/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml
index 061e8a6a..794cfb85 100644
--- a/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml
+++ b/test/ref/DCP/dcp_test2/pkl_8577c7c0-be29-4eb5-a449-1e3870a42bbd.xml
@@ -9,7 +9,7 @@
<Asset>
<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id>
<AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText>
- <Hash>zaAcrAcv0oOzOa3etTP6xDfzQko=</Hash>
+ <Hash>2jp5+JDLOh5CqzQ8goZTzBEWsPo=</Hash>
<Size>1686</Size>
<Type>text/xml</Type>
<OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName>
@@ -17,7 +17,7 @@
<Asset>
<Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id>
<AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText>
- <Hash>BUpeFS6X9j+X0z2TZWSsLMT4pE0=</Hash>
+ <Hash>dU+tcR6bZ5BQ/TXKtBY03ejjUmc=</Hash>
<Size>63160</Size>
<Type>application/mxf</Type>
<OriginalFileName>video.mxf</OriginalFileName>
@@ -25,7 +25,7 @@
<Asset>
<Id>urn:uuid:fc843acc-1ad9-4808-b9ed-33f5319e047d</Id>
<AnnotationText>fc843acc-1ad9-4808-b9ed-33f5319e047d</AnnotationText>
- <Hash>NzWhEbTccUIh1sSXIbU+8POVui0=</Hash>
+ <Hash>X+4lOvviLTQeP28hyzhCOGjraiE=</Hash>
<Size>161326</Size>
<Type>application/mxf</Type>
<OriginalFileName>audio.mxf</OriginalFileName>
diff --git a/test/ref/DCP/dcp_test2/video.mxf b/test/ref/DCP/dcp_test2/video.mxf
index 3b670708..6200297c 100644
--- a/test/ref/DCP/dcp_test2/video.mxf
+++ b/test/ref/DCP/dcp_test2/video.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test5/audio.mxf b/test/ref/DCP/dcp_test5/audio.mxf
index 947865e1..fc55b975 100644
--- a/test/ref/DCP/dcp_test5/audio.mxf
+++ b/test/ref/DCP/dcp_test5/audio.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
index 5fa3643b..0dbd0198 100644
--- a/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
+++ b/test/ref/DCP/dcp_test5/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
@@ -22,7 +22,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>o3VmpdFsNUgF11oadcaGJ/IfO0M=</Hash>
+ <Hash>w7xIWU3Q+QnEQMq7BcOhsWO+OU0=</Hash>
<FrameRate>24 1</FrameRate>
<ScreenAspectRatio>1998 1080</ScreenAspectRatio>
</MainPicture>
@@ -32,7 +32,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>l+XLgxe2fMZDgY+0QYzDfGhvTQM=</Hash>
+ <Hash>5ANfi1KoyGiZ8hQIhDHm5f/OvQY=</Hash>
</MainSound>
<axd:AuxData xmlns:axd="http://www.dolby.com/schemas/2012/AD">
<Id>urn:uuid:b68febcc-5ddf-489a-84a7-924f29fa2afd</Id>
diff --git a/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml b/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml
index 49fd579b..e9b1e802 100644
--- a/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml
+++ b/test/ref/DCP/dcp_test5/pkl_d76fdaaf-8316-42dc-a87e-1719ad6ca3ca.xml
@@ -9,7 +9,7 @@
<Asset>
<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id>
<AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText>
- <Hash>eqEIVxSAbJL+SROmqrDHbr9sb+A=</Hash>
+ <Hash>4zHV3/AhGYo5WjNmyuxeRSPOVwk=</Hash>
<Size>2024</Size>
<Type>text/xml</Type>
<OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName>
@@ -17,7 +17,7 @@
<Asset>
<Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id>
<AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText>
- <Hash>o3VmpdFsNUgF11oadcaGJ/IfO0M=</Hash>
+ <Hash>w7xIWU3Q+QnEQMq7BcOhsWO+OU0=</Hash>
<Size>40144</Size>
<Type>application/mxf</Type>
<OriginalFileName>video.mxf</OriginalFileName>
@@ -25,7 +25,7 @@
<Asset>
<Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id>
<AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText>
- <Hash>l+XLgxe2fMZDgY+0QYzDfGhvTQM=</Hash>
+ <Hash>5ANfi1KoyGiZ8hQIhDHm5f/OvQY=</Hash>
<Size>161326</Size>
<Type>application/mxf</Type>
<OriginalFileName>audio.mxf</OriginalFileName>
diff --git a/test/ref/DCP/dcp_test5/video.mxf b/test/ref/DCP/dcp_test5/video.mxf
index f3e7588b..3ec65a51 100644
--- a/test/ref/DCP/dcp_test5/video.mxf
+++ b/test/ref/DCP/dcp_test5/video.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test7/ASSETMAP b/test/ref/DCP/dcp_test7/ASSETMAP
index 86a6ff6a..e52b4b11 100644
--- a/test/ref/DCP/dcp_test7/ASSETMAP
+++ b/test/ref/DCP/dcp_test7/ASSETMAP
@@ -37,7 +37,7 @@
<Path>video.mxf</Path>
<VolumeIndex>1</VolumeIndex>
<Offset>0</Offset>
- <Length>49240</Length>
+ <Length>31648</Length>
</Chunk>
</ChunkList>
</Asset>
diff --git a/test/ref/DCP/dcp_test7/audio.mxf b/test/ref/DCP/dcp_test7/audio.mxf
index 5e08f74f..1f5f7987 100644
--- a/test/ref/DCP/dcp_test7/audio.mxf
+++ b/test/ref/DCP/dcp_test7/audio.mxf
Binary files differ
diff --git a/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
index b73ef84c..13aecd8a 100644
--- a/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
+++ b/test/ref/DCP/dcp_test7/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
@@ -37,7 +37,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash>
+ <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash>
<FrameRate>24 1</FrameRate>
<ScreenAspectRatio>1.85</ScreenAspectRatio>
</MainPicture>
@@ -47,7 +47,7 @@
<IntrinsicDuration>24</IntrinsicDuration>
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
- <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash>
+ <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash>
</MainSound>
</AssetList>
</Reel>
diff --git a/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml b/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
index 4180eb8d..9d251109 100644
--- a/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
+++ b/test/ref/DCP/dcp_test7/pkl_d199d58b-5ef8-4d49-b270-07e590ccb280.xml
@@ -9,7 +9,7 @@
<Asset>
<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id>
<AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText>
- <Hash>Vsre14v3AhK6X2gUzeYF9G8GKo0=</Hash>
+ <Hash>SgCEvehTaji0MCWOJTVioOcNndY=</Hash>
<Size>1965</Size>
<Type>text/xml;asdcpKind=CPL</Type>
<OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName>
@@ -17,15 +17,15 @@
<Asset>
<Id>urn:uuid:5407b210-4441-4e97-8b16-8bdc7c12da54</Id>
<AnnotationText>5407b210-4441-4e97-8b16-8bdc7c12da54</AnnotationText>
- <Hash>wUmt8G+cFFKMGt0ueS9+F1S4uhc=</Hash>
- <Size>49240</Size>
+ <Hash>vsVjRV9vhTBPUWfE/TT1o2vdQsI=</Hash>
+ <Size>31648</Size>
<Type>application/x-smpte-mxf;asdcpKind=Picture</Type>
<OriginalFileName>video.mxf</OriginalFileName>
</Asset>
<Asset>
<Id>urn:uuid:97f0f352-5b77-48ee-a558-9df37717f4fa</Id>
<AnnotationText>97f0f352-5b77-48ee-a558-9df37717f4fa</AnnotationText>
- <Hash>KcJb7S2K5cNm8RG4kfQD5FTeS0A=</Hash>
+ <Hash>3M7YTgvFKXXMEGLkIbV4miC90FE=</Hash>
<Size>881326</Size>
<Type>application/x-smpte-mxf;asdcpKind=Sound</Type>
<OriginalFileName>audio.mxf</OriginalFileName>
diff --git a/test/ref/DCP/dcp_test7/video.mxf b/test/ref/DCP/dcp_test7/video.mxf
index 27ba41cf..cd0e43af 100644
--- a/test/ref/DCP/dcp_test7/video.mxf
+++ b/test/ref/DCP/dcp_test7/video.mxf
Binary files differ
diff --git a/test/ref/DCP/encryption_test/audio.mxf b/test/ref/DCP/encryption_test/audio.mxf
index a4f89ae9..505b7f13 100644
--- a/test/ref/DCP/encryption_test/audio.mxf
+++ b/test/ref/DCP/encryption_test/audio.mxf
Binary files differ
diff --git a/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml b/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
index e8e24467..6203c884 100644
--- a/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
+++ b/test/ref/DCP/encryption_test/cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml
@@ -23,7 +23,7 @@
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
<KeyId>urn:uuid:ac8d301c-e5d9-4343-b6f3-ba2668adbe56</KeyId>
- <Hash>AVtX8wz76uG2Uw0Qbc9+DKnHUfw=</Hash>
+ <Hash>Q0GMntXvEqVQsiv+YkfhMrXdw0w=</Hash>
<FrameRate>24 1</FrameRate>
<ScreenAspectRatio>1998 1080</ScreenAspectRatio>
</MainPicture>
@@ -34,7 +34,7 @@
<EntryPoint>0</EntryPoint>
<Duration>24</Duration>
<KeyId>urn:uuid:7ab6c77b-6648-44b9-8549-a5290ada6238</KeyId>
- <Hash>3o02UpYqrl6w0NQbFvrB2tKxaIk=</Hash>
+ <Hash>v0SCdh2xnKNzGC7Sk5pS2q5Q/wQ=</Hash>
</MainSound>
</AssetList>
</Reel>
@@ -57,15 +57,15 @@
<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
- <dsig:DigestValue>X3YkODMLyEJsAz5v3S/uT+xDD7c=</dsig:DigestValue>
+ <dsig:DigestValue>DBBENxFb5Qv377fb86n0KgUQ7go=</dsig:DigestValue>
</dsig:Reference>
</dsig:SignedInfo>
- <dsig:SignatureValue>jH02vGxlTTi9T94KCIfMkafmdO0wluP9cvh+u5HyYoZo/D7O1Ki202t5uHRp0wcu
-OfBFuu1Hw3Ooy/VEa2l4l/UDfE7lI+D79e0VfA8HwFB+c21GF7Q2FRV5ddu9ODgz
-rk6kC5fZSLxc7cpK6jPNnT285O3nHfjk6MQ0fgGfNbvMefgeEWVKj8qcyFgN6H4e
-wr1omcjbdw/HVQaOW84//pBRSRdMJGe1u2iUE2RwxBLzP4BepzkMv9Asm6uDo1YG
-X1d60g2aCUdxAg9fjyTaOss1nRp1YdPlb3SHUhKXgTT/eAPkmmr7bs3jJtp2BN9U
-4Izz2GR/3Uyf0NP20mZgNQ==</dsig:SignatureValue>
+ <dsig:SignatureValue>rhF1QacGUhxm1jfcgyBjAo2BmD4QxBl7c6Bzt8rjXXhR+NVT4ITeyxi39+94WwBx
+Yp8iQhF46bE2QGZAr+HnZZJGVG3ajeaQ4uvPp2KRC8sHpBlZ2rGGtyjXAflYjepw
+c1cLvRoAKbxOMW+ESxjyYOKgT0Bke0GhbzZ8+w+hGZLHxK9oTokIG9YDnRNUKN5W
+n6avbxuaT8wtZgVwD4qfKzMeJlYW3yDFo/2apQA5K+oCj/gfrS1habYqBoNo9kO1
+fWkQ7LIeRrYuzNlr5K4e/LyIm7SHwb9EGcA7K8WbDrHKvaJmTs/T01QhU9f+huk2
+ZGJMMCGHhiwcbVtqVhgJSQ==</dsig:SignatureValue>
<dsig:KeyInfo>
<dsig:X509Data>
<dsig:X509IssuerSerial>
diff --git a/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml b/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml
index 4d49b259..fb0313ab 100644
--- a/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml
+++ b/test/ref/DCP/encryption_test/pkl_5203f3d4-9d62-4062-8bf1-7a114eff99df.xml
@@ -9,7 +9,7 @@
<Asset>
<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab</Id>
<AnnotationText>6affb8ee-0020-4dff-a53c-17652f6358ab</AnnotationText>
- <Hash>Zd9zaFAGx/4W2B3vSZkAqTzcDZ0=</Hash>
+ <Hash>sLWF9OcgdkvBUH1VcNiwseLA3sA=</Hash>
<Size>9226</Size>
<Type>text/xml</Type>
<OriginalFileName>cpl_6affb8ee-0020-4dff-a53c-17652f6358ab.xml</OriginalFileName>
@@ -17,7 +17,7 @@
<Asset>
<Id>urn:uuid:9a7fbb03-4078-4944-90b1-0d8a21c9d793</Id>
<AnnotationText>9a7fbb03-4078-4944-90b1-0d8a21c9d793</AnnotationText>
- <Hash>AVtX8wz76uG2Uw0Qbc9+DKnHUfw=</Hash>
+ <Hash>Q0GMntXvEqVQsiv+YkfhMrXdw0w=</Hash>
<Size>44008</Size>
<Type>application/mxf</Type>
<OriginalFileName>video.mxf</OriginalFileName>
@@ -25,7 +25,7 @@
<Asset>
<Id>urn:uuid:ce300880-a425-40a6-adac-eb1e3f5643fc</Id>
<AnnotationText>ce300880-a425-40a6-adac-eb1e3f5643fc</AnnotationText>
- <Hash>3o02UpYqrl6w0NQbFvrB2tKxaIk=</Hash>
+ <Hash>v0SCdh2xnKNzGC7Sk5pS2q5Q/wQ=</Hash>
<Size>165454</Size>
<Type>application/mxf</Type>
<OriginalFileName>audio.mxf</OriginalFileName>
@@ -49,15 +49,15 @@
<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
- <dsig:DigestValue>0F1ZXfoRDPIQHlRG0MC1uXkahG8=</dsig:DigestValue>
+ <dsig:DigestValue>OU1UpJxBmpxK8SE5yfe8aJsqoIw=</dsig:DigestValue>
</dsig:Reference>
</dsig:SignedInfo>
- <dsig:SignatureValue>u98MLscN/Fn3YxGFMw6kP7fIWUj05FPxQvIYvsIpP68UP3FX9rdP6nh3Olyv194d
-A1fQJu4ZamTcYN2O2E5vdGjxxHlPNXfFPckWc9Sy1i3V8u+EFdOggjMY4snvPot6
-kMyzAICuKzTJs4l+O/BzJAJSFSxrEtBCYEFxrtyKntDxSUE7ePSqPwcim6+5BzDO
-QOsIp3wjJHlp7u4QqU3knIiaM7SibIXqtIBF7TOrChWZjFImKePNib9/DXvnE2WL
-Y+5wJjGhImQR+2U2DDpSCLkl0kVgDrYfKcNg4lXUDZGEKo0Yqz0+1Rszz/DqsC+J
-6mYxqMMvRXeh9pViSpgKaA==</dsig:SignatureValue>
+ <dsig:SignatureValue>ypg6tt5iJi7YEUJQfEQmZeigXzcm2xn/J59tqqYBqwmAch1ia//Khyo6m7/HpQJl
+2Y5swUI8MtmzdV3gj3urd8WuQsDWFLflIHHiIanYE/XCdFZ8lV/nvyCkAaf/AH2V
+W7bWD8/fYXJD2G9a2tRiWTjzfgpsTk+ox+C12Y/SebWAQ97sSLIMwwmQIYK2kTnh
+nbKSuhk+v+V2ObpYl48zXu3za3Yt77rCdcGgPwYr/NUI47ascpnueNw48clDtjp+
+775jeA5ZG5lBR3VGTLwvoOXT3CH/FgG0DPSLmYbRnOzEShVUt7xFgbxMgNTYOGQJ
+3ipS6qmHgWHjX3/fo6isgg==</dsig:SignatureValue>
<dsig:KeyInfo>
<dsig:X509Data>
<dsig:X509IssuerSerial>
diff --git a/test/ref/DCP/encryption_test/video.mxf b/test/ref/DCP/encryption_test/video.mxf
index 2fbfacdd..e6ddbadb 100644
--- a/test/ref/DCP/encryption_test/video.mxf
+++ b/test/ref/DCP/encryption_test/video.mxf
Binary files differ
diff --git a/test/round_trip_test.cc b/test/round_trip_test.cc
index 028accbe..ffba5cbd 100644
--- a/test/round_trip_test.cc
+++ b/test/round_trip_test.cc
@@ -35,15 +35,15 @@
#include "decrypted_kdm.h"
#include "encrypted_kdm.h"
#include "certificate_chain.h"
-#include "mono_picture_asset.h"
+#include "mono_j2k_picture_asset.h"
#include "sound_asset.h"
#include "reel.h"
#include "test.h"
#include "cpl.h"
-#include "mono_picture_frame.h"
+#include "mono_j2k_picture_frame.h"
#include "certificate_chain.h"
-#include "mono_picture_asset_writer.h"
-#include "mono_picture_asset_reader.h"
+#include "mono_j2k_picture_asset_writer.h"
+#include "mono_j2k_picture_asset_reader.h"
#include "reel_picture_asset.h"
#include "reel_mono_picture_asset.h"
#include "openjpeg_image.h"
@@ -70,8 +70,8 @@ BOOST_AUTO_TEST_CASE (round_trip_test)
boost::filesystem::path work_dir = "build/test/round_trip_test";
boost::filesystem::create_directory (work_dir);
- auto asset_A = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
- auto writer = asset_A->start_write(work_dir / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto asset_A = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto writer = asset_A->start_write(work_dir / "video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData j2c ("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
writer->write (j2c.data (), j2c.size ());
@@ -123,7 +123,7 @@ BOOST_AUTO_TEST_CASE (round_trip_test)
}
/* Reload the picture asset */
- auto asset_B = make_shared<dcp::MonoPictureAsset>(work_dir / "video.mxf");
+ auto asset_B = make_shared<dcp::MonoJ2KPictureAsset>(work_dir / "video.mxf");
BOOST_CHECK (!kdm_B.keys().empty ());
asset_B->set_key (kdm_B.keys().front().key());
diff --git a/test/shared_subtitle_test.cc b/test/shared_subtitle_test.cc
index 7ac20e10..22ee7177 100644
--- a/test/shared_subtitle_test.cc
+++ b/test/shared_subtitle_test.cc
@@ -175,13 +175,13 @@ BOOST_AUTO_TEST_CASE (format_xml_test1)
{
xmlpp::Document doc;
auto root = doc.create_root_node("Foo");
- root->add_child("Empty");
- root->add_child("Text")->add_child_text("Hello world");
- root->add_child("Font")->add_child("Text")->add_child_text("Say what");
- auto fred = root->add_child("Text")->add_child("Font");
+ cxml::add_child(root, "Empty");
+ cxml::add_text_child(root, "Text", "Hello world");
+ cxml::add_text_child(cxml::add_child(root, "Font"), "Text", "Say what");
+ auto fred = cxml::add_child(cxml::add_child(root, "Text"), "Font");
fred->set_attribute("bob", "job");
fred->add_child_text("Fred");
- fred->add_child("Text")->add_child_text("Jim");
+ cxml::add_text_child(fred, "Text", "Jim");
fred->add_child_text("Sheila");
BOOST_REQUIRE_EQUAL (dcp::SubtitleAsset::format_xml(doc, make_pair(string{}, string{"fred"})),
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
@@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE (format_xml_entities_test)
{
xmlpp::Document doc;
auto root = doc.create_root_node("Foo");
- root->add_child("Bar")->add_child_text("Don't panic &amp; xml \"is\" 'great' & < > —");
+ cxml::add_text_child(root, "Bar", "Don't panic &amp; xml \"is\" 'great' & < > —");
BOOST_REQUIRE_EQUAL(dcp::SubtitleAsset::format_xml(doc, {}),
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<Foo>\n"
diff --git a/test/stream_operators.cc b/test/stream_operators.cc
index 0ed0d05f..348abd2f 100644
--- a/test/stream_operators.cc
+++ b/test/stream_operators.cc
@@ -214,6 +214,9 @@ ostream&
dcp::operator<< (ostream& s, VerificationNote::Type t)
{
switch (t) {
+ case VerificationNote::Type::OK:
+ s << "check";
+ break;
case VerificationNote::Type::ERROR:
s << "error";
break;
diff --git a/test/test.cc b/test/test.cc
index d384bdfa..51a631d2 100644
--- a/test/test.cc
+++ b/test/test.cc
@@ -39,11 +39,11 @@
#include "interop_subtitle_asset.h"
#include "file.h"
#include "j2k_transcode.h"
-#include "mono_picture_asset.h"
-#include "mono_picture_asset.h"
+#include "mono_j2k_picture_asset.h"
+#include "mono_j2k_picture_asset.h"
#include "openjpeg_image.h"
-#include "picture_asset_writer.h"
-#include "picture_asset_writer.h"
+#include "j2k_picture_asset_writer.h"
+#include "j2k_picture_asset_writer.h"
#include "reel.h"
#include "reel_asset.h"
#include "reel_interop_closed_caption_asset.h"
@@ -122,7 +122,7 @@ check_xml (xmlpp::Element* ref, xmlpp::Element* test, vector<string> ignore_tags
BOOST_CHECK_EQUAL (ref->get_name (), test->get_name ());
BOOST_CHECK_EQUAL (ref->get_namespace_prefix (), test->get_namespace_prefix ());
- if (find(ignore_tags.begin(), ignore_tags.end(), ref->get_name()) != ignore_tags.end()) {
+ if (find(ignore_tags.begin(), ignore_tags.end(), std::string(ref->get_name())) != ignore_tags.end()) {
return;
}
@@ -260,18 +260,18 @@ check_file (boost::filesystem::path ref, boost::filesystem::path check)
RNGFixer::RNGFixer ()
{
- Kumu::cth_test = true;
+ Kumu::dcpomatic_test = true;
Kumu::FortunaRNG().Reset();
}
RNGFixer::~RNGFixer ()
{
- Kumu::cth_test = false;
+ Kumu::dcpomatic_test = false;
}
-shared_ptr<dcp::MonoPictureAsset>
+shared_ptr<dcp::MonoJ2KPictureAsset>
simple_picture (boost::filesystem::path path, string suffix, int frames, optional<dcp::Key> key)
{
dcp::MXFMetadata mxf_meta;
@@ -279,12 +279,12 @@ simple_picture (boost::filesystem::path path, string suffix, int frames, optiona
mxf_meta.product_name = "OpenDCP";
mxf_meta.product_version = "0.0.25";
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
mp->set_metadata (mxf_meta);
if (key) {
mp->set_key (*key);
}
- auto picture_writer = mp->start_write(path / dcp::String::compose("video%1.mxf", suffix), dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto picture_writer = mp->start_write(path / dcp::String::compose("video%1.mxf", suffix), dcp::Behaviour::MAKE_NEW);
dcp::Size const size (1998, 1080);
auto image = make_shared<dcp::OpenJPEGImage>(size);
@@ -530,10 +530,10 @@ black_picture_asset (boost::filesystem::path dir, int frames)
auto frame = dcp::compress_j2k (image, 100000000, 24, false, false);
BOOST_REQUIRE (frame.size() < 230000000 / (24 * 8));
- auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
+ auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
asset->set_metadata (dcp::MXFMetadata("libdcp", "libdcp", "1.6.4devel"));
boost::filesystem::create_directories (dir);
- auto writer = asset->start_write(dir / "pic.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto writer = asset->start_write(dir / "pic.mxf", dcp::Behaviour::MAKE_NEW);
for (int i = 0; i < frames; ++i) {
writer->write (frame.data(), frame.size());
}
@@ -567,7 +567,11 @@ Editor::Editor(boost::filesystem::path path)
Editor::~Editor()
{
- auto f = fopen(_path.string().c_str(), "w");
+ /* Open this binary so that text files are re-written with Unix endings even on Windows,
+ * so that if we subsequently get hashes of edited files the hashes are the same on
+ * all platforms.
+ */
+ auto f = fopen(_path.string().c_str(), "wb");
BOOST_REQUIRE (f);
fwrite (_content.c_str(), _content.length(), 1, f);
fclose (f);
diff --git a/test/test.h b/test/test.h
index bacb9311..d3fded87 100644
--- a/test/test.h
+++ b/test/test.h
@@ -34,7 +34,7 @@ namespace xmlpp {
namespace dcp {
class DCP;
- class MonoPictureAsset;
+ class MonoJ2KPictureAsset;
class SoundAsset;
}
@@ -44,7 +44,7 @@ extern boost::filesystem::path xsd_test;
extern void check_xml (xmlpp::Element* ref, xmlpp::Element* test, std::vector<std::string> ignore_tags, bool ignore_whitespace = false);
extern void check_xml (std::string ref, std::string test, std::vector<std::string> ignore, bool ignore_whitespace = false);
extern void check_file (boost::filesystem::path ref, boost::filesystem::path check);
-extern std::shared_ptr<dcp::MonoPictureAsset> simple_picture (
+extern std::shared_ptr<dcp::MonoJ2KPictureAsset> simple_picture (
boost::filesystem::path path,
std::string suffix,
int frames = 24,
diff --git a/test/verify_report_test.cc b/test/verify_report_test.cc
new file mode 100644
index 00000000..6b288891
--- /dev/null
+++ b/test/verify_report_test.cc
@@ -0,0 +1,67 @@
+/*
+ Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "verify.h"
+#include "verify_report.h"
+#include <boost/test/unit_test.hpp>
+#include "test.h"
+
+
+BOOST_AUTO_TEST_CASE(verify_report_basically_ok)
+{
+ dcp::HTMLFormatter formatter("build/test/verify_report_basically_ok.html");
+ dcp::verify_report(
+ dcp::verify(
+ { private_test / "TONEPLATES-SMPTE-PLAINTEXT_TST_F_XX-XX_ITL-TD_51-XX_2K_WOE_20111001_WOE_OV" },
+ {},
+ [](std::string, boost::optional<boost::filesystem::path>) {},
+ [](float) {},
+ {},
+ xsd_test
+ ),
+ formatter
+ );
+}
+
+
+BOOST_AUTO_TEST_CASE(text_formatter)
+{
+ {
+ dcp::TextFormatter fmt("build/test/text_formatter.txt");
+
+ fmt.heading("Heading");
+ fmt.subheading("Subheading");
+ auto A = fmt.unordered_list();
+ fmt.list_item("Foo");
+ fmt.list_item("Bar");
+ auto B = fmt.unordered_list();
+ fmt.list_item("Fred");
+ fmt.list_item("Jim");
+ fmt.list_item("Sheila");
+ }
+
+#ifdef LIBDCP_WINDOWS
+ check_file("test/data/text_formatter_windows.txt", "build/test/text_formatter.txt");
+#else
+ check_file("test/data/text_formatter.txt", "build/test/text_formatter.txt");
+#endif
+}
+
diff --git a/test/verify_test.cc b/test/verify_test.cc
index eab50b59..3f551790 100644
--- a/test/verify_test.cc
+++ b/test/verify_test.cc
@@ -38,8 +38,8 @@
#include "file.h"
#include "interop_subtitle_asset.h"
#include "j2k_transcode.h"
-#include "mono_picture_asset.h"
-#include "mono_picture_asset_writer.h"
+#include "mono_j2k_picture_asset.h"
+#include "mono_j2k_picture_asset_writer.h"
#include "openjpeg_image.h"
#include "raw_convert.h"
#include "reel.h"
@@ -52,7 +52,7 @@
#include "reel_smpte_closed_caption_asset.h"
#include "reel_smpte_subtitle_asset.h"
#include "smpte_subtitle_asset.h"
-#include "stereo_picture_asset.h"
+#include "stereo_j2k_picture_asset.h"
#include "stream_operators.h"
#include "test.h"
#include "util.h"
@@ -63,6 +63,7 @@
#include <boost/test/unit_test.hpp>
#include <cstdio>
#include <iostream>
+#include <tuple>
using std::list;
@@ -148,6 +149,43 @@ prepare_directory (path path)
}
+static
+path
+find_prefix(path dir, string prefix)
+{
+ auto iter = std::find_if(directory_iterator(dir), directory_iterator(), [prefix](path const& p) {
+ return boost::starts_with(p.filename().string(), prefix);
+ });
+
+ BOOST_REQUIRE(iter != directory_iterator());
+ return iter->path();
+}
+
+
+static
+path
+find_cpl(path dir)
+{
+ return find_prefix(dir, "cpl_");
+}
+
+
+static
+path
+find_pkl(path dir)
+{
+ return find_prefix(dir, "pkl_");
+}
+
+
+static
+path
+find_asset_map(path dir)
+{
+ return find_prefix(dir, "ASSETMAP");
+}
+
+
/** Copy dcp_test{reference_number} to build/test/verify_test{verify_test_suffix}
* to make a new sacrificial test DCP.
*/
@@ -196,53 +234,85 @@ LIBDCP_ENABLE_WARNINGS
static
+string
+to_string(dcp::VerificationNote const& note)
+{
+ string s = note_to_string(note) + dcp::String::compose(
+ "\n [%1 %2 %3 %4 %5 %6 ",
+ static_cast<int>(note.type()),
+ static_cast<int>(note.code()),
+ note.note().get_value_or("<none>"),
+ note.file().get_value_or("<none>"),
+ note.line().get_value_or(0),
+ note.frame().get_value_or(0)
+ );
+
+ s += dcp::String::compose(
+ "%1 %2 %3 %4 %5]\n",
+ note.id().get_value_or("<none>"),
+ note.other_id().get_value_or("<none>"),
+ note.cpl_id().get_value_or("<none>"),
+ note.reference_hash().get_value_or("<none>"),
+ note.calculated_hash().get_value_or("<none>")
+ );
+
+ return s;
+}
+
+
+static
void
-check_verify_result(vector<path> dir, vector<dcp::DecryptedKDM> kdm, vector<dcp::VerificationNote> test_notes)
+check_verify_result(vector<dcp::VerificationNote> notes, vector<dcp::VerificationNote> test_notes)
{
- auto notes = dcp::verify({dir}, kdm, &stage, &progress, {}, xsd_test);
- std::sort (notes.begin(), notes.end());
- std::sort (test_notes.begin(), test_notes.end());
+ std::sort(notes.begin(), notes.end());
+ std::sort(test_notes.begin(), test_notes.end());
- string message = "\nVerification notes from test:\n";
- for (auto i: notes) {
- message += " " + note_to_string(i) + "\n";
- message += dcp::String::compose(
- " [%1 %2 %3 %4 %5 %6 %7]\n",
- static_cast<int>(i.type()),
- static_cast<int>(i.code()),
- i.note().get_value_or("<none>"),
- i.file().get_value_or("<none>"),
- i.line().get_value_or(0),
- i.reference_hash().get_value_or("<none>"),
- i.calculated_hash().get_value_or("<none>")
- );
+ string message = "\n";
+
+ vector<dcp::VerificationNote> not_expected;
+ for (auto note: notes) {
+ auto iter = std::find_if(test_notes.begin(), test_notes.end(), [note](dcp::VerificationNote const& n) { return note.type() == n.type() && note.code() == n.code(); });
+ if (iter != test_notes.end() && *iter != note) {
+ message += "Wrong details:\n --seen " + to_string(note) + " --expected " + to_string(*iter) + "\n";
+ } else if (iter == test_notes.end()) {
+ not_expected.push_back(note);
+ }
}
- message += "Expected:\n";
- for (auto i: test_notes) {
- message += " " + note_to_string(i) + "\n";
- message += dcp::String::compose(
- " [%1 %2 %3 %4 %5 %6 %7]\n",
- static_cast<int>(i.type()),
- static_cast<int>(i.code()),
- i.note().get_value_or("<none>"),
- i.file().get_value_or("<none>"),
- i.line().get_value_or(0),
- i.reference_hash().get_value_or("<none>"),
- i.calculated_hash().get_value_or("<none>")
- );
+
+ vector<dcp::VerificationNote> not_seen;
+ for (auto note: test_notes) {
+ auto iter = std::find_if(notes.begin(), notes.end(), [note](dcp::VerificationNote const& n) { return note.type() == n.type() && note.code() == n.code(); });
+ if (iter == notes.end()) {
+ not_seen.push_back(note);
+ }
+ }
+
+ for (auto note: not_expected) {
+ message += "Not expected:\n" + to_string(note) + "\n";
+ }
+
+ for (auto note: not_seen) {
+ message += "Not seen:\n" + to_string(note) + "\n";
}
- BOOST_REQUIRE_MESSAGE (notes == test_notes, message);
+ BOOST_REQUIRE_MESSAGE(notes == test_notes, message);
+}
+
+
+static
+void
+check_verify_result(vector<path> dir, vector<dcp::DecryptedKDM> kdm, vector<dcp::VerificationNote> test_notes)
+{
+ check_verify_result(dcp::verify({dir}, kdm, &stage, &progress, {}, xsd_test).notes, test_notes);
}
/* Copy dcp_test1 to build/test/verify_test{suffix} then edit a file found by the functor 'file',
- * replacing from with to. Verify the resulting DCP and check that the results match the given
- * list of codes.
+ * replacing from with to.
*/
static
void
-check_verify_result_after_replace (string suffix, boost::function<path (string)> file, string from, string to, vector<dcp::VerificationNote::Code> codes)
+replace(string suffix, boost::function<path (string)> file, string from, string to)
{
auto dir = setup (1, suffix);
@@ -250,17 +320,6 @@ check_verify_result_after_replace (string suffix, boost::function<path (string)>
Editor e (file(suffix));
e.replace (from, to);
}
-
- auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test);
-
- BOOST_REQUIRE_EQUAL (notes.size(), codes.size());
- auto i = notes.begin();
- auto j = codes.begin();
- while (i != notes.end()) {
- BOOST_CHECK_EQUAL (i->code(), *j);
- ++i;
- ++j;
- }
}
@@ -295,11 +354,44 @@ private:
};
+static
+dcp::VerificationNote
+ok(dcp::VerificationNote::Code code, shared_ptr<const dcp::CPL> cpl)
+{
+ return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code).set_cpl_id(cpl->id());
+}
+
+
+static
+dcp::VerificationNote
+ok(dcp::VerificationNote::Code code, string note, shared_ptr<const dcp::CPL> cpl)
+{
+ return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code, note).set_cpl_id(cpl->id());
+}
+
+
+static
+dcp::VerificationNote
+ok(dcp::VerificationNote::Code code, boost::filesystem::path path, shared_ptr<const dcp::CPL> cpl)
+{
+ return dcp::VerificationNote(dcp::VerificationNote::Type::OK, code, path).set_cpl_id(cpl->id());
+}
+
+
+void
+add(vector<dcp::VerificationNote>& notes, vector<dcp::VerificationNote> const& add)
+{
+ for (auto i: add) {
+ notes.push_back(i);
+ }
+}
+
+
BOOST_AUTO_TEST_CASE (verify_no_error)
{
stages.clear ();
auto dir = setup (1, "no_error");
- auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test);
+ auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes;
path const cpl_file = dir / dcp_test1_cpl();
path const pkl_file = dir / dcp_test1_pkl();
@@ -342,7 +434,9 @@ BOOST_AUTO_TEST_CASE (verify_no_error)
++st;
BOOST_REQUIRE (st == stages.end());
- BOOST_CHECK_EQUAL (notes.size(), 0U);
+ for (auto note: notes) {
+ BOOST_CHECK(note.type() == dcp::VerificationNote::Type::OK);
+ }
}
@@ -351,21 +445,22 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash)
using namespace boost::filesystem;
auto dir = setup (1, "incorrect_picture_sound_hash");
+ auto cpl = make_shared<dcp::CPL>(find_cpl(dir));
auto video_path = path(dir / "video.mxf");
HashCalculator video_calc(video_path);
auto mod = fopen(video_path.string().c_str(), "r+b");
BOOST_REQUIRE (mod);
- fseek (mod, 4096, SEEK_SET);
+ BOOST_REQUIRE_EQUAL(fseek(mod, -16, SEEK_END), 0);
int x = 42;
- fwrite (&x, sizeof(x), 1, mod);
+ BOOST_REQUIRE(fwrite(&x, sizeof(x), 1, mod) == 1);
fclose (mod);
auto audio_path = path(dir / "audio.mxf");
HashCalculator audio_calc(audio_path);
mod = fopen(audio_path.string().c_str(), "r+b");
BOOST_REQUIRE (mod);
- BOOST_REQUIRE_EQUAL (fseek(mod, -64, SEEK_END), 0);
+ BOOST_REQUIRE_EQUAL(fseek(mod, 0, SEEK_END), 0);
BOOST_REQUIRE (fwrite (&x, sizeof(x), 1, mod) == 1);
fclose (mod);
@@ -374,12 +469,25 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash)
{ dir },
{},
{
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_PICTURE_HASH, canonical(video_path)
- ).set_reference_hash(video_calc.old_hash()).set_calculated_hash(video_calc.new_hash()),
+ ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(video_calc.old_hash()).set_calculated_hash(video_calc.new_hash()),
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_SOUND_HASH, canonical(audio_path)
- ).set_reference_hash(audio_calc.old_hash()).set_calculated_hash(audio_calc.new_hash()),
+ ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(audio_calc.old_hash()).set_calculated_hash(audio_calc.new_hash()),
});
}
@@ -389,6 +497,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes)
using namespace boost::filesystem;
auto dir = setup (1, "mismatched_picture_sound_hashes");
+ auto cpl = make_shared<dcp::CPL>(find_cpl(dir));
HashCalculator calc(dir / dcp_test1_cpl());
@@ -401,14 +510,30 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes)
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, dcp_test1_cpl_id(), canonical(dir / dcp_test1_cpl())
- ).set_reference_hash("x" + calc.old_hash()).set_calculated_hash(calc.old_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_PICTURE_HASHES, canonical(dir / "video.mxf") },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_HASHES, canonical(dir / "audio.mxf") },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xKcJb7S2K5cNm8RG4kfQD5FTeS0A=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 28 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xtfX1mVIKJCVr1m7Y32Nzxf0+Rpw=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 12 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xwUmt8G+cFFKMGt0ueS9+F1S4uhc=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 20 },
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(dir / dcp_test1_cpl())
+ ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash("x" + calc.old_hash()).set_calculated_hash(calc.old_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_PICTURE_HASHES, canonical(dir / "video.mxf")
+ ).set_cpl_id(dcp_test1_cpl_id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_HASHES, canonical(dir / "audio.mxf")
+ ).set_cpl_id(dcp_test1_cpl_id()),
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'x3M7YTgvFKXXMEGLkIbV4miC90FE=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 28 },
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xskI+5b/9LA/y6h0mcyxysJYanxI=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 12 },
+ { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "value 'xvsVjRV9vhTBPUWfE/TT1o2vdQsI=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl()), 20 },
});
}
@@ -424,21 +549,37 @@ BOOST_AUTO_TEST_CASE (verify_failed_read_content_kind)
e.replace ("<ContentKind>", "<ContentKind>x");
}
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
+
check_verify_result (
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, dcp_test1_cpl_id(), canonical(dir / dcp_test1_cpl())
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("xtrailer") }
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(dir / dcp_test1_cpl())
+ ).set_cpl_id(dcp_test1_cpl_id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("xtrailer")
+ ).set_cpl_id(dcp_test1_cpl_id())
});
}
static
path
-cpl (string suffix)
+dcp_test1_cpl_path(string suffix)
{
return dcp::String::compose("build/test/verify_test%1/%2", suffix, dcp_test1_cpl());
}
@@ -446,7 +587,7 @@ cpl (string suffix)
static
path
-pkl (string suffix)
+dcp_test1_pkl_path(string suffix)
{
return dcp::String::compose("build/test/verify_test%1/%2", suffix, dcp_test1_pkl());
}
@@ -462,22 +603,64 @@ asset_map (string suffix)
BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_rate)
{
- check_verify_result_after_replace (
- "invalid_picture_frame_rate", &cpl,
- "<FrameRate>24 1", "<FrameRate>99 1",
- { dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES,
- dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE }
- );
+ auto const suffix = "invalid_picture_frame_rate";
+
+ replace(suffix, &dcp_test1_cpl_path, "<FrameRate>24 1", "<FrameRate>99 1");
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ 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::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path)
+ ).set_cpl_id(cpl->id()).set_calculated_hash("7n7GQ2TbxQbmHYuAR8ml7XDOep8=").set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI="),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE, string{"99/1"}
+ ).set_cpl_id(cpl->id())
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
+
BOOST_AUTO_TEST_CASE (verify_missing_asset)
{
auto dir = setup (1, "missing_asset");
remove (dir / "video.mxf");
+
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
+
check_verify_result (
{ dir },
{},
{
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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" }
});
}
@@ -485,71 +668,236 @@ BOOST_AUTO_TEST_CASE (verify_missing_asset)
BOOST_AUTO_TEST_CASE (verify_empty_asset_path)
{
- check_verify_result_after_replace (
- "empty_asset_path", &asset_map,
- "<Path>video.mxf</Path>", "<Path></Path>",
- { dcp::VerificationNote::Code::EMPTY_ASSET_PATH }
- );
+ auto const suffix = "empty_asset_path";
+
+ replace("empty_asset_path", &asset_map, "<Path>video.mxf</Path>", "<Path></Path>");
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ auto cpl = std::make_shared<dcp::CPL>(cpl_path);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_ASSET_PATH }
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
BOOST_AUTO_TEST_CASE (verify_mismatched_standard)
{
- check_verify_result_after_replace (
- "mismatched_standard", &cpl,
- "http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#",
- { dcp::VerificationNote::Code::MISMATCHED_STANDARD,
- dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES }
- );
+ auto const suffix = "mismatched_standard";
+
+ replace(suffix, &dcp_test1_cpl_path, "http://www.smpte-ra.org/schemas/429-7/2006/CPL", "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#");
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "invalid character encountered", canonical(cpl_path), 42
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'Id'", canonical(cpl_path), 53
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'EditRate'", canonical(cpl_path), 54
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, "no declaration found for element 'IntrinsicDuration'", canonical(cpl_path), 55
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML,
+ "element 'Id' is not allowed for content model '(Id,AnnotationText?,EditRate,IntrinsicDuration,"
+ "EntryPoint?,Duration?,FullContentTitleText,ReleaseTerritory?,VersionNumber?,Chain?,Distributor?,"
+ "Facility?,AlternateContentVersionList?,Luminance?,MainSoundConfiguration,MainSoundSampleRate,"
+ "MainPictureStoredArea,MainPictureActiveArea,MainSubtitleLanguageList?,ExtensionMetadataList?,)'",
+ canonical(cpl_path), 149
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path)
+ ).set_cpl_id(cpl->id()).set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI=").set_calculated_hash("FZ9E7L/pOuJ6aZfbiaANTv8BFOo=")
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_id)
{
+ auto const suffix = "invalid_xml_cpl_id";
+
/* There's no MISMATCHED_CPL_HASHES error here because it can't find the correct hash by ID (since the ID is wrong) */
- check_verify_result_after_replace (
- "invalid_xml_cpl_id", &cpl,
- "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab", "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a",
- { dcp::VerificationNote::Code::INVALID_XML }
- );
+ replace("invalid_xml_cpl_id", &dcp_test1_cpl_path, "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358ab", "<Id>urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a");
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML,
+ "value 'urn:uuid:6affb8ee-0020-4dff-a53c-17652f6358a' does not match regular expression "
+ "facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'", canonical(cpl_path), 3
+ ).set_cpl_id(cpl->id())
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
BOOST_AUTO_TEST_CASE (verify_invalid_xml_issue_date)
{
- check_verify_result_after_replace (
- "invalid_xml_issue_date", &cpl,
- "<IssueDate>", "<IssueDate>x",
- { dcp::VerificationNote::Code::INVALID_XML,
- dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES }
- );
+ auto const suffix = "invalid_xml_issue_date";
+
+ replace("invalid_xml_issue_date", &dcp_test1_cpl_path, "<IssueDate>", "<IssueDate>x");
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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)
+ ).set_cpl_id(cpl->id()).set_reference_hash("skI+5b/9LA/y6h0mcyxysJYanxI=").set_calculated_hash("sz3BeIugJ567q3HMnA62JeRw4TE="),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML,
+ "invalid character encountered",
+ canonical(cpl_path), 5
+ ).set_cpl_id(cpl->id()),
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
BOOST_AUTO_TEST_CASE (verify_invalid_xml_pkl_id)
{
- check_verify_result_after_replace (
- "invalid_xml_pkl_id", &pkl,
- "<Id>urn:uuid:" + dcp_test1_pkl_id().substr(0, 3),
- "<Id>urn:uuid:x" + dcp_test1_pkl_id().substr(1, 2),
- { dcp::VerificationNote::Code::INVALID_XML }
- );
+ auto const suffix = "invalid_xml_pkl_id";
+
+ replace("invalid_xml_pkl_id", &dcp_test1_pkl_path, "<Id>urn:uuid:" + dcp_test1_pkl_id().substr(0, 3), "<Id>urn:uuid:x" + dcp_test1_pkl_id().substr(1, 2));
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const pkl_path = find_pkl(dir);
+ auto const cpl_path = find_cpl(dir);
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML,
+ "value 'urn:uuid:x199d58b-5ef8-4d49-b270-07e590ccb280' does not match regular "
+ "expression facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'",
+ canonical(pkl_path), 3
+ ),
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
BOOST_AUTO_TEST_CASE (verify_invalid_xml_asset_map_id)
{
- check_verify_result_after_replace (
- "invalid_xml_asset_map_id", &asset_map,
- "<Id>urn:uuid:" + dcp_test1_asset_map_id.substr(0, 3),
- "<Id>urn:uuid:x" + dcp_test1_asset_map_id.substr(1, 2),
- { dcp::VerificationNote::Code::INVALID_XML }
- );
+ auto const suffix = "invalid_xml_asset_map_id";
+
+ replace("invalid_xml_asset_map_id", &asset_map, "<Id>urn:uuid:" + dcp_test1_asset_map_id.substr(0, 3), "<Id>urn:uuid:x" + dcp_test1_asset_map_id.substr(1, 2));
+
+ auto const dir = dcp::String::compose("build/test/verify_test%1", suffix);
+ auto const cpl_path = find_cpl(dir);
+ auto const asset_map_path = find_asset_map(dir);
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML,
+ "value 'urn:uuid:x17b3de4-6dda-408d-b19b-6711354b0bc3' does not match regular "
+ "expression facet 'urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'",
+ canonical(asset_map_path), 3
+ ),
+ };
+
+ check_verify_result(dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes, expected);
}
@@ -557,11 +905,12 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
{
stages.clear ();
auto dir = setup (3, "verify_invalid_standard");
- auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test);
+ auto notes = dcp::verify({dir}, {}, &stage, &progress, {}, xsd_test).notes;
path const cpl_file = dir / "cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml";
path const pkl_file = dir / "pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml";
path const assetmap_file = dir / "ASSETMAP";
+ auto cpl = std::make_shared<dcp::CPL>(cpl_file);
auto st = stages.begin();
BOOST_CHECK_EQUAL (st->first, "Checking DCP");
@@ -601,13 +950,26 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
++st;
BOOST_REQUIRE (st == stages.end());
- BOOST_REQUIRE_EQUAL (notes.size(), 2U);
- auto i = notes.begin ();
- BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_STANDARD);
- ++i;
- BOOST_CHECK_EQUAL (i->type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (i->code(), dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K);
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl)
+ };
+
+ for (int j = 0; j < 24; ++j) {
+ expected.push_back(
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2")
+ ).set_cpl_id(cpl->id())
+ );
+ }
+
+ check_verify_result(notes, expected);
}
/* DCP with a short asset */
@@ -620,22 +982,42 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration)
BOOST_REQUIRE(dcp.cpls().size() == 1);
auto cpl = dcp.cpls()[0];
- check_verify_result (
- { dir },
- {},
- {
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") },
+ vector<dcp::VerificationNote> expected = {
+ 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 },
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING,
+ dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT,
+ cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ };
+
+ for (int i = 0; i < 23; ++i) {
+ expected.push_back(
dcp::VerificationNote(
- dcp::VerificationNote::Type::WARNING,
- dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT,
- cpl->file().get()
- ).set_id("d74fda30-d5f4-4c5f-870f-ebc089d97eb7")
- });
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2")
+ ).set_cpl_id(cpl->id())
+ );
+ }
+
+ check_verify_result({ dir }, {}, expected);
}
@@ -643,9 +1025,9 @@ static
shared_ptr<dcp::CPL>
dcp_from_frame (dcp::ArrayData const& frame, path dir)
{
- auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
+ auto asset = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
create_directories (dir);
- auto writer = asset->start_write(dir / "pic.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto writer = asset->start_write(dir / "pic.mxf", dcp::Behaviour::MAKE_NEW);
for (int i = 0; i < 24; ++i) {
writer->write (frame.data(), frame.size());
}
@@ -674,12 +1056,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
prepare_directory (dir);
auto cpl = dcp_from_frame (oversized_frame, dir);
- vector<dcp::VerificationNote> expected;
+ vector<dcp::VerificationNote> expected = {
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
+ };
+
for (auto i = 0; i < 24; ++i) {
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte")
- ).set_frame(i).set_frame_rate(24)
+ ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id())
);
}
@@ -687,13 +1078,15 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf")
- ).set_frame(i).set_frame_rate(24)
+ ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id())
);
}
expected.push_back(
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
- );
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ );
check_verify_result({ dir }, {}, expected);
}
@@ -717,13 +1110,21 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
prepare_directory (dir);
auto cpl = dcp_from_frame (oversized_frame, dir);
- vector<dcp::VerificationNote> expected;
+ 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::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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+ };
for (auto i = 0; i < 24; ++i) {
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_CODESTREAM, string("missing marker start byte")
- ).set_frame(i).set_frame_rate(24)
+ ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id())
);
}
@@ -731,13 +1132,15 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf")
- ).set_frame(i).set_frame_rate(24)
+ ).set_frame(i).set_frame_rate(24).set_cpl_id(cpl->id())
);
}
expected.push_back(
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
- );
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ );
check_verify_result ({ dir }, {}, expected);
}
@@ -754,7 +1157,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_picture_frame_size_in_bytes)
prepare_directory (dir);
auto cpl = dcp_from_frame (frame, dir);
- check_verify_result({ dir }, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ { 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::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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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())
+ });
}
@@ -765,14 +1181,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_interop_subtitles)
copy_file ("test/data/subs1.xml", dir / "subs.xml");
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml");
auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
check_verify_result (
{dir},
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -784,14 +1207,21 @@ BOOST_AUTO_TEST_CASE(verify_catch_missing_font_file_with_interop_ccap)
copy_file("test/data/subs1.xml", dir / "ccap.xml");
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "ccap.xml");
auto reel_asset = make_shared<dcp::ReelInteropClosedCaptionAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
check_verify_result (
{dir},
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -805,7 +1235,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles)
copy_file ("test/data/subs1.xml", dir / "subs.xml");
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml");
auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
{
Editor e (dir / "subs.xml");
@@ -816,16 +1246,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles)
{ dir },
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 5 },
- {
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 5
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR,
dcp::VerificationNote::Code::INVALID_XML,
string("element 'Foo' is not allowed for content model '(SubtitleID,MovieTitle,ReelNumber,Language,LoadFont*,Font*,Subtitle*)'"),
path(),
29
- },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} }
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -837,15 +1276,24 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles)
copy_file("test/data/subs4.xml", dir / "subs.xml");
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml");
auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
check_verify_result (
{ dir },
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get())
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -858,14 +1306,21 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_single_space_subtitle)
copy_file("test/data/subs5.xml", dir / "subs.xml");
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml");
auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
check_verify_result (
{ dir },
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"Arial"} }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"Arial"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -884,9 +1339,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-04-14T13:19:14.000+02:00"} },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() }
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-04-14T13:19:14.000+02:00"}
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id()
+ ).set_cpl_id(cpl->id()),
});
}
@@ -907,18 +1374,34 @@ BOOST_AUTO_TEST_CASE (verify_invalid_smpte_subtitles)
{ dir },
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'Foo'"), path(), 2 },
- {
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR,
dcp::VerificationNote::Code::INVALID_XML,
string("element 'Foo' is not allowed for content model '(Id,ContentTitleText,AnnotationText?,IssueDate,ReelNumber?,Language?,EditRate,TimeCodeRate,StartTime?,DisplayType?,LoadFont*,SubtitleList)'"),
path(),
2
- },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2020-05-09T00:29:21.000+02:00"} },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() }
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2020-05-09T00:29:21.000+02:00"}
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id()
+ ).set_cpl_id(cpl->id()),
});
}
@@ -936,12 +1419,30 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles)
{ dir },
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-08-09T18:34:46.000+02:00"} },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id() }
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2021-08-09T18:34:46.000+02:00"}
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, asset->id()
+ ).set_cpl_id(cpl->id())
});
}
@@ -960,8 +1461,15 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_child_nodes)
{ dir },
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -980,10 +1488,21 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_empty_child_nodes
{ dir },
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get()) },
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()),
{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"} },
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_TEXT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"font0"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -1011,8 +1530,16 @@ BOOST_AUTO_TEST_CASE (verify_external_asset)
{ vf_dir },
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1047,38 +1574,6 @@ BOOST_AUTO_TEST_CASE (verify_valid_cpl_metadata)
}
-path
-find_prefix(path dir, string prefix)
-{
- auto iter = std::find_if(directory_iterator(dir), directory_iterator(), [prefix](path const& p) {
- return boost::starts_with(p.filename().string(), prefix);
- });
-
- BOOST_REQUIRE(iter != directory_iterator());
- return iter->path();
-}
-
-
-path find_cpl (path dir)
-{
- return find_prefix(dir, "cpl_");
-}
-
-
-path
-find_pkl(path dir)
-{
- return find_prefix(dir, "pkl_");
-}
-
-
-path
-find_asset_map(path dir)
-{
- return find_prefix(dir, "ASSETMAP");
-}
-
-
/* DCP with invalid CompositionMetadataAsset */
BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
{
@@ -1115,9 +1610,26 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
{ dir },
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXConfiguration'"), canonical(cpl->file().get()), 50 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXSampleRate'"), canonical(cpl->file().get()), 51 },
- {
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXConfiguration'"), canonical(cpl->file().get()), 50
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:MainSoundXSampleRate'"), canonical(cpl->file().get()), 51
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR,
dcp::VerificationNote::Code::INVALID_XML,
string("element 'meta:MainSoundXConfiguration' is not allowed for content model "
@@ -1127,11 +1639,10 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
"MainSoundSampleRate,MainPictureStoredArea,MainPictureActiveArea,MainSubtitleLanguageList?,"
"ExtensionMetadataList?,)'"),
canonical(cpl->file().get()),
- 71
- },
+ 71).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get())
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash())
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash())
});
}
@@ -1185,9 +1696,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language1)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1209,9 +1732,21 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language2)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("badlang") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("wrong-andbad")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1252,16 +1787,38 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language3)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("this-is-wrong") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("andso-is-this") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("fred-jim") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("frobozz") },
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl),
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("this-is-wrong")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("andso-is-this")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("fred-jim")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_LANGUAGE, string("frobozz")
+ ).set_cpl_id(cpl->id()),
});
}
static
-vector<dcp::VerificationNote>
+std::tuple<vector<dcp::VerificationNote>, shared_ptr<dcp::CPL>, boost::filesystem::path>
check_picture_size (int width, int height, int frame_rate, bool three_d)
{
using namespace boost::filesystem;
@@ -1269,13 +1826,13 @@ check_picture_size (int width, int height, int frame_rate, bool three_d)
path dcp_path = "build/test/verify_picture_test";
prepare_directory (dcp_path);
- shared_ptr<dcp::PictureAsset> mp;
+ shared_ptr<dcp::J2KPictureAsset> mp;
if (three_d) {
- mp = make_shared<dcp::StereoPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE);
+ mp = make_shared<dcp::StereoJ2KPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE);
} else {
- mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE);
+ mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(frame_rate, 1), dcp::Standard::SMPTE);
}
- auto picture_writer = mp->start_write(dcp_path / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto picture_writer = mp->start_write(dcp_path / "video.mxf", dcp::Behaviour::MAKE_NEW);
auto image = black_image (dcp::Size(width, height));
auto j2c = dcp::compress_j2k (image, 100000000, frame_rate, three_d, width > 2048);
@@ -1298,9 +1855,9 @@ check_picture_size (int width, int height, int frame_rate, bool three_d)
auto reel = make_shared<dcp::Reel>();
if (three_d) {
- reel->add (make_shared<dcp::ReelStereoPictureAsset>(std::dynamic_pointer_cast<dcp::StereoPictureAsset>(mp), 0));
+ reel->add (make_shared<dcp::ReelStereoPictureAsset>(std::dynamic_pointer_cast<dcp::StereoJ2KPictureAsset>(mp), 0));
} else {
- reel->add (make_shared<dcp::ReelMonoPictureAsset>(std::dynamic_pointer_cast<dcp::MonoPictureAsset>(mp), 0));
+ reel->add (make_shared<dcp::ReelMonoPictureAsset>(std::dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(mp), 0));
}
reel->add (simple_markers(frame_rate));
@@ -1311,7 +1868,8 @@ check_picture_size (int width, int height, int frame_rate, bool three_d)
d->set_annotation_text("A Test DCP");
d->write_xml();
- return dcp::verify({dcp_path}, {}, &stage, &progress, {}, xsd_test);
+ /* It seems that for the Ubuntu 16.04 compiler we can't use an initializer list here */
+ return std::tuple<vector<dcp::VerificationNote>, shared_ptr<dcp::CPL>, boost::filesystem::path>{ dcp::verify({dcp_path}, {}, &stage, &progress, {}, xsd_test).notes, cpl, dcp_path };
}
@@ -1319,8 +1877,28 @@ static
void
check_picture_size_ok (int width, int height, int frame_rate, bool three_d)
{
- auto notes = check_picture_size(width, height, frame_rate, three_d);
- BOOST_CHECK_EQUAL (notes.size(), 0U);
+ vector<dcp::VerificationNote> notes;
+ shared_ptr<dcp::CPL> cpl;
+ boost::filesystem::path dir;
+ std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ dcp::String::compose("%1x%2", width, height),
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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);
}
@@ -1328,10 +1906,31 @@ static
void
check_picture_size_bad_frame_size (int width, int height, int frame_rate, bool three_d)
{
- auto notes = check_picture_size(width, height, frame_rate, three_d);
- BOOST_REQUIRE_EQUAL (notes.size(), 1U);
- BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_SIZE_IN_PIXELS);
+ vector<dcp::VerificationNote> notes;
+ shared_ptr<dcp::CPL> cpl;
+ boost::filesystem::path dir;
+ std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ dcp::String::compose("%1x%2", width, height),
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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")
+ ).set_cpl_id(cpl->id())
+ };
+ check_verify_result(notes, expected);
}
@@ -1339,10 +1938,35 @@ static
void
check_picture_size_bad_2k_frame_rate (int width, int height, int frame_rate, bool three_d)
{
- auto notes = check_picture_size(width, height, frame_rate, three_d);
- BOOST_REQUIRE_EQUAL (notes.size(), 2U);
- BOOST_CHECK_EQUAL (notes.back().type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (notes.back().code(), dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K);
+ vector<dcp::VerificationNote> notes;
+ shared_ptr<dcp::CPL> cpl;
+ boost::filesystem::path dir;
+ std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ dcp::String::compose("%1x%2", width, height),
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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))
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K, dcp::String::compose("%1/1", frame_rate), canonical(dir / "video.mxf")
+ ).set_cpl_id(cpl->id())
+ };
+
+ check_verify_result(notes, expected);
}
@@ -1350,10 +1974,32 @@ static
void
check_picture_size_bad_4k_frame_rate (int width, int height, int frame_rate, bool three_d)
{
- auto notes = check_picture_size(width, height, frame_rate, three_d);
- BOOST_REQUIRE_EQUAL (notes.size(), 1U);
- BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_4K);
+ vector<dcp::VerificationNote> notes;
+ shared_ptr<dcp::CPL> cpl;
+ boost::filesystem::path dir;
+ std::tie(notes, cpl, dir) = check_picture_size(width, height, frame_rate, three_d);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ dcp::String::compose("%1x%2", width, height),
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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")
+ ).set_cpl_id(cpl->id())
+ };
+
+ check_verify_result(notes, expected);
}
@@ -1399,10 +2045,28 @@ BOOST_AUTO_TEST_CASE (verify_picture_size)
check_picture_size_bad_4k_frame_rate (3996, 2160, 48, false);
/* No 4K 3D */
- auto notes = check_picture_size(3996, 2160, 24, true);
- BOOST_REQUIRE_EQUAL (notes.size(), 1U);
- BOOST_CHECK_EQUAL (notes.front().type(), dcp::VerificationNote::Type::BV21_ERROR);
- BOOST_CHECK_EQUAL (notes.front().code(), dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D);
+ vector<dcp::VerificationNote> notes;
+ shared_ptr<dcp::CPL> cpl;
+ boost::filesystem::path dir;
+ std::tie(notes, cpl, dir) = check_picture_size(3996, 2160, 24, true);
+
+ std::vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"3996x2160"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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 },
+ };
}
@@ -1458,15 +2122,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_xml_size_in_bytes)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- {
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
dcp::VerificationNote::Type::BV21_ERROR,
dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES,
string("419371"),
canonical(dir / "subs.mxf")
- },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1503,11 +2179,30 @@ verify_timed_text_asset_too_large (string name)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_SIZE_IN_BYTES, string("121695488"), canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, string("121634816"), canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR,
+ dcp::VerificationNote::Code::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES,
+ dcp::raw_convert<string>(121634816),
+ canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1554,15 +2249,34 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language)
subs->write (dir / "subs.mxf");
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
- dcp->cpls()[0]->reels()[0]->add(reel_subs);
+ auto cpl = dcp->cpls()[0];
+ cpl->reels()[0]->add(reel_subs);
dcp->write_xml();
check_verify_result (
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id())
});
}
@@ -1600,9 +2314,31 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages)
{ path },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_SUBTITLE_LANGUAGES }
+ 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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_SUBTITLE_LANGUAGES
+ ).set_cpl_id(cpl->id()),
});
}
@@ -1640,8 +2376,28 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed)
{ path },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf") }
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs1.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(path / "subs2.mxf")
+ ).set_cpl_id(cpl->id())
});
}
@@ -1681,15 +2437,34 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time)
subs->write (dir / "subs.mxf");
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
- dcp->cpls()[0]->reels()[0]->add(reel_subs);
+ auto cpl = dcp->cpls()[0];
+ cpl->reels()[0]->add(reel_subs);
dcp->write_xml();
check_verify_result (
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id())
});
}
@@ -1730,15 +2505,34 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time)
subs->write (dir / "subs.mxf");
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
- dcp->cpls().front()->reels().front()->add(reel_subs);
+ auto cpl = dcp->cpls()[0];
+ cpl->reels().front()->add(reel_subs);
dcp->write_xml();
check_verify_result (
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id())
});
}
@@ -1831,8 +2625,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_first_text_time)
{ dir },
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1843,7 +2647,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time)
auto const dir = path("build/test/verify_valid_subtitle_first_text_time");
/* Just late enough */
auto cpl = dcp_with_text<dcp::ReelSMPTESubtitleAsset> (dir, {{ 4 * 24, 5 * 24 }});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -1888,7 +2705,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time_on_second_reel)
dcp->set_annotation_text("hello");
dcp->write_xml();
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -1905,8 +2735,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_spacing)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1920,7 +2760,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_spacing)
{ 4 * 24, 5 * 24 },
{ 5 * 24 + 16, 8 * 24 },
});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -1932,8 +2786,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_duration)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1942,7 +2806,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_duration)
{
auto const dir = path("build/test/verify_valid_subtitle_duration");
auto cpl = dcp_with_text<dcp::ReelSMPTESubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 17 }});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -1963,10 +2841,24 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_overlapping_reel_boundary)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get()) },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::SUBTITLE_OVERLAPS_REEL_BOUNDARY },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::SUBTITLE_OVERLAPS_REEL_BOUNDARY
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -1987,8 +2879,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count1)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2003,7 +2905,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count1)
{ 96, 200, 0.1, dcp::VAlign::CENTER, "have" },
{ 96, 200, 0.2, dcp::VAlign::CENTER, "four" },
});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -2022,8 +2938,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count2)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2039,7 +2965,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count2)
{ 150, 180, 0.2, dcp::VAlign::CENTER, "four" },
{ 190, 250, 0.3, dcp::VAlign::CENTER, "lines" }
});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -2055,8 +2995,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length1)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2073,8 +3023,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length2)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2094,8 +3054,18 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count1)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT},
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2110,7 +3080,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count2)
{ 96, 200, 0.1, dcp::VAlign::CENTER, "have" },
{ 96, 200, 0.2, dcp::VAlign::CENTER, "four" },
});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -2129,8 +3113,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_count3)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT},
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2146,7 +3140,21 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count4)
{ 150, 180, 0.2, dcp::VAlign::CENTER, "four" },
{ 190, 250, 0.3, dcp::VAlign::CENTER, "lines" }
});
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+
+ check_verify_result(
+ {dir},
+ {},
+ {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -2158,11 +3166,20 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_length)
{
{ 96, 300, 0.0, dcp::VAlign::CENTER, "01234567890123456789012345678901" }
});
+
check_verify_result (
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2179,8 +3196,18 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_length)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2199,7 +3226,15 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign1)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2218,8 +3253,18 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign2)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2234,11 +3279,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering1)
{ 96, 300, 0.1, dcp::VAlign::TOP, "is" },
{ 96, 300, 0.2, dcp::VAlign::TOP, "fine" },
});
- check_verify_result (
+
+ check_verify_result(
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2253,11 +3307,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering2)
{ 96, 300, 0.1, dcp::VAlign::BOTTOM, "is" },
{ 96, 300, 0.0, dcp::VAlign::BOTTOM, "also fine" },
});
- check_verify_result (
+
+ check_verify_result(
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2270,8 +3333,18 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering3)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2280,11 +3353,20 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering4)
{
auto const dir = path ("build/test/verify_incorrect_closed_caption_ordering4");
auto cpl = dcp_with_text_from_file<dcp::ReelSMPTEClosedCaptionAsset> (dir, "test/data/verify_incorrect_closed_caption_ordering4.xml");
- check_verify_result (
+
+ check_verify_result(
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2314,8 +3396,20 @@ BOOST_AUTO_TEST_CASE (verify_invalid_sound_frame_rate)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_SOUND_FRAME_RATE, string("96000"), canonical(dir / "audiofoo.mxf") },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ 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_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2342,10 +3436,24 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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->id(), canonical(cpl->file().get())
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash())
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash())
});
}
@@ -2371,10 +3479,24 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text)
{dir},
{},
{
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISMATCHED_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) },
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get())
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash())
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISMATCHED_CPL_ANNOTATION_TEXT, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl->file().get())
+ ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()).set_cpl_id(cpl->id())
});
}
@@ -2386,7 +3508,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration)
shared_ptr<dcp::DCP> dcp (new dcp::DCP(dir));
auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
- shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (dir, "", 24);
+ shared_ptr<dcp::MonoJ2KPictureAsset> mp = simple_picture (dir, "", 24);
shared_ptr<dcp::SoundAsset> ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25);
auto reel = make_shared<dcp::Reel>(
@@ -2405,8 +3527,20 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_DURATION },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), canonical(cpl->file().get()) }
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id())
});
}
@@ -2477,8 +3611,22 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_MAIN_SUBTITLE_FROM_SOME_REELS },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2486,13 +3634,47 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
{
path dir ("build/test/verify_subtitles_must_be_in_all_reels2");
auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, true, true);
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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())
+ });
}
{
path dir ("build/test/verify_subtitles_must_be_in_all_reels1");
auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, false, false);
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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())
+ });
}
}
@@ -2561,21 +3743,69 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
{
path dir ("build/test/verify_closed_captions_must_be_in_all_reels2");
auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 4, 4);
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
{
path dir ("build/test/verify_closed_captions_must_be_in_all_reels3");
auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 0, 0);
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {dir},
+ {},
+ {
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
}
@@ -2618,8 +3848,20 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, code, subs->id() },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2686,10 +3928,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, asset_id }
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, asset_id
+ ).set_cpl_id(cpl->id())
});
}
@@ -2703,14 +3960,36 @@ verify_markers_test (
)
{
auto dcp = make_simple (dir);
- dcp->cpls()[0]->set_content_kind (dcp::ContentKind::FEATURE);
+ auto cpl = dcp->cpls()[0];
+ cpl->set_content_kind(dcp::ContentKind::FEATURE);
auto markers_asset = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 24);
for (auto const& i: markers) {
markers_asset->set (i.first, i.second);
}
- dcp->cpls()[0]->reels()[0]->add(markers_asset);
+ cpl->reels()[0]->add(markers_asset);
dcp->write_xml();
+ for (auto& note: test_notes) {
+ 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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl));
+ test_notes.push_back(ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl));
+ test_notes.push_back(
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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);
}
@@ -2807,7 +4086,28 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number)
cpl->unset_version_number();
dcp->write_xml();
- check_verify_result({dir}, {}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->id(), cpl->file().get() }});
+ check_verify_result(
+ {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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->file().get()
+ ).set_cpl_id(cpl->id())
+ });
}
@@ -2831,10 +4131,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() }
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2858,10 +4173,25 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() }
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_EXTENSION_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2886,11 +4216,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl->file().get(), 70 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77 },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77).set_cpl_id(cpl->id()),
+ 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()),
});
}
@@ -2914,10 +4260,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'"), cpl->file().get() },
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'"), cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2941,10 +4302,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'"), cpl->file().get() },
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'"), cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -2969,11 +4345,28 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl->file().get(), 74 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl->file().get(), 75 },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl->file().get(), 75
+ ).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ 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())
});
}
@@ -2997,10 +4390,25 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7)
{dir},
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'"), cpl->file().get() },
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'"), cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -3025,11 +4433,27 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl->file().get(), 72 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl->file().get(), 76 },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl->file().get(), 76).set_cpl_id(cpl->id()),
+ 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()),
});
}
@@ -3054,11 +4478,28 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
{dir},
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl->file().get(), 71 },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77 },
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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::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::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 77
+ ).set_cpl_id(cpl->id()),
+ 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()),
});
}
@@ -3066,36 +4507,58 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
BOOST_AUTO_TEST_CASE (verify_unsigned_cpl_with_encrypted_content)
{
- path dir = "build/test/verify_unsigned_cpl_with_encrypted_content";
+ path const dir = "build/test/verify_unsigned_cpl_with_encrypted_content";
prepare_directory (dir);
for (auto i: directory_iterator("test/ref/DCP/encryption_test")) {
copy_file (i.path(), dir / i.path().filename());
}
- path const pkl = dir / ( "pkl_" + encryption_test_pkl_id() + ".xml" );
- path const cpl = dir / ( "cpl_" + encryption_test_cpl_id() + ".xml");
+ path const pkl = dir / ( "pkl_" + encryption_test_pkl_id() + ".xml");
+ path const cpl_path = dir / ( "cpl_" + encryption_test_cpl_id() + ".xml");
- HashCalculator calc(cpl);
+ HashCalculator calc(cpl_path);
{
- Editor e (cpl);
+ Editor e(cpl_path);
e.delete_lines ("<dsig:Signature", "</dsig:Signature>");
}
+ auto cpl = std::make_shared<dcp::CPL>(cpl_path);
+
check_verify_result (
{dir},
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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)
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl)
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_path)
+ ).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, encryption_test_cpl_id(), canonical(cpl)
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl), },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, encryption_test_cpl_id(), canonical(cpl) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, encryption_test_cpl_id(), canonical(cpl) }
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, canonical(cpl_path)
+ ).set_cpl_id(cpl->id())
});
}
@@ -3108,24 +4571,47 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_encrypted_content)
copy_file (i.path(), dir / i.path().filename());
}
- path const cpl = dir / ("cpl_" + encryption_test_cpl_id() + ".xml");
+ path const cpl_path = dir / ("cpl_" + encryption_test_cpl_id() + ".xml");
path const pkl = dir / ("pkl_" + encryption_test_pkl_id() + ".xml");
{
Editor e (pkl);
e.delete_lines ("<dsig:Signature", "</dsig:Signature>");
}
+ auto cpl = std::make_shared<dcp::CPL>(cpl_path);
+
check_verify_result (
{dir},
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, encryption_test_cpl_id(), canonical(cpl) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, encryption_test_pkl_id(), canonical(pkl) },
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, encryption_test_pkl_id(), canonical(pkl)
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_path)
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, encryption_test_pkl_id(), canonical(pkl)
+ )
});
}
@@ -3143,7 +4629,27 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_unencrypted_content)
e.delete_lines ("<dsig:Signature", "</dsig:Signature>");
}
- check_verify_result({dir}, {}, {});
+ auto cpl = make_shared<dcp::CPL>(find_cpl(dir));
+
+ check_verify_result(
+ {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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ });
}
@@ -3164,10 +4670,10 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
dcp::Key key;
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction (24, 1), dcp::Standard::SMPTE);
mp->set_key (key);
- auto writer = mp->start_write(dir / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto writer = mp->start_write(dir / "video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::ArrayData j2c ("test/data/flat_red.j2c");
for (int i = 0; i < 24; ++i) {
writer->write (j2c.data(), j2c.size());
@@ -3210,7 +4716,22 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
{dir},
{},
{
- {dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED},
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1440x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::PARTIALLY_ENCRYPTED
+ ).set_cpl_id(cpl->id())
});
}
@@ -3218,22 +4739,22 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_2k)
{
vector<dcp::VerificationNote> notes;
- dcp::MonoPictureAsset picture (find_file(private_test / "data" / "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV", "j2c.mxf"));
+ dcp::MonoJ2KPictureAsset picture (find_file(private_test / "data" / "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV", "j2c.mxf"));
auto reader = picture.start_read ();
auto frame = reader->get_frame (0);
verify_j2k(frame, 0, 0, 24, notes);
- BOOST_REQUIRE_EQUAL (notes.size(), 0U);
+ BOOST_CHECK(notes.empty());
}
BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_4k)
{
vector<dcp::VerificationNote> notes;
- dcp::MonoPictureAsset picture (find_file(private_test / "data" / "sul", "TLR"));
+ dcp::MonoJ2KPictureAsset picture (find_file(private_test / "data" / "sul", "TLR"));
auto reader = picture.start_read ();
auto frame = reader->get_frame (0);
verify_j2k(frame, 0, 0, 24, notes);
- BOOST_REQUIRE_EQUAL (notes.size(), 0U);
+ BOOST_CHECK(notes.empty());
}
@@ -3244,11 +4765,11 @@ BOOST_AUTO_TEST_CASE (verify_jpeg2000_codestream_libdcp)
auto dcp = make_simple (dir);
dcp->write_xml ();
vector<dcp::VerificationNote> notes;
- dcp::MonoPictureAsset picture (find_file(dir, "video"));
+ dcp::MonoJ2KPictureAsset picture (find_file(dir, "video"));
auto reader = picture.start_read ();
auto frame = reader->get_frame (0);
verify_j2k(frame, 0, 0, 24, notes);
- BOOST_REQUIRE_EQUAL (notes.size(), 0U);
+ BOOST_CHECK(notes.empty());
}
@@ -3310,10 +4831,24 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_resource_id)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_RESOURCE_ID },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_RESOURCE_ID
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id())
});
}
@@ -3376,11 +4911,27 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id)
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INCORRECT_TIMED_TEXT_ASSET_ID },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2018-10-02T12:25:14+02:00"} }
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, 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_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INCORRECT_TIMED_TEXT_ASSET_ID
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_ISSUE_DATE, string{"2018-10-02T12:25:14+02:00"}
+ ).set_cpl_id(cpl->id())
});
}
@@ -3388,18 +4939,29 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id)
/** Check a DCP with a 3D asset marked as 2D */
BOOST_AUTO_TEST_CASE (verify_threed_marked_as_twod)
{
+ auto const path = private_test / "data" / "xm";
+
+ auto cpl = std::make_shared<dcp::CPL>(find_prefix(path, "CPL_"));
+ BOOST_REQUIRE(cpl);
+
check_verify_result (
- { private_test / "data" / "xm" },
+ { path },
{},
{
- {
+ 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_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(private_test / "data" / "xm", "j2c"))
- },
- {
+ dcp::VerificationNote::Code::THREED_ASSET_MARKED_AS_TWOD, boost::filesystem::canonical(find_file(path, "j2c"))
+ ),
+ dcp::VerificationNote(
dcp::VerificationNote::Type::BV21_ERROR,
dcp::VerificationNote::Code::INVALID_STANDARD
- },
+ )
});
}
@@ -3422,17 +4984,34 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
);
}
- dcp::CPL cpl (find_cpl(dir));
+ auto cpl = make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result (
{ dir },
{},
{
+ 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(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ canonical(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::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_ENTRY_POINT
+ ).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir))
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_ENTRY_POINT },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_DURATION },
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::UNEXPECTED_DURATION
+ ).set_cpl_id(cpl->id())
});
}
@@ -3451,16 +5030,30 @@ BOOST_AUTO_TEST_CASE(verify_invalid_content_kind)
e.replace("trailer", "trip");
}
- dcp::CPL cpl (find_cpl(dir));
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result (
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir))
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("trip") }
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ 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_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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))
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_CONTENT_KIND, string("trip")
+ ).set_cpl_id(cpl->id()),
});
}
@@ -3480,17 +5073,28 @@ BOOST_AUTO_TEST_CASE(verify_valid_content_kind)
e.replace("<ContentKind>trailer</ContentKind>", "<ContentKind scope=\"http://bobs.contents/\">trip</ContentKind>");
}
- dcp::CPL cpl (find_cpl(dir));
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result (
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir))
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
});
-
}
@@ -3513,17 +5117,28 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1)
}
dcp::PKL pkl(find_pkl(dir));
- dcp::CPL cpl(find_cpl(dir));
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result(
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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))
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir))
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 1997 is not a multiple of 2", canonical(find_cpl(dir)) },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 4080 is bigger than the asset height 1080", canonical(find_cpl(dir)) },
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 1997 is not a multiple of 2", canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 4080 is bigger than the asset height 1080", canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()),
});
}
@@ -3547,18 +5162,31 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2)
}
dcp::PKL pkl(find_pkl(dir));
- dcp::CPL cpl(find_cpl(dir));
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result(
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_KIND, string{"trailer"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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),
+ 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))
+ ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is not a multiple of 2", canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 9900 is bigger than the asset width 1998", canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id()),
dcp::VerificationNote(
- dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir))
- ).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is not a multiple of 2", canonical(find_cpl(dir)) },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 9900 is bigger than the asset width 1998", canonical(find_cpl(dir)) },
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is bigger than the asset height 1080", canonical(find_cpl(dir)) },
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is bigger than the asset height 1080", canonical(find_cpl(dir))
+ ).set_cpl_id(cpl->id())
});
}
@@ -3578,11 +5206,24 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_pkl_asset_ids)
}
dcp::PKL pkl(find_pkl(dir));
+ auto cpl = std::make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result(
{ dir },
{},
{
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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)) },
});
}
@@ -3604,13 +5245,30 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_assetmap_asset_ids)
dcp::PKL pkl(find_pkl(dir));
dcp::AssetMap asset_map(find_asset_map(dir));
+ auto cpl = make_shared<dcp::CPL>(find_cpl(dir));
check_verify_result(
{ dir },
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP, asset_map.id(), canonical(find_asset_map(dir)) },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, string("5407b210-4441-4e97-8b16-8bdc7c12da54") },
+ ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
+ ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP, asset_map.id(), canonical(find_asset_map(dir))
+ ),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, string("5407b210-4441-4e97-8b16-8bdc7c12da54")
+ )
});
}
@@ -3683,7 +5341,25 @@ BOOST_AUTO_TEST_CASE(verify_mismatched_sound_channel_counts)
{ path },
{},
{
- { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_CHANNEL_COUNTS, canonical(find_file(path, "audio2")) },
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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),
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_SOUND_CHANNEL_COUNTS, canonical(find_file(path, "audio2"))
+ ).set_cpl_id(cpl->id())
});
}
@@ -3734,7 +5410,23 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_sound_configuration)
{ path },
{},
{
- { 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)) },
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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))
+ ).set_cpl_id(cpl->id())
});
}
@@ -3748,8 +5440,8 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
boost::filesystem::remove_all(path);
boost::filesystem::create_directories(path);
- auto mp = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
- auto picture_writer = mp->start_write(path / "video.mxf", dcp::PictureAsset::Behaviour::MAKE_NEW);
+ auto mp = make_shared<dcp::MonoJ2KPictureAsset>(dcp::Fraction(24, 1), dcp::Standard::SMPTE);
+ auto picture_writer = mp->start_write(path / "video.mxf", dcp::Behaviour::MAKE_NEW);
dcp::Size const size(1998, 1080);
auto image = make_shared<dcp::OpenJPEGImage>(size);
@@ -3789,20 +5481,40 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
dcp->set_annotation_text("A Test DCP");
dcp->write_xml();
- vector<dcp::VerificationNote> expected;
+ vector<dcp::VerificationNote> expected = {
+ ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video.mxf"), cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC
+ ).set_cpl_id(cpl->id())
+ };
for (auto frame = 0; frame < 24; frame++) {
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(path / "video.mxf")
- ).set_frame(frame).set_frame_rate(24)
+ ).set_frame(frame).set_frame_rate(24).set_cpl_id(cpl->id())
);
}
int component_sizes[] = {
- 1321721,
- 1294364,
- 1289952,
+ 1321816,
+ 1294414,
+ 1289881,
};
for (auto frame = 0; frame < 24; frame++) {
@@ -3810,19 +5522,11 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
expected.push_back(
dcp::VerificationNote(
dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_TILE_PART_SIZE
- ).set_frame(frame).set_component(component).set_size(component_sizes[component])
+ ).set_frame(frame).set_component(component).set_size(component_sizes[component]).set_cpl_id(cpl->id())
);
}
}
- expected.push_back(
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC }
- );
-
- expected.push_back(
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC }
- );
-
check_verify_result({ path }, {}, expected);
}
@@ -3830,16 +5534,41 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
BOOST_AUTO_TEST_CASE(verify_too_many_subtitle_namespaces)
{
boost::filesystem::path const dir = "test/ref/DCP/subtitle_namespace_test";
+ dcp::DCP dcp(dir);
+ dcp.read();
+ BOOST_REQUIRE(!dcp.cpls().empty());
+ auto cpl = dcp.cpls()[0];
+
check_verify_result(
{ dir },
{},
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(find_file(dir, "sub_")) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, "fc815694-7977-4a27-a8b3-32b9d4075e4c", canonical(find_file(dir, "cpl_")) },
- { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, std::string{"315de731-1173-484c-9a35-bdacf5a9d99d"} }
+ 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),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFEC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_FFMC_IN_FEATURE
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, canonical(find_file(dir, "sub_"))
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(find_file(dir, "cpl_"))
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INCORRECT_SUBTITLE_NAMESPACE_COUNT, std::string{"315de731-1173-484c-9a35-bdacf5a9d99d"}
+ ).set_cpl_id(cpl->id()),
});
}
@@ -3855,14 +5584,19 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font_for_font)
}
auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "subs.xml");
auto reel_asset = make_shared<dcp::ReelInteropSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset, dcp::Standard::INTEROP);
+ auto cpl = write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
check_verify_result (
{dir},
{},
{
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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")
+ dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT_FOR_FONT).set_id("theFontId").set_cpl_id(cpl->id())
});
}
@@ -3903,14 +5637,29 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
subs->write(dir / "subs.mxf");
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 202, 0);
- dcp->cpls()[0]->reels()[0]->add(reel_subs);
+ auto cpl = dcp->cpls()[0];
+ cpl->reels()[0]->add(reel_subs);
dcp->write_xml();
check_verify_result (
{ dir },
{},
{
- dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT).set_id(reel_subs->id())
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, 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())
});
}
@@ -3922,12 +5671,13 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset)
auto dcp1 = make_simple(dir / "1");
dcp1->write_xml();
+ auto cpl = dcp1->cpls()[0];
- auto const asset_1 = dcp::MonoPictureAsset(dir / "1" / "video.mxf").id();
+ auto const asset_1 = dcp::MonoJ2KPictureAsset(dir / "1" / "video.mxf").id();
auto dcp2 = make_simple(dir / "2");
dcp2->write_xml();
- auto const asset_2 = dcp::MonoPictureAsset(dir / "2" / "video.mxf").id();
+ auto const asset_2 = dcp::MonoJ2KPictureAsset(dir / "2" / "video.mxf").id();
boost::filesystem::remove(dir / "1" / "video.mxf");
boost::filesystem::copy_file(dir / "2" / "video.mxf", dir / "1" / "video.mxf");
@@ -3936,6 +5686,18 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset)
{dir / "1"},
{},
{
+ 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),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_MAP_ID).set_id(asset_1).set_other_id(asset_2)
});
}
@@ -3956,7 +5718,20 @@ BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty)
{dir},
{},
{
- dcp::VerificationNote(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_id(cpl->id())
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::OK,
+ dcp::VerificationNote::Code::VALID_MAIN_PICTURE_ACTIVE_AREA,
+ string{"1998x1080"},
+ cpl->file().get()
+ ).set_cpl_id(cpl->id()),
+ 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),
+ dcp::VerificationNote(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_cpl_id(cpl->id())
});
}
@@ -3979,13 +5754,72 @@ BOOST_AUTO_TEST_CASE(verify_encrypted_smpte_dcp)
{ dir },
{ kdm },
{
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->id(), canonical(cpl_file) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, cpl->id(), canonical(cpl_file) },
- { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, filename_to_id(pkl_file.filename()), canonical(pkl_file) }
+ 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_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+ ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl_file)
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, canonical(cpl_file)
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, filename_to_id(pkl_file.filename()), canonical(pkl_file)
+ )
});
}
+BOOST_AUTO_TEST_CASE(verify_invalid_sound_bit_depth)
+{
+ auto const dir = private_test / "data" / "16_bit_audio";
+
+ auto cpl = make_shared<dcp::CPL>(find_prefix(dir, "CPL_"));
+
+ vector<dcp::VerificationNote> notes = {
+ 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{"Advertisement"}, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CONTENT_VERSION_LABEL_TEXT, cpl->content_version()->label_text, cpl),
+ ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"204794_Kitex_Scoobee_Day_Bags_30_Sec_Malayalam_220524_RADQR"}, 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::ERROR, dcp::VerificationNote::Code::INVALID_SOUND_BIT_DEPTH, "16", canonical(dir / "Audio.mxf")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, string("fd4796c2-9c84-454c-91f4-13ad127cea8a")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_HASH, string("9d5e8bc4-676b-4306-a86d-03f70c73b457")
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, canonical(cpl->file().get())
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_FFOC
+ ).set_cpl_id(cpl->id()),
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::MISSING_LFOC
+ ).set_cpl_id(cpl->id()),
+ };
+
+ for (auto i = 0; i < 792; ++i) {
+ notes.push_back(
+ dcp::VerificationNote(
+ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2")
+ ).set_cpl_id(cpl->id())
+ );
+ }
+
+ check_verify_result({ dir }, {}, notes);
+}
+
+
BOOST_AUTO_TEST_CASE(overlapping_subtitles)
{
auto asset = make_shared<dcp::InteropSubtitleAsset>();
diff --git a/test/wscript b/test/wscript
index d2cac0b3..64b3ed59 100644
--- a/test/wscript
+++ b/test/wscript
@@ -53,7 +53,7 @@ def configure(conf):
def build(bld):
obj = bld(features='cxx cxxprogram')
obj.name = 'tests'
- obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATETIME OPENJPEG CXML XMLSEC1 SNDFILE OPENMP ASDCPLIB_CTH LIBXML++ OPENSSL XERCES DL'
+ obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM BOOST_DATETIME OPENJPEG CXML XMLSEC1 SNDFILE OPENMP ASDCPLIB_DCPOMATIC LIBXML++ OPENSSL XERCES DL AVCODEC AVUTIL'
obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0']
if bld.env['CXX_NAME'] == 'gcc':
obj.cppflags.append('-fno-default-inline')
@@ -94,6 +94,8 @@ def build(bld):
make_digest_test.cc
markers_test.cc
mca_test.cc
+ mono_mpeg2_picture_read_test.cc
+ mono_mpeg2_picture_write_test.cc
kdm_test.cc
key_test.cc
language_tag_test.cc
@@ -117,13 +119,14 @@ def build(bld):
utf8_test.cc
v_align_test.cc
verify_test.cc
+ verify_report_test.cc
"""
obj.target = 'tests'
obj.install_path = ''
obj = bld(features='cxx cxxprogram')
obj.name = 'subs_in_out'
- obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_CTH XMLSEC1 OPENSSL DL LIBXML++'
+ obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_DCPOMATIC XMLSEC1 OPENSSL DL LIBXML++ AVCODEC AVUTIL'
obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0']
if bld.env['CXX_NAME'] == 'gcc':
obj.cppflags.append('-fno-default-inline')
@@ -140,7 +143,7 @@ def build(bld):
obj = bld(features='cxx cxxprogram')
obj.name = 'rewrite_subs'
- obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_CTH XMLSEC1 OPENSSL DL LIBXML++'
+ obj.uselib = 'BOOST_TEST BOOST_FILESYSTEM OPENJPEG CXML OPENMP ASDCPLIB_DCPOMATIC XMLSEC1 OPENSSL DL LIBXML++ AVCODEC AVUTIL'
obj.cppflags = ['-fno-inline', '-fno-elide-constructors', '-g', '-O0']
if bld.env['CXX_NAME'] == 'gcc':
obj.cppflags.append('-fno-default-inline')