Don't bother decoding referenced DCP video if the player will ignore it.
authorCarl Hetherington <cth@carlh.net>
Wed, 22 Jun 2016 00:53:18 +0000 (01:53 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 22 Jun 2016 00:53:18 +0000 (01:53 +0100)
src/lib/dcp_decoder.cc
src/lib/dcp_decoder.h
src/lib/player.cc

index 7b4ef9fc7a6b6f668181b98c481b183bfcfb8032..35fe375e9b97c925c02d25c9d240e152b1712b53 100644 (file)
@@ -52,6 +52,7 @@ using boost::dynamic_pointer_cast;
 
 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));
@@ -90,7 +91,7 @@ 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 ((_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) {
@@ -108,7 +109,7 @@ DCPDecoder::pass (PassReason reason, bool)
                }
        }
 
-       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 ();
@@ -127,7 +128,7 @@ DCPDecoder::pass (PassReason reason, bool)
                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),
@@ -258,3 +259,9 @@ DCPDecoder::text_subtitles_during (ContentTimePeriod period, bool starting) cons
 
        return ctp;
 }
+
+void
+DCPDecoder::set_decode_referenced ()
+{
+       _decode_referenced = true;
+}
index 97a1847946a6f677985824893a9096b7ab2c9971..12e37104e599b76f7e272d212bef9fdfb1683b7d 100644 (file)
@@ -44,6 +44,8 @@ public:
                return _reels;
        }
 
+       void set_decode_referenced ();
+
 private:
        friend struct dcp_subtitle_within_dcp_test;
 
@@ -69,4 +71,6 @@ private:
        boost::shared_ptr<dcp::StereoPictureAssetReader> _stereo_reader;
        /** Reader for current sound asset, if applicable */
        boost::shared_ptr<dcp::SoundAssetReader> _sound_reader;
+
+       bool _decode_referenced;
 };
index ba678dfeb92543fa0b4798c90c06d4ce845bef00..20a3e14533557997117cfd9fb0c9a91ae017a700 100644 (file)
@@ -143,6 +143,11 @@ Player::setup_pieces ()
                        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)));
        }