Allow incremental writing of picture MXFs.
[libdcp.git] / src / picture_asset.h
index d2c6f656a546662a5c3b2bd26eea4ab8c492c46c..059e5926b8788c4964e1a89db900655229053165 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <openjpeg.h>
+#include "AS_DCP.h"
 #include "mxf_asset.h"
 #include "util.h"
 
@@ -35,7 +36,7 @@ class StereoPictureFrame;
 class PictureAsset : public MXFAsset
 {
 public:
-       PictureAsset (std::string directory, std::string mxf_name, boost::signals2::signal<void (float)>* progress, int fps, int intrinsic_duration);
+       PictureAsset (std::string directory, std::string mxf_name, boost::signals2::signal<void (float)>* progress, int fps, int intrinsic_duration, Size size);
        
        /** Write details of this asset to a CPL stream.
         *  @param s Stream.
@@ -59,6 +60,31 @@ protected:
        Size _size;
 };
 
+class MonoPictureAsset;
+
+class MonoPictureAssetWriter
+{
+public:
+       ~MonoPictureAssetWriter ();
+
+       void write (uint8_t* data, int size);
+       void finalize ();
+
+private:
+       friend class MonoPictureAsset;
+       
+       MonoPictureAssetWriter (MonoPictureAsset *);
+
+       ASDCP::JP2K::CodestreamParser _j2k_parser;
+       ASDCP::JP2K::FrameBuffer _frame_buffer;
+       ASDCP::JP2K::MXFWriter _mxf_writer;
+       ASDCP::WriterInfo _writer_info;
+       ASDCP::JP2K::PictureDescriptor _picture_descriptor;
+       MonoPictureAsset* _asset;
+       int _frames_written;
+       bool _finalized;
+};
+
 /** A 2D (monoscopic) picture asset */
 class MonoPictureAsset : public PictureAsset
 {
@@ -103,6 +129,15 @@ public:
                Size size
                );
 
+       MonoPictureAsset (
+               std::string directory,
+               std::string mxf_name,
+               int fps,
+               Size size
+               );
+
+       boost::shared_ptr<MonoPictureAssetWriter> start_write ();
+
        MonoPictureAsset (std::string directory, std::string mxf_name, int fps, int intrinsic_duration);
        
        boost::shared_ptr<const MonoPictureFrame> get_frame (int n) const;