XMLPlatformUtils::Terminate ();
for (auto i: error_handler.errors()) {
- notes.push_back (
- VerificationNote(
- VerificationNote::VERIFY_ERROR,
- VerificationNote::INVALID_XML,
- i.message(),
- boost::trim_copy(i.public_id() + " " + i.system_id()),
- i.line()
- )
- );
+ notes.push_back ({
+ VerificationNote::VERIFY_ERROR,
+ VerificationNote::INVALID_XML,
+ i.message(),
+ boost::trim_copy(i.public_id() + " " + i.system_id()),
+ i.line()
+ });
}
}
auto const pr = verify_picture_asset (reel_asset, progress);
switch (pr) {
case VERIFY_PICTURE_ASSET_RESULT_BAD:
- notes.push_back (
- VerificationNote(
- VerificationNote::VERIFY_ERROR, VerificationNote::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
- )
- );
+ notes.push_back ({
+ VerificationNote::VERIFY_ERROR, VerificationNote::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
+ });
break;
case VERIFY_PICTURE_ASSET_RESULT_FRAME_NEARLY_TOO_LARGE:
- notes.push_back (
- VerificationNote(
- VerificationNote::VERIFY_WARNING, VerificationNote::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
- )
- );
+ notes.push_back ({
+ VerificationNote::VERIFY_WARNING, VerificationNote::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, file
+ });
break;
default:
break;
VerificationNote(
VerificationNote::VERIFY_BV21_ERROR,
VerificationNote::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D,
+ String::compose("%1/%2", asset->edit_rate().numerator, asset->edit_rate().denominator),
file
)
);
if (asset->sampling_rate() != 48000) {
notes.push_back (
VerificationNote(
- VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_SOUND_FRAME_RATE, *asset->file()
+ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_SOUND_FRAME_RATE, raw_convert<string>(asset->sampling_rate()), *asset->file()
)
);
}
}
if (!reel_asset->entry_point()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_ENTRY_POINT });
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_ENTRY_POINT, reel_asset->id() });
} else if (reel_asset->entry_point().get()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INCORRECT_SUBTITLE_ENTRY_POINT });
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INCORRECT_SUBTITLE_ENTRY_POINT, reel_asset->id() });
}
}
}
if (!reel_asset->entry_point()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CLOSED_CAPTION_ENTRY_POINT });
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CLOSED_CAPTION_ENTRY_POINT, reel_asset->id() });
} else if (reel_asset->entry_point().get()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INCORRECT_CLOSED_CAPTION_ENTRY_POINT });
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INCORRECT_CLOSED_CAPTION_ENTRY_POINT, reel_asset->id() });
}
}
} else {
notes.push_back ({ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_SUBTITLE_LANGUAGE, *asset->file() });
}
- if (boost::filesystem::file_size(asset->file().get()) > 115 * 1024 * 1024) {
- notes.push_back ({ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_TIMED_TEXT_SIZE_IN_BYTES, *asset->file() });
+ auto const size = boost::filesystem::file_size(asset->file().get());
+ if (size > 115 * 1024 * 1024) {
+ notes.push_back (
+ { VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_TIMED_TEXT_SIZE_IN_BYTES, raw_convert<string>(size), *asset->file() }
+ );
}
/* XXX: I'm not sure what Bv2.1_7.2.1 means when it says "the font resource shall not be larger than 10MB"
* but I'm hoping that checking for the total size of all fonts being <= 10MB will do.
total_size += i.second.size();
}
if (total_size > 10 * 1024 * 1024) {
- notes.push_back ({ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, asset->file().get() });
+ notes.push_back ({ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, raw_convert<string>(total_size), asset->file().get() });
}
if (!asset->start_time()) {
if (asset->raw_xml().size() > 256 * 1024) {
notes.push_back (
VerificationNote(
- VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES, *asset->file()
+ VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES, raw_convert<string>(asset->raw_xml().size()), *asset->file()
)
);
}
}
if (too_early) {
- notes.push_back(
- VerificationNote(
- VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_FIRST_TEXT_TIME
- )
- );
+ notes.push_back({
+ VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_FIRST_TEXT_TIME
+ });
}
if (too_short) {
- notes.push_back (
- VerificationNote(
- VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_DURATION
- )
- );
+ notes.push_back ({
+ VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_DURATION
+ });
}
if (too_close) {
- notes.push_back (
- VerificationNote(
- VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_SPACING
- )
- );
+ notes.push_back ({
+ VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_SPACING
+ });
}
}
}
if (missing) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_EXTENSION_METADATA});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get()});
} else if (!malformed.empty()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_EXTENSION_METADATA, malformed});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_EXTENSION_METADATA, malformed, cpl->file().get()});
}
}
if (dcp->standard() == SMPTE) {
if (!cpl->annotation_text()) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_ANNOTATION_TEXT));
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_ANNOTATION_TEXT, cpl->id(), cpl->file().get()});
} else if (cpl->annotation_text().get() != cpl->content_title_text()) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::MISMATCHED_CPL_ANNOTATION_TEXT));
+ notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISMATCHED_CPL_ANNOTATION_TEXT, cpl->id(), cpl->file().get()});
}
}
/* Check that the CPL's hash corresponds to the PKL */
optional<string> h = i->hash(cpl->id());
if (h && make_digest(ArrayData(*cpl->file())) != *h) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::MISMATCHED_CPL_HASHES));
+ notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get()));
}
/* Check that any PKL with a single CPL has its AnnotationText the same as the CPL's ContentTitleText */
}
if (required_annotation_text && i->annotation_text() != required_annotation_text) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, i->file().get()});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, i->id(), i->file().get()});
}
}
if (!duration) {
duration = i->actual_duration();
} else if (*duration != i->actual_duration()) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISMATCHED_ASSET_DURATION));
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISMATCHED_ASSET_DURATION});
break;
}
}
frame_rate.numerator != 50 &&
frame_rate.numerator != 60 &&
frame_rate.numerator != 96)) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_ERROR, VerificationNote::INVALID_PICTURE_FRAME_RATE));
+ notes.push_back ({
+ VerificationNote::VERIFY_ERROR,
+ VerificationNote::INVALID_PICTURE_FRAME_RATE,
+ String::compose("%1/%2", frame_rate.numerator, frame_rate.denominator)
+ });
}
/* Check asset */
if (reel->main_picture()->asset_ref().resolved()) {
if (ffoc == markers_seen.end()) {
notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_FFOC});
} else if (ffoc->second.e != 1) {
- notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_FFOC});
+ notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_FFOC, raw_convert<string>(ffoc->second.e)});
}
auto lfoc = markers_seen.find(Marker::LFOC);
if (lfoc == markers_seen.end()) {
notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::MISSING_LFOC});
- } else if (lfoc->second.as_editable_units(lfoc->second.tcr) != (cpl->reels().back()->duration() - 1)) {
- notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_LFOC});
+ } else {
+ auto lfoc_time = lfoc->second.as_editable_units(lfoc->second.tcr);
+ if (lfoc_time != (cpl->reels().back()->duration() - 1)) {
+ notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INCORRECT_LFOC, raw_convert<string>(lfoc_time)});
+ }
}
check_text_timing (cpl->reels(), notes);
}
if (result.line_count_exceeded) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_LINE_COUNT));
+ notes.push_back ({VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_LINE_COUNT});
}
if (result.error_length_exceeded) {
notes.push_back (VerificationNote(VerificationNote::VERIFY_WARNING, VerificationNote::INVALID_SUBTITLE_LINE_LENGTH));
}
if (result.line_count_exceeded) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_LINE_COUNT));
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_LINE_COUNT});
}
if (result.error_length_exceeded) {
- notes.push_back (VerificationNote(VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_LINE_LENGTH));
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::INVALID_CLOSED_CAPTION_LINE_LENGTH});
}
if (!cpl->full_content_title_text()) {
/* Since FullContentTitleText is assumed always to exist if there's a CompositionMetadataAsset we
* can use it as a proxy for CompositionMetadataAsset's existence.
*/
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get()});
} else if (!cpl->version_number()) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->id(), cpl->file().get()});
}
check_extension_metadata (cpl, notes);
DCP_ASSERT (cpl->file());
doc.read_file (cpl->file().get());
if (!doc.optional_node_child("Signature")) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, cpl->file().get()});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, cpl->id(), cpl->file().get()});
}
}
}
cxml::Document doc ("PackingList");
doc.read_file (pkl->file().get());
if (!doc.optional_node_child("Signature")) {
- notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, pkl->file().get()});
+ notes.push_back ({VerificationNote::VERIFY_BV21_ERROR, VerificationNote::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, pkl->id(), pkl->file().get()});
}
}
}
*
* Comments should clarify meaning and also say which of the optional fields (e.g. file)
* are filled in when this code is used.
- * XXX: this needs checking.
*/
enum Code {
- /** An error when reading the DCP. note contains (probably technical) details. */
+ /** An error when reading the DCP.
+ * note contains (probably technical) details.
+ */
FAILED_READ,
- /** The hash of the CPL in the PKL does not agree with the CPL file */
+ /** The hash of the CPL in the PKL does not agree with the CPL file.
+ * note contains CPL ID.
+ * file contains CPL filename.
+ */
MISMATCHED_CPL_HASHES,
- /** Frame rate given in a reel for the main picture is not 24, 25, 30, 48, 50 or 60 */
+ /** Frame rate given in a reel for the main picture is not 24, 25, 30, 48, 50 or 60.
+ * note contains the invalid frame rate as "<numerator>/<denominator>"
+ */
INVALID_PICTURE_FRAME_RATE,
- /** The hash of a main picture asset does not agree with the PKL file. file contains the picture asset filename. */
+ /** The hash of a main picture asset does not agree with the PKL file.
+ * file contains the picture asset filename.
+ */
INCORRECT_PICTURE_HASH,
- /** The hash of a main picture is different in the CPL and PKL */
+ /** The hash of a main picture is different in the CPL and PKL.
+ * file contains the picture asset filename.
+ */
MISMATCHED_PICTURE_HASHES,
- /** The hash of a main sound asset does not agree with the PKL file. file contains the sound asset filename. */
+ /** The hash of a main sound asset does not agree with the PKL file.
+ * file contains the sound asset filename.
+ */
INCORRECT_SOUND_HASH,
- /** The hash of a main sound is different in the CPL and PKL */
+ /** The hash of a main sound is different in the CPL and PKL.
+ * file contains the sound asset filename.
+ */
MISMATCHED_SOUND_HASHES,
- /** An assetmap's <Path> entry is empty */
+ /** An assetmap's <Path> entry is empty. */
EMPTY_ASSET_PATH,
- /** A file mentioned in an asset map cannot be found */
+ /** A file mentioned in an asset map cannot be found.
+ * file contains the filename that is missing.
+ */
MISSING_ASSET,
/** The DCP contains both SMPTE and Interop-standard components */
MISMATCHED_STANDARD,
- /** Some XML fails to validate against the XSD/DTD */
+ /** Some XML fails to validate against the XSD/DTD.
+ * note contains the (probably technical) details.
+ * file contains the invalid filename.
+ * line contains the line number.
+ */
INVALID_XML,
/** No ASSETMAP{.xml} was found */
MISSING_ASSETMAP,
- /** An asset's IntrinsicDuration is less than 1 second */
+ /** An asset's IntrinsicDuration is less than 1 second.
+ * note contains asset ID.
+ */
INVALID_INTRINSIC_DURATION,
- /** An asset's Duration is less than 1 second */
+ /** An asset's Duration is less than 1 second.
+ * note contains asset ID.
+ */
INVALID_DURATION,
- /** The JPEG2000 data in at least one picture frame is larger than the equivalent of 250Mbit/s */
+ /** The JPEG2000 data in at least one picture frame is larger than the equivalent of 250Mbit/s.
+ * file contains the picture asset filename.
+ */
INVALID_PICTURE_FRAME_SIZE_IN_BYTES,
- /** The JPEG2000 data in at least one picture frame is larger than the equivalent of 230Mbit/s */
+ /** The JPEG2000 data in at least one picture frame is larger than the equivalent of 230Mbit/s.
+ * file contains the picture asset filename.
+ */
NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES,
- /** An asset that the CPL requires is not in this DCP; the DCP may be a VF */
+ /** An asset that the CPL requires is not in this DCP; the DCP may be a VF.
+ * note contains the asset ID.
+ */
EXTERNAL_ASSET,
/** DCP is Interop, not SMPTE [Bv2.1_6.1] */
INVALID_STANDARD,
- /** A language or territory does not conform to RFC 5646 [Bv2.1_6.2.1] */
+ /** A language or territory does not conform to RFC 5646 [Bv2.1_6.2.1].
+ * note contains the invalid language.
+ */
INVALID_LANGUAGE,
- /** A picture asset does not have one of the required Bv2.1 sizes (in pixels) [Bv2.1_7.1] */
+ /** A picture asset does not have one of the required Bv2.1 sizes (in pixels) [Bv2.1_7.1].
+ * note contains the incorrect size as "<width>x<height>"
+ * file contains the asset filename.
+ */
INVALID_PICTURE_SIZE_IN_PIXELS,
- /** A picture asset is 2K but is not at 24, 25 or 48 fps as required by Bv2.1 [Bv2.1_7.1] */
+ /** A picture asset is 2K but is not at 24, 25 or 48 fps as required by Bv2.1 [Bv2.1_7.1].
+ * note contains the invalid frame rate as "<numerator>/<denominator>"
+ * file contains the asset filename.
+ */
INVALID_PICTURE_FRAME_RATE_FOR_2K,
- /** A picture asset is 4K but is not at 24fps as required by Bv2.1 [Bv2.1_7.1] */
+ /** A picture asset is 4K but is not at 24fps as required by Bv2.1 [Bv2.1_7.1]
+ * note contains the invalid frame rate as "<numerator>/<denominator>"
+ * file contains the asset filename.
+ */
INVALID_PICTURE_FRAME_RATE_FOR_4K,
- /** A picture asset is 4K but is 3D which is not allowed by Bv2.1 [Bv2.1_7.1] */
+ /** A picture asset is 4K but is 3D which is not allowed by Bv2.1 [Bv2.1_7.1]
+ * note contains the invalid frame rate as "<numerator>/<denominator>"
+ * file contains the asset filename.
+ */
INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D,
- /** A closed caption's XML file is larger than 256KB [Bv2.1_7.2.1] */
+ /** A closed caption's XML file is larger than 256KB [Bv2.1_7.2.1].
+ * note contains the invalid size in bytes.
+ * file contains the asset filename.
+ */
INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES,
- /** Any timed text asset's total files is larger than 115MB [Bv2.1_7.2.1] */
+ /** Any timed text asset's total files is larger than 115MB [Bv2.1_7.2.1]
+ * note contains the invalid size in bytes.
+ * file contains the asset filename.
+ */
INVALID_TIMED_TEXT_SIZE_IN_BYTES,
- /** The total size of all a timed text asset's fonts is larger than 10MB [Bv2.1_7.2.1] */
+ /** The total size of all a timed text asset's fonts is larger than 10MB [Bv2.1_7.2.1]
+ * note contains the invalid size in bytes.
+ * file contains the asset filename.
+ */
INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES,
- /** Some SMPTE subtitle XML has no <Language> tag [Bv2.1_7.2.2] */
+ /** Some SMPTE subtitle XML has no <Language> tag [Bv2.1_7.2.2]
+ * file contains the asset filename.
+ */
MISSING_SUBTITLE_LANGUAGE,
/** Not all subtitle assets specify the same <Language> tag [Bv2.1_7.2.2] */
MISMATCHED_SUBTITLE_LANGUAGES,
- /** Some SMPTE subtitle XML has no <StartTime> tag [Bv2.1_7.2.3] */
+ /** Some SMPTE subtitle XML has no <StartTime> tag [Bv2.1_7.2.3]
+ * file contains the asset filename.
+ */
MISSING_SUBTITLE_START_TIME,
- /** Some SMPTE subtitle XML has a non-zero <StartTime> tag [Bv2.1_7.2.3] */
+ /** Some SMPTE subtitle XML has a non-zero <StartTime> tag [Bv2.1_7.2.3]
+ * file contains the asset filename.
+ */
INVALID_SUBTITLE_START_TIME,
/** The first subtitle or closed caption happens before 4s into the first reel [Bv2.1_7.2.4] */
INVALID_SUBTITLE_FIRST_TEXT_TIME,
INVALID_CLOSED_CAPTION_LINE_COUNT,
/** There are more than 32 characters in at least one closed caption line [Bv2.1_7.2.6] */
INVALID_CLOSED_CAPTION_LINE_LENGTH,
- /** The audio sampling rate must be 48kHz [Bv2.1_7.3] */
+ /** The audio sampling rate must be 48kHz [Bv2.1_7.3].
+ * note contains the invalid frame rate.
+ * file contains the asset filename.
+ */
INVALID_SOUND_FRAME_RATE,
- /** The CPL has no <AnnotationText> tag [Bv2.1_8.1] */
+ /** The CPL has no <AnnotationText> tag [Bv2.1_8.1]
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
MISSING_CPL_ANNOTATION_TEXT,
- /** The <AnnotationText> is not the same as the <ContentTitleText> [Bv2.1_8.1] */
+ /** The <AnnotationText> is not the same as the <ContentTitleText> [Bv2.1_8.1]
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
MISMATCHED_CPL_ANNOTATION_TEXT,
/** At least one asset in a reel does not have the same duration as the others */
MISMATCHED_ASSET_DURATION,
MISSING_MAIN_SUBTITLE_FROM_SOME_REELS,
/** If one reel has at least one ClosedCaption, all reels must have the same number of ClosedCaptions */
MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS,
- /** MainSubtitle in reels must have <EntryPoint> Bv2.1_8.3.2 */
+ /** MainSubtitle in reels must have <EntryPoint> Bv2.1_8.3.2
+ * note contains the asset ID
+ */
MISSING_SUBTITLE_ENTRY_POINT,
- /** MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2 */
+ /** MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2
+ * note contains the asset ID
+ */
INCORRECT_SUBTITLE_ENTRY_POINT,
- /** Closed caption in reels must have <EntryPoint> Bv2.1_8.3.2 */
+ /** Closed caption in reels must have <EntryPoint> Bv2.1_8.3.2
+ * note contains the asset ID
+ */
MISSING_CLOSED_CAPTION_ENTRY_POINT,
- /** Closed caption MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2 */
+ /** Closed caption MainSubtitle <EntryPoint> must be zero Bv2.1_8.3.2
+ * note contains the asset ID
+ */
INCORRECT_CLOSED_CAPTION_ENTRY_POINT,
- /** <Hash> must be present for assets in CPLs */
+ /** <Hash> must be present for assets in CPLs.
+ * note contains the asset ID
+ */
MISSING_HASH,
/** If ContentKind is Feature there must be a FFEC marker */
MISSING_FFEC_IN_FEATURE,
MISSING_FFOC,
/** There should be a LFOC */
MISSING_LFOC,
- /** The FFOC should be 1 */
+ /** The FFOC should be 1.
+ * note contains the incorrect value.
+ */
INCORRECT_FFOC,
- /** The LFOC should be the last frame in the reel */
+ /** The LFOC should be the last frame in the reel
+ * note contains the incorrect value.
+ */
INCORRECT_LFOC,
- /** There must be a <CompositionMetadataAsset> */
+ /** There must be a <CompositionMetadataAsset>
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
MISSING_CPL_METADATA,
- /** CPL metadata should contain <VersionNumber> of 1, at least */
+ /** CPL metadata should contain <VersionNumber> of 1, at least
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
MISSING_CPL_METADATA_VERSION_NUMBER,
- /** There must be an <ExtensionMetadata> in <CompositionMetadataAsset> Bv2.1_8.6.3 */
+ /** There must be an <ExtensionMetadata> in <CompositionMetadataAsset> Bv2.1_8.6.3
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
MISSING_EXTENSION_METADATA,
- /** <ExtensionMetadata> must have a particular form Bv2.1_8.6.3 */
+ /** <ExtensionMetadata> must have a particular form Bv2.1_8.6.3
+ * note contains details of what's wrong
+ * file contains the CPL filename.
+ */
INVALID_EXTENSION_METADATA,
- /** CPLs containing encrypted content must be signed Bv2.1_8.7 */
+ /** CPLs containing encrypted content must be signed Bv2.1_8.7
+ * note contains the CPL ID.
+ * file contains the CPL filename.
+ */
UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT,
- /** PKLs containing encrypted content must be signed Bv2.1_8.7 */
+ /** PKLs containing encrypted content must be signed Bv2.1_8.7
+ * note contains the PKL ID.
+ * file contains the PKL filename.
+ */
UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT,
- /** If a PKL has one CPL its <ContentTitleText> must be the same as the PKL's <AnnotationText> */
+ /** If a PKL has one CPL its <ContentTitleText> must be the same as the PKL's <AnnotationText>.
+ * note contains the PKL ID.
+ * file contains the PKL filename.
+ */
MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL,
/** If any content is encrypted, everything must be encrypted */
PARTIALLY_ENCRYPTED,
#include "reel_markers_asset.h"
#include "compose.hpp"
#include "test.h"
+#include "raw_convert.h"
#include <boost/test/unit_test.hpp>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
static list<pair<string, optional<path>>> stages;
static string const dcp_test1_pkl = "pkl_2b9b857f-ab4a-440e-a313-1ace0f1cfc95.xml";
-static string const dcp_test1_cpl = "cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml";
+static string const dcp_test1_cpl_id = "81fb54df-e1bf-4647-8788-ea7ba154375b";
+static string const dcp_test1_cpl = "cpl_" + dcp_test1_cpl_id + ".xml";
static void
stage (string s, optional<path> p)
static
-void
+shared_ptr<dcp::CPL>
write_dcp_with_single_asset (path dir, shared_ptr<dcp::ReelAsset> reel_asset, dcp::Standard standard = dcp::SMPTE)
{
auto reel = make_shared<dcp::Reel>();
dcp::LocalTime().as_string(),
"hello"
);
+
+ return cpl;
}
check_verify_result (vector<path> dir, vector<dcp::VerificationNote> test_notes)
{
auto notes = dcp::verify ({dir}, &stage, &progress, xsd_test);
- dump_notes (notes);
BOOST_REQUIRE_EQUAL (notes.size(), test_notes.size());
for (auto i = 0U; i < notes.size(); ++i) {
BOOST_REQUIRE_EQUAL (notes[i], test_notes[i]);
check_verify_result (
directories,
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, dcp_test1_cpl_id, canonical(dir / dcp_test1_cpl) },
{ dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_PICTURE_HASHES, canonical(dir / "video.mxf") },
{ dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_SOUND_HASHES, canonical(dir / "audio.mxf") },
{ dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, "value 'xxz+gUPoPMdbFlAewvWIq8BRhBmA=' is invalid Base64-encoded binary", canonical(dir / dcp_test1_pkl), 12 },
static
-void
+shared_ptr<dcp::CPL>
dcp_from_frame (dcp::ArrayData const& frame, path dir)
{
auto asset = make_shared<dcp::MonoPictureAsset>(dcp::Fraction(24, 1), dcp::SMPTE);
writer->finalize ();
auto reel_asset = make_shared<dcp::ReelMonoPictureAsset>(asset, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ return write_dcp_with_single_asset (dir, reel_asset);
}
path const dir("build/test/verify_test15");
prepare_directory (dir);
- dcp_from_frame (oversized_frame, dir);
+ auto cpl = dcp_from_frame (oversized_frame, dir);
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
path const dir("build/test/verify_test16");
prepare_directory (dir);
- dcp_from_frame (oversized_frame, dir);
+ auto cpl = dcp_from_frame (oversized_frame, dir);
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::NEARLY_INVALID_PICTURE_FRAME_SIZE_IN_BYTES, canonical(dir / "pic.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
path const dir("build/test/verify_test17");
prepare_directory (dir);
- dcp_from_frame (frame, dir);
+ auto cpl = dcp_from_frame (frame, dir);
- check_verify_result ({ dir }, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({ dir }, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
copy_file ("test/data/subs.mxf", dir / "subs.mxf");
auto asset = make_shared<dcp::SMPTESubtitleAsset>(dir / "subs.mxf");
auto reel_asset = make_shared<dcp::ReelSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
copy_file ("test/data/broken_smpte.mxf", dir / "subs.mxf");
auto asset = make_shared<dcp::SMPTESubtitleAsset>(dir / "subs.mxf");
auto reel_asset = make_shared<dcp::ReelSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
check_verify_result (
{ dir },
2
},
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
});
}
prepare_directory (vf_dir);
auto picture = ov.cpls()[0]->reels()[0]->main_picture();
- write_dcp_with_single_asset (vf_dir, picture);
+ auto cpl = write_dcp_with_single_asset (vf_dir, picture);
check_verify_result (
{ vf_dir },
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::EXTERNAL_ASSET, picture->asset()->id() },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
"hello"
);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
canonical(cpl->file().get()),
75
},
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) },
});
}
asset->write (dir / "subs.mxf");
auto reel_asset = make_shared<dcp::ReelSubtitleAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
reel_asset->_language = "badlang";
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_LANGUAGE, string("badlang") },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_LANGUAGE, string("wrong-andbad") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
});
}
asset->write (dir / "subs.mxf");
auto reel_asset = make_shared<dcp::ReelClosedCaptionAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
reel_asset->_language = "badlang";
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
check_verify_result (
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_LANGUAGE, string("badlang") },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_LANGUAGE, string("wrong-andbad") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
asset->set_language (dcp::LanguageTag("de-DE"));
asset->write (dir / "subs.mxf");
auto reel_asset = make_shared<dcp::ReelClosedCaptionAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES, canonical(dir / "subs.mxf") },
+ {
+ dcp::VerificationNote::VERIFY_BV21_ERROR,
+ dcp::VerificationNote::INVALID_CLOSED_CAPTION_XML_SIZE_IN_BYTES,
+ string("413262"),
+ canonical(dir / "subs.mxf")
+ },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
});
}
asset->write (dir / "subs.mxf");
auto reel_asset = make_shared<T>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ auto cpl = write_dcp_with_single_asset (dir, reel_asset);
check_verify_result (
{ dir },
{
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_TIMED_TEXT_SIZE_IN_BYTES, canonical(dir / "subs.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, canonical(dir / "subs.mxf") },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_TIMED_TEXT_SIZE_IN_BYTES, string("121696411"), canonical(dir / "subs.mxf") },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_TIMED_TEXT_FONT_SIZE_IN_BYTES, string("121634816"), canonical(dir / "subs.mxf") },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_SUBTITLE_START_TIME, canonical(dir / "subs.mxf") },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
});
}
template <class T>
-void
+shared_ptr<dcp::CPL>
dcp_with_text (path dir, vector<TestText> subs)
{
prepare_directory (dir);
asset->write (dir / "subs.mxf");
auto reel_asset = make_shared<T>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
- write_dcp_with_single_asset (dir, reel_asset);
+ return write_dcp_with_single_asset (dir, reel_asset);
}
{
auto const dir = path("build/test/verify_text_too_early");
/* Just too early */
- dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24 - 1, 5 * 24 }});
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24 - 1, 5 * 24 }});
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_FIRST_TEXT_TIME },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
{
auto const dir = path("build/test/verify_text_not_too_early");
/* Just late enough */
- dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 5 * 24 }});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 5 * 24 }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_text_too_close)
{
auto const dir = path("build/test/verify_text_too_close");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 4 * 24, 5 * 24 },
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_SPACING },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_text_not_too_close)
{
auto const dir = path("build/test/verify_text_not_too_close");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 4 * 24, 5 * 24 },
{ 5 * 24 + 16, 8 * 24 },
});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_text_too_short)
{
auto const dir = path("build/test/verify_text_too_short");
- dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 1 }});
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 1 }});
check_verify_result (
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_DURATION },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_text_not_too_short)
{
auto const dir = path("build/test/verify_text_not_too_short");
- dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 17 }});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (dir, {{ 4 * 24, 4 * 24 + 17 }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_too_many_subtitle_lines1)
{
auto const dir = path ("build/test/verify_too_many_subtitle_lines1");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 200, 0.0, "We" },
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_LINE_COUNT },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_not_too_many_subtitle_lines1)
{
auto const dir = path ("build/test/verify_not_too_many_subtitle_lines1");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 200, 0.0, "We" },
{ 96, 200, 0.1, "have" },
{ 96, 200, 0.2, "four" },
});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_too_many_subtitle_lines2)
{
auto const dir = path ("build/test/verify_too_many_subtitle_lines2");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 300, 0.0, "We" },
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_LINE_COUNT },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_not_too_many_subtitle_lines2)
{
auto const dir = path ("build/test/verify_not_too_many_subtitle_lines2");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 300, 0.0, "We" },
{ 150, 180, 0.2, "four" },
{ 190, 250, 0.3, "lines" }
});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_subtitle_lines_too_long1)
{
auto const dir = path ("build/test/verify_subtitle_lines_too_long1");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 300, 0.0, "012345678901234567890123456789012345678901234567890123" }
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::NEARLY_INVALID_SUBTITLE_LINE_LENGTH },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_subtitle_lines_too_long2)
{
auto const dir = path ("build/test/verify_subtitle_lines_too_long2");
- dcp_with_text<dcp::ReelSubtitleAsset> (
+ auto cpl = dcp_with_text<dcp::ReelSubtitleAsset> (
dir,
{
{ 96, 300, 0.0, "012345678901234567890123456789012345678901234567890123456789012345678901234567890" }
{dir},
{
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INVALID_SUBTITLE_LINE_LENGTH },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_too_many_closed_caption_lines1)
{
auto const dir = path ("build/test/verify_too_many_closed_caption_lines1");
- dcp_with_text<dcp::ReelClosedCaptionAsset> (
+ auto cpl = dcp_with_text<dcp::ReelClosedCaptionAsset> (
dir,
{
{ 96, 200, 0.0, "We" },
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_CLOSED_CAPTION_LINE_COUNT},
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_not_too_many_closed_caption_lines1)
{
auto const dir = path ("build/test/verify_not_too_many_closed_caption_lines1");
- dcp_with_text<dcp::ReelClosedCaptionAsset> (
+ auto cpl = dcp_with_text<dcp::ReelClosedCaptionAsset> (
dir,
{
{ 96, 200, 0.0, "We" },
{ 96, 200, 0.1, "have" },
{ 96, 200, 0.2, "four" },
});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_too_many_closed_caption_lines2)
{
auto const dir = path ("build/test/verify_too_many_closed_caption_lines2");
- dcp_with_text<dcp::ReelClosedCaptionAsset> (
+ auto cpl = dcp_with_text<dcp::ReelClosedCaptionAsset> (
dir,
{
{ 96, 300, 0.0, "We" },
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_CLOSED_CAPTION_LINE_COUNT},
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
BOOST_AUTO_TEST_CASE (verify_not_too_many_closed_caption_lines2)
{
auto const dir = path ("build/test/verify_not_too_many_closed_caption_lines2");
- dcp_with_text<dcp::ReelClosedCaptionAsset> (
+ auto cpl = dcp_with_text<dcp::ReelClosedCaptionAsset> (
dir,
{
{ 96, 300, 0.0, "We" },
{ 150, 180, 0.2, "four" },
{ 190, 250, 0.3, "lines" }
});
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
BOOST_AUTO_TEST_CASE (verify_closed_caption_lines_too_long1)
{
auto const dir = path ("build/test/verify_closed_caption_lines_too_long1");
- dcp_with_text<dcp::ReelClosedCaptionAsset> (
+ auto cpl = dcp_with_text<dcp::ReelClosedCaptionAsset> (
dir,
{
{ 96, 300, 0.0, "0123456789012345678901234567890123" }
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_CLOSED_CAPTION_LINE_LENGTH },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_SOUND_FRAME_RATE, canonical(dir / "audiofoo.mxf") },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_SOUND_FRAME_RATE, string("96000"), canonical(dir / "audiofoo.mxf") },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() },
});
}
BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
+ auto const cpl = dcp->cpls()[0];
+
{
- BOOST_REQUIRE (dcp->cpls()[0]->file());
- Editor e(dcp->cpls()[0]->file().get());
+ BOOST_REQUIRE (cpl->file());
+ Editor e(cpl->file().get());
e.replace("<AnnotationText>A Test DCP</AnnotationText>", "");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_ANNOTATION_TEXT },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) }
});
}
);
BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
+ auto const cpl = dcp->cpls()[0];
{
- BOOST_REQUIRE (dcp->cpls()[0]->file());
- Editor e(dcp->cpls()[0]->file().get());
+ BOOST_REQUIRE (cpl->file());
+ Editor e(cpl->file().get());
e.replace("<AnnotationText>A Test DCP</AnnotationText>", "<AnnotationText>A Test DCP 1</AnnotationText>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISMATCHED_CPL_ANNOTATION_TEXT },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES }
+ { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISMATCHED_CPL_ANNOTATION_TEXT, cpl->id(), canonical(cpl->file().get()) },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), canonical(cpl->file().get()) }
});
}
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_ASSET_DURATION },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), canonical(cpl->file().get()) }
});
}
static
-void
+shared_ptr<dcp::CPL>
verify_subtitles_must_be_in_all_reels_check (path dir, bool add_to_reel1, bool add_to_reel2)
{
prepare_directory (dir);
dcp::LocalTime().as_string(),
"A Test DCP"
);
+
+ return cpl;
}
{
{
path dir ("build/test/verify_subtitles_must_be_in_all_reels1");
- verify_subtitles_must_be_in_all_reels_check (dir, true, false);
+ auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, true, false);
check_verify_result (
{ dir },
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_MAIN_SUBTITLE_FROM_SOME_REELS },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
{
path dir ("build/test/verify_subtitles_must_be_in_all_reels2");
- verify_subtitles_must_be_in_all_reels_check (dir, true, true);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, true, true);
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
{
path dir ("build/test/verify_subtitles_must_be_in_all_reels1");
- verify_subtitles_must_be_in_all_reels_check (dir, false, false);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = verify_subtitles_must_be_in_all_reels_check (dir, false, false);
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
}
static
-void
+shared_ptr<dcp::CPL>
verify_closed_captions_must_be_in_all_reels_check (path dir, int caps_in_reel1, int caps_in_reel2)
{
prepare_directory (dir);
dcp::LocalTime().as_string(),
"A Test DCP"
);
+
+ return cpl;
}
{
{
path dir ("build/test/verify_closed_captions_must_be_in_all_reels1");
- verify_closed_captions_must_be_in_all_reels_check (dir, 3, 4);
+ auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 3, 4);
check_verify_result (
{dir},
{
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
{
path dir ("build/test/verify_closed_captions_must_be_in_all_reels2");
- verify_closed_captions_must_be_in_all_reels_check (dir, 4, 4);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 4, 4);
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
{
path dir ("build/test/verify_closed_captions_must_be_in_all_reels3");
- verify_closed_captions_must_be_in_all_reels_check (dir, 0, 0);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }});
+ auto cpl = verify_closed_captions_must_be_in_all_reels_check (dir, 0, 0);
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }});
}
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_BV21_ERROR, code },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, code, subs->id() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl->id(), cpl->file().get() }
});
}
);
BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
+ auto const cpl = dcp->cpls()[0];
{
- BOOST_REQUIRE (dcp->cpls()[0]->file());
- Editor e(dcp->cpls()[0]->file().get());
+ BOOST_REQUIRE (cpl->file());
+ Editor e(cpl->file().get());
e.replace("<Hash>XGhFVrqZqapOJx5Fh2SLjj48Yjg=</Hash>", "");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_HASH, string("1fab8bb0-cfaf-4225-ad6d-01768bc10470") }
});
}
{ dcp::Marker::LFOC, dcp::Time(23, 24, 24) }
},
{
- { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_FFOC }
+ { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_FFOC, string("3") }
});
verify_markers_test (
{ dcp::Marker::LFOC, dcp::Time(18, 24, 24) }
},
{
- { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_LFOC }
+ { dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::INCORRECT_LFOC, string("18") }
});
}
path dir = "build/test/verify_cpl_metadata_version";
prepare_directory (dir);
auto dcp = make_simple (dir);
- dcp->cpls()[0]->unset_version_number();
+ auto cpl = dcp->cpls()[0];
+ cpl->unset_version_number();
dcp->write_xml (
dcp::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
"A Test DCP"
);
- check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER }});
+ check_verify_result ({dir}, {{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->id(), cpl->file().get() }});
}
"A Test DCP"
);
+ auto cpl = dcp->cpls()[0];
+
{
- Editor e (dcp->cpls()[0]->file().get());
+ Editor e (cpl->file().get());
e.delete_lines ("<meta:ExtensionMetadataList>", "</meta:ExtensionMetadataList>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_EXTENSION_METADATA }
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() }
});
}
"A Test DCP"
);
+ auto cpl = dcp->cpls()[0];
+
{
- Editor e (dcp->cpls()[0]->file().get());
+ Editor e (cpl->file().get());
e.delete_lines ("<meta:ExtensionMetadata scope=\"http://isdcf.com/ns/cplmd/app\">", "</meta:ExtensionMetadata>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_EXTENSION_METADATA }
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_EXTENSION_METADATA, cpl->id(), cpl->file().get() }
});
}
"A Test DCP"
);
- path const cpl = dcp->cpls()[0]->file().get();
+ auto const cpl = dcp->cpls()[0];
{
- Editor e (cpl);
+ Editor e (cpl->file().get());
e.replace ("<meta:Name>A", "<meta:NameX>A");
e.replace ("n</meta:Name>", "n</meta:NameX>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl, 75 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl, 82 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:NameX'"), cpl->file().get(), 75 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:NameX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 82 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
});
}
"A Test DCP"
);
+ auto cpl = dcp->cpls()[0];
+
{
- Editor e (dcp->cpls()[0]->file().get());
+ Editor e (cpl->file().get());
e.replace ("Application", "Fred");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'") },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Name> should be 'Application'"), cpl->file().get() },
});
}
dcp::LocalTime().as_string(),
"A Test DCP"
);
+
+ auto cpl = dcp->cpls()[0];
+
{
- Editor e (dcp->cpls()[0]->file().get());
+ Editor e (cpl->file().get());
e.replace ("DCP Constraints Profile", "Fred");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'") },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Name> property should be 'DCP Constraints Profile'"), cpl->file().get() },
});
}
"A Test DCP"
);
- path const cpl = dcp->cpls()[0]->file().get();
+ auto const cpl = dcp->cpls()[0];
{
- Editor e (cpl);
+ Editor e (cpl->file().get());
e.replace ("<meta:Value>", "<meta:ValueX>");
e.replace ("</meta:Value>", "</meta:ValueX>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl, 79 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl, 80 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:ValueX'"), cpl->file().get(), 79 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:ValueX' is not allowed for content model '(Name,Value)'"), cpl->file().get(), 80 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
});
}
dcp::LocalTime().as_string(),
"A Test DCP"
);
+
+ auto const cpl = dcp->cpls()[0];
+
{
- Editor e (dcp->cpls()[0]->file().get());
+ Editor e (cpl->file().get());
e.replace ("SMPTE-RDD-52:2020-Bv2.1", "Fred");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'") },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::INVALID_EXTENSION_METADATA, string("<Value> property should be 'SMPTE-RDD-52:2020-Bv2.1'"), cpl->file().get() },
});
}
"A Test DCP"
);
- path const cpl = dcp->cpls()[0]->file().get();
+ auto const cpl = dcp->cpls()[0];
{
- Editor e (cpl);
+ Editor e (cpl->file().get());
e.replace ("<meta:Property>", "<meta:PropertyX>");
e.replace ("</meta:Property>", "</meta:PropertyX>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl, 77 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl, 81 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:PropertyX'"), cpl->file().get(), 77 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:PropertyX' is not allowed for content model '(Property+)'"), cpl->file().get(), 81 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
});
}
"A Test DCP"
);
- path const cpl = dcp->cpls()[0]->file().get();
+ auto const cpl = dcp->cpls()[0];
{
- Editor e (cpl);
+ Editor e (cpl->file().get());
e.replace ("<meta:PropertyList>", "<meta:PropertyListX>");
e.replace ("</meta:PropertyList>", "</meta:PropertyListX>");
}
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl, 76 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl, 82 },
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("no declaration found for element 'meta:PropertyListX'"), cpl->file().get(), 76 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::INVALID_XML, string("element 'meta:PropertyListX' is not allowed for content model '(Name,PropertyList?,)'"), cpl->file().get(), 82 },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl->id(), cpl->file().get() },
});
}
copy_file (i.path(), dir / i.path().filename());
}
- path const pkl = dir / "pkl_93182bd2-b1e8-41a3-b5c8-6e6564273bff.xml";
- path const cpl = dir / "cpl_81fb54df-e1bf-4647-8788-ea7ba154375b.xml";
+ string const pkl_id = "93182bd2-b1e8-41a3-b5c8-6e6564273bff";
+ path const pkl = dir / ( "pkl_" + pkl_id + ".xml" );
+ string const cpl_id = "81fb54df-e1bf-4647-8788-ea7ba154375b";
+ path const cpl = dir / ( "cpl_" + cpl_id + ".xml");
{
Editor e (cpl);
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, canonical(pkl), },
+ { dcp::VerificationNote::VERIFY_ERROR, dcp::VerificationNote::MISMATCHED_CPL_HASHES, cpl_id, canonical(cpl) },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, pkl_id, canonical(pkl), },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_FFOC },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_LFOC },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, canonical(cpl) }
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl_id, canonical(cpl) },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::UNSIGNED_CPL_WITH_ENCRYPTED_CONTENT, cpl_id, canonical(cpl) }
});
}
copy_file (i.path(), dir / i.path().filename());
}
- path const pkl = dir / "pkl_93182bd2-b1e8-41a3-b5c8-6e6564273bff.xml";
+ string const cpl_id = "81fb54df-e1bf-4647-8788-ea7ba154375b";
+ path const cpl = dir / ("cpl_" + cpl_id + ".xml");
+ string const pkl_id = "93182bd2-b1e8-41a3-b5c8-6e6564273bff";
+ path const pkl = dir / ("pkl_" + pkl_id + ".xml");
{
Editor e (pkl);
e.delete_lines ("<dsig:Signature", "</dsig:Signature>");
check_verify_result (
{dir},
{
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, canonical(pkl) },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, pkl_id, canonical(pkl) },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFEC_IN_FEATURE },
{ dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_FFMC_IN_FEATURE },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_FFOC },
{ dcp::VerificationNote::VERIFY_WARNING, dcp::VerificationNote::MISSING_LFOC },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA },
- { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, canonical(pkl) },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::MISSING_CPL_METADATA, cpl_id, canonical(cpl) },
+ { dcp::VerificationNote::VERIFY_BV21_ERROR, dcp::VerificationNote::UNSIGNED_PKL_WITH_ENCRYPTED_CONTENT, pkl_id, canonical(pkl) },
});
}