X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fpicture_asset.h;h=2af1f69ad0a940c2f270256eb5805fb3b2312a7b;hb=127c14300f1d2df9fc2b9dd4ffb5218ea6a717c3;hp=2041abb3f2d00141562fbb650e853c103b944b77;hpb=e1e4934599bc244817ae63f4bc9f4a2ba81b1a29;p=libdcp.git diff --git a/src/picture_asset.h b/src/picture_asset.h index 2041abb3..2af1f69a 100644 --- a/src/picture_asset.h +++ b/src/picture_asset.h @@ -21,7 +21,7 @@ #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 @@ -33,9 +33,10 @@ 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: @@ -53,23 +54,35 @@ 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 + ); + /** 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 ( @@ -79,69 +92,10 @@ protected: /** picture size in pixels */ Size _size; -}; - -class MonoPictureAsset; - -struct FrameInfo -{ - FrameInfo (uint64_t o, uint64_t s, std::string h) - : offset (o) - , size (s) - , hash (h) - {} - - FrameInfo (std::istream& s); - - void write (std::ostream& s); - - uint64_t offset; - uint64_t size; - 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: - FrameInfo write (uint8_t* data, int size); - void fake_write (int size); - void finalize (); private: - friend class MonoPictureAsset; - - MonoPictureAssetWriter (MonoPictureAsset *, bool, MXFMetadata const &); - void start (uint8_t *, int); - - /* 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; - bool _started; - /** true if finalize() has been called */ - bool _finalized; - bool _overwrite; - MXFMetadata _metadata; + std::string key_type () const; + virtual int edit_rate_factor () const = 0; }; /** A 2D (monoscopic) picture asset */ @@ -156,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, @@ -166,7 +121,9 @@ public: boost::signals2::signal* progress, int fps, int intrinsic_duration, + bool encrypted, Size size, + bool interop, MXFMetadata const & metadata = MXFMetadata () ); @@ -178,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, @@ -188,7 +146,9 @@ public: boost::signals2::signal* progress, int fps, int intrinsic_duration, + bool encrypted, Size size, + bool interop, MXFMetadata const & metadata = MXFMetadata () ); @@ -209,14 +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 (bool, MXFMetadata const & metadata = MXFMetadata ()); + 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, boost::function note) const; private: std::string path_from_list (int f, std::vector const & files) const; - void construct (boost::function, MXFMetadata const &); + void construct (boost::function, bool, MXFMetadata const &); + std::string cpl_node_name () const; + int edit_rate_factor () const; }; /** A 3D (stereoscopic) picture asset */ @@ -224,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, boost::function note) const; + +private: + std::string cpl_node_name () const; + std::pair cpl_node_attribute (bool) const; + int edit_rate_factor () const; };