X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fasset_reader.h;h=2da67bd82fb4531e3a48996e69aeb47fe4f783d0;hb=4bd57fbbac67ac04ec47a9765b9f278aa1691851;hp=09169a8e0b173ec3ab01c60f8bfc2b0b10150fe2;hpb=9486066c29b91a8d9ac25be1c596cad62387208f;p=libdcp.git diff --git a/src/asset_reader.h b/src/asset_reader.h index 09169a8e..2da67bd8 100644 --- a/src/asset_reader.h +++ b/src/asset_reader.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Carl Hetherington + Copyright (C) 2016-2021 Carl Hetherington This file is part of libdcp. @@ -31,27 +31,79 @@ files in the program, then also delete it here. */ + +/** @file src/asset_reader.h + * @brief AssetReader class + */ + + #ifndef LIBDCP_ASSET_READER_H #define LIBDCP_ASSET_READER_H -#include -#include + +#include "asset.h" +#include "crypto_context.h" +#include "dcp_assert.h" +#include +#include + namespace dcp { -class MXF; -class DecryptionContext; -class AssetReader : public boost::noncopyable +class AtmosAsset; +class MonoPictureAsset; +class SoundAsset; +class StereoPictureAsset; + + +template +class AssetReader { public: - explicit AssetReader (MXF const * mxf); - virtual ~AssetReader () {} + AssetReader (AssetReader const&) = delete; + AssetReader& operator== (AssetReader const&) = delete; + + ~AssetReader () + { + delete _reader; + } + + std::shared_ptr get_frame (int n) const + { + /* Can't use make_shared here as the constructor is private */ + return std::shared_ptr (new F(_reader, n, _crypto_context)); + } + + R* reader () const { + return _reader; + } protected: - boost::shared_ptr _decryption_context; + R* _reader = nullptr; + std::shared_ptr _crypto_context; + +private: + friend class AtmosAsset; + friend class MonoPictureAsset; + friend class SoundAsset; + friend class StereoPictureAsset; + + explicit AssetReader (Asset const * asset, boost::optional key, Standard standard) + : _crypto_context (new DecryptionContext(key, standard)) + { + _reader = new R (); + DCP_ASSERT (asset->file()); + auto 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)); + } + } }; + } + #endif