X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fstereo_picture_asset_writer.cc;h=322c7b00c67ea3de45f2a645dc5141854eb3d906;hb=273fd9a4f1b43ae0de0071e5efd3b6347b166ff1;hp=b4b0ad524e607a6650440e324bde20c3484bd908;hpb=054cc86d5ba734c72780b07a772a55e3a7000a4f;p=libdcp.git diff --git a/src/stereo_picture_asset_writer.cc b/src/stereo_picture_asset_writer.cc index b4b0ad52..322c7b00 100644 --- a/src/stereo_picture_asset_writer.cc +++ b/src/stereo_picture_asset_writer.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2013 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,11 +17,12 @@ */ -#include "AS_DCP.h" -#include "KM_fileio.h" #include "stereo_picture_asset_writer.h" #include "exceptions.h" +#include "dcp_assert.h" #include "picture_asset.h" +#include "AS_DCP.h" +#include "KM_fileio.h" #include "picture_asset_writer_common.cc" @@ -29,25 +30,26 @@ using std::istream; using std::ostream; using std::string; using boost::shared_ptr; -using namespace libdcp; +using namespace dcp; struct StereoPictureAssetWriter::ASDCPState : public ASDCPStateBase { ASDCP::JP2K::MXFSWriter mxf_writer; }; -StereoPictureAssetWriter::StereoPictureAssetWriter (PictureAsset* asset, bool overwrite) - : PictureAssetWriter (asset, overwrite) +StereoPictureAssetWriter::StereoPictureAssetWriter (PictureAsset* mxf, boost::filesystem::path file, Standard standard, bool overwrite) + : PictureAssetWriter (mxf, file, standard, overwrite) , _state (new StereoPictureAssetWriter::ASDCPState) , _next_eye (EYE_LEFT) { - _state->encryption_context = asset->encryption_context (); + } void StereoPictureAssetWriter::start (uint8_t* data, int size) { - libdcp::start (this, _state, _asset, data, size); + dcp::start (this, _state, _standard, _picture_asset, data, size); + _picture_asset->set_frame_rate (Fraction (_picture_asset->edit_rate().numerator * 2, _picture_asset->edit_rate().denominator)); } /** Write a frame for one eye. Frames must be written left, then right, then left etc. @@ -57,7 +59,7 @@ StereoPictureAssetWriter::start (uint8_t* data, int size) FrameInfo StereoPictureAssetWriter::write (uint8_t* data, int size) { - assert (!_finalized); + DCP_ASSERT (!_finalized); if (!_started) { start (data, size); @@ -73,47 +75,51 @@ StereoPictureAssetWriter::write (uint8_t* data, int size) Kumu::Result_t r = _state->mxf_writer.WriteFrame ( _state->frame_buffer, _next_eye == EYE_LEFT ? ASDCP::JP2K::SP_LEFT : ASDCP::JP2K::SP_RIGHT, - _state->encryption_context, + _encryption_context, 0, &hash ); if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("error in writing video MXF", _asset->path().string(), r)); + boost::throw_exception (MXFFileError ("error in writing video MXF", _file.string(), r)); } _next_eye = _next_eye == EYE_LEFT ? EYE_RIGHT : EYE_LEFT; - ++_frames_written; + if (_next_eye == EYE_LEFT) { + ++_frames_written; + } + return FrameInfo (before_offset, _state->mxf_writer.Tell() - before_offset, hash); } void StereoPictureAssetWriter::fake_write (int size) { - assert (_started); - assert (!_finalized); + DCP_ASSERT (_started); + DCP_ASSERT (!_finalized); Kumu::Result_t r = _state->mxf_writer.FakeWriteFrame (size, _next_eye == EYE_LEFT ? ASDCP::JP2K::SP_LEFT : ASDCP::JP2K::SP_RIGHT); if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("error in writing video MXF", _asset->path().string(), r)); + boost::throw_exception (MXFFileError ("error in writing video MXF", _file.string(), r)); } _next_eye = _next_eye == EYE_LEFT ? EYE_RIGHT : EYE_LEFT; - ++_frames_written; + if (_next_eye == EYE_LEFT) { + ++_frames_written; + } } -void +bool StereoPictureAssetWriter::finalize () { - assert (!_finalized); - - Kumu::Result_t r = _state->mxf_writer.Finalize(); - if (ASDCP_FAILURE (r)) { - boost::throw_exception (MXFFileError ("error in finalizing video MXF", _asset->path().string(), r)); + if (_started) { + Kumu::Result_t r = _state->mxf_writer.Finalize(); + if (ASDCP_FAILURE (r)) { + boost::throw_exception (MXFFileError ("error in finalizing video MXF", _file.string(), r)); + } } - _finalized = true; - _asset->set_intrinsic_duration (_frames_written / 2); - _asset->set_duration (_frames_written / 2); + _picture_asset->_intrinsic_duration = _frames_written; + return PictureAssetWriter::finalize (); }