Tweak API a little.
authorCarl Hetherington <cth@carlh.net>
Sat, 2 Feb 2013 12:47:49 +0000 (12:47 +0000)
committerCarl Hetherington <cth@carlh.net>
Sat, 2 Feb 2013 12:47:49 +0000 (12:47 +0000)
src/picture_asset.cc
src/picture_asset.h
test/tests.cc

index b6120171b76cd2d33e8ff10d7d6b01cc55dc6c47..d63cdee0fd4ff8562ae7dad13923eb531cd9bdcf 100644 (file)
@@ -397,10 +397,10 @@ StereoPictureAsset::get_frame (int n) const
 }
 
 shared_ptr<MonoPictureAssetWriter>
-MonoPictureAsset::start_write (uint8_t* data, int size, bool overwrite)
+MonoPictureAsset::start_write (bool overwrite)
 {
        /* XXX: can't we use a shared_ptr here? */
-       return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, data, size, overwrite));
+       return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, overwrite));
 }
 
 FrameInfo::FrameInfo (istream& s)
@@ -431,11 +431,20 @@ struct MonoPictureAssetWriter::ASDCPState
 /** @param a Asset to write to.  `a' must not be deleted while
  *  this writer class still exists, or bad things will happen.
  */
-MonoPictureAssetWriter::MonoPictureAssetWriter (MonoPictureAsset* a, uint8_t* data, int size, bool overwrite)
+MonoPictureAssetWriter::MonoPictureAssetWriter (MonoPictureAsset* a, bool overwrite)
        : _state (new MonoPictureAssetWriter::ASDCPState)
        , _asset (a)
        , _frames_written (0)
+       , _started (false)
        , _finalized (false)
+       , _overwrite (overwrite)
+{
+
+}
+
+
+void
+MonoPictureAssetWriter::start (uint8_t* data, int size)
 {
        if (ASDCP_FAILURE (_state->j2k_parser.OpenReadFrame (data, size, _state->frame_buffer))) {
                throw MiscError ("could not parse J2K frame");
@@ -451,11 +460,13 @@ MonoPictureAssetWriter::MonoPictureAssetWriter (MonoPictureAsset* a, uint8_t* da
                                   _state->writer_info,
                                   _state->picture_descriptor,
                                   16384,
-                                  overwrite)
+                                  _overwrite)
                    )) {
                
                throw MXFFileError ("could not open MXF file for writing", _asset->path().string());
        }
+
+       _started = true;
 }
 
 FrameInfo
@@ -463,6 +474,10 @@ MonoPictureAssetWriter::write (uint8_t* data, int size)
 {
        assert (!_finalized);
 
+       if (!_started) {
+               start (data, size);
+       }
+
        if (ASDCP_FAILURE (_state->j2k_parser.OpenReadFrame (data, size, _state->frame_buffer))) {
                throw MiscError ("could not parse J2K frame");
        }
@@ -481,6 +496,7 @@ MonoPictureAssetWriter::write (uint8_t* data, int size)
 void
 MonoPictureAssetWriter::fake_write (int size)
 {
+       assert (_started);
        assert (!_finalized);
 
        if (ASDCP_FAILURE (_state->mxf_writer.FakeWriteFrame (size))) {
index 2ec172358fd9358ece4052af9deb5ad83fe18a71..d3fabbbd902c7cd2f76b094a2ce9d47de45aaabe 100644 (file)
@@ -121,7 +121,8 @@ public:
 private:
        friend class MonoPictureAsset;
 
-       MonoPictureAssetWriter (MonoPictureAsset *, uint8_t *, int, bool);
+       MonoPictureAssetWriter (MonoPictureAsset *, bool);
+       void start (uint8_t *, int);
 
        /* no copy construction */
        MonoPictureAssetWriter (MonoPictureAssetWriter const &);
@@ -137,8 +138,10 @@ private:
        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;
 };
 
 /** A 2D (monoscopic) picture asset */
@@ -204,7 +207,7 @@ public:
        MonoPictureAsset (std::string directory, std::string mxf_name, int fps, Size size);
 
        /** Start a progressive write to a MonoPictureAsset */
-       boost::shared_ptr<MonoPictureAssetWriter> start_write (uint8_t *, int, bool);
+       boost::shared_ptr<MonoPictureAssetWriter> start_write (bool);
 
        boost::shared_ptr<const MonoPictureFrame> get_frame (int n) const;
        bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, std::list<std::string>& notes) const;
index fb0e0430cc71774399988941c3a3e7f1fed691b0..eb5d099199523e997af6d5197177c150fce16c50 100644 (file)
@@ -599,7 +599,7 @@ BOOST_AUTO_TEST_CASE (recovery)
        boost::filesystem::remove_all ("build/test/baz");
        boost::filesystem::create_directories ("build/test/baz");
        shared_ptr<libdcp::MonoPictureAsset> mp (new libdcp::MonoPictureAsset ("build/test/baz", "video1.mxf", 24, libdcp::Size (32, 32)));
-       shared_ptr<libdcp::MonoPictureAssetWriter> writer = mp->start_write (data, size, false);
+       shared_ptr<libdcp::MonoPictureAssetWriter> writer = mp->start_write (false);
 
        int written_size = 0;
        for (int i = 0; i < 24; ++i) {
@@ -625,9 +625,11 @@ BOOST_AUTO_TEST_CASE (recovery)
        Kumu::ResetTestRNG ();
 
        mp.reset (new libdcp::MonoPictureAsset ("build/test/baz", "video2.mxf", 24, libdcp::Size (32, 32)));
-       writer = mp->start_write (data, size, true);
+       writer = mp->start_write (true);
 
-       for (int i = 0; i < 4; ++i) {
+       writer->write (data, size);
+
+       for (int i = 1; i < 4; ++i) {
                writer->fake_write (written_size);
        }