summaryrefslogtreecommitdiff
path: root/src
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 /src
parent2da8a38e3cc9bebfe324a682d8e4da2e8856676a (diff)
Use new libdcp reader interface.
Diffstat (limited to 'src')
-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
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;
};