Restore correct setup of fast resampler when the player is set to fast.
authorCarl Hetherington <cth@carlh.net>
Sun, 3 Sep 2017 21:41:40 +0000 (22:41 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 3 Sep 2017 21:41:40 +0000 (22:41 +0100)
14 files changed:
src/lib/audio_decoder.cc
src/lib/audio_decoder.h
src/lib/dcp_content.cc
src/lib/dcp_decoder.cc
src/lib/dcp_decoder.h
src/lib/decoder_factory.cc
src/lib/decoder_factory.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h
src/lib/player.cc
src/wx/subtitle_panel.cc
test/dcp_subtitle_test.cc
test/ffmpeg_decoder_seek_test.cc
test/ffmpeg_pts_offset_test.cc

index 16a03a8e93593cdc5879f1e33f72c93742660ffb..5df4047db49e00f579350ffc33efee2c228e4dce 100644 (file)
@@ -37,9 +37,10 @@ using std::pair;
 using boost::shared_ptr;
 using boost::optional;
 
-AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr<const AudioContent> content, shared_ptr<Log> log)
+AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr<const AudioContent> content, shared_ptr<Log> log, bool fast)
        : DecoderPart (parent, log)
        , _content (content)
+       , _fast (fast)
 {
        /* Set up _positions so that we have one for each stream */
        BOOST_FOREACH (AudioStreamPtr i, content->streams ()) {
@@ -82,6 +83,9 @@ AudioDecoder::emit (AudioStreamPtr stream, shared_ptr<const AudioBuffers> data,
                                );
 
                        resampler.reset (new Resampler (stream->frame_rate(), _content->resampled_frame_rate(), stream->channels()));
+                       if (_fast) {
+                               resampler->set_fast ();
+                       }
                        _resamplers[stream] = resampler;
                }
        }
index 359540d6ffd1861343793f8f2d71f146b451ba70..ba1520ef53adc72bd441fdb44f4f816ea4b0f701 100644 (file)
@@ -44,7 +44,7 @@ class Resampler;
 class AudioDecoder : public boost::enable_shared_from_this<AudioDecoder>, public DecoderPart
 {
 public:
-       AudioDecoder (Decoder* parent, boost::shared_ptr<const AudioContent> content, boost::shared_ptr<Log> log);
+       AudioDecoder (Decoder* parent, boost::shared_ptr<const AudioContent> content, boost::shared_ptr<Log> log, bool fast);
 
        ContentTime position () const;
        void emit (AudioStreamPtr stream, boost::shared_ptr<const AudioBuffers>, ContentTime);
@@ -63,6 +63,8 @@ private:
        /** Frame after the last one that was emitted from Data for each AudioStream */
        std::map<AudioStreamPtr, Frame> _positions;
        std::map<AudioStreamPtr, boost::shared_ptr<Resampler> > _resamplers;
+
+       bool _fast;
 };
 
 #endif
