X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fasset.cc;h=00ad67bc5a17dfc46e8a8bc495552eb78a40a4c7;hb=83358c16fcfdad24e8e415df13d6cf8e9bb43556;hp=d8cf25dae5922f0d973991a2cef918ab1dd3ece8;hpb=f6ee90107839e0d750d8678b67c9d6d1d596d739;p=libdcp.git diff --git a/src/asset.cc b/src/asset.cc index d8cf25da..00ad67bc 100644 --- a/src/asset.cc +++ b/src/asset.cc @@ -22,147 +22,107 @@ */ #include -#include #include +#include +#include #include "AS_DCP.h" #include "KM_util.h" #include "asset.h" #include "util.h" #include "metadata.h" +#include "compose.hpp" +#include "raw_convert.h" -using namespace std; -using namespace boost; +using std::string; +using boost::shared_ptr; using namespace libdcp; -Asset::Asset (string directory, string mxf_name, sigc::signal1* progress, int fps, int length) +Asset::Asset (boost::filesystem::path directory, boost::filesystem::path file_name) : _directory (directory) - , _mxf_name (mxf_name) - , _progress (progress) - , _fps (fps) - , _length (length) + , _file_name (file_name) , _uuid (make_uuid ()) + , _edit_rate (0) + , _entry_point (0) + , _intrinsic_duration (0) + , _duration (0) { - -} - -void -Asset::write_to_pkl (ostream& s) const -{ - s << " \n" - << " urn:uuid:" << _uuid << "\n" - << " " << _mxf_name << "\n" - << " " << digest() << "\n" - << " " << filesystem::file_size(mxf_path()) << "\n" - << " application/mxf\n" - << " \n"; + if (_file_name.empty ()) { + _file_name = _uuid + ".xml"; + } } void -Asset::write_to_assetmap (ostream& s) const +Asset::write_to_pkl (xmlpp::Node* node, bool interop) const { - s << " \n" - << " urn:uuid:" << _uuid << "\n" - << " \n" - << " \n" - << " " << _mxf_name << "\n" - << " 1\n" - << " 0\n" - << " " << filesystem::file_size(mxf_path()) << "\n" - << " \n" - << " \n" - << " \n"; + xmlpp::Node* asset = node->add_child ("Asset"); + asset->add_child("Id")->add_child_text ("urn:uuid:" + _uuid); + asset->add_child("AnnotationText")->add_child_text (_file_name.string ()); + asset->add_child("Hash")->add_child_text (digest ()); + asset->add_child("Size")->add_child_text (raw_convert (boost::filesystem::file_size(path()))); + if (interop) { + asset->add_child("Type")->add_child_text (String::compose ("application/x-smpte-mxf;asdcpKind=%1", asdcp_kind ())); + } else { + asset->add_child("Type")->add_child_text ("application/mxf"); + } } void -Asset::fill_writer_info (ASDCP::WriterInfo* writer_info) const +Asset::write_to_assetmap (xmlpp::Node* node) const { - writer_info->ProductVersion = Metadata::instance()->product_version; - writer_info->CompanyName = Metadata::instance()->company_name; - writer_info->ProductName = Metadata::instance()->product_name.c_str(); - - writer_info->LabelSetType = ASDCP::LS_MXF_SMPTE; - unsigned int c; - Kumu::hex2bin (_uuid.c_str(), writer_info->AssetUUID, Kumu::UUID_Length, &c); - assert (c == Kumu::UUID_Length); + xmlpp::Node* asset = node->add_child ("Asset"); + asset->add_child("Id")->add_child_text ("urn:uuid:" + _uuid); + xmlpp::Node* chunk_list = asset->add_child ("ChunkList"); + xmlpp::Node* chunk = chunk_list->add_child ("Chunk"); + chunk->add_child("Path")->add_child_text (_file_name.string ()); + chunk->add_child("VolumeIndex")->add_child_text ("1"); + chunk->add_child("Offset")->add_child_text ("0"); + chunk->add_child("Length")->add_child_text (raw_convert (boost::filesystem::file_size(path()))); } -filesystem::path -Asset::mxf_path () const +boost::filesystem::path +Asset::path () const { - filesystem::path p; + boost::filesystem::path p; p /= _directory; - p /= _mxf_name; + p /= _file_name; return p; } -list -Asset::equals (shared_ptr other, EqualityOptions opt) const -{ - list notes; - - if (opt.flags & LIBDCP_METADATA) { - if (_mxf_name != other->_mxf_name) { - notes.push_back ("MXF names differ"); - } - if (_fps != other->_fps) { - notes.push_back ("MXF frames per second differ"); - } - if (_length != other->_length) { - notes.push_back ("MXF lengths differ"); - } - } - - if (opt.flags & MXF_BITWISE) { - - if (digest() != other->digest()) { - notes.push_back ("MXF digests differ"); - } - - if (filesystem::file_size (mxf_path()) != filesystem::file_size (other->mxf_path())) { - notes.push_back (mxf_path().string() + " and " + other->mxf_path().string() + " sizes differ"); - return notes; - } - - ifstream a (mxf_path().string().c_str(), ios::binary); - ifstream b (other->mxf_path().string().c_str(), ios::binary); - - int buffer_size = 65536; - char abuffer[buffer_size]; - char bbuffer[buffer_size]; - - int n = filesystem::file_size (mxf_path ()); - - while (n) { - int const t = min (n, buffer_size); - a.read (abuffer, t); - b.read (bbuffer, t); - - if (memcmp (abuffer, bbuffer, t) != 0) { - notes.push_back (mxf_path().string() + " and " + other->mxf_path().string() + " content differs"); - return notes; - } - - n -= t; - } - } - - return notes; -} - string Asset::digest () const { if (_digest.empty ()) { - _digest = make_digest (mxf_path().string(), 0); + _digest = make_digest (path().string(), 0); } return _digest; } -int -Asset::length () const +void +Asset::compute_digest (boost::function progress) { - return _length; + if (!_digest.empty ()) { + return; + } + + _digest = make_digest (path().string(), &progress); } +bool +Asset::equals (shared_ptr other, EqualityOptions, boost::function note) const +{ + if (_edit_rate != other->_edit_rate) { + note (ERROR, "asset edit rates differ"); + return false; + } + if (_intrinsic_duration != other->_intrinsic_duration) { + note (ERROR, "asset intrinsic durations differ"); + } + + if (_duration != other->_duration) { + note (ERROR, "asset durations differ"); + } + + return true; +}