}
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)
/** @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");
_state->writer_info,
_state->picture_descriptor,
16384,
- overwrite)
+ _overwrite)
)) {
throw MXFFileError ("could not open MXF file for writing", _asset->path().string());
}
+
+ _started = true;
}
FrameInfo
{
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");
}
void
MonoPictureAssetWriter::fake_write (int size)
{
+ assert (_started);
assert (!_finalized);
if (ASDCP_FAILURE (_state->mxf_writer.FakeWriteFrame (size))) {
private:
friend class MonoPictureAsset;
- MonoPictureAssetWriter (MonoPictureAsset *, uint8_t *, int, bool);
+ MonoPictureAssetWriter (MonoPictureAsset *, bool);
+ void start (uint8_t *, int);
/* no copy construction */
MonoPictureAssetWriter (MonoPictureAssetWriter const &);
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 */
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;
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) {
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);
}