diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-06-01 23:58:47 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-06-01 23:58:47 +0100 |
| commit | 368832f2ff6837d9029020b41fb97fb148c3be31 (patch) | |
| tree | 7653ce59c8e5de15d746897efa7640f33a70a32f /src/lib | |
| parent | 2da8a38e3cc9bebfe324a682d8e4da2e8856676a (diff) | |
Use new libdcp reader interface.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/dcp_decoder.cc | 55 | ||||
| -rw-r--r-- | src/lib/dcp_decoder.h | 13 | ||||
| -rw-r--r-- | src/lib/dcp_examiner.cc | 6 | ||||
| -rw-r--r-- | src/lib/video_mxf_decoder.cc | 38 | ||||
| -rw-r--r-- | src/lib/video_mxf_decoder.h | 9 |
5 files changed, 95 insertions, 26 deletions
diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 18cbda84c..e7e88d319 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -32,13 +32,16 @@ #include <dcp/cpl.h> #include <dcp/reel.h> #include <dcp/mono_picture_asset.h> +#include <dcp/mono_picture_asset_reader.h> #include <dcp/stereo_picture_asset.h> +#include <dcp/stereo_picture_asset_reader.h> #include <dcp/reel_picture_asset.h> #include <dcp/reel_sound_asset.h> #include <dcp/reel_subtitle_asset.h> #include <dcp/mono_picture_frame.h> #include <dcp/stereo_picture_frame.h> #include <dcp/sound_frame.h> +#include <dcp/sound_asset_reader.h> #include <boost/foreach.hpp> #include <iostream> @@ -72,6 +75,7 @@ DCPDecoder::DCPDecoder (shared_ptr<const DCPContent> c, shared_ptr<Log> log, boo _reel = _reels.begin (); _offset = 0; + get_readers (); } bool @@ -86,29 +90,27 @@ DCPDecoder::pass (PassReason reason, bool) /* Frame within the (played part of the) reel that is coming up next */ int64_t const frame = _next.frames_round (vfr); - if ((*_reel)->main_picture () && reason != PASS_REASON_SUBTITLE) { + if ((_mono_reader || _stereo_reader) && reason != PASS_REASON_SUBTITLE) { shared_ptr<dcp::PictureAsset> asset = (*_reel)->main_picture()->asset (); - shared_ptr<dcp::MonoPictureAsset> mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset); - shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset); int64_t const entry_point = (*_reel)->main_picture()->entry_point (); - if (mono) { - video->give (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame (entry_point + frame), asset->size())), _offset + frame); + if (_mono_reader) { + video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_mono_reader->get_frame (entry_point + frame), asset->size())), _offset + frame); } else { video->give ( - shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)), + shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)), _offset + frame ); video->give ( - shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)), + shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)), _offset + frame ); } } - if ((*_reel)->main_sound () && reason != PASS_REASON_SUBTITLE) { + if (_sound_reader && reason != PASS_REASON_SUBTITLE) { int64_t const entry_point = (*_reel)->main_sound()->entry_point (); - shared_ptr<const dcp::SoundFrame> sf = (*_reel)->main_sound()->asset()->get_frame (entry_point + frame); + shared_ptr<const dcp::SoundFrame> sf = _sound_reader->get_frame (entry_point + frame); uint8_t const * from = sf->data (); int const channels = _dcp_content->audio->stream()->channels (); @@ -161,6 +163,41 @@ DCPDecoder::next_reel () { _offset += (*_reel)->main_picture()->duration(); ++_reel; + get_readers (); +} + +void +DCPDecoder::get_readers () +{ + if (_reel == _reels.end()) { + _mono_reader.reset (); + _stereo_reader.reset (); + _sound_reader.reset (); + return; + } + + if ((*_reel)->main_picture()) { + shared_ptr<dcp::PictureAsset> asset = (*_reel)->main_picture()->asset (); + shared_ptr<dcp::MonoPictureAsset> mono = dynamic_pointer_cast<dcp::MonoPictureAsset> (asset); + shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset); + DCPOMATIC_ASSERT (mono || stereo); + if (mono) { + _mono_reader = mono->start_read (); + _stereo_reader.reset (); + } else { + _stereo_reader = stereo->start_read (); + _mono_reader.reset (); + } + } else { + _mono_reader.reset (); + _stereo_reader.reset (); + } + + if ((*_reel)->main_sound()) { + _sound_reader = (*_reel)->main_sound()->asset()->start_read (); + } else { + _sound_reader.reset (); + } } void diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h index b7141f916..7ad6fcbf7 100644 --- a/src/lib/dcp_decoder.h +++ b/src/lib/dcp_decoder.h @@ -26,6 +26,9 @@ namespace dcp { class Reel; + class MonoPictureAssetReader; + class StereoPictureAssetReader; + class SoundAssetReader; } class DCPContent; @@ -47,15 +50,23 @@ private: bool pass (PassReason, bool accurate); void seek (ContentTime t, bool accurate); void next_reel (); + void get_readers (); std::list<ContentTimePeriod> image_subtitles_during (ContentTimePeriod, bool starting) const; std::list<ContentTimePeriod> text_subtitles_during (ContentTimePeriod, bool starting) const; + boost::shared_ptr<const DCPContent> _dcp_content; /** Time of next thing to return from pass relative to the start of _reel */ ContentTime _next; std::list<boost::shared_ptr<dcp::Reel> > _reels; + std::list<boost::shared_ptr<dcp::Reel> >::iterator _reel; /** Offset of _reel from the start of the content in frames */ int64_t _offset; - boost::shared_ptr<const DCPContent> _dcp_content; + /** Reader for current mono picture asset, if applicable */ + boost::shared_ptr<dcp::MonoPictureAssetReader> _mono_reader; + /** Reader for current stereo picture asset, if applicable */ + boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader; + /** Reader for current sound asset, if applicable */ + boost::shared_ptr<dcp::SoundAssetReader> _sound_reader; }; diff --git a/src/lib/dcp_examiner.cc b/src/lib/dcp_examiner.cc index 92f0d15c8..fa05f6e64 100644 --- a/src/lib/dcp_examiner.cc +++ b/src/lib/dcp_examiner.cc @@ -30,8 +30,10 @@ #include <dcp/reel_picture_asset.h> #include <dcp/reel_sound_asset.h> #include <dcp/mono_picture_asset.h> +#include <dcp/mono_picture_asset_reader.h> #include <dcp/mono_picture_frame.h> #include <dcp/stereo_picture_asset.h> +#include <dcp/stereo_picture_asset_reader.h> #include <dcp/stereo_picture_frame.h> #include <dcp/sound_asset.h> #include <iostream> @@ -122,9 +124,9 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content) shared_ptr<dcp::StereoPictureAsset> stereo = dynamic_pointer_cast<dcp::StereoPictureAsset> (asset); if (mono) { - mono->get_frame(0)->xyz_image (); + mono->start_read()->get_frame(0)->xyz_image (); } else { - stereo->get_frame(0)->xyz_image (dcp::EYE_LEFT); + stereo->start_read()->get_frame(0)->xyz_image (dcp::EYE_LEFT); } } diff --git a/src/lib/video_mxf_decoder.cc b/src/lib/video_mxf_decoder.cc index 70c884699..938d7deaf 100644 --- a/src/lib/video_mxf_decoder.cc +++ b/src/lib/video_mxf_decoder.cc @@ -23,7 +23,9 @@ #include "video_mxf_content.h" #include "j2k_image_proxy.h" #include <dcp/mono_picture_asset.h> +#include <dcp/mono_picture_asset_reader.h> #include <dcp/stereo_picture_asset.h> +#include <dcp/stereo_picture_asset_reader.h> #include <dcp/exceptions.h> using boost::shared_ptr; @@ -32,17 +34,6 @@ VideoMXFDecoder::VideoMXFDecoder (shared_ptr<const VideoMXFContent> content, sha : _content (content) { video.reset (new VideoDecoder (this, content, log)); -} - -bool -VideoMXFDecoder::pass (PassReason, bool) -{ - double const vfr = _content->active_video_frame_rate (); - int64_t const frame = _next.frames_round (vfr); - - if (frame >= _content->video->length()) { - return true; - } shared_ptr<dcp::MonoPictureAsset> mono; try { @@ -67,10 +58,29 @@ VideoMXFDecoder::pass (PassReason, bool) } if (mono) { - video->give (shared_ptr<ImageProxy> (new J2KImageProxy (mono->get_frame(frame), mono->size())), frame); + _mono_reader = mono->start_read (); + _size = mono->size (); + } else { + _stereo_reader = stereo->start_read (); + _size = stereo->size (); + } +} + +bool +VideoMXFDecoder::pass (PassReason, bool) +{ + double const vfr = _content->active_video_frame_rate (); + int64_t const frame = _next.frames_round (vfr); + + if (frame >= _content->video->length()) { + return true; + } + + if (_mono_reader) { + video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_mono_reader->get_frame(frame), _size)), frame); } else { - video->give (shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_LEFT)), frame); - video->give (shared_ptr<ImageProxy> (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_RIGHT)), frame); + video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame(frame), _size, dcp::EYE_LEFT)), frame); + video->give (shared_ptr<ImageProxy> (new J2KImageProxy (_stereo_reader->get_frame(frame), _size, dcp::EYE_RIGHT)), frame); } _next += ContentTime::from_frames (1, vfr); diff --git a/src/lib/video_mxf_decoder.h b/src/lib/video_mxf_decoder.h index 0432ad885..34388ac82 100644 --- a/src/lib/video_mxf_decoder.h +++ b/src/lib/video_mxf_decoder.h @@ -20,6 +20,11 @@ #include "decoder.h" +namespace dcp { + class MonoPictureAssetReader; + class StereoPictureAssetReader; +} + class VideoMXFContent; class Log; @@ -35,4 +40,8 @@ private: boost::shared_ptr<const VideoMXFContent> _content; /** Time of next thing to return from pass */ ContentTime _next; + + boost::shared_ptr<dcp::MonoPictureAssetReader> _mono_reader; + boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader; + dcp::Size _size; }; |
