#define LIBDCP_VERIFY_H
+#include <boost/any.hpp>
#include <boost/filesystem.hpp>
#include <boost/function.hpp>
#include <boost/optional.hpp>
+#include <map>
#include <string>
#include <vector>
-/* Something in windows.h defines this */
+/* windows.h defines this but we want to use it */
#undef ERROR
* specifications require it and their QC will fail DCPs that don't have it.
* note contains the incorrect <IssueDate>
*/
- INVALID_SUBTITLE_ISSUE_DATE
+ INVALID_SUBTITLE_ISSUE_DATE,
+ /** The sound assets in the CPL do not have the same audio channel count.
+ * file contains the filename of the first asset to differ
+ */
+ MISMATCHED_SOUND_CHANNEL_COUNTS,
+ /** The CPL contains a MainSoundConfiguration tag which does not describe the number of
+ * channels in the audio assets.
+ * note contains details of what is wrong
+ * file contains the CPL filename
+ */
+ INVALID_MAIN_SOUND_CONFIGURATION,
+ /** An interop subtitle file has a <LoadFont> node which refers to a font file that is not found.
+ * note contains the <LoadFont> ID
+ */
+ MISSING_FONT,
+ /** A tile part in a JPEG2000 frame is too big.
+ * frame contains the frame index (counted from 0)
+ * component contains the component index (0, 1 or 2)
+ * 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,
};
VerificationNote (Type type, Code code)
VerificationNote (Type type, Code code, std::string note)
: _type (type)
, _code (code)
- , _note (note)
- {}
+ {
+ _data[Data::NOTE] = note;
+ }
VerificationNote (Type type, Code code, boost::filesystem::path file)
: _type (type)
, _code (code)
- , _file (file)
- {}
+ {
+ _data[Data::FILE] = file;
+ }
VerificationNote (Type type, Code code, std::string note, boost::filesystem::path file)
: _type (type)
, _code (code)
- , _note (note)
- , _file (file)
- {}
+ {
+ _data[Data::NOTE] = note;
+ _data[Data::FILE] = file;
+ }
VerificationNote (Type type, Code code, std::string note, boost::filesystem::path file, uint64_t line)
: _type (type)
, _code (code)
- , _note (note)
- , _file (file)
- , _line (line)
- {}
+ {
+ _data[Data::NOTE] = note;
+ _data[Data::FILE] = file;
+ _data[Data::LINE] = line;
+ }
Type type () const {
return _type;
return _code;
}
+private:
+ enum class Data {
+ NOTE, ///< further information about the error
+ FILE, ///< path of file containing the error
+ LINE, ///< error line number within the FILE
+ FRAME,
+ COMPONENT,
+ SIZE,
+ ID,
+ OTHER_ID,
+ };
+
+ template <class T>
+ boost::optional<T> data(Data key) const
+ {
+ auto iter = _data.find(key);
+ if (iter == _data.end()) {
+ return {};
+ }
+ return boost::any_cast<T>(iter->second);
+ }
+
+public:
boost::optional<std::string> note () const {
- return _note;
+ return data<std::string>(Data::NOTE);
}
boost::optional<boost::filesystem::path> file () const {
- return _file;
+ return data<boost::filesystem::path>(Data::FILE);
}
boost::optional<uint64_t> line () const {
- return _line;
+ return data<uint64_t>(Data::LINE);
+ }
+
+ VerificationNote& set_frame(int frame) {
+ _data[Data::FRAME] = frame;
+ return *this;
+ }
+
+ boost::optional<int> frame() const {
+ return data<int>(Data::FRAME);
+ }
+
+ VerificationNote& set_component(int component) {
+ _data[Data::COMPONENT] = component;
+ return *this;
+ }
+
+ boost::optional<int> component() const {
+ return data<int>(Data::COMPONENT);
+ }
+
+ VerificationNote& set_size(int size) {
+ _data[Data::SIZE] = size;
+ return *this;
+ }
+
+ boost::optional<int> size() const {
+ 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);
}
private:
Type _type;
Code _code;
- /** Further information about the error, if applicable */
- boost::optional<std::string> _note;
- /** Path of file containing the error, if applicable */
- boost::optional<boost::filesystem::path> _file;
- /** Error line number within _file, if applicable */
- boost::optional<uint64_t> _line;
+ std::map<Data, boost::any> _data;
+};
+
+
+struct VerificationOptions
+{
+ ///< If set, any assets larger than this number of bytes will not have their hashes checked
+ boost::optional<boost::uintmax_t> maximum_asset_size_for_hash_check;
+ ///< true to check asset hashes (except those which match maximum_asset_size_for_hash_check)
+ ///< false to check no asset hashes.
+ bool check_asset_hashes = true;
};
std::vector<boost::filesystem::path> directories,
boost::function<void (std::string, boost::optional<boost::filesystem::path>)> stage,
boost::function<void (float)> progress,
+ VerificationOptions options = {},
boost::optional<boost::filesystem::path> xsd_dtd_directory = boost::optional<boost::filesystem::path>()
);