+
+shared_ptr<MonoPictureAssetWriter>
+MonoPictureAsset::start_write ()
+{
+ /* XXX: can't we use a shared_ptr here? */
+ return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this));
+}
+
+MonoPictureAssetWriter::MonoPictureAssetWriter (MonoPictureAsset* a)
+ : _frame_buffer (4 * Kumu::Megabyte)
+ , _asset (a)
+ , _frames_written (0)
+ , _finalized (false)
+{
+
+}
+
+void
+MonoPictureAssetWriter::write (uint8_t* data, int size)
+{
+ if (ASDCP_FAILURE (_j2k_parser.OpenReadFrame (data, size, _frame_buffer))) {
+ throw MiscError ("could not parse J2K frame");
+ }
+
+ if (_frames_written == 0) {
+ _j2k_parser.FillPictureDescriptor (_picture_descriptor);
+ _picture_descriptor.EditRate = ASDCP::Rational (_asset->frames_per_second(), 1);
+
+ MXFAsset::fill_writer_info (&_writer_info, _asset->uuid());
+
+ if (ASDCP_FAILURE (_mxf_writer.OpenWrite (_asset->path().c_str(), _writer_info, _picture_descriptor))) {
+ throw MXFFileError ("could not open MXF file for writing", _asset->path().string());
+ }
+ }
+
+ if (ASDCP_FAILURE (_mxf_writer.WriteFrame (_frame_buffer, 0, 0))) {
+ throw MiscError ("error in writing video MXF");
+ }
+
+ _frames_written++;
+}
+
+void
+MonoPictureAssetWriter::finalize ()
+{
+ if (ASDCP_FAILURE (_mxf_writer.Finalize())) {
+ throw MiscError ("error in finalizing video MXF");
+ }
+
+ _finalized = true;
+ _asset->set_intrinsic_duration (_frames_written);
+}
+
+MonoPictureAssetWriter::~MonoPictureAssetWriter ()
+{
+ assert (_finalized);
+}