Various 3D bits.
authorCarl Hetherington <cth@carlh.net>
Mon, 22 Jul 2013 22:55:20 +0000 (23:55 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 22 Jul 2013 22:55:20 +0000 (23:55 +0100)
src/lib/audio_buffers.cc
src/lib/dcp_video_frame.h
src/lib/film.cc
src/lib/writer.cc
src/lib/writer.h

index d387304142462c6245b70aace709c730deb669ae..7590f02d2ed35c49b247864464104c5bbfde4496 100644 (file)
@@ -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));
index e786d9b610d943560b8cf0ac29cf9587c7fb1c97..96a773a6fb1c71bf041ad3b81356fc3ecc278fc3 100644 (file)
@@ -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
index 40c6962563e29d4856029479fdef3e7cc7bf448c..095fb069cbf4ca4763c25eb11a2bd27948703ead 100644 (file)
@@ -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"));
 
index a456c32fc66b46f847357895b0d6374cefa61276..90e1bd5549f5244fcfae1134fd34c9ef0d17bbd5 100644 (file)
@@ -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 */
index 023107d9756555be0e144b9b363801e670cda33e..db2c042faa3671e8407072afdd77cb891a9e282d 100644 (file)
@@ -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;
 };