index 18f88b3d3dba31344ed91c6d01d537939caf2124..fd092593514f76401699efcbbfe62b5f55c7817d 100644 (file)
@@ -493,7 +493,7 @@ DCPContent::can_reference_audio (list<string>& why_not) const
 {
        shared_ptr<DCPDecoder> decoder;
        try {
-               decoder.reset (new DCPDecoder (shared_from_this(), film()->log()));
+               decoder.reset (new DCPDecoder (shared_from_this(), film()->log(), false));
        } catch (dcp::DCPReadError) {
                /* We couldn't read the DCP, so it's probably missing */
                return false;
@@ -514,7 +514,7 @@ DCPContent::can_reference_subtitle (list<string>& why_not) const
 {
        shared_ptr<DCPDecoder> decoder;
        try {
-               decoder.reset (new DCPDecoder (shared_from_this(), film()->log()));
+               decoder.reset (new DCPDecoder (shared_from_this(), film()->log(), false));
        } catch (dcp::DCPReadError) {
                /* We couldn't read the DCP, so it's probably missing */
                return false;
index ef40f2ec7311949db871dfcaff8ee4db6ed756c4..59a85e05145aef96010e6d65dcb5d2216e7f33b9 100644 (file)
@@ -50,13 +50,13 @@ using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 using boost::optional;
 
-DCPDecoder::DCPDecoder (shared_ptr<const DCPContent> c, shared_ptr<Log> log)
+DCPDecoder::DCPDecoder (shared_ptr<const DCPContent> c, shared_ptr<Log> log, bool fast)
        : DCP (c)
        , _decode_referenced (false)
 {
        video.reset (new VideoDecoder (this, c, log));
        if (c->audio) {
-               audio.reset (new AudioDecoder (this, c->audio, log));
+               audio.reset (new AudioDecoder (this, c->audio, log, fast));
        }
        if (c->subtitle) {
                subtitle.reset (new SubtitleDecoder (this, c->subtitle, log));
index aa76b83d6c435f3617210ecfccdd5026c709bebf..6ec9de684d74da53abb204b578e91ee1f314c2c5 100644 (file)
@@ -39,7 +39,7 @@ struct dcp_subtitle_within_dcp_test;
 class DCPDecoder : public DCP, public Decoder
 {
 public:
-       DCPDecoder (boost::shared_ptr<const DCPContent>, boost::shared_ptr<Log> log);
+       DCPDecoder (boost::shared_ptr<const DCPContent>, boost::shared_ptr<Log> log, bool fast);
 
        std::list<boost::shared_ptr<dcp::Reel> > reels () const {
                return _reels;
index b661d494bf9f02b85864d9a1477974e85400f761..b675f9473331b88439b0ac5e80c17efbb614d07e 100644 (file)
@@ -37,16 +37,16 @@ using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 
 shared_ptr<Decoder>
-decoder_factory (shared_ptr<const Content> content, shared_ptr<Log> log)
+decoder_factory (shared_ptr<const Content> content, shared_ptr<Log> log, bool fast)
 {
        shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (content);
        if (fc) {
-               return shared_ptr<Decoder> (new FFmpegDecoder (fc, log));
+               return shared_ptr<Decoder> (new FFmpegDecoder (fc, log, fast));
        }
 
        shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (content);
        if (dc) {
-               return shared_ptr<Decoder> (new DCPDecoder (dc, log));
+               return shared_ptr<Decoder> (new DCPDecoder (dc, log, fast));
        }
 
        shared_ptr<const ImageContent> ic = dynamic_pointer_cast<const ImageContent> (content);
index 43100d4d90782395f3f56e3a10798d11349875e9..52a53afd2b34f129fb250087a429e5a149ddd5b8 100644 (file)
@@ -22,5 +22,6 @@ class ImageDecoder;
 
 extern boost::shared_ptr<Decoder> decoder_factory (
        boost::shared_ptr<const Content> content,
-       boost::shared_ptr<Log> log
+       boost::shared_ptr<Log> log,
+       bool fast
        );
index 5e2cb8638804b328e36e1c89cd127e3e449d2535..378b59901163339f2a8dbb1175f1847e87b0fb1e 100644 (file)
@@ -78,7 +78,7 @@ using boost::optional;
 using boost::dynamic_pointer_cast;
 using dcp::Size;
 
-FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log)
+FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log, bool fast)
        : FFmpeg (c)
        , _log (log)
        , _have_current_subtitle (false)
@@ -94,7 +94,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log>
        }
 
        if (c->audio) {
-               audio.reset (new AudioDecoder (this, c->audio, log));
+               audio.reset (new AudioDecoder (this, c->audio, log, fast));
        }
 
        if (c->subtitle) {
index 993d1dd0e1341a23ece5f309dbbc3a3eb8d24b39..3a38f4475333d3f3871e057fb376c56ff3ca2122 100644 (file)
@@ -45,7 +45,7 @@ struct ffmpeg_pts_offset_test;
 class FFmpegDecoder : public FFmpeg, public Decoder
 {
 public:
-       FFmpegDecoder (boost::shared_ptr<const FFmpegContent>, boost::shared_ptr<Log>);
+       FFmpegDecoder (boost::shared_ptr<const FFmpegContent>, boost::shared_ptr<Log> log, bool fast);
 
        bool pass ();
        void seek (ContentTime time, bool);
index 7d3f381ed64b221de7b2cbb795ae6097961182ea..11369b682b97879e692b3b415b70978440f8841c 100644 (file)
@@ -109,7 +109,7 @@ Player::setup_pieces ()
                        continue;
                }
 
-               shared_ptr<Decoder> decoder = decoder_factory (i, _film->log());
+               shared_ptr<Decoder> decoder = decoder_factory (i, _film->log(), _fast);
                FrameRateChange frc (i->active_video_frame_rate(), _film->video_frame_rate());
 
                if (!decoder) {
@@ -425,6 +425,7 @@ Player::set_always_burn_subtitles (bool burn)
        _always_burn_subtitles = burn;
 }
 
+/** Sets up the player to be faster, possibly at the expense of quality */
 void
 Player::set_fast ()
 {
@@ -452,7 +453,7 @@ Player::get_reel_assets ()
 
                scoped_ptr<DCPDecoder> decoder;
                try {
-                       decoder.reset (new DCPDecoder (j, _film->log()));
+                       decoder.reset (new DCPDecoder (j, _film->log(), false));
                } catch (...) {
                        return a;
                }
index 845b821986b92c756eb5335b8770b531ea80ede5..bc8eb19439b472de83d722515b0018c5ff979459 100644 (file)
@@ -395,7 +395,7 @@ SubtitlePanel::subtitle_view_clicked ()
        ContentList c = _parent->selected_subtitle ();
        DCPOMATIC_ASSERT (c.size() == 1);
 
-       shared_ptr<Decoder> decoder = decoder_factory (c.front(), _parent->film()->log());
+       shared_ptr<Decoder> decoder = decoder_factory (c.front(), _parent->film()->log(), false);
 
        if (decoder) {
                _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ());
index 927b8be69c32d28c6ebfb594006693f30abfea4c..b4dfe1df7acea1119e561a5529a5c3b0c987da39 100644 (file)
@@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_within_dcp_test)
        film->examine_and_add_content (content);
        wait_for_jobs ();
 
-       shared_ptr<DCPDecoder> decoder (new DCPDecoder (content, film->log()));
+       shared_ptr<DCPDecoder> decoder (new DCPDecoder (content, film->log(), false));
        decoder->subtitle->TextStart.connect (bind (store, _1));
 
        stored = optional<ContentTextSubtitle> ();
index 87ac5040fffa642ec259fee463235434ec134765..c09fd02f37d6769e5401f90a8a48267976571805 100644 (file)
@@ -74,7 +74,7 @@ test (boost::filesystem::path file, vector<int> frames)
        film->examine_and_add_content (content);
        wait_for_jobs ();
        shared_ptr<Log> log (new NullLog);
-       shared_ptr<FFmpegDecoder> decoder (new FFmpegDecoder (content, log));
+       shared_ptr<FFmpegDecoder> decoder (new FFmpegDecoder (content, log, false));
        decoder->video->Data.connect (bind (&store, _1));
 
        for (vector<int>::const_iterator i = frames.begin(); i != frames.end(); ++i) {
index 85a1e78443b00e1408d1bdf64c22f74cbcccd938..bdc46f6d91834474f9d125dfc609b4de06640b64 100644 (file)
@@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test)
                /* Sound == video so no offset required */
                content->_first_video = ContentTime ();
                content->ffmpeg_audio_streams().front()->first_audio = ContentTime ();
-               FFmpegDecoder decoder (content, film->log());
+               FFmpegDecoder decoder (content, film->log(), false);
                BOOST_CHECK_EQUAL (decoder._pts_offset.get(), 0);
        }
 
@@ -56,7 +56,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test)
                /* Common offset should be removed */
                content->_first_video = ContentTime::from_seconds (600);
                content->ffmpeg_audio_streams().front()->first_audio = ContentTime::from_seconds (600);
-               FFmpegDecoder decoder (content, film->log());
+               FFmpegDecoder decoder (content, film->log(), false);
                BOOST_CHECK_EQUAL (decoder._pts_offset.get(), ContentTime::from_seconds(-600).get());
        }
 
@@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test)
                /* Video is on a frame boundary */
                content->_first_video = ContentTime::from_frames (1, 24);
                content->ffmpeg_audio_streams().front()->first_audio = ContentTime ();
-               FFmpegDecoder decoder (content, film->log());
+               FFmpegDecoder decoder (content, film->log(), false);
                BOOST_CHECK_EQUAL (decoder._pts_offset.get(), 0);
        }
 
@@ -73,7 +73,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test)
                double const frame = 1.0 / 24.0;
                content->_first_video = ContentTime::from_seconds (frame + 0.0215);
                content->ffmpeg_audio_streams().front()->first_audio = ContentTime ();
-               FFmpegDecoder decoder (content, film->log());
+               FFmpegDecoder decoder (content, film->log(), false);
                BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215), 0.00001);
        }
 
@@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_pts_offset_test)
                double const frame = 1.0 / 24.0;
                content->_first_video = ContentTime::from_seconds (frame + 0.0215 + 4.1);
                content->ffmpeg_audio_streams().front()->first_audio = ContentTime::from_seconds (4.1);
-               FFmpegDecoder decoder (content, film->log());
+               FFmpegDecoder decoder (content, film->log(), false);
                BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215) - 4.1, 0.1);
        }
 }