From 368832f2ff6837d9029020b41fb97fb148c3be31 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 1 Jun 2016 23:58:47 +0100 Subject: [PATCH] Use new libdcp reader interface. --- cscript | 2 +- 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 ++++++ test/audio_delay_test.cc | 3 +- test/ffmpeg_audio_test.cc | 17 +++++------ test/silence_padding_test.cc | 15 +++++----- 9 files changed, 115 insertions(+), 43 deletions(-) diff --git a/cscript b/cscript index 7f25420e3..c3a17aa11 100644 --- a/cscript +++ b/cscript @@ -237,7 +237,7 @@ def dependencies(target): ffmpeg_options = {} return (('ffmpeg-cdist', 'aab2fb1', ffmpeg_options), - ('libdcp', 'f028e8a'), + ('libdcp', 'a641fdc'), ('libsub', '3d8c3bc')) def configure_options(target): 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; }; diff --git a/test/audio_delay_test.cc b/test/audio_delay_test.cc index b46cfeb2c..1d2d171db 100644 --- a/test/audio_delay_test.cc +++ b/test/audio_delay_test.cc @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "lib/ffmpeg_content.h" #include "lib/dcp_content_type.h" @@ -79,7 +80,7 @@ void test_audio_delay (int delay_in_ms) int const delay_in_frames = delay_in_ms * 48000 / 1000; while (n < sound_asset->asset()->intrinsic_duration()) { - shared_ptr sound_frame = sound_asset->asset()->get_frame (frame++); + shared_ptr sound_frame = sound_asset->asset()->start_read()->get_frame (frame++); uint8_t const * d = sound_frame->data (); for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) { diff --git a/test/ffmpeg_audio_test.cc b/test/ffmpeg_audio_test.cc index ae3a65a67..cfbaf46c3 100644 --- a/test/ffmpeg_audio_test.cc +++ b/test/ffmpeg_audio_test.cc @@ -22,13 +22,6 @@ * @brief A simple test of reading audio from an FFmpeg file. */ -#include -#include -#include -#include -#include -#include -#include #include "lib/ffmpeg_content.h" #include "lib/film.h" #include "lib/dcp_content_type.h" @@ -36,6 +29,14 @@ #include "lib/ratio.h" #include "lib/ffmpeg_content.h" #include "test.h" +#include +#include +#include +#include +#include +#include +#include +#include using std::string; using boost::shared_ptr; @@ -75,7 +76,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test) int frame = 0; while (n < sound_asset->asset()->intrinsic_duration()) { - shared_ptr sound_frame = sound_asset->asset()->get_frame (frame++); + shared_ptr sound_frame = sound_asset->asset()->start_read()->get_frame (frame++); uint8_t const * d = sound_frame->data (); for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) { diff --git a/test/silence_padding_test.cc b/test/silence_padding_test.cc index 53c5021c3..9791b7172 100644 --- a/test/silence_padding_test.cc +++ b/test/silence_padding_test.cc @@ -22,18 +22,19 @@ * @brief Test the padding (with silence) of a mono source to a 6-channel DCP. */ -#include +#include "lib/ffmpeg_content.h" +#include "lib/film.h" +#include "lib/dcp_content_type.h" +#include "lib/ratio.h" +#include "test.h" #include #include #include #include #include #include -#include "lib/ffmpeg_content.h" -#include "lib/film.h" -#include "lib/dcp_content_type.h" -#include "lib/ratio.h" -#include "test.h" +#include +#include using std::string; using boost::lexical_cast; @@ -72,7 +73,7 @@ test_silence_padding (int channels) int frame = 0; while (n < sound_asset->asset()->intrinsic_duration()) { - shared_ptr sound_frame = sound_asset->asset()->get_frame (frame++); + shared_ptr sound_frame = sound_asset->asset()->start_read()->get_frame (frame++); uint8_t const * d = sound_frame->data (); for (int i = 0; i < sound_frame->size(); i += (3 * sound_asset->asset()->channels())) { -- 2.30.2