X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fverify.h;h=372da7644f8f6d08cb5242eb66ac0c0a9542b7e7;hb=3e866abeee4de737a04719ff8ab6c6bf46bb4d74;hp=b6722143848281f37eec0e6ee1ba647fb07297a0;hpb=9691fc54fa6a3409520a1a42e6eeb8e6a235f5f6;p=libdcp.git diff --git a/src/verify.h b/src/verify.h index b6722143..372da764 100644 --- a/src/verify.h +++ b/src/verify.h @@ -31,17 +31,30 @@ files in the program, then also delete it here. */ + +/** @file src/verify.h + * @brief dcp::verify() method and associated code + */ + + #ifndef LIBDCP_VERIFY_H #define LIBDCP_VERIFY_H + #include #include #include #include #include + +/* Something in windows.h defines this */ +#undef ERROR + + namespace dcp { + class VerificationNote { public: @@ -75,124 +88,128 @@ public: * are filled in when this code is used. */ enum class 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. - * note contains CPL ID. - * file contains CPL filename. + /** 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 "/" */ 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. - * file contains the picture asset filename. + /** 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. - * file contains the sound asset filename. + /** 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 entry is empty. */ EMPTY_ASSET_PATH, - /** A file mentioned in an asset map cannot be found. - * file contains the filename that is missing. + /** 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. - * note contains the (probably technical) details. - * file contains the invalid filename. - * line contains the line number. + /** 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. - * note contains asset ID. + /** 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. - * note contains asset ID. + /** 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. - * file contains the picture asset filename. + /** 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. - * file contains the picture asset filename. + /** 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. - * note contains the asset ID. + /** An asset that the CPL requires is not in this DCP; the DCP may be a VF + * note contains the asset ID */ EXTERNAL_ASSET, + /** A stereoscopic asset has an MXF which is marked as being monoscopic + * file contains the asset filename + */ + THREED_ASSET_MARKED_AS_TWOD, /** 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]. - * note contains the invalid language. + * 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]. * note contains the incorrect size as "x" - * file contains the asset filename. + * 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]. * note contains the invalid frame rate as "/" - * file contains the asset filename. + * 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] * note contains the invalid frame rate as "/" - * file contains the asset filename. + * 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] * note contains the invalid frame rate as "/" - * file contains the asset filename. + * 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]. - * note contains the invalid size in bytes. - * file contains the asset filename. + * 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] - * note contains the invalid size in bytes. - * file contains the asset filename. + * 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] - * note contains the invalid size in bytes. - * file contains the asset filename. + * 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 tag [Bv2.1_7.2.2] - * file contains the asset filename. + * file contains the asset filename */ MISSING_SUBTITLE_LANGUAGE, /** Not all subtitle assets specify the same tag [Bv2.1_7.2.2] */ MISMATCHED_SUBTITLE_LANGUAGES, /** Some SMPTE subtitle XML has no tag [Bv2.1_7.2.3] - * file contains the asset filename. + * file contains the asset filename */ MISSING_SUBTITLE_START_TIME, /** Some SMPTE subtitle XML has a non-zero tag [Bv2.1_7.2.3] - * file contains the asset filename. + * 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] */ @@ -201,6 +218,8 @@ public: INVALID_SUBTITLE_DURATION, /** At least one pair of subtitles are separated by less than the the minimum of 2 frames suggested by [Bv2.1_7.2.5] */ INVALID_SUBTITLE_SPACING, + /** A subtitle lasts for longer than the reel which contains it */ + SUBTITLE_OVERLAPS_REEL_BOUNDARY, /** There are more than 3 subtitle lines in at least one place [Bv2.1_7.2.7] */ INVALID_SUBTITLE_LINE_COUNT, /** There are more than 52 characters in at least one subtitle line [Bv2.1_7.2.7] */ @@ -212,18 +231,18 @@ public: /** 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]. - * note contains the invalid frame rate. - * file contains the asset filename. + * note contains the invalid frame rate + * file contains the asset filename */ INVALID_SOUND_FRAME_RATE, /** The CPL has no tag [Bv2.1_8.1] - * note contains the CPL ID. - * file contains the CPL filename. + * note contains the CPL ID + * file contains the CPL filename */ MISSING_CPL_ANNOTATION_TEXT, /** The is not the same as the [Bv2.1_8.1] - * note contains the CPL ID. - * file contains the CPL filename. + * 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 */ @@ -232,23 +251,23 @@ public: 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 Bv2.1_8.3.2 + /** MainSubtitle in reels must have [Bv2.1_8.3.2] * note contains the asset ID */ MISSING_SUBTITLE_ENTRY_POINT, - /** MainSubtitle must be zero Bv2.1_8.3.2 + /** MainSubtitle must be zero [Bv2.1_8.3.2] * note contains the asset ID */ INCORRECT_SUBTITLE_ENTRY_POINT, - /** Closed caption in reels must have Bv2.1_8.3.2 + /** Closed caption in reels must have [Bv2.1_8.3.2] * note contains the asset ID */ MISSING_CLOSED_CAPTION_ENTRY_POINT, - /** Closed caption MainSubtitle must be zero Bv2.1_8.3.2 + /** Closed caption MainSubtitle must be zero [Bv2.1_8.3.2] * note contains the asset ID */ INCORRECT_CLOSED_CAPTION_ENTRY_POINT, - /** must be present for assets in CPLs. + /** must be present for assets in CPLs * note contains the asset ID */ MISSING_HASH, @@ -260,51 +279,106 @@ public: 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 - * note contains the incorrect value. + * note contains the incorrect value */ INCORRECT_LFOC, /** There must be a - * note contains the CPL ID. - * file contains the CPL filename. + * note contains the CPL ID + * file contains the CPL filename */ MISSING_CPL_METADATA, /** CPL metadata should contain of 1, at least - * note contains the CPL ID. - * file contains the CPL filename. + * note contains the CPL ID + * file contains the CPL filename */ MISSING_CPL_METADATA_VERSION_NUMBER, - /** There must be an in Bv2.1_8.6.3 - * note contains the CPL ID. - * file contains the CPL filename. + /** There must be an in [Bv2.1_8.6.3] + * note contains the CPL ID + * file contains the CPL filename */ MISSING_EXTENSION_METADATA, - /** must have a particular form Bv2.1_8.6.3 + /** must have a particular form [Bv2.1_8.6.3] * note contains details of what's wrong - * file contains the CPL filename. + * file contains the CPL filename */ INVALID_EXTENSION_METADATA, - /** CPLs containing encrypted content must be signed Bv2.1_8.7 - * note contains the CPL ID. - * file contains the CPL filename. + /** 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 - * note contains the PKL ID. - * file contains the PKL filename. + /** 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 must be the same as the PKL's . - * note contains the PKL ID. - * file contains the PKL filename. + * 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, + /** General error from our JPEG2000 codestream verification + * note contains details + */ + INVALID_JPEG2000_CODESTREAM, + /** Invalid number of guard bits in a 2K JPEG2000 stream (should be 1) [Bv2.1_10.2.1] + * note contains the number of guard bits + */ + INVALID_JPEG2000_GUARD_BITS_FOR_2K, + /** Invalid number of guard bits in a 4K JPEG2000 stream (should be 2) [Bv2.1_10.2.1] + * note contains the number of guard bits + */ + INVALID_JPEG2000_GUARD_BITS_FOR_4K, + /** JPEG2000 tile size is not the same as the image size [Bv2.1_10.2.1] */ + INVALID_JPEG2000_TILE_SIZE, + /** JPEG2000 code block width is not 32 [Bv2.1_10.2.1] + * note contains the code block width + */ + INVALID_JPEG2000_CODE_BLOCK_WIDTH, + /** JPEG2000 code block height is not 32 [Bv2.1_10.2.1] + * note contains the code block height + */ + INVALID_JPEG2000_CODE_BLOCK_HEIGHT, + /** There must be no POC markers in a 2K codestream [Bv2.1_10.2.1] + * note contains the number of POC markers found + */ + INCORRECT_JPEG2000_POC_MARKER_COUNT_FOR_2K, + /** There must be exactly one POC marker in a 4K codestream [Bv2.1_10.2.1] + * note contains the number of POC markers found + */ + INCORRECT_JPEG2000_POC_MARKER_COUNT_FOR_4K, + /** A POC marker has incorrect content [Bv2.1_10.2.1] + * note contains details + */ + INCORRECT_JPEG2000_POC_MARKER, + /** A POC marker was found outside the main head [Bv2.1_10.2.1] */ + INVALID_JPEG2000_POC_MARKER_LOCATION, + /** Invalid number of tile parts for 2K JPEG2000 stream (should be 3) [Bv2.1_10.2.1] + * note contains the number of tile parts + */ + INVALID_JPEG2000_TILE_PARTS_FOR_2K, + /** Invalid number of tile parts for 4K JPEG2000 stream (should be 6) [Bv2.1_10.2.1] + * note contains the number of tile parts + */ + INVALID_JPEG2000_TILE_PARTS_FOR_4K, + /** No TLM marker was found [Bv2.1_10.2.1] */ + MISSING_JPEG200_TLM_MARKER, + /** The MXF ResourceID of a timed text resource was not the same as that of the contained XML essence [Bv2.1_10.4.3] */ + MISMATCHED_TIMED_TEXT_RESOURCE_ID, + /** The AssetID of a timed text MXF is the same as its ResourceID or that of the contained XML essence [Bv2.1_10.4.2] */ + INCORRECT_TIMED_TEXT_ASSET_ID, + /** The ContainerDuration of a timed text MXF is not the same as the Duration in its reel [Bv2.1_10_4_3] + * note contains the reel duration, followed by a space, followed by the MXF duration + * file contains the asset filename + */ + MISMATCHED_TIMED_TEXT_DURATION, }; VerificationNote (Type type, Code code) @@ -370,19 +444,23 @@ private: boost::optional _line; }; + std::vector verify ( std::vector directories, boost::function)> stage, boost::function progress, - boost::filesystem::path xsd_dtd_directory + boost::optional xsd_dtd_directory = boost::optional() ); std::string note_to_string (dcp::VerificationNote note); bool operator== (dcp::VerificationNote const& a, dcp::VerificationNote const& b); +bool operator< (dcp::VerificationNote const& a, dcp::VerificationNote const& b); std::ostream& operator<<(std::ostream& s, dcp::VerificationNote const& note); + } + #endif