DCPDecoder::DCPDecoder (shared_ptr<const DCPContent> c, shared_ptr<Log> log)
: _dcp_content (c)
+ , _decode_referenced (false)
{
video.reset (new VideoDecoder (this, c, log));
audio.reset (new AudioDecoder (this, c->audio, log));
/* Frame within the (played part of the) reel that is coming up next */
int64_t const frame = _next.frames_round (vfr);
- if ((_mono_reader || _stereo_reader) && reason != PASS_REASON_SUBTITLE) {
+ if ((_mono_reader || _stereo_reader) && reason != PASS_REASON_SUBTITLE && (_decode_referenced || !_dcp_content->reference_video())) {
shared_ptr<dcp::PictureAsset> asset = (*_reel)->main_picture()->asset ();
int64_t const entry_point = (*_reel)->main_picture()->entry_point ();
if (_mono_reader) {
}
}
- if (_sound_reader && reason != PASS_REASON_SUBTITLE) {
+ if (_sound_reader && reason != PASS_REASON_SUBTITLE && (_decode_referenced || !_dcp_content->reference_audio())) {
int64_t const entry_point = (*_reel)->main_sound()->entry_point ();
shared_ptr<const dcp::SoundFrame> sf = _sound_reader->get_frame (entry_point + frame);
uint8_t const * from = sf->data ();
audio->give (_dcp_content->audio->stream(), data, ContentTime::from_frames (_offset, vfr) + _next);
}
- if ((*_reel)->main_subtitle ()) {
+ if ((*_reel)->main_subtitle() && (_decode_referenced || !_dcp_content->reference_subtitle())) {
int64_t const entry_point = (*_reel)->main_subtitle()->entry_point ();
list<dcp::SubtitleString> subs = (*_reel)->main_subtitle()->asset()->subtitles_during (
dcp::Time (entry_point + frame, vfr, vfr),
return ctp;
}
+
+void
+DCPDecoder::set_decode_referenced ()
+{
+ _decode_referenced = true;
+}
return _reels;
}
+ void set_decode_referenced ();
+
private:
friend struct dcp_subtitle_within_dcp_test;
boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader;
/** Reader for current sound asset, if applicable */
boost::shared_ptr<dcp::SoundAssetReader> _sound_reader;
+
+ bool _decode_referenced;
};
decoder->audio->set_fast ();
}
+ shared_ptr<DCPDecoder> dcp = dynamic_pointer_cast<DCPDecoder> (decoder);
+ if (dcp && _play_referenced) {
+ dcp->set_decode_referenced ();
+ }
+
_pieces.push_back (shared_ptr<Piece> (new Piece (i, decoder, frc)));
}