summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-06-01 23:58:47 +0100
committerCarl Hetherington <cth@carlh.net>2016-06-01 23:58:47 +0100
commit368832f2ff6837d9029020b41fb97fb148c3be31 (patch)
tree7653ce59c8e5de15d746897efa7640f33a70a32f
parent2da8a38e3cc9bebfe324a682d8e4da2e8856676a (diff)
Use new libdcp reader interface.
-rw-r--r--cscript2
-rw-r--r--src/lib/dcp_decoder.cc55
-rw-r--r--src/lib/dcp_decoder.h13
-rw-r--r--src/lib/dcp_examiner.cc6
-rw-r--r--src/lib/video_mxf_decoder.cc38
-rw-r--r--src/lib/video_mxf_decoder.h9
-rw-r--r--test/audio_delay_test.cc3
-rw-r--r--test/ffmpeg_audio_test.cc17
-rw-r--r--test/silence_padding_test.cc15
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 <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;
};
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 <dcp/cpl.h>
#include <dcp/reel.h>
#include <dcp/sound_asset.h>
+#include <dcp/sound_asset_reader.h>
#include <dcp/reel_sound_asset.h>
#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<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> 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 <boost/test/unit_test.hpp>
-#include <dcp/cpl.h>
-#include <dcp/dcp.h>
-#include <dcp/sound_asset.h>
-#include <dcp/sound_frame.h>
-#include <dcp/reel_sound_asset.h>
-#include <dcp/reel.h>
#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 <dcp/cpl.h>
+#include <dcp/dcp.h>
+#include <dcp/sound_asset.h>
+#include <dcp/sound_frame.h>
+#include <dcp/reel_sound_asset.h>
+#include <dcp/sound_asset_reader.h>
+#include <dcp/reel.h>
+#include <boost/test/unit_test.hpp>
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<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> 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 <boost/test/unit_test.hpp>
+#include "lib/ffmpeg_content.h"
+#include "lib/film.h"
+#include "lib/dcp_content_type.h"
+#include "lib/ratio.h"
+#include "test.h"
#include <dcp/cpl.h>
#include <dcp/dcp.h>
#include <dcp/sound_asset.h>
#include <dcp/sound_frame.h>
#include <dcp/reel.h>
#include <dcp/reel_sound_asset.h>
-#include "lib/ffmpeg_content.h"
-#include "lib/film.h"
-#include "lib/dcp_content_type.h"
-#include "lib/ratio.h"
-#include "test.h"
+#include <dcp/sound_asset_reader.h>
+#include <boost/test/unit_test.hpp>
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<const dcp::SoundFrame> sound_frame = sound_asset->asset()->get_frame (frame++);
+ shared_ptr<const dcp::SoundFrame> 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())) {