X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fpicture_asset.h;h=2af1f69ad0a940c2f270256eb5805fb3b2312a7b;hb=127c14300f1d2df9fc2b9dd4ffb5218ea6a717c3;hp=9df85bade20424df1f9a7c5253bcf562262c106d;hpb=fe4c98bdc865290d10e70ebab7e48247d390f4c4;p=libdcp.git diff --git a/src/picture_asset.h b/src/picture_asset.h index 9df85bad..2af1f69a 100644 --- a/src/picture_asset.h +++ b/src/picture_asset.h @@ -21,20 +21,22 @@ #define LIBDCP_PICTURE_ASSET_H /** @file src/picture_asset.h - * @brief An asset made up of JPEG2000 files + * @brief An asset made up of JPEG2000 data */ #include #include "mxf_asset.h" #include "util.h" +#include "metadata.h" namespace libdcp { class MonoPictureFrame; -class StereoPictureFrame; +class StereoPictureFrame; +class PictureAssetWriter; -/** @brief An asset made up of JPEG2000 files */ +/** @brief An asset made up of JPEG2000 data */ class PictureAsset : public MXFAsset { public: @@ -52,93 +54,48 @@ public: * @param directory Directory where MXF file is. * @param mxf_name Name of MXF file. * @param progress Signal to use to inform of progres, or 0. - * @param fps Video Frames per second. - * @param intrinsic_duration Duration of all the frames in the asset. + * @param fps Video frames per second. + * @param intrinsic_duration Total number of frames in the asset. * @param size Size of video frame images in pixels. */ - PictureAsset (std::string directory, std::string mxf_name, boost::signals2::signal* progress, int fps, int intrinsic_duration, Size size); - - /** Write details of this asset to a CPL stream. - * @param s Stream. - */ - void write_to_cpl (std::ostream& s) const; + PictureAsset ( + std::string directory, + std::string mxf_name, + boost::signals2::signal* progress, + int fps, + int intrinsic_duration, + bool encrypted, + Size + ); - bool equals (boost::shared_ptr other, EqualityOptions opt, std::list& notes) const; + /** Start a progressive write to this asset. + * @param overwrite true to overwrite an existing MXF file; in this mode, writing can be resumed to a partially-written MXF; false if the + * MXF file does not exist. + * @param metadata MXF metadata to use. + */ + virtual boost::shared_ptr start_write (bool overwrite, bool interop, MXFMetadata const & metadata = MXFMetadata ()) = 0; + + bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function note) const; Size size () const { return _size; } + void write_to_cpl (xmlpp::Element *, bool) const; + protected: bool frame_buffer_equals ( - int frame, EqualityOptions opt, std::list& notes, + int frame, EqualityOptions opt, boost::function note, uint8_t const * data_A, unsigned int size_A, uint8_t const * data_B, unsigned int size_B ) const; /** picture size in pixels */ Size _size; -}; - -class MonoPictureAsset; - -struct FrameInfo -{ - FrameInfo (uint64_t o, uint64_t l, std::string h) - : offset (o) - , length (l) - , hash (h) - {} - - FrameInfo (std::istream& s); - - void write (std::ostream& s); - - uint64_t offset; - uint64_t length; - std::string hash; -}; - -/** A helper class for writing to MonoPictureAssets progressively (i.e. writing frame-by-frame, - * rather than giving libdcp all the frames in one go). - * - * Objects of this class can only be created with MonoPictureAsset::start_write(). - * - * Frames can be written to the MonoPictureAsset by calling write() with a JPEG2000 image - * (a verbatim .j2 file). finalize() must be called after the last frame has been written. - * The action of finalize() can't be done in MonoPictureAssetWriter's destructor as it may - * throw an exception. - */ -class MonoPictureAssetWriter -{ -public: - ~MonoPictureAssetWriter (); - - FrameInfo write (uint8_t* data, int size); - void fake_write (int size); - void finalize (); private: - friend class MonoPictureAsset; - - MonoPictureAssetWriter (MonoPictureAsset *, bool); - - /* no copy construction */ - MonoPictureAssetWriter (MonoPictureAssetWriter const &); - MonoPictureAssetWriter& operator= (MonoPictureAssetWriter const &); - - /* do this with an opaque pointer so we don't have to include - ASDCP headers - */ - - struct ASDCPState; - boost::shared_ptr _state; - - MonoPictureAsset* _asset; - /** Number of picture frames written to the asset so far */ - int _frames_written; - /** true if finalize() has been called */ - bool _finalized; + std::string key_type () const; + virtual int edit_rate_factor () const = 0; }; /** A 2D (monoscopic) picture asset */ @@ -153,8 +110,9 @@ public: * @param mxf_name Name of MXF file to create. * @param progress Signal to inform of progress. * @param fps Video frames per second. - * @param intrinsic_duration Length of the whole asset in frames. + * @param intrinsic_duration Total number of frames in the asset. * @param size Size of images in pixels. + * @param encrypted true if asset should be encrypted. */ MonoPictureAsset ( std::vector const & files, @@ -163,7 +121,10 @@ public: boost::signals2::signal* progress, int fps, int intrinsic_duration, - Size size + bool encrypted, + Size size, + bool interop, + MXFMetadata const & metadata = MXFMetadata () ); /** Construct a MonoPictureAsset, generating the MXF from the JPEG2000 files. @@ -174,8 +135,9 @@ public: * @param mxf_name Name of MXF file to create. * @param progress Signal to inform of progress. * @param fps Video frames per second. - * @param intrinsic_duration Length of the whole asset in frames. + * @param intrinsic_duration Total number of frames in the asset. * @param size Size of images in pixels. + * @param encrypted true if asset should be encrypted. */ MonoPictureAsset ( boost::function get_path, @@ -184,7 +146,10 @@ public: boost::signals2::signal* progress, int fps, int intrinsic_duration, - Size size + bool encrypted, + Size size, + bool interop, + MXFMetadata const & metadata = MXFMetadata () ); /** Construct a MonoPictureAsset, reading the MXF from disk. @@ -204,16 +169,16 @@ public: MonoPictureAsset (std::string directory, std::string mxf_name, int fps, Size size); /** Start a progressive write to a MonoPictureAsset */ - boost::shared_ptr start_write (); - - boost::shared_ptr start_overwrite (); + boost::shared_ptr start_write (bool, bool, MXFMetadata const & metadata = MXFMetadata ()); boost::shared_ptr get_frame (int n) const; - bool equals (boost::shared_ptr other, EqualityOptions opt, std::list& notes) const; + bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function note) const; private: std::string path_from_list (int f, std::vector const & files) const; - void construct (boost::function); + void construct (boost::function, bool, MXFMetadata const &); + std::string cpl_node_name () const; + int edit_rate_factor () const; }; /** A 3D (stereoscopic) picture asset */ @@ -221,9 +186,27 @@ class StereoPictureAsset : public PictureAsset { public: StereoPictureAsset (std::string directory, std::string mxf_name, int fps, int intrinsic_duration); - + + /** Construct a StereoPictureAsset for progressive writing using + * start_write() and a StereoPictureAssetWriter. + * + * @param directory Directory to put the MXF in. + * @param mxf_name Filename of the MXF within this directory. + * @param fps Video frames per second. + * @param size Size in pixels that the picture frames will be. + */ + StereoPictureAsset (std::string directory, std::string mxf_name, int fps, Size size); + + /** Start a progressive write to a StereoPictureAsset */ + boost::shared_ptr start_write (bool, bool, MXFMetadata const & metadata = MXFMetadata ()); + boost::shared_ptr get_frame (int n) const; - bool equals (boost::shared_ptr other, EqualityOptions opt, std::list& notes) const; + bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function note) const; + +private: + std::string cpl_node_name () const; + std::pair cpl_node_attribute (bool) const; + int edit_rate_factor () const; };