diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-07-22 23:55:20 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-07-22 23:55:20 +0100 |
| commit | 58bca31a6e1e20f20bf924af4cd27b54edd39be7 (patch) | |
| tree | 81c86e4054b2c27d9ff83fdcf041830e8e369b35 /src/lib | |
| parent | 9b240c6d5d4e2189401498a99f98f41d1b15ed31 (diff) | |
Various 3D bits.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/audio_buffers.cc | 2 | ||||
| -rw-r--r-- | src/lib/dcp_video_frame.h | 1 | ||||
| -rw-r--r-- | src/lib/film.cc | 1 | ||||
| -rw-r--r-- | src/lib/writer.cc | 86 | ||||
| -rw-r--r-- | src/lib/writer.h | 14 |
5 files changed, 83 insertions, 21 deletions
diff --git a/src/lib/audio_buffers.cc b/src/lib/audio_buffers.cc index d38730414..7590f02d2 100644 --- a/src/lib/audio_buffers.cc +++ b/src/lib/audio_buffers.cc @@ -197,7 +197,7 @@ AudioBuffers::move (int from, int to, int frames) assert (frames > 0); assert (frames <= _frames); assert ((from + frames) <= _frames); - assert ((to + frames) <= _frames); + assert ((to + frames) <= _allocated_frames); for (int i = 0; i < _channels; ++i) { memmove (_data[i] + to, _data[i] + from, frames * sizeof(float)); diff --git a/src/lib/dcp_video_frame.h b/src/lib/dcp_video_frame.h index e786d9b61..96a773a6f 100644 --- a/src/lib/dcp_video_frame.h +++ b/src/lib/dcp_video_frame.h @@ -20,6 +20,7 @@ #include <openjpeg.h> #include <libdcp/picture_asset.h> +#include <libdcp/picture_asset_writer.h> #include "util.h" /** @file src/dcp_video_frame.h diff --git a/src/lib/film.cc b/src/lib/film.cc index 40c696256..095fb069c 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -380,6 +380,7 @@ Film::read_metadata () _dci_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate")); _dcp_audio_channels = f.number_child<int> ("DCPAudioChannels"); _sequence_video = f.bool_child ("SequenceVideo"); + _dcp_3d = f.bool_child ("DCP3D"); _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist")); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index a456c32fc..90e1bd554 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -71,17 +71,37 @@ Writer::Writer (shared_ptr<const Film> f, shared_ptr<Job> j) film's parameters which affect the video output. We will hard-link it into the DCP later. */ - - _picture_asset.reset ( - new libdcp::MonoPictureAsset ( - _film->internal_video_mxf_dir (), - _film->internal_video_mxf_filename (), - _film->dcp_video_frame_rate (), - _film->container()->size (_film->full_frame ()) - ) - ); - _picture_asset_writer = _picture_asset->start_write (_first_nonexistant_frame > 0); + if (f->dcp_3d ()) { + _stereo_picture_asset.reset ( + new libdcp::StereoPictureAsset ( + _film->internal_video_mxf_dir (), + _film->internal_video_mxf_filename (), + _film->dcp_video_frame_rate (), + _film->container()->size (_film->full_frame ()) + ) + ); + + _stereo_picture_asset_writer = _stereo_picture_asset->start_write (_first_nonexistant_frame > 0); + + _picture_asset = _stereo_picture_asset; + _picture_asset_writer = _stereo_picture_asset_writer; + + } else { + _mono_picture_asset.reset ( + new libdcp::MonoPictureAsset ( + _film->internal_video_mxf_dir (), + _film->internal_video_mxf_filename (), + _film->dcp_video_frame_rate (), + _film->container()->size (_film->full_frame ()) + ) + ); + + _mono_picture_asset_writer = _mono_picture_asset->start_write (_first_nonexistant_frame > 0); + + _picture_asset = _mono_picture_asset; + _picture_asset_writer = _mono_picture_asset_writer; + } _sound_asset.reset ( new libdcp::SoundAsset ( @@ -197,23 +217,55 @@ try if (!qi.encoded) { qi.encoded.reset (new EncodedData (_film->j2c_path (qi.frame, qi.eyes, false))); } - libdcp::FrameInfo const fin = _picture_asset_writer->write (qi.encoded->data(), qi.encoded->size(), qi.eyes); - qi.encoded->write_info (_film, qi.frame, qi.eyes, fin); - _last_written = qi.encoded; + + if (_mono_picture_asset_writer) { + libdcp::FrameInfo fin = _mono_picture_asset_writer->write (qi.encoded->data(), qi.encoded->size()); + qi.encoded->write_info (_film, qi.frame, qi.eyes, fin); + } else { + libdcp::FrameInfo fin = _stereo_picture_asset_writer->write ( + qi.encoded->data(), + qi.encoded->size(), + qi.eyes == EYES_LEFT ? libdcp::EYE_LEFT : libdcp::EYE_RIGHT + ); + qi.encoded->write_info (_film, qi.frame, qi.eyes, fin); + } + _last_written[qi.eyes] = qi.encoded; ++_full_written; break; } case QueueItem::FAKE: _film->log()->log (String::compose (N_("Writer FAKE-writes %1 to MXF"), qi.frame)); _picture_asset_writer->fake_write (qi.size); - _last_written.reset (); + _last_written[qi.eyes].reset (); ++_fake_written; break; case QueueItem::REPEAT: { _film->log()->log (String::compose (N_("Writer REPEAT-writes %1 to MXF"), qi.frame)); - libdcp::FrameInfo const fin = _picture_asset_writer->write (_last_written->data(), _last_written->size(), qi.eyes); - _last_written->write_info (_film, qi.frame, qi.eyes, fin); + if (_mono_picture_asset_writer) { + + libdcp::FrameInfo fin = _mono_picture_asset_writer->write ( + _last_written[EYES_BOTH]->data(), + _last_written[EYES_BOTH]->size() + ); + + _last_written[EYES_BOTH]->write_info (_film, qi.frame, qi.eyes, fin); + + } else { + + libdcp::FrameInfo fin = _stereo_picture_asset_writer->write ( + _last_written[EYES_LEFT]->data(), _last_written[EYES_LEFT]->size(), libdcp::EYE_LEFT + ); + + _last_written[EYES_LEFT]->write_info (_film, qi.frame, qi.eyes, fin); + + fin = _stereo_picture_asset_writer->write ( + _last_written[EYES_RIGHT]->data(), _last_written[EYES_RIGHT]->size(), libdcp::EYE_RIGHT + ); + + _last_written[EYES_RIGHT]->write_info (_film, qi.frame, qi.eyes, fin); + } + ++_repeat_written; break; } @@ -283,7 +335,7 @@ Writer::finish () _sound_asset_writer->finalize (); int const frames = _last_written_frame + 1; - + _picture_asset->set_duration (frames); /* Hard-link the video MXF into the DCP */ diff --git a/src/lib/writer.h b/src/lib/writer.h index 023107d97..db2c042fa 100644 --- a/src/lib/writer.h +++ b/src/lib/writer.h @@ -32,6 +32,10 @@ class Job; namespace libdcp { class MonoPictureAsset; class MonoPictureAssetWriter; + class StereoPictureAsset; + class StereoPictureAssetWriter; + class PictureAsset; + class PictureAssetWriter; class SoundAsset; class SoundAssetWriter; } @@ -102,7 +106,7 @@ private: /** condition to manage thread wakeups */ boost::condition _condition; /** the data of the last written frame, or 0 if there isn't one */ - boost::shared_ptr<const EncodedData> _last_written; + boost::shared_ptr<const EncodedData> _last_written[EYES_COUNT]; /** the index of the last written frame */ int _last_written_frame; Eyes _last_written_eyes; @@ -122,8 +126,12 @@ private: */ int _pushed_to_disk; - boost::shared_ptr<libdcp::MonoPictureAsset> _picture_asset; - boost::shared_ptr<libdcp::MonoPictureAssetWriter> _picture_asset_writer; + boost::shared_ptr<libdcp::PictureAsset> _picture_asset; + boost::shared_ptr<libdcp::PictureAssetWriter> _picture_asset_writer; + boost::shared_ptr<libdcp::MonoPictureAsset> _mono_picture_asset; + boost::shared_ptr<libdcp::MonoPictureAssetWriter> _mono_picture_asset_writer; + boost::shared_ptr<libdcp::StereoPictureAsset> _stereo_picture_asset; + boost::shared_ptr<libdcp::StereoPictureAssetWriter> _stereo_picture_asset_writer; boost::shared_ptr<libdcp::SoundAsset> _sound_asset; boost::shared_ptr<libdcp::SoundAssetWriter> _sound_asset_writer; }; |
