X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fasset.cc;h=06b87953e4631dd42a1cff4a2b680bb0cafc2ba5;hb=127c14300f1d2df9fc2b9dd4ffb5218ea6a717c3;hp=e2624712c8b1ddf9cc5cb36f79f699c13df3c8a9;hpb=b6718fb437f242fd5127194d4c94e39d71c5e1ad;p=libdcp.git diff --git a/src/asset.cc b/src/asset.cc index e2624712..06b87953 100644 --- a/src/asset.cc +++ b/src/asset.cc @@ -17,77 +17,108 @@ */ +/** @file src/asset.cc + * @brief Parent class for assets of DCPs. + */ + #include +#include #include +#include +#include +#include #include "AS_DCP.h" #include "KM_util.h" #include "asset.h" #include "util.h" -#include "tags.h" +#include "metadata.h" using namespace std; using namespace boost; using namespace libdcp; -/** Construct an Asset. - * @param p Pathname of MXF file. - * @param fps Frames per second. - * @param len Length in frames. - */ - -Asset::Asset (string p, int fps, int len) - : _mxf_path (p) - , _fps (fps) - , _length (len) +Asset::Asset (string directory, string file_name, int edit_rate, int intrinsic_duration) + : _directory (directory) + , _file_name (file_name) , _uuid (make_uuid ()) + , _edit_rate (edit_rate) + , _entry_point (0) + , _intrinsic_duration (intrinsic_duration) + , _duration (intrinsic_duration) { - + if (_file_name.empty ()) { + _file_name = _uuid + ".xml"; + } } -/** Write details of the asset to a PKL stream. - * @param s Stream. - */ void -Asset::write_to_pkl (ostream& s) const +Asset::write_to_pkl (xmlpp::Node* node) const { - s << " \n" - << " urn:uuid:" << _uuid << "\n" - << " " << filesystem::path(_mxf_path).filename() << "\n" - << " " << _digest << "\n" - << " " << filesystem::file_size(_mxf_path) << "\n" - << " application/mxf\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); + asset->add_child("Hash")->add_child_text (digest ()); + asset->add_child("Size")->add_child_text (lexical_cast (filesystem::file_size(path()))); + asset->add_child("Type")->add_child_text ("application/mxf"); } -/** Write details of the asset to a ASSETMAP stream. - * @param s Stream. - */ void -Asset::write_to_assetmap (ostream& s) const +Asset::write_to_assetmap (xmlpp::Node* node) const { - s << " \n" - << " urn:uuid:" << _uuid << "\n" - << " \n" - << " \n" - << " " << filesystem::path(_mxf_path).filename() << "\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); + 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); + chunk->add_child("VolumeIndex")->add_child_text ("1"); + chunk->add_child("Offset")->add_child_text ("0"); + chunk->add_child("Length")->add_child_text (lexical_cast (filesystem::file_size(path()))); +} + +filesystem::path +Asset::path () const +{ + filesystem::path p; + p /= _directory; + p /= _file_name; + return p; +} + +string +Asset::digest () const +{ + if (_digest.empty ()) { + _digest = make_digest (path().string(), 0); + } + + return _digest; } -/** Fill in a ADSCP::WriteInfo struct */ void -Asset::fill_writer_info (ASDCP::WriterInfo* writer_info) const +Asset::compute_digest (boost::function progress) +{ + if (!_digest.empty ()) { + return; + } + + _digest = make_digest (path().string(), &progress); +} + +bool +Asset::equals (shared_ptr other, EqualityOptions, boost::function note) const { - writer_info->ProductVersion = Tags::instance()->product_version; - writer_info->CompanyName = Tags::instance()->company_name; - writer_info->ProductName = Tags::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); + 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; }