From 368832f2ff6837d9029020b41fb97fb148c3be31 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 1 Jun 2016 23:58:47 +0100 Subject: Use new libdcp reader interface. --- src/lib/dcp_decoder.cc | 55 ++++++++++++++++++++++++++++++++++++-------- src/lib/dcp_decoder.h | 13 ++++++++++- src/lib/dcp_examiner.cc | 6 +++-- src/lib/video_mxf_decoder.cc | 38 +++++++++++++++++++----------- src/lib/video_mxf_decoder.h | 9 ++++++++ 5 files changed, 95 insertions(+), 26 deletions(-) (limited to 'src/lib') 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 #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include @@ -72,6 +75,7 @@ DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr 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 asset = (*_reel)->main_picture()->asset (); - shared_ptr mono = dynamic_pointer_cast (asset); - shared_ptr stereo = dynamic_pointer_cast (asset); int64_t const entry_point = (*_reel)->main_picture()->entry_point (); - if (mono) { - video->give (shared_ptr (new J2KImageProxy (mono->get_frame (entry_point + frame), asset->size())), _offset + frame); + if (_mono_reader) { + video->give (shared_ptr (new J2KImageProxy (_mono_reader->get_frame (entry_point + frame), asset->size())), _offset + frame); } else { video->give ( - shared_ptr (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)), + shared_ptr (new J2KImageProxy (_stereo_reader->get_frame (entry_point + frame), asset->size(), dcp::EYE_LEFT)), _offset + frame ); video->give ( - shared_ptr (new J2KImageProxy (stereo->get_frame (entry_point + frame), asset->size(), dcp::EYE_RIGHT)), + shared_ptr (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 sf = (*_reel)->main_sound()->asset()->get_frame (entry_point + frame); + shared_ptr 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 asset = (*_reel)->main_picture()->asset (); + shared_ptr mono = dynamic_pointer_cast (asset); + shared_ptr stereo = dynamic_pointer_cast (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 image_subtitles_during (ContentTimePeriod, bool starting) const; std::list text_subtitles_during (ContentTimePeriod, bool starting) const; + boost::shared_ptr _dcp_content; /** Time of next thing to return from pass relative to the start of _reel */ ContentTime _next; std::list > _reels; + std::list >::iterator _reel; /** Offset of _reel from the start of the content in frames */ int64_t _offset; - boost::shared_ptr _dcp_content; + /** Reader for current mono picture asset, if applicable */ + boost::shared_ptr _mono_reader; + /** Reader for current stereo picture asset, if applicable */ + boost::shared_ptr _stereo_reader; + /** Reader for current sound asset, if applicable */ + boost::shared_ptr _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 #include #include +#include #include #include +#include #include #include #include @@ -122,9 +124,9 @@ DCPExaminer::DCPExaminer (shared_ptr content) shared_ptr stereo = dynamic_pointer_cast (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 +#include #include +#include #include using boost::shared_ptr; @@ -32,17 +34,6 @@ VideoMXFDecoder::VideoMXFDecoder (shared_ptr 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 mono; try { @@ -67,10 +58,29 @@ VideoMXFDecoder::pass (PassReason, bool) } if (mono) { - video->give (shared_ptr (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 (new J2KImageProxy (_mono_reader->get_frame(frame), _size)), frame); } else { - video->give (shared_ptr (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_LEFT)), frame); - video->give (shared_ptr (new J2KImageProxy (stereo->get_frame(frame), stereo->size(), dcp::EYE_RIGHT)), frame); + video->give (shared_ptr (new J2KImageProxy (_stereo_reader->get_frame(frame), _size, dcp::EYE_LEFT)), frame); + video->give (shared_ptr (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 _content; /** Time of next thing to return from pass */ ContentTime _next; + + boost::shared_ptr _mono_reader; + boost::shared_ptr _stereo_reader; + dcp::Size _size; }; -- cgit v1.2.3