diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-08-13 01:19:45 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-08-13 01:19:45 +0100 |
| commit | c14a05a935886345d4d891a92a31b1c35bf10582 (patch) | |
| tree | fc640e3c8187867029cef48b91df7ed308b80c82 /src/mxf_asset.cc | |
| parent | c2ec345242b680426938ed3ef7332ede1d3276a6 (diff) | |
Missing files.
Diffstat (limited to 'src/mxf_asset.cc')
| -rw-r--r-- | src/mxf_asset.cc | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/mxf_asset.cc b/src/mxf_asset.cc new file mode 100644 index 00000000..b5560b26 --- /dev/null +++ b/src/mxf_asset.cc @@ -0,0 +1,124 @@ +/* + Copyright (C) 2012 Carl Hetherington <cth@carlh.net> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/asset.cc + * @brief Parent class for assets of DCPs made up of MXF files. + */ + +#include <iostream> +#include <fstream> +#include <boost/filesystem.hpp> +#include "AS_DCP.h" +#include "KM_util.h" +#include "mxf_asset.h" +#include "util.h" +#include "metadata.h" + +using namespace std; +using namespace boost; +using namespace libdcp; + +MXFAsset::MXFAsset (string directory, string file_name, sigc::signal1<void, float>* progress, int fps, int length) + : Asset (directory, file_name) + , _progress (progress) + , _fps (fps) + , _length (length) +{ + +} + +void +MXFAsset::fill_writer_info (ASDCP::WriterInfo* writer_info) 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); +} + +list<string> +MXFAsset::equals (shared_ptr<const Asset> other, EqualityOptions opt) const +{ + shared_ptr<const MXFAsset> other_mxf = dynamic_pointer_cast<const MXFAsset> (other); + if (!other_mxf) { + return list<string> (); + } + + list<string> notes; + + if (opt.flags & LIBDCP_METADATA) { + if (_file_name != other_mxf->_file_name) { + notes.push_back ("MXF names differ"); + } + if (_fps != other_mxf->_fps) { + notes.push_back ("MXF frames per second differ"); + } + if (_length != other_mxf->_length) { + notes.push_back ("MXF lengths differ"); + } + } + + if (opt.flags & MXF_BITWISE) { + + if (digest() != other_mxf->digest()) { + notes.push_back ("MXF digests differ"); + } + + if (filesystem::file_size (path()) != filesystem::file_size (other_mxf->path())) { + notes.push_back (path().string() + " and " + other_mxf->path().string() + " sizes differ"); + return notes; + } + + ifstream a (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 (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 (path().string() + " and " + other_mxf->path().string() + " content differs"); + return notes; + } + + n -= t; + } + } + + return notes; +} + +int +MXFAsset::length () const +{ + return _length; +} + + |
