diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-07-22 17:26:11 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-07-22 17:26:11 +0100 |
| commit | 64fa6bfcdff322541a6afe7f079890a109cd4f71 (patch) | |
| tree | 4363b51ff9a0688c38a32bb43c5da4112ecb326b /src | |
| parent | bfbd64d680a0cbe9867b23088023ae5f9ecc219b (diff) | |
Various more 3D fixes.
Diffstat (limited to 'src')
| -rw-r--r-- | src/picture_asset_writer.cc | 61 | ||||
| -rw-r--r-- | src/picture_asset_writer.h | 12 |
2 files changed, 44 insertions, 29 deletions
diff --git a/src/picture_asset_writer.cc b/src/picture_asset_writer.cc index 748de2db..18e509d6 100644 --- a/src/picture_asset_writer.cc +++ b/src/picture_asset_writer.cc @@ -71,7 +71,7 @@ struct StereoPictureAssetWriter::ASDCPState {} ASDCP::JP2K::CodestreamParser j2k_parser; - ASDCP::JP2K::SFrameBuffer frame_buffer; + ASDCP::JP2K::FrameBuffer frame_buffer; ASDCP::JP2K::MXFSWriter mxf_writer; ASDCP::WriterInfo writer_info; ASDCP::JP2K::PictureDescriptor picture_descriptor; @@ -97,7 +97,7 @@ StereoPictureAssetWriter::StereoPictureAssetWriter (StereoPictureAsset* asset, b } template <class P, class Q> -void start (PictureAssetWriter* writer, shared_ptr<P> state, Q* asset, uint8_t* data, int size) +void libdcp::start (PictureAssetWriter* writer, shared_ptr<P> state, Q* asset, uint8_t* data, int size) { if (ASDCP_FAILURE (state->j2k_parser.OpenReadFrame (data, size, state->frame_buffer))) { boost::throw_exception (MiscError ("could not parse J2K frame")); @@ -125,49 +125,66 @@ void start (PictureAssetWriter* writer, shared_ptr<P> state, Q* asset, uint8_t* void MonoPictureAssetWriter::start (uint8_t* data, int size) { - ::start (this, _state, _asset, data, size); + libdcp::start (this, _state, _asset, data, size); } void StereoPictureAssetWriter::start (uint8_t* data, int size) { - ::start (this, _state, _asset, data, size); + libdcp::start (this, _state, _asset, data, size); } -template <class P, class Q> -FrameInfo write (PictureAssetWriter* writer, shared_ptr<P> state, Q* asset, uint8_t* data, int size) +FrameInfo +MonoPictureAssetWriter::write (uint8_t* data, int size) { - assert (!writer->_finalized); + assert (!_finalized); - if (!writer->_started) { - writer->start (data, size); + if (!_started) { + start (data, size); } - if (ASDCP_FAILURE (state->j2k_parser.OpenReadFrame (data, size, state->frame_buffer))) { + if (ASDCP_FAILURE (_state->j2k_parser.OpenReadFrame (data, size, _state->frame_buffer))) { boost::throw_exception (MiscError ("could not parse J2K frame")); } - uint64_t const before_offset = state->mxf_writer.Tell (); + uint64_t const before_offset = _state->mxf_writer.Tell (); string hash; - if (ASDCP_FAILURE (state->mxf_writer.WriteFrame (state->frame_buffer, 0, 0, &hash))) { - boost::throw_exception (MXFFileError ("error in writing video MXF", asset->path().string())); + if (ASDCP_FAILURE (_state->mxf_writer.WriteFrame (_state->frame_buffer, 0, 0, &hash))) { + boost::throw_exception (MXFFileError ("error in writing video MXF", _asset->path().string())); } - ++asset->_frames_written; - return FrameInfo (before_offset, state->mxf_writer.Tell() - before_offset, hash); + ++_frames_written; + return FrameInfo (before_offset, _state->mxf_writer.Tell() - before_offset, hash); } FrameInfo -MonoPictureAssetWriter::write (uint8_t* data, int size) +StereoPictureAssetWriter::write (uint8_t* data, int size, Eye eye) { - return ::write (this, _state, _asset, data, size); -} + assert (!_finalized); -FrameInfo -StereoPictureAssetWriter::write (uint8_t* data, int size) -{ - return ::write (this, _state, _asset, data, size); + if (!_started) { + start (data, size); + } + + if (ASDCP_FAILURE (_state->j2k_parser.OpenReadFrame (data, size, _state->frame_buffer))) { + boost::throw_exception (MiscError ("could not parse J2K frame")); + } + + uint64_t const before_offset = _state->mxf_writer.Tell (); + + string hash; + if (ASDCP_FAILURE (_state->mxf_writer.WriteFrame ( + _state->frame_buffer, + (eye == EYE_LEFT) ? ASDCP::JP2K::SP_LEFT : ASDCP::JP2K::SP_RIGHT, + 0, 0, &hash) + )) { + + boost::throw_exception (MXFFileError ("error in writing video MXF", _asset->path().string())); + } + + ++_frames_written; + return FrameInfo (before_offset, _state->mxf_writer.Tell() - before_offset, hash); } void diff --git a/src/picture_asset_writer.h b/src/picture_asset_writer.h index 5c2b0fef..951633bf 100644 --- a/src/picture_asset_writer.h +++ b/src/picture_asset_writer.h @@ -23,6 +23,7 @@ #include <boost/shared_ptr.hpp> #include <boost/utility.hpp> #include "metadata.h" +#include "types.h" namespace libdcp { @@ -49,14 +50,11 @@ struct FrameInfo class PictureAssetWriter : public boost::noncopyable { public: - virtual FrameInfo write (uint8_t *, int) = 0; - virtual void fake_write (int) = 0; - virtual void finalize () = 0; - protected: + template <class P, class Q> + friend void start (PictureAssetWriter *, boost::shared_ptr<P>, Q *, uint8_t *, int); PictureAssetWriter (bool, MXFMetadata const &); - virtual void start (uint8_t *, int) = 0; /** Number of picture frames written to the asset so far */ int _frames_written; @@ -80,7 +78,7 @@ protected: class MonoPictureAssetWriter : public PictureAssetWriter { public: - FrameInfo write (uint8_t* data, int size); + FrameInfo write (uint8_t *, int); void fake_write (int size); void finalize (); @@ -103,7 +101,7 @@ private: class StereoPictureAssetWriter : public PictureAssetWriter { public: - FrameInfo write (uint8_t* data, int size); + FrameInfo write (uint8_t *, int, Eye); void fake_write (int size); void finalize (); |
