summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/picture_asset.cc24
-rw-r--r--src/picture_asset.h7
-rw-r--r--test/tests.cc8
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);
}