* @brief Parent class for assets of DCPs made up of MXF files.
*/
+#include "raw_convert.h"
#include "AS_DCP.h"
#include "KM_prng.h"
#include "KM_util.h"
#include "util.h"
#include "metadata.h"
#include "exceptions.h"
-#include "kdm.h"
+#include "dcp_assert.h"
+#include "compose.hpp"
#include <libxml++/nodes/element.h>
#include <boost/filesystem.hpp>
-#include <boost/lexical_cast.hpp>
#include <iostream>
using std::string;
using std::list;
using std::pair;
using boost::shared_ptr;
-using boost::lexical_cast;
using boost::dynamic_pointer_cast;
using namespace dcp;
MXF::MXF (Fraction edit_rate)
- : Content (edit_rate)
- , _progress (0)
+ : _edit_rate (edit_rate)
+ , _intrinsic_duration (0)
, _encryption_context (0)
, _decryption_context (0)
{
-
+ /* _intrinsic_duration must be set up up by a subclass */
}
MXF::MXF (boost::filesystem::path file)
: Content (file)
- , _progress (0)
+ , _intrinsic_duration (0)
, _encryption_context (0)
, _decryption_context (0)
{
-
+ /* _edit_rate and _intrinsic_duration must be set up up by a subclass */
}
MXF::~MXF ()
}
unsigned int c;
Kumu::hex2bin (_id.c_str(), writer_info->AssetUUID, Kumu::UUID_Length, &c);
- assert (c == Kumu::UUID_Length);
+ DCP_ASSERT (c == Kumu::UUID_Length);
if (_key) {
Kumu::GenRandomUUID (writer_info->ContextID);
unsigned int c;
Kumu::hex2bin (_key_id.c_str(), writer_info->CryptographicKeyID, Kumu::UUID_Length, &c);
- assert (c == Kumu::UUID_Length);
+ DCP_ASSERT (c == Kumu::UUID_Length);
}
}
bool
-MXF::equals (shared_ptr<const Content> other, EqualityOptions opt, boost::function<void (NoteType, string)> note) const
+MXF::equals (shared_ptr<const Asset> other, EqualityOptions opt, NoteHandler note) const
{
if (!Content::equals (other, opt, note)) {
return false;
shared_ptr<const MXF> other_mxf = dynamic_pointer_cast<const MXF> (other);
if (!other_mxf) {
- note (ERROR, "comparing an MXF asset with a non-MXF asset");
return false;
}
+ if (_edit_rate != other_mxf->_edit_rate) {
+ note (DCP_ERROR, "MXF: edit rates differ");
+ return false;
+ }
+
+ if (_intrinsic_duration != other_mxf->_intrinsic_duration) {
+ note (DCP_ERROR, String::compose ("MXF: intrinsic durations differ (%1 vs %2)", _intrinsic_duration, other_mxf->_intrinsic_duration));
+ return false;
+ }
+
if (_file != other_mxf->file ()) {
- note (ERROR, "MXF names differ");
if (!opt.mxf_names_can_differ) {
+ note (DCP_ERROR, "MXF: names differ");
return false;
+ } else {
+ note (DCP_NOTE, "MXF: names differ");
}
}
return true;
}
+/** Set the (private) key that will be used to encrypt or decrypt this MXF's content.
+ * This is the top-secret key that is distributed (itself encrypted) to cinemas
+ * via Key Delivery Messages (KDMs).
+ * @param key Key to use.
+ */
void
MXF::set_key (Key key)
{
throw MiscError ("could not set up CBC initialization vector");
}
}
+
+void
+MXF::read_writer_info (ASDCP::WriterInfo const & info)
+{
+ char buffer[64];
+ Kumu::bin2UUIDhex (info.AssetUUID, ASDCP::UUIDlen, buffer, sizeof (buffer));
+ _id = buffer;
+}
+
+string
+MXF::pkl_type (Standard standard) const
+{
+ switch (standard) {
+ case INTEROP:
+ return String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ());
+ case SMPTE:
+ return "application/mxf";
+ default:
+ DCP_ASSERT (false);
+ }
+}