diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/picture_asset.cc | 42 | ||||
| -rw-r--r-- | src/picture_asset.h | 5 |
2 files changed, 41 insertions, 6 deletions
diff --git a/src/picture_asset.cc b/src/picture_asset.cc index d242777c..11815761 100644 --- a/src/picture_asset.cc +++ b/src/picture_asset.cc @@ -207,7 +207,7 @@ MonoPictureAsset::construct (boost::function<string (int)> get_path) fill_writer_info (&writer_info, _uuid); ASDCP::JP2K::MXFWriter mxf_writer; - if (ASDCP_FAILURE (mxf_writer.OpenWrite (path().string().c_str(), writer_info, picture_desc))) { + if (ASDCP_FAILURE (mxf_writer.OpenWrite (path().string().c_str(), writer_info, picture_desc, 16384, false))) { throw MXFFileError ("could not open MXF file for writing", path().string()); } @@ -399,7 +399,14 @@ shared_ptr<MonoPictureAssetWriter> MonoPictureAsset::start_write () { /* XXX: can't we use a shared_ptr here? */ - return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this)); + return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, false)); +} + +shared_ptr<MonoPictureAssetWriter> +MonoPictureAsset::start_overwrite () +{ + /* XXX: can't we use a shared_ptr here? */ + return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, true)); } FrameInfo::FrameInfo (istream& s) @@ -455,8 +462,8 @@ MonoPictureAssetWriter::write (uint8_t* data, int size) _state->picture_descriptor.EditRate = ASDCP::Rational (_asset->edit_rate(), 1); MXFAsset::fill_writer_info (&_state->writer_info, _asset->uuid()); - - if (ASDCP_FAILURE (_state->mxf_writer.OpenWrite (_asset->path().string().c_str(), _state->writer_info, _state->picture_descriptor))) { + + if (ASDCP_FAILURE (_state->mxf_writer.OpenWrite (_asset->path().string().c_str(), _state->writer_info, _state->picture_descriptor, 16384, false))) { throw MXFFileError ("could not open MXF file for writing", _asset->path().string()); } } @@ -468,11 +475,36 @@ MonoPictureAssetWriter::write (uint8_t* data, int size) throw MiscError ("error in writing video MXF"); } - _frames_written++; + ++_frames_written; return FrameInfo (before_offset, _state->mxf_writer.Tell() - before_offset, hash); } void +MonoPictureAssetWriter::fake_write (int size) +{ + assert (!_finalized); + + if (_frames_written == 0) { + /* This is our first frame; set up the writer */ + + _state->j2k_parser.FillPictureDescriptor (_state->picture_descriptor); + _state->picture_descriptor.EditRate = ASDCP::Rational (_asset->edit_rate(), 1); + + MXFAsset::fill_writer_info (&_state->writer_info, _asset->uuid()); + + if (ASDCP_FAILURE (_state->mxf_writer.OpenWrite (_asset->path().string().c_str(), _state->writer_info, _state->picture_descriptor, 16384, true))) { + throw MXFFileError ("could not open MXF file for writing", _asset->path().string()); + } + } + + if (ASDCP_FAILURE (_state->mxf_writer.FakeWriteFrame (size))) { + throw MiscError ("error in writing video MXF"); + } + + ++_frames_written; +} + +void MonoPictureAssetWriter::finalize () { if (ASDCP_FAILURE (_state->mxf_writer.Finalize())) { diff --git a/src/picture_asset.h b/src/picture_asset.h index 4e9e1dd7..9df85bad 100644 --- a/src/picture_asset.h +++ b/src/picture_asset.h @@ -115,12 +115,13 @@ public: ~MonoPictureAssetWriter (); FrameInfo write (uint8_t* data, int size); + void fake_write (int size); void finalize (); private: friend class MonoPictureAsset; - MonoPictureAssetWriter (MonoPictureAsset *); + MonoPictureAssetWriter (MonoPictureAsset *, bool); /* no copy construction */ MonoPictureAssetWriter (MonoPictureAssetWriter const &); @@ -205,6 +206,8 @@ public: /** Start a progressive write to a MonoPictureAsset */ boost::shared_ptr<MonoPictureAssetWriter> start_write (); + boost::shared_ptr<MonoPictureAssetWriter> start_overwrite (); + 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; |
