#define LIBDCP_VERIFY_H
+#include "decrypted_kdm.h"
#include <boost/any.hpp>
#include <boost/filesystem.hpp>
#include <boost/function.hpp>
#include <vector>
-/* Something in windows.h defines this */
+/* windows.h defines this but we want to use it */
#undef ERROR
namespace dcp {
+class DCP;
+
+
class VerificationNote
{
public:
enum class Type {
+ OK,
ERROR,
BV21_ERROR, ///< may not always be considered an error, but violates a "shall" requirement of Bv2.1
WARNING
};
- /** Codes for errors or warnings from verifying DCPs.
+ /** Codes for successful checks, errors or warnings from verifying DCPs.
*
* The names should (in general) answer the question "what is wrong?" with an answer that begins "There is a ..."
* e.g. "There is a INCORRECT_CPL_HASH"
* note contains (probably technical) details
*/
FAILED_READ,
+ MATCHING_CPL_HASHES,
/** The hash of the CPL in the PKL does not agree with the CPL file
* note contains CPL ID
* file contains CPL filename
+ * calculated_hash contains current hash of the CPL
+ * reference_hash contains the hash written in the PKL
*/
MISMATCHED_CPL_HASHES,
/** The 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,
+ CORRECT_PICTURE_HASH,
/** The hash of a main picture asset does not agree with the PKL file
* file contains the picture asset filename
+ * calculated_hash contains the current hash of the picture MXF
+ * reference_hash contains the hash from the PKL
*/
INCORRECT_PICTURE_HASH,
/** The hash of a main picture is different in the CPL and PKL
MISMATCHED_PICTURE_HASHES,
/** The hash of a main sound asset does not agree with the PKL file
* file contains the sound asset filename
+ * calculated_hash contains the current hash of the picture MXF
+ * reference_hash contains the hash from the PKL
*/
INCORRECT_SOUND_HASH,
/** The hash of a main sound is different in the CPL and PKL
* note contains asset ID
*/
INVALID_DURATION,
+ VALID_PICTURE_FRAME_SIZES_IN_BYTES,
/** The JPEG2000 data in at least one picture frame is larger than the equivalent of 250Mbit/s
* file contains the picture asset filename
*/
* note contains the invalid language
*/
INVALID_LANGUAGE,
+ VALID_RELEASE_TERRITORY,
/** 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
* file contains the CPL filename
*/
MISMATCHED_CPL_ANNOTATION_TEXT,
+ VALID_CPL_ANNOTATION_TEXT,
/** At least one asset in a reel does not have the same duration as the others */
MISMATCHED_ASSET_DURATION,
/** If one reel has a _MainSubtitle_, all must have them */
* file contains the PKL filename
*/
MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL,
+ MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL,
+ /** All content is encrypted */
+ ALL_ENCRYPTED,
+ /** No content is encrypted */
+ NONE_ENCRYPTED,
/** Some, but not all content, is encrypted */
PARTIALLY_ENCRYPTED,
/** General error during JPEG2000 codestream verification
+ * frame contains the frame index (counted from 0)
* note contains details
*/
INVALID_JPEG2000_CODESTREAM,
UNEXPECTED_DURATION,
/** A <ContentKind> has been specified with either no scope or the SMPTE 429-7 scope, but which is not one of those allowed */
INVALID_CONTENT_KIND,
+ VALID_CONTENT_KIND,
/** Either the width or height of a <MainPictureActiveArea> in a CPL is either not an even number, or bigger than the corresponding asset dimension.
* note contains details of what is wrong
* file contains the CPL filename
*/
INVALID_MAIN_PICTURE_ACTIVE_AREA,
+ VALID_MAIN_PICTURE_ACTIVE_AREA,
/** A PKL has more than one asset with the same ID
* note contains the PKL ID
* file contains the PKL filename
* file contains the ASSETMAP filename
*/
DUPLICATE_ASSET_ID_IN_ASSETMAP,
- /** An Interop subtitle asset has no subtitles.
+ /** An Interop subtitle asset has no subtitles
* note contains the asset ID
* file contains the asset filename
*/
* size contains the invalid size in bytes.
*/
INVALID_JPEG2000_TILE_PART_SIZE,
+ /** A subtitle XML root node has more than one namespace (xmlns) declaration.
+ * note contains the asset ID
+ */
+ INCORRECT_SUBTITLE_NAMESPACE_COUNT,
+ /** A subtitle or closed caption file has a <Font> tag which refers to a font that is not
+ * first introduced with a <LoadFont>.
+ * id contains the ID of the <Font> tag.
+ */
+ MISSING_LOAD_FONT_FOR_FONT,
+ /** A SMPTE subtitle asset has at least one <Text> element but no <LoadFont>
+ * id contains the ID of the subtitle asset.
+ */
+ MISSING_LOAD_FONT,
+ /** An ID in an asset map does not match the ID obtained from reading the actual file.
+ * id contains the ID from the asset map.
+ * other_id contains the ID from the file.
+ */
+ MISMATCHED_ASSET_MAP_ID,
+ /** The <LabelText> inside a <ContentVersion> is empty
+ * note contains the CPL ID
+ * file contains the CPL filename
+ */
+ EMPTY_CONTENT_VERSION_LABEL_TEXT,
+ VALID_CONTENT_VERSION_LABEL_TEXT,
};
VerificationNote (Type type, Code code)
FRAME,
COMPONENT,
SIZE,
+ ID,
+ OTHER_ID,
+ FRAME_RATE,
+ CPL_ID,
+ CALCULATED_HASH,
+ REFERENCE_HASH
};
template <class T>
return data<int>(Data::SIZE);
}
+ VerificationNote& set_id(std::string id) {
+ _data[Data::ID] = id;
+ return *this;
+ }
+
+ boost::optional<std::string> id() const {
+ return data<std::string>(Data::ID);
+ }
+
+ VerificationNote& set_other_id(std::string other_id) {
+ _data[Data::OTHER_ID] = other_id;
+ return *this;
+ }
+
+ boost::optional<std::string> other_id() const {
+ return data<std::string>(Data::OTHER_ID);
+ }
+
+ VerificationNote& set_frame_rate(int frame_rate) {
+ _data[Data::FRAME_RATE] = frame_rate;
+ return *this;
+ }
+
+ boost::optional<int> frame_rate() const {
+ return data<int>(Data::FRAME_RATE);
+ }
+
+ VerificationNote& set_calculated_hash(std::string hash) {
+ _data[Data::CALCULATED_HASH] = hash;
+ return *this;
+ }
+
+ boost::optional<std::string> calculated_hash() const {
+ return data<std::string>(Data::CALCULATED_HASH);
+ }
+
+ VerificationNote& set_reference_hash(std::string hash) {
+ _data[Data::REFERENCE_HASH] = hash;
+ return *this;
+ }
+
+ boost::optional<std::string> reference_hash() const {
+ return data<std::string>(Data::REFERENCE_HASH);
+ }
+
+ VerificationNote& set_cpl_id(std::string id) {
+ _data[Data::CPL_ID] = id;
+ return *this;
+ }
+
+ boost::optional<std::string> cpl_id() const {
+ return data<std::string>(Data::CPL_ID);
+ }
+
private:
Type _type;
Code _code;
};
-std::vector<VerificationNote> verify (
+struct VerifyResult
+{
+ std::vector<VerificationNote> notes;
+ std::vector<std::shared_ptr<dcp::DCP>> dcps;
+};
+
+
+VerifyResult verify(
std::vector<boost::filesystem::path> directories,
- boost::function<void (std::string, boost::optional<boost::filesystem::path>)> stage,
- boost::function<void (float)> progress,
+ std::vector<dcp::DecryptedKDM> kdms,
+ std::function<void (std::string, boost::optional<boost::filesystem::path>)> stage,
+ std::function<void (float)> progress,
VerificationOptions options = {},
boost::optional<boost::filesystem::path> xsd_dtd_directory = boost::optional<boost::filesystem::path>()
);
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);
bool operator< (dcp::VerificationNote const& a, dcp::VerificationNote const& b);
std::ostream& operator<<(std::ostream& s, dcp::VerificationNote const& note);