diff options
| -rw-r--r-- | src/picture_asset.cc | 24 | ||||
| -rw-r--r-- | src/picture_asset.h | 7 | ||||
| -rw-r--r-- | test/tests.cc | 8 |
3 files changed, 30 insertions, 9 deletions
diff --git a/src/picture_asset.cc b/src/picture_asset.cc index b6120171..d63cdee0 100644 --- a/src/picture_asset.cc +++ b/src/picture_asset.cc @@ -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))) { diff --git a/src/picture_asset.h b/src/picture_asset.h index 2ec17235..d3fabbbd 100644 --- a/src/picture_asset.h +++ b/src/picture_asset.h @@ -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; diff --git a/test/tests.cc b/test/tests.cc index fb0e0430..eb5d0991 100644 --- a/test/tests.cc +++ b/test/tests.cc @@ -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); } |
