X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fpicture_asset.h;h=b404abd2e5d0bb897d23391adcd3e520e4291d5f;hb=83358c16fcfdad24e8e415df13d6cf8e9bb43556;hp=f1b14bd6bf7fef2c2e555d78469d81c0e2b1607a;hpb=fe95c6dfbeda97ec88ffa5e2fded883ffb609b81;p=libdcp.git diff --git a/src/picture_asset.h b/src/picture_asset.h index f1b14bd6..b404abd2 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 @@ -29,6 +29,12 @@ #include "util.h" #include "metadata.h" +namespace ASDCP { + namespace JP2K { + struct PictureDescriptor; + } +} + namespace libdcp { @@ -36,163 +42,64 @@ class MonoPictureFrame; 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: /** Construct a PictureAsset. - * This class will not write anything to disk in this constructor, but subclasses may. * * @param directory Directory where MXF file is. * @param mxf_name Name of MXF file. */ - PictureAsset (std::string directory, std::string mxf_name); - - /** Construct a PictureAsset. - * This class will not write anything to disk in this constructor, but subclasses may. - * - * @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 size Size of video frame images in pixels. + PictureAsset (boost::filesystem::path directory, boost::filesystem::path mxf_name); + + /** Start a progressive write to this asset. + * The following parameters must be set up (if required) before calling this: + * Interop mode (set_interop) + * Edit rate (set_edit_rate) + * MXF Metadata (set_metadata) + * + * @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. */ - PictureAsset (std::string directory, std::string mxf_name, boost::signals2::signal* progress, int fps, int intrinsic_duration, bool encrypted, Size); + virtual boost::shared_ptr start_write (bool overwrite) = 0; - virtual boost::shared_ptr start_write (bool, MXFMetadata const & metadata = MXFMetadata ()) = 0; + virtual void read () = 0; + virtual void create (std::vector const &) {} + virtual void create (boost::function) {} - bool equals (boost::shared_ptr other, EqualityOptions opt, boost::function note) const; - Size size () const { return _size; } - void write_to_cpl (xmlpp::Node *) const; + void set_size (Size s) { + _size = s; + } + + void write_to_cpl (xmlpp::Element *) const; + +protected: -protected: + std::string asdcp_kind () const { + return "Picture"; + } bool frame_buffer_equals ( 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; + bool descriptor_equals ( + ASDCP::JP2K::PictureDescriptor const & a, ASDCP::JP2K::PictureDescriptor const & b, boost::function + ) const; + /** picture size in pixels */ Size _size; private: std::string key_type () const; - std::string cpl_node_name () const = 0; virtual int edit_rate_factor () const = 0; }; - -/** A 2D (monoscopic) picture asset */ -class MonoPictureAsset : public PictureAsset -{ -public: - /** Construct a MonoPictureAsset, generating the MXF from the JPEG2000 files. - * This may take some time; progress is indicated by emission of the Progress signal. - * - * @param files Pathnames of JPEG2000 files, in frame order. - * @param directory Directory in which to create MXF file. - * @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 size Size of images in pixels. - * @param encrypted true if asset should be encrypted. - */ - MonoPictureAsset ( - std::vector const & files, - std::string directory, - std::string mxf_name, - boost::signals2::signal* progress, - int fps, - int intrinsic_duration, - bool encrypted, - Size size, - MXFMetadata const & metadata = MXFMetadata () - ); - - /** Construct a MonoPictureAsset, generating the MXF from the JPEG2000 files. - * This may take some time; progress is indicated by emission of the Progress signal. - * - * @param get_path Functor which returns a JPEG2000 file path for a given frame (frames counted from 0). - * @param directory Directory in which to create MXF file. - * @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 size Size of images in pixels. - * @param encrypted true if asset should be encrypted. - */ - MonoPictureAsset ( - boost::function get_path, - std::string directory, - std::string mxf_name, - boost::signals2::signal* progress, - int fps, - int intrinsic_duration, - bool encrypted, - Size size, - MXFMetadata const & metadata = MXFMetadata () - ); - - /** Construct a MonoPictureAsset, reading the MXF from disk. - * @param directory Directory that the MXF is in. - * @param mxf_name The filename of the MXF within `directory'. - */ - MonoPictureAsset (std::string directory, std::string mxf_name); - - /** Construct a MonoPictureAsset for progressive writing using - * start_write() and a MonoPictureAssetWriter. - * - * @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. - */ - 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 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 &); - std::string cpl_node_name () const; - int edit_rate_factor () const; -}; - -/** A 3D (stereoscopic) picture asset */ -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, 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; - int edit_rate_factor () const; -}; }