From: Carl Hetherington Date: Sun, 3 Sep 2017 21:41:40 +0000 (+0100) Subject: Restore correct setup of fast resampler when the player is set to fast. X-Git-Tag: v2.11.23~14 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=4b2cf0764a4091b9466f90e6dbbeb029e04bc2be Restore correct setup of fast resampler when the player is set to fast. --- diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index 16a03a8e9..5df4047db 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -37,9 +37,10 @@ using std::pair; using boost::shared_ptr; using boost::optional; -AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr content, shared_ptr log) +AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr content, shared_ptr 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 data, ); resampler.reset (new Resampler (stream->frame_rate(), _content->resampled_frame_rate(), stream->channels())); + if (_fast) { + resampler->set_fast (); + } _resamplers[stream] = resampler; } } diff --git a/src/lib/audio_decoder.h b/src/lib/audio_decoder.h index 359540d6f..ba1520ef5 100644 --- a/src/lib/audio_decoder.h +++ b/src/lib/audio_decoder.h @@ -44,7 +44,7 @@ class Resampler; class AudioDecoder : public boost::enable_shared_from_this, public DecoderPart { public: - AudioDecoder (Decoder* parent, boost::shared_ptr content, boost::shared_ptr log); + AudioDecoder (Decoder* parent, boost::shared_ptr content, boost::shared_ptr log, bool fast); ContentTime position () const; void emit (AudioStreamPtr stream, boost::shared_ptr, ContentTime); @@ -63,6 +63,8 @@ private: /** Frame after the last one that was emitted from Data for each AudioStream */ std::map _positions; std::map > _resamplers; + + bool _fast; }; #endif diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 18f88b3d3..fd0925935 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -493,7 +493,7 @@ DCPContent::can_reference_audio (list& why_not) const { shared_ptr 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& why_not) const { shared_ptr 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; diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index ef40f2ec7..59a85e051 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -50,13 +50,13 @@ using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::optional; -DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr log) +DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr 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)); diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h index aa76b83d6..6ec9de684 100644 --- a/src/lib/dcp_decoder.h +++ b/src/lib/dcp_decoder.h @@ -39,7 +39,7 @@ struct dcp_subtitle_within_dcp_test; class DCPDecoder : public DCP, public Decoder { public: - DCPDecoder (boost::shared_ptr, boost::shared_ptr log); + DCPDecoder (boost::shared_ptr, boost::shared_ptr log, bool fast); std::list > reels () const { return _reels; diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc index b661d494b..b675f9473 100644 --- a/src/lib/decoder_factory.cc +++ b/src/lib/decoder_factory.cc @@ -37,16 +37,16 @@ using boost::shared_ptr; using boost::dynamic_pointer_cast; shared_ptr -decoder_factory (shared_ptr content, shared_ptr log) +decoder_factory (shared_ptr content, shared_ptr log, bool fast) { shared_ptr fc = dynamic_pointer_cast (content); if (fc) { - return shared_ptr (new FFmpegDecoder (fc, log)); + return shared_ptr (new FFmpegDecoder (fc, log, fast)); } shared_ptr dc = dynamic_pointer_cast (content); if (dc) { - return shared_ptr (new DCPDecoder (dc, log)); + return shared_ptr (new DCPDecoder (dc, log, fast)); } shared_ptr ic = dynamic_pointer_cast (content); diff --git a/src/lib/decoder_factory.h b/src/lib/decoder_factory.h index 43100d4d9..52a53afd2 100644 --- a/src/lib/decoder_factory.h +++ b/src/lib/decoder_factory.h @@ -22,5 +22,6 @@ class ImageDecoder; extern boost::shared_ptr decoder_factory ( boost::shared_ptr content, - boost::shared_ptr log + boost::shared_ptr log, + bool fast ); diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 5e2cb8638..378b59901 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -78,7 +78,7 @@ using boost::optional; using boost::dynamic_pointer_cast; using dcp::Size; -FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr log) +FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr log, bool fast) : FFmpeg (c) , _log (log) , _have_current_subtitle (false) @@ -94,7 +94,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr } if (c->audio) { - audio.reset (new AudioDecoder (this, c->audio, log)); + audio.reset (new AudioDecoder (this, c->audio, log, fast)); } if (c->subtitle) { diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 993d1dd0e..3a38f4475 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -45,7 +45,7 @@ struct ffmpeg_pts_offset_test; class FFmpegDecoder : public FFmpeg, public Decoder { public: - FFmpegDecoder (boost::shared_ptr, boost::shared_ptr); + FFmpegDecoder (boost::shared_ptr, boost::shared_ptr log, bool fast); bool pass (); void seek (ContentTime time, bool); diff --git a/src/lib/player.cc b/src/lib/player.cc index 7d3f381ed..11369b682 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -109,7 +109,7 @@ Player::setup_pieces () continue; } - shared_ptr decoder = decoder_factory (i, _film->log()); + shared_ptr 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 decoder; try { - decoder.reset (new DCPDecoder (j, _film->log())); + decoder.reset (new DCPDecoder (j, _film->log(), false)); } catch (...) { return a; } diff --git a/src/wx/subtitle_panel.cc b/src/wx/subtitle_panel.cc index 845b82198..bc8eb1943 100644 --- a/src/wx/subtitle_panel.cc +++ b/src/wx/subtitle_panel.cc @@ -395,7 +395,7 @@ SubtitlePanel::subtitle_view_clicked () ContentList c = _parent->selected_subtitle (); DCPOMATIC_ASSERT (c.size() == 1); - shared_ptr decoder = decoder_factory (c.front(), _parent->film()->log()); + shared_ptr decoder = decoder_factory (c.front(), _parent->film()->log(), false); if (decoder) { _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ()); diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc index 927b8be69..b4dfe1df7 100644 --- a/test/dcp_subtitle_test.cc +++ b/test/dcp_subtitle_test.cc @@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE (dcp_subtitle_within_dcp_test) film->examine_and_add_content (content); wait_for_jobs (); - shared_ptr decoder (new DCPDecoder (content, film->log())); + shared_ptr decoder (new DCPDecoder (content, film->log(), false)); decoder->subtitle->TextStart.connect (bind (store, _1)); stored = optional (); diff --git a/test/ffmpeg_decoder_seek_test.cc b/test/ffmpeg_decoder_seek_test.cc index 87ac5040f..c09fd02f3 100644 --- a/test/ffmpeg_decoder_seek_test.cc +++ b/test/ffmpeg_decoder_seek_test.cc @@ -74,7 +74,7 @@ test (boost::filesystem::path file, vector frames) film->examine_and_add_content (content); wait_for_jobs (); shared_ptr log (new NullLog); - shared_ptr decoder (new FFmpegDecoder (content, log)); + shared_ptr decoder (new FFmpegDecoder (content, log, false)); decoder->video->Data.connect (bind (&store, _1)); for (vector::const_iterator i = frames.begin(); i != frames.end(); ++i) { diff --git a/test/ffmpeg_pts_offset_test.cc b/test/ffmpeg_pts_offset_test.cc index 85a1e7844..bdc46f6d9 100644 --- a/test/ffmpeg_pts_offset_test.cc +++ b/test/ffmpeg_pts_offset_test.cc @@ -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); } }