From 8c7b705e318d888444e5156f627cdc48168d3ac7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 27 Sep 2016 11:22:03 +0100 Subject: Use a template as a basis for Frames. --- src/wscript | 1 - 1 file changed, 1 deletion(-) (limited to 'src/wscript') diff --git a/src/wscript b/src/wscript index 489d669e..dfb106be 100644 --- a/src/wscript +++ b/src/wscript @@ -90,7 +90,6 @@ def build(bld): sound_asset.cc sound_asset_reader.cc sound_asset_writer.cc - sound_frame.cc stereo_picture_asset.cc stereo_picture_asset_reader.cc stereo_picture_asset_writer.cc -- cgit v1.2.3 From f9474637db140eb3d9170185fc79437c8d9914b7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 27 Sep 2016 11:35:53 +0100 Subject: Use a template for AssetReader. --- src/asset_reader.cc | 46 --------------------------- src/asset_reader.h | 28 ++++++++++++++-- src/mono_picture_asset.h | 2 +- src/mono_picture_asset_reader.cc | 65 -------------------------------------- src/mono_picture_asset_reader.h | 22 +------------ src/mono_picture_frame.h | 3 +- src/sound_asset.h | 2 +- src/sound_asset_reader.cc | 65 -------------------------------------- src/sound_asset_reader.h | 24 +------------- src/stereo_picture_asset.h | 3 +- src/stereo_picture_asset_reader.cc | 65 -------------------------------------- src/stereo_picture_asset_reader.h | 22 +------------ src/stereo_picture_frame.h | 3 +- src/wscript | 4 --- 14 files changed, 35 insertions(+), 319 deletions(-) delete mode 100644 src/asset_reader.cc delete mode 100644 src/mono_picture_asset_reader.cc delete mode 100644 src/sound_asset_reader.cc delete mode 100644 src/stereo_picture_asset_reader.cc (limited to 'src/wscript') diff --git a/src/asset_reader.cc b/src/asset_reader.cc deleted file mode 100644 index 73c5d010..00000000 --- a/src/asset_reader.cc +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (C) 2016 Carl Hetherington - - 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 . - - 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 "mxf.h" -#include "exceptions.h" -#include "decryption_context.h" -#include - -using namespace dcp; - -AssetReader::AssetReader (MXF const * mxf) - : _decryption_context (new DecryptionContext (mxf->key ())) -{ - -} diff --git a/src/asset_reader.h b/src/asset_reader.h index 09169a8e..1cfd9ea2 100644 --- a/src/asset_reader.h +++ b/src/asset_reader.h @@ -34,21 +34,43 @@ #ifndef LIBDCP_ASSET_READER_H #define LIBDCP_ASSET_READER_H +#include "dcp_assert.h" +#include "asset.h" +#include #include #include namespace dcp { -class MXF; class DecryptionContext; +template class AssetReader : public boost::noncopyable { public: - explicit AssetReader (MXF const * mxf); - virtual ~AssetReader () {} + explicit AssetReader (Asset const * asset) + { + _reader = new R (); + DCP_ASSERT (asset->file ()); + Kumu::Result_t const r = _reader->OpenRead (asset->file()->string().c_str()); + if (ASDCP_FAILURE (r)) { + delete _reader; + boost::throw_exception (FileError ("could not open MXF file for reading", asset->file().get(), r)); + } + } + + ~AssetReader () + { + delete _reader; + } + + boost::shared_ptr get_frame (int n) const + { + return boost::shared_ptr (new F (_reader, n, _decryption_context)); + } protected: + R* _reader; boost::shared_ptr _decryption_context; }; diff --git a/src/mono_picture_asset.h b/src/mono_picture_asset.h index 75ebc3aa..f532db00 100644 --- a/src/mono_picture_asset.h +++ b/src/mono_picture_asset.h @@ -35,11 +35,11 @@ #define LIBDCP_MONO_PICTURE_ASSET_H #include "picture_asset.h" +#include "mono_picture_asset_reader.h" namespace dcp { class MonoPictureAssetWriter; -class MonoPictureAssetReader; /** @class MonoPictureAsset * @brief A 2D (monoscopic) picture asset. diff --git a/src/mono_picture_asset_reader.cc b/src/mono_picture_asset_reader.cc deleted file mode 100644 index f11ec7f4..00000000 --- a/src/mono_picture_asset_reader.cc +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2016 Carl Hetherington - - 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 . - - 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 "mono_picture_asset_reader.h" -#include "mono_picture_asset.h" -#include "mono_picture_frame.h" -#include "exceptions.h" -#include "dcp_assert.h" -#include - -using namespace dcp; -using boost::shared_ptr; - -MonoPictureAssetReader::MonoPictureAssetReader (MonoPictureAsset const * asset) - : AssetReader (asset) -{ - _reader = new ASDCP::JP2K::MXFReader (); - DCP_ASSERT (asset->file ()); - Kumu::Result_t const r = _reader->OpenRead (asset->file()->string().c_str()); - if (ASDCP_FAILURE (r)) { - delete _reader; - boost::throw_exception (FileError ("could not open MXF file for reading", asset->file().get(), r)); - } -} - -MonoPictureAssetReader::~MonoPictureAssetReader () -{ - delete _reader; -} - -shared_ptr -MonoPictureAssetReader::get_frame (int n) const -{ - return shared_ptr (new MonoPictureFrame (_reader, n, _decryption_context)); -} diff --git a/src/mono_picture_asset_reader.h b/src/mono_picture_asset_reader.h index 08f9fde0..9ec899cc 100644 --- a/src/mono_picture_asset_reader.h +++ b/src/mono_picture_asset_reader.h @@ -32,31 +32,11 @@ */ #include "asset_reader.h" -#include - -namespace ASDCP { - namespace JP2K { - class MXFReader; - } -} namespace dcp { class MonoPictureFrame; -class MonoPictureAsset; - -class MonoPictureAssetReader : public AssetReader -{ -public: - ~MonoPictureAssetReader (); - boost::shared_ptr get_frame (int n) const; - -private: - friend class MonoPictureAsset; - - explicit MonoPictureAssetReader (MonoPictureAsset const *); - ASDCP::JP2K::MXFReader* _reader; -}; +typedef AssetReader MonoPictureAssetReader; } diff --git a/src/mono_picture_frame.h b/src/mono_picture_frame.h index cb4afd6f..87c5d6ab 100644 --- a/src/mono_picture_frame.h +++ b/src/mono_picture_frame.h @@ -36,6 +36,7 @@ */ #include "types.h" +#include "mono_picture_asset_reader.h" #include #include #include @@ -73,7 +74,7 @@ public: int j2k_size () const; private: - friend class MonoPictureAssetReader; + friend MonoPictureAssetReader; MonoPictureFrame (ASDCP::JP2K::MXFReader* reader, int n, boost::shared_ptr); diff --git a/src/sound_asset.h b/src/sound_asset.h index 9278eeee..6d090312 100644 --- a/src/sound_asset.h +++ b/src/sound_asset.h @@ -42,12 +42,12 @@ #include "types.h" #include "metadata.h" #include "sound_frame.h" +#include "sound_asset_reader.h" namespace dcp { class SoundAssetWriter; -class SoundAssetReader; /** @class SoundAsset * @brief Representation of a sound asset diff --git a/src/sound_asset_reader.cc b/src/sound_asset_reader.cc deleted file mode 100644 index 78c0abe1..00000000 --- a/src/sound_asset_reader.cc +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2016 Carl Hetherington - - 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 . - - 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 "sound_asset_reader.h" -#include "sound_asset.h" -#include "sound_frame.h" -#include "exceptions.h" -#include "dcp_assert.h" -#include - -using boost::shared_ptr; -using namespace dcp; - -SoundAssetReader::SoundAssetReader (SoundAsset const * asset) - : AssetReader (asset) -{ - _reader = new ASDCP::PCM::MXFReader (); - DCP_ASSERT (asset->file ()); - Kumu::Result_t const r = _reader->OpenRead (asset->file()->string().c_str()); - if (ASDCP_FAILURE (r)) { - delete _reader; - boost::throw_exception (FileError ("could not open MXF file for reading", asset->file().get(), r)); - } -} - -SoundAssetReader::~SoundAssetReader () -{ - delete _reader; -} - -shared_ptr -SoundAssetReader::get_frame (int n) const -{ - return shared_ptr (new SoundFrame (_reader, n, _decryption_context)); -} diff --git a/src/sound_asset_reader.h b/src/sound_asset_reader.h index b2213b59..41d50257 100644 --- a/src/sound_asset_reader.h +++ b/src/sound_asset_reader.h @@ -32,31 +32,9 @@ */ #include "asset_reader.h" -#include "sound_frame.h" -#include - -namespace ASDCP { - namespace PCM { - class MXFReader; - } -} namespace dcp { -class SoundAsset; - -class SoundAssetReader : public AssetReader -{ -public: - ~SoundAssetReader (); - boost::shared_ptr get_frame (int n) const; - -private: - friend class SoundAsset; - - explicit SoundAssetReader (SoundAsset const * asset); - - ASDCP::PCM::MXFReader* _reader; -}; +typedef AssetReader SoundAssetReader; } diff --git a/src/stereo_picture_asset.h b/src/stereo_picture_asset.h index 23c49138..fbf4e618 100644 --- a/src/stereo_picture_asset.h +++ b/src/stereo_picture_asset.h @@ -35,11 +35,10 @@ #define LIBDCP_STEREO_PICTURE_ASSET_H #include "picture_asset.h" +#include "stereo_picture_asset_reader.h" namespace dcp { -class StereoPictureAssetReader; - /** A 3D (stereoscopic) picture asset */ class StereoPictureAsset : public PictureAsset { diff --git a/src/stereo_picture_asset_reader.cc b/src/stereo_picture_asset_reader.cc deleted file mode 100644 index 7348dfa9..00000000 --- a/src/stereo_picture_asset_reader.cc +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2016 Carl Hetherington - - 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 . - - 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 "stereo_picture_asset_reader.h" -#include "stereo_picture_asset.h" -#include "stereo_picture_frame.h" -#include "exceptions.h" -#include "dcp_assert.h" -#include - -using namespace dcp; -using boost::shared_ptr; - -StereoPictureAssetReader::StereoPictureAssetReader (StereoPictureAsset const * asset) - : AssetReader (asset) -{ - _reader = new ASDCP::JP2K::MXFSReader (); - DCP_ASSERT (asset->file ()); - Kumu::Result_t const r = _reader->OpenRead (asset->file()->string().c_str()); - if (ASDCP_FAILURE (r)) { - delete _reader; - boost::throw_exception (FileError ("could not open MXF file for reading", asset->file().get(), r)); - } -} - -StereoPictureAssetReader::~StereoPictureAssetReader () -{ - delete _reader; -} - -shared_ptr -StereoPictureAssetReader::get_frame (int n) const -{ - return shared_ptr (new StereoPictureFrame (_reader, n, _decryption_context)); -} diff --git a/src/stereo_picture_asset_reader.h b/src/stereo_picture_asset_reader.h index 817bc4b3..43b9d225 100644 --- a/src/stereo_picture_asset_reader.h +++ b/src/stereo_picture_asset_reader.h @@ -32,31 +32,11 @@ */ #include "asset_reader.h" -#include - -namespace ASDCP { - namespace JP2K { - class MXFSReader; - } -} namespace dcp { class StereoPictureFrame; -class StereoPictureAsset; - -class StereoPictureAssetReader : public AssetReader -{ -public: - ~StereoPictureAssetReader (); - boost::shared_ptr get_frame (int n) const; - -private: - friend class StereoPictureAsset; - - explicit StereoPictureAssetReader (StereoPictureAsset const *); - ASDCP::JP2K::MXFSReader* _reader; -}; +typedef AssetReader StereoPictureAssetReader; } diff --git a/src/stereo_picture_frame.h b/src/stereo_picture_frame.h index 65e1cea3..42d88b3f 100644 --- a/src/stereo_picture_frame.h +++ b/src/stereo_picture_frame.h @@ -32,6 +32,7 @@ */ #include "types.h" +#include "stereo_picture_asset_reader.h" #include #include #include @@ -69,7 +70,7 @@ public: int right_j2k_size () const; private: - friend class StereoPictureAssetReader; + friend StereoPictureAssetReader; StereoPictureFrame (ASDCP::JP2K::MXFSReader* reader, int n, boost::shared_ptr); diff --git a/src/wscript b/src/wscript index dfb106be..63c65905 100644 --- a/src/wscript +++ b/src/wscript @@ -35,7 +35,6 @@ from waflib import TaskGen def build(bld): source = """ asset.cc - asset_reader.cc asset_writer.cc atmos_asset.cc certificate_chain.cc @@ -64,7 +63,6 @@ def build(bld): metadata.cc modified_gamma_transfer_function.cc mono_picture_asset.cc - mono_picture_asset_reader.cc mono_picture_asset_writer.cc mono_picture_frame.cc mxf.cc @@ -88,10 +86,8 @@ def build(bld): smpte_load_font_node.cc smpte_subtitle_asset.cc sound_asset.cc - sound_asset_reader.cc sound_asset_writer.cc stereo_picture_asset.cc - stereo_picture_asset_reader.cc stereo_picture_asset_writer.cc stereo_picture_frame.cc subtitle_asset.cc -- cgit v1.2.3 From 214d72306bdfdd617c3e6a7cfeb5c5d76d7f5e72 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 27 Sep 2016 12:30:04 +0100 Subject: Add Atmos read/write and untested MXF decryption tool. --- run/tools/dcpdecryptmxf | 12 +++ src/atmos_asset.cc | 33 +++++++ src/atmos_asset.h | 19 ++++ src/atmos_asset_reader.h | 41 +++++++++ src/atmos_asset_writer.cc | 109 +++++++++++++++++++++++ src/atmos_asset_writer.h | 73 ++++++++++++++++ src/atmos_frame.h | 49 +++++++++++ src/decryption_context.h | 5 ++ src/frame.h | 5 ++ src/mono_picture_asset.cc | 2 +- src/sound_asset.cc | 2 +- src/stereo_picture_asset.cc | 2 +- src/wscript | 3 + tools/dcpdecryptmxf.cc | 207 ++++++++++++++++++++++++++++++++++++++++++++ tools/wscript | 6 ++ 15 files changed, 565 insertions(+), 3 deletions(-) create mode 100755 run/tools/dcpdecryptmxf create mode 100644 src/atmos_asset_reader.h create mode 100644 src/atmos_asset_writer.cc create mode 100644 src/atmos_asset_writer.h create mode 100644 src/atmos_frame.h create mode 100644 tools/dcpdecryptmxf.cc (limited to 'src/wscript') diff --git a/run/tools/dcpdecryptmxf b/run/tools/dcpdecryptmxf new file mode 100755 index 00000000..9caf5460 --- /dev/null +++ b/run/tools/dcpdecryptmxf @@ -0,0 +1,12 @@ +#!/bin/bash + +export LD_LIBRARY_PATH=build/src:build/asdcplib/src:$LD_LIBRARY_PATH +if [ "$1" == "--debug" ]; then + shift + gdb --args build/tools/dcpdecryptmxf "$@" +elif [ "$1" == "--valgrind" ]; then + shift + valgrind --tool="memcheck" --leak-check=full --show-reachable=yes build/tools/dcpdecryptmxf "$@" +else + build/tools/dcpdecryptmxf "$@" +fi 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 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 +AtmosAsset::start_read () const +{ + return shared_ptr (new AtmosAssetReader (this, key ())); +} + +shared_ptr +AtmosAsset::start_write (boost::filesystem::path file) +{ + return shared_ptr (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 start_write (boost::filesystem::path file); + boost::shared_ptr 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 + + 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 . + + 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 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 + + 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 . + + 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 + +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 + + 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 . + + 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 +#include + +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 _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 + + 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 . + + 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 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 @@ -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 @@ -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 MonoPictureAsset::start_read () const { - return shared_ptr (new MonoPictureAssetReader (this)); + return shared_ptr (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 SoundAsset::start_read () const { - return shared_ptr (new SoundAssetReader (this)); + return shared_ptr (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 StereoPictureAsset::start_read () const { - return shared_ptr (new StereoPictureAssetReader (this)); + return shared_ptr (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 diff --git a/tools/dcpdecryptmxf.cc b/tools/dcpdecryptmxf.cc new file mode 100644 index 00000000..e640620a --- /dev/null +++ b/tools/dcpdecryptmxf.cc @@ -0,0 +1,207 @@ +/* + Copyright (C) 2016 Carl Hetherington + + 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 . + + 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 "encrypted_kdm.h" +#include "decrypted_kdm.h" +#include "decryption_context.h" +#include "key.h" +#include "util.h" +#include "atmos_asset.h" +#include "atmos_frame.h" +#include "atmos_asset_reader.h" +#include "atmos_asset_writer.h" +#include "exceptions.h" +#include +#include +#include +#include + +using std::string; +using std::cerr; +using std::cout; +using boost::optional; +using boost::shared_ptr; + +static void +help (string n) +{ + cerr << "Syntax: " << n << " [OPTION] ]\n" + << " -v, --version show DCP-o-matic version\n" + << " -h, --help show this help\n" + << " -o, --output output filename\n" + << " -k, --kdm KDM file\n" + << " -p, --private-key private key file\n"; +} + +int +atmos ( + ASDCP::ATMOS::MXFReader& reader, + boost::filesystem::path output_file, + dcp::DecryptedKDM kdm + ) +{ + ASDCP::WriterInfo info; + if (ASDCP_FAILURE (reader.FillWriterInfo (info))) { + cerr << "Could not read ATMOS MXF information\n"; + exit (EXIT_FAILURE); + } + + if (!info.EncryptedEssence) { + cerr << "MXF is not encrypted!\n"; + exit (EXIT_FAILURE); + } + + char key_buffer[64]; + Kumu::bin2UUIDhex (info.CryptographicKeyID, ASDCP::UUIDlen, key_buffer, sizeof (key_buffer)); + string const key_id = key_buffer; + + optional key; + BOOST_FOREACH (dcp::DecryptedKDMKey const & i, kdm.keys()) { + if (i.id() == key_id) { + key = i.key(); + } + } + + if (!key) { + cerr << "Could not find key in KDM.\n"; + exit (EXIT_FAILURE); + } + + dcp::DecryptionContext dc (key.get()); + + ASDCP::ATMOS::AtmosDescriptor desc; + if (ASDCP_FAILURE (reader.FillAtmosDescriptor (desc))) { + cerr << "could not read ATMOS descriptor.\n"; + exit (EXIT_FAILURE); + } + + ASDCP::DCData::FrameBuffer buffer (Kumu::Megabyte); + + for (size_t i = 0; i < desc.ContainerDuration; ++i) { + reader.ReadFrame (i, buffer, dc.decryption(), 0); + } + + return 0; +} + +int +main (int argc, char* argv[]) +{ + optional output_file; + optional kdm_file; + optional private_key_file; + + int option_index = 0; + while (true) { + struct option long_options[] = { + { "version", no_argument, 0, 'v' }, + { "help", no_argument, 0, 'h' }, + { "output", required_argument, 0, 'o'}, + { "kdm", required_argument, 0, 'k'}, + { "private-key", required_argument, 0, 'p'}, + { 0, 0, 0, 0 } + }; + + int c = getopt_long (argc, argv, "vho:k:p:", long_options, &option_index); + + if (c == -1) { + break; + } + + switch (c) { + case 'v': + cout << "libdcp version " << LIBDCP_VERSION << "\n"; + exit (EXIT_SUCCESS); + case 'h': + help (argv[0]); + exit (EXIT_SUCCESS); + case 'o': + output_file = optarg; + break; + case 'k': + kdm_file = optarg; + break; + case 'p': + private_key_file = optarg; + break; + } + } + + if (optind >= argc) { + help (argv[0]); + exit (EXIT_FAILURE); + } + + boost::filesystem::path input_file = argv[optind]; + + if (!output_file) { + cerr << "You must specify -o or --output\n"; + exit (EXIT_FAILURE); + } + + if (!kdm_file) { + cerr << "You must specify -k or --kdm\n"; + exit (EXIT_FAILURE); + } + + if (!private_key_file) { + cerr << "You must specify -p or --private-key\n"; + exit (EXIT_FAILURE); + } + + dcp::EncryptedKDM encrypted_kdm (dcp::file_to_string (kdm_file.get ())); + dcp::DecryptedKDM decrypted_kdm (encrypted_kdm, dcp::file_to_string (private_key_file.get())); + + try { + dcp::AtmosAsset in (input_file); + shared_ptr reader = in.start_read (); + dcp::AtmosAsset out ( + in.edit_rate(), + in.first_frame(), + in.max_channel_count(), + in.max_object_count(), + in.atmos_id(), + in.atmos_version() + ); + shared_ptr writer = out.start_write (output_file.get()); + for (int64_t i = 0; i < in.intrinsic_duration(); ++i) { + shared_ptr f = reader->get_frame (i); + writer->write (f->data(), f->size()); + } + } catch (dcp::DCPReadError& e) { + cerr << "Unknown MXF format.\n"; + return EXIT_FAILURE; + } + + return 0; +} diff --git a/tools/wscript b/tools/wscript index 1f04cd18..b3bb3a1f 100644 --- a/tools/wscript +++ b/tools/wscript @@ -49,3 +49,9 @@ def build(bld): obj.uselib = 'OPENJPEG CXML OPENMP ASDCPLIB_CTH BOOST_FILESYSTEM LIBXML++ XMLSEC1 OPENSSL' obj.source = 'dcpdumpsub.cc' obj.target = 'dcpdumpsub' + + obj = bld(features='cxx cxxprogram') + obj.use = ['libdcp%s' % bld.env.API_VERSION] + obj.uselib = 'OPENJPEG CXML OPENMP ASDCPLIB_CTH BOOST_FILESYSTEM LIBXML++ XMLSEC1 OPENSSL' + obj.source = 'dcpdecryptmxf.cc' + obj.target = 'dcpdecryptmxf' -- cgit v1.2.3 From 9f8eca1279e3d2f04127c3eeaef52345e33a1e49 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 28 Sep 2016 11:35:58 +0100 Subject: Missing header install. --- src/wscript | 1 + 1 file changed, 1 insertion(+) (limited to 'src/wscript') diff --git a/src/wscript b/src/wscript index f24064be..008ec368 100644 --- a/src/wscript +++ b/src/wscript @@ -113,6 +113,7 @@ def build(bld): colour_matrix.h cpl.h dcp.h + dcp_assert.h dcp_time.h data.h decrypted_kdm.h -- cgit v1.2.3 From 5aba207171b7f1da91968bf2197c5668e8aacb4e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 28 Sep 2016 11:58:15 +0100 Subject: Another missing header install. --- src/wscript | 1 + 1 file changed, 1 insertion(+) (limited to 'src/wscript') diff --git a/src/wscript b/src/wscript index 008ec368..9972076d 100644 --- a/src/wscript +++ b/src/wscript @@ -118,6 +118,7 @@ def build(bld): data.h decrypted_kdm.h decrypted_kdm_key.h + decryption_context.h encrypted_kdm.h encryption_context.h exceptions.h -- cgit v1.2.3