summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-07-22 23:55:20 +0100
committerCarl Hetherington <cth@carlh.net>2013-07-22 23:55:20 +0100
commit58bca31a6e1e20f20bf924af4cd27b54edd39be7 (patch)
tree81c86e4054b2c27d9ff83fdcf041830e8e369b35 /src/lib
parent9b240c6d5d4e2189401498a99f98f41d1b15ed31 (diff)
Various 3D bits.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/audio_buffers.cc2
-rw-r--r--src/lib/dcp_video_frame.h1
-rw-r--r--src/lib/film.cc1
-rw-r--r--src/lib/writer.cc86
-rw-r--r--src/lib/writer.h14
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;
};