diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/atmos_asset.cc | 33 | ||||
| -rw-r--r-- | src/atmos_asset.h | 19 | ||||
| -rw-r--r-- | src/atmos_asset_reader.h | 41 | ||||
| -rw-r--r-- | src/atmos_asset_writer.cc | 109 | ||||
| -rw-r--r-- | src/atmos_asset_writer.h | 73 | ||||
| -rw-r--r-- | src/atmos_frame.h | 49 | ||||
| -rw-r--r-- | src/decryption_context.h | 5 | ||||
| -rw-r--r-- | src/frame.h | 5 | ||||
| -rw-r--r-- | src/mono_picture_asset.cc | 2 | ||||
| -rw-r--r-- | src/sound_asset.cc | 2 | ||||
| -rw-r--r-- | src/stereo_picture_asset.cc | 2 | ||||
| -rw-r--r-- | src/wscript | 3 |
12 files changed, 340 insertions, 3 deletions
diff --git a/src/atmos_asset.cc b/src/atmos_asset.cc index a8a595c3..eac01dcf 100644 --- a/src/atmos_asset.cc +++ b/src/atmos_asset.cc @@ -32,12 +32,27 @@ */ #include "atmos_asset.h" +#include "atmos_asset_reader.h" +#include "atmos_asset_writer.h" #include "exceptions.h" #include <asdcp/AS_DCP.h> using std::string; +using boost::shared_ptr; using namespace dcp; +AtmosAsset::AtmosAsset (Fraction edit_rate, int first_frame, int max_channel_count, int max_object_count, string atmos_id, int atmos_version) + : _edit_rate (edit_rate) + , _intrinsic_duration (0) + , _first_frame (first_frame) + , _max_channel_count (max_channel_count) + , _max_object_count (max_object_count) + , _atmos_id (atmos_id) + , _atmos_version (atmos_version) +{ + +} + AtmosAsset::AtmosAsset (boost::filesystem::path file) : Asset (file) { @@ -57,6 +72,12 @@ AtmosAsset::AtmosAsset (boost::filesystem::path file) _first_frame = desc.FirstFrame; _max_channel_count = desc.MaxChannelCount; _max_object_count = desc.MaxObjectCount; + + char id[64]; + Kumu::bin2UUIDhex (desc.AtmosID, ASDCP::UUIDlen, id, sizeof (id)); + _atmos_id = id; + + _atmos_version = desc.AtmosVersion; } string @@ -64,3 +85,15 @@ AtmosAsset::pkl_type (Standard) const { return "application/mxf"; } + +shared_ptr<AtmosAssetReader> +AtmosAsset::start_read () const +{ + return shared_ptr<AtmosAssetReader> (new AtmosAssetReader (this, key ())); +} + +shared_ptr<AtmosAssetWriter> +AtmosAsset::start_write (boost::filesystem::path file) +{ + return shared_ptr<AtmosAssetWriter> (new AtmosAssetWriter (this, file)); +} diff --git a/src/atmos_asset.h b/src/atmos_asset.h index 2e99e18b..8e9190c8 100644 --- a/src/atmos_asset.h +++ b/src/atmos_asset.h @@ -36,14 +36,21 @@ #include "asset.h" #include "mxf.h" +#include "atmos_asset_reader.h" namespace dcp { +class AtmosAssetWriter; + class AtmosAsset : public Asset, public MXF { public: + AtmosAsset (Fraction edit_rate, int first_frame, int max_channel_count, int max_object_count, std::string atmos_id, int atmos_version); explicit AtmosAsset (boost::filesystem::path file); + boost::shared_ptr<AtmosAssetWriter> start_write (boost::filesystem::path file); + boost::shared_ptr<AtmosAssetReader> start_read () const; + std::string pkl_type (Standard) const; Fraction edit_rate () const { @@ -69,12 +76,24 @@ public: return _max_object_count; } + std::string atmos_id () const { + return _atmos_id; + } + + int atmos_version () const { + return _atmos_version; + } + private: + friend class AtmosAssetWriter; + Fraction _edit_rate; int64_t _intrinsic_duration; int _first_frame; int _max_channel_count; int _max_object_count; + std::string _atmos_id; + int _atmos_version; }; } diff --git a/src/atmos_asset_reader.h b/src/atmos_asset_reader.h new file mode 100644 index 00000000..14806261 --- /dev/null +++ b/src/atmos_asset_reader.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2016 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp 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. + + libdcp 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 libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + +#include "asset_reader.h" +#include "atmos_frame.h" + +namespace dcp { + +typedef AssetReader<ASDCP::ATMOS::MXFReader, AtmosFrame> AtmosAssetReader; + +} diff --git a/src/atmos_asset_writer.cc b/src/atmos_asset_writer.cc new file mode 100644 index 00000000..eb0d608a --- /dev/null +++ b/src/atmos_asset_writer.cc @@ -0,0 +1,109 @@ +/* + Copyright (C) 2016 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp 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. + + libdcp 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 libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + +#include "atmos_asset_writer.h" +#include "atmos_asset.h" +#include "exceptions.h" +#include "dcp_assert.h" +#include "compose.hpp" +#include "encryption_context.h" +#include <asdcp/AS_DCP.h> + +using std::min; +using std::max; +using namespace dcp; + +struct AtmosAssetWriter::ASDCPState +{ + ASDCP::ATMOS::MXFWriter mxf_writer; + ASDCP::DCData::FrameBuffer frame_buffer; + ASDCP::WriterInfo writer_info; + ASDCP::ATMOS::AtmosDescriptor desc; +}; + +AtmosAssetWriter::AtmosAssetWriter (AtmosAsset* asset, boost::filesystem::path file) + : AssetWriter (asset, file, SMPTE) + , _state (new AtmosAssetWriter::ASDCPState) + , _asset (asset) +{ + _state->desc.EditRate = ASDCP::Rational (_asset->edit_rate().numerator, _asset->edit_rate().denominator); + _state->desc.FirstFrame = _asset->first_frame (); + _state->desc.MaxChannelCount = _asset->max_channel_count (); + _state->desc.MaxObjectCount = _asset->max_object_count (); + + unsigned int c; + Kumu::hex2bin (_asset->atmos_id().c_str(), _state->desc.AtmosID, ASDCP::UUIDlen, &c); + DCP_ASSERT (c == ASDCP::UUIDlen); + + _state->desc.AtmosVersion = 0; + + _asset->fill_writer_info (&_state->writer_info, _asset->id(), SMPTE); +} + +void +AtmosAssetWriter::write (uint8_t const * data, int size) +{ + DCP_ASSERT (!_finalized); + + if (!_started) { + Kumu::Result_t r = _state->mxf_writer.OpenWrite (_file.string().c_str(), _state->writer_info, _state->desc); + if (ASDCP_FAILURE (r)) { + boost::throw_exception (FileError ("could not open atmos MXF for writing", _file.string(), r)); + } + + _asset->set_file (_file); + _started = true; + } + + _state->frame_buffer.Capacity (size); + _state->frame_buffer.Size (size); + memcpy (_state->frame_buffer.Data(), data, size); + + ASDCP::Result_t const r = _state->mxf_writer.WriteFrame (_state->frame_buffer, _encryption_context->encryption(), _encryption_context->hmac()); + if (ASDCP_FAILURE (r)) { + boost::throw_exception (MiscError (String::compose ("could not write atmos MXF frame (%1)", int (r)))); + } + + ++_frames_written; +} + +bool +AtmosAssetWriter::finalize () +{ + if (_started && ASDCP_FAILURE (_state->mxf_writer.Finalize())) { + boost::throw_exception (MiscError ("could not finalise atmos MXF")); + } + + _asset->_intrinsic_duration = _frames_written; + return AssetWriter::finalize (); +} diff --git a/src/atmos_asset_writer.h b/src/atmos_asset_writer.h new file mode 100644 index 00000000..e494b779 --- /dev/null +++ b/src/atmos_asset_writer.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2016 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp 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. + + libdcp 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 libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + +/** @file src/atmos_asset_writer.h + * @brief AtmosAssetWriter class. + */ + +#include "asset_writer.h" +#include "types.h" +#include "atmos_frame.h" +#include <boost/shared_ptr.hpp> +#include <boost/filesystem.hpp> + +namespace dcp { + +class AtmosAsset; + +/** @class AtmosAssetWriter + * @brief A helper class for writing to AtmosAssets. + * + * Objects of this class can only be created with AtmosAsset::start_write(). + */ +class AtmosAssetWriter : public AssetWriter +{ +public: + void write (uint8_t const * data, int size); + bool finalize (); + +private: + friend class AtmosAsset; + + AtmosAssetWriter (AtmosAsset *, boost::filesystem::path); + + /* do this with an opaque pointer so we don't have to include + ASDCP headers + */ + struct ASDCPState; + boost::shared_ptr<ASDCPState> _state; + + AtmosAsset* _asset; +}; + +} diff --git a/src/atmos_frame.h b/src/atmos_frame.h new file mode 100644 index 00000000..763875bd --- /dev/null +++ b/src/atmos_frame.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2016 Carl Hetherington <cth@carlh.net> + + This file is part of libdcp. + + libdcp 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. + + libdcp 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 libdcp. If not, see <http://www.gnu.org/licenses/>. + + In addition, as a special exception, the copyright holders give + permission to link the code of portions of this program with the + OpenSSL library under certain conditions as described in each + individual source file, and distribute linked combinations + including the two. + + You must obey the GNU General Public License in all respects + for all of the code used other than OpenSSL. If you modify + file(s) with this exception, you may extend this exception to your + version of the file(s), but you are not obligated to do so. If you + do not wish to do so, delete this exception statement from your + version. If you delete this exception statement from all source + files in the program, then also delete it here. +*/ + +/** @file src/atmos_frame.h + * @brief AtmosFrame class. + */ + +#ifndef LIBDCP_ATMOS_FRAME_H +#define LIBDCP_ATMOS_FRAME_H + +#include "frame.h" + +namespace dcp { + +typedef Frame<ASDCP::ATMOS::MXFReader, ASDCP::DCData::FrameBuffer> AtmosFrame; + +} + +#endif diff --git a/src/decryption_context.h b/src/decryption_context.h index e3d3ce1e..fb8342cf 100644 --- a/src/decryption_context.h +++ b/src/decryption_context.h @@ -31,6 +31,9 @@ files in the program, then also delete it here. */ +#ifndef LIBDCP_DECRYPTION_CONTEXT_H +#define LIBDCP_DECRYPTION_CONTEXT_H + #include "key.h" #include <boost/optional.hpp> @@ -55,3 +58,5 @@ private: }; } + +#endif diff --git a/src/frame.h b/src/frame.h index 54b74e55..f20a1bb3 100644 --- a/src/frame.h +++ b/src/frame.h @@ -31,6 +31,9 @@ files in the program, then also delete it here. */ +#ifndef LIBDCP_FRAME_H +#define LIBDCP_FRAME_H + #include "decryption_context.h" #include "exceptions.h" #include <asdcp/KM_fileio.h> @@ -73,3 +76,5 @@ private: }; } + +#endif diff --git a/src/mono_picture_asset.cc b/src/mono_picture_asset.cc index a6643bc0..407a3614 100644 --- a/src/mono_picture_asset.cc +++ b/src/mono_picture_asset.cc @@ -176,7 +176,7 @@ MonoPictureAsset::start_write (boost::filesystem::path file, Standard standard, shared_ptr<MonoPictureAssetReader> MonoPictureAsset::start_read () const { - return shared_ptr<MonoPictureAssetReader> (new MonoPictureAssetReader (this)); + return shared_ptr<MonoPictureAssetReader> (new MonoPictureAssetReader (this, key ())); } string diff --git a/src/sound_asset.cc b/src/sound_asset.cc index 11fd4b2f..74d41212 100644 --- a/src/sound_asset.cc +++ b/src/sound_asset.cc @@ -201,7 +201,7 @@ SoundAsset::start_write (boost::filesystem::path file, Standard standard) shared_ptr<SoundAssetReader> SoundAsset::start_read () const { - return shared_ptr<SoundAssetReader> (new SoundAssetReader (this)); + return shared_ptr<SoundAssetReader> (new SoundAssetReader (this, key ())); } string diff --git a/src/stereo_picture_asset.cc b/src/stereo_picture_asset.cc index 9a21b72b..4bbf7268 100644 --- a/src/stereo_picture_asset.cc +++ b/src/stereo_picture_asset.cc @@ -86,7 +86,7 @@ StereoPictureAsset::start_write (boost::filesystem::path file, Standard standard shared_ptr<StereoPictureAssetReader> StereoPictureAsset::start_read () const { - return shared_ptr<StereoPictureAssetReader> (new StereoPictureAssetReader (this)); + return shared_ptr<StereoPictureAssetReader> (new StereoPictureAssetReader (this, key ())); } bool diff --git a/src/wscript b/src/wscript index 63c65905..f24064be 100644 --- a/src/wscript +++ b/src/wscript @@ -37,6 +37,7 @@ def build(bld): asset.cc asset_writer.cc atmos_asset.cc + atmos_asset_writer.cc certificate_chain.cc certificate.cc colour_conversion.cc @@ -103,6 +104,8 @@ def build(bld): asset_reader.h asset_writer.h atmos_asset.h + atmos_asset_reader.h + atmos_asset_writer.h certificate_chain.h certificate.h chromaticity.h |
