Use a typedef for a note-taking functor.
[libdcp.git] / src / mxf.cc
index dd4d2efcbb1b87c57636674c186650a82bd38f12..442eb696b62cc347d86031dde771e0822dc7955a 100644 (file)
@@ -29,6 +29,7 @@
 #include "util.h"
 #include "metadata.h"
 #include "exceptions.h"
+#include "dcp_assert.h"
 #include "compose.hpp"
 #include <libxml++/nodes/element.h>
 #include <boost/filesystem.hpp>
@@ -42,19 +43,21 @@ using boost::dynamic_pointer_cast;
 using namespace dcp;
 
 MXF::MXF (Fraction edit_rate)
-       : Content (edit_rate)
+       : _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)
+       , _intrinsic_duration (0)
        , _encryption_context (0)
        , _decryption_context (0)
 {
-
+       /* _edit_rate and _intrinsic_duration must be set up up by a subclass */
 }
 
 MXF::~MXF ()
@@ -77,7 +80,7 @@ MXF::fill_writer_info (ASDCP::WriterInfo* writer_info, Standard standard)
        }
        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);
@@ -85,12 +88,12 @@ MXF::fill_writer_info (ASDCP::WriterInfo* writer_info, Standard standard)
 
                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;
@@ -98,14 +101,25 @@ MXF::equals (shared_ptr<const Content> other, EqualityOptions opt, boost::functi
        
        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");
                }
        }
        
@@ -162,6 +176,6 @@ MXF::pkl_type (Standard standard) const
        case SMPTE:
                return "application/mxf";
        default:
-               assert (false);
+               DCP_ASSERT (false);
        }
 }