From 76f83b97c401c24b3c93baee0665e84be05f43ea Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 22 Jun 2016 01:47:28 +0100 Subject: [PATCH] Set AudioDecoder::fast a different way. --- src/lib/audio_decoder.cc | 14 +++++++++++--- src/lib/audio_decoder.h | 7 ++----- src/lib/audio_decoder_stream.cc | 12 ++++++++++-- src/lib/audio_decoder_stream.h | 3 ++- src/lib/dcp_content.cc | 6 +++--- src/lib/dcp_decoder.cc | 4 ++-- src/lib/dcp_decoder.h | 2 +- src/lib/decoder_factory.cc | 6 +++--- src/lib/decoder_factory.h | 3 +-- src/lib/ffmpeg_decoder.cc | 4 ++-- src/lib/ffmpeg_decoder.h | 2 +- src/lib/player.cc | 8 ++++++-- src/lib/resampler.cc | 16 +++++++++++++--- src/lib/resampler.h | 3 ++- src/wx/subtitle_panel.cc | 2 +- test/audio_decoder_test.cc | 2 +- test/dcp_subtitle_test.cc | 2 +- test/ffmpeg_decoder_seek_test.cc | 2 +- test/ffmpeg_decoder_sequential_test.cc | 2 +- test/ffmpeg_pts_offset_test.cc | 10 +++++----- test/resampler_test.cc | 2 +- test/seek_zero_test.cc | 2 +- 22 files changed, 71 insertions(+), 43 deletions(-) diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index 8c395cb89..4b89dc620 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -31,12 +31,12 @@ using std::cout; using std::map; using boost::shared_ptr; -AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr content, bool fast, shared_ptr log) +AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr content, shared_ptr log) : _ignore (false) - , _fast (fast) + , _fast (false) { BOOST_FOREACH (AudioStreamPtr i, content->streams ()) { - _streams[i] = shared_ptr (new AudioDecoderStream (content, i, parent, fast, log)); + _streams[i] = shared_ptr (new AudioDecoderStream (content, i, parent, log)); } } @@ -101,3 +101,11 @@ AudioDecoder::set_ignore () { _ignore = true; } + +void +AudioDecoder::set_fast () +{ + for (map >::const_iterator i = _streams.begin(); i != _streams.end(); ++i) { + i->second->set_fast (); + } +} diff --git a/src/lib/audio_decoder.h b/src/lib/audio_decoder.h index fbb1ad4d4..315cd94e4 100644 --- a/src/lib/audio_decoder.h +++ b/src/lib/audio_decoder.h @@ -41,7 +41,7 @@ class Log; class AudioDecoder : public boost::enable_shared_from_this { public: - AudioDecoder (Decoder* parent, boost::shared_ptr, bool fast, boost::shared_ptr log); + AudioDecoder (Decoder* parent, boost::shared_ptr, boost::shared_ptr log); /** Try to fetch some audio from a specific place in this content. * @param frame Frame to start from (after resampling, if applicable) @@ -52,10 +52,7 @@ public: ContentAudio get (AudioStreamPtr stream, Frame time, Frame length, bool accurate); void set_ignore (); - - bool fast () const { - return _fast; - } + void set_fast (); void give (AudioStreamPtr stream, boost::shared_ptr, ContentTime); void flush (); diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index 1bfc65871..a254356ef 100644 --- a/src/lib/audio_decoder_stream.cc +++ b/src/lib/audio_decoder_stream.cc @@ -40,14 +40,14 @@ using std::max; using boost::optional; using boost::shared_ptr; -AudioDecoderStream::AudioDecoderStream (shared_ptr content, AudioStreamPtr stream, Decoder* decoder, bool fast, shared_ptr log) +AudioDecoderStream::AudioDecoderStream (shared_ptr content, AudioStreamPtr stream, Decoder* decoder, shared_ptr log) : _content (content) , _stream (stream) , _decoder (decoder) , _log (log) { if (content->resampled_frame_rate() != _stream->frame_rate() && _stream->channels() > 0) { - _resampler.reset (new Resampler (_stream->frame_rate(), content->resampled_frame_rate(), _stream->channels (), fast)); + _resampler.reset (new Resampler (_stream->frame_rate(), content->resampled_frame_rate(), _stream->channels ())); } reset_decoded (); @@ -249,3 +249,11 @@ AudioDecoderStream::seek (ContentTime t, bool accurate) _seek_reference = t; } } + +void +AudioDecoderStream::set_fast () +{ + if (_resampler) { + _resampler->set_fast (); + } +} diff --git a/src/lib/audio_decoder_stream.h b/src/lib/audio_decoder_stream.h index 939a7d08b..a99464b89 100644 --- a/src/lib/audio_decoder_stream.h +++ b/src/lib/audio_decoder_stream.h @@ -35,12 +35,13 @@ class Decoder; class AudioDecoderStream { public: - AudioDecoderStream (boost::shared_ptr, AudioStreamPtr, Decoder* decoder, bool fast, boost::shared_ptr log); + AudioDecoderStream (boost::shared_ptr, AudioStreamPtr, Decoder* decoder, boost::shared_ptr log); ContentAudio get (Frame time, Frame length, bool accurate); void audio (boost::shared_ptr, ContentTime); void flush (); void seek (ContentTime time, bool accurate); + void set_fast (); private: diff --git a/src/lib/dcp_content.cc b/src/lib/dcp_content.cc index 295f33b3c..ca809df61 100644 --- a/src/lib/dcp_content.cc +++ b/src/lib/dcp_content.cc @@ -332,7 +332,7 @@ DCPContent::reels () const list p; scoped_ptr decoder; try { - decoder.reset (new DCPDecoder (shared_from_this(), film()->log(), false)); + decoder.reset (new DCPDecoder (shared_from_this(), film()->log())); } catch (...) { /* Could not load the DCP; guess reels */ list p; @@ -403,7 +403,7 @@ DCPContent::can_reference_video (list& why_not) const bool DCPContent::can_reference_audio (list& why_not) const { - DCPDecoder decoder (shared_from_this(), film()->log(), false); + DCPDecoder decoder (shared_from_this(), film()->log()); BOOST_FOREACH (shared_ptr i, decoder.reels()) { if (!i->main_sound()) { why_not.push_back (_("The DCP does not have sound in all reels.")); @@ -417,7 +417,7 @@ DCPContent::can_reference_audio (list& why_not) const bool DCPContent::can_reference_subtitle (list& why_not) const { - DCPDecoder decoder (shared_from_this(), film()->log(), false); + DCPDecoder decoder (shared_from_this(), film()->log()); BOOST_FOREACH (shared_ptr i, decoder.reels()) { if (!i->main_subtitle()) { why_not.push_back (_("The DCP does not have subtitles in all reels.")); diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index c17b21a7f..7b4ef9fc7 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -50,11 +50,11 @@ using std::cout; using boost::shared_ptr; using boost::dynamic_pointer_cast; -DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr log, bool fast) +DCPDecoder::DCPDecoder (shared_ptr c, shared_ptr log) : _dcp_content (c) { video.reset (new VideoDecoder (this, c, log)); - audio.reset (new AudioDecoder (this, c->audio, fast, log)); + audio.reset (new AudioDecoder (this, c->audio, log)); subtitle.reset ( new SubtitleDecoder ( diff --git a/src/lib/dcp_decoder.h b/src/lib/dcp_decoder.h index 7ad6fcbf7..97a184794 100644 --- a/src/lib/dcp_decoder.h +++ b/src/lib/dcp_decoder.h @@ -38,7 +38,7 @@ struct dcp_subtitle_within_dcp_test; class DCPDecoder : public Decoder { public: - DCPDecoder (boost::shared_ptr, boost::shared_ptr log, bool fast); + DCPDecoder (boost::shared_ptr, boost::shared_ptr log); std::list > reels () const { return _reels; diff --git a/src/lib/decoder_factory.cc b/src/lib/decoder_factory.cc index dc01a043a..462a80eed 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, bool fast) +decoder_factory (shared_ptr content, shared_ptr log) { shared_ptr fc = dynamic_pointer_cast (content); if (fc) { - return shared_ptr (new FFmpegDecoder (fc, log, fast)); + return shared_ptr (new FFmpegDecoder (fc, log)); } shared_ptr dc = dynamic_pointer_cast (content); if (dc) { - return shared_ptr (new DCPDecoder (dc, log, fast)); + return shared_ptr (new DCPDecoder (dc, log)); } shared_ptr ic = dynamic_pointer_cast (content); diff --git a/src/lib/decoder_factory.h b/src/lib/decoder_factory.h index 52a53afd2..43100d4d9 100644 --- a/src/lib/decoder_factory.h +++ b/src/lib/decoder_factory.h @@ -22,6 +22,5 @@ class ImageDecoder; extern boost::shared_ptr decoder_factory ( boost::shared_ptr content, - boost::shared_ptr log, - bool fast + boost::shared_ptr log ); diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index df6b7416b..164785c83 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -75,7 +75,7 @@ using boost::is_any_of; using boost::split; using dcp::Size; -FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr log, bool fast) +FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr log) : FFmpeg (c) , _log (log) { @@ -87,7 +87,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr } if (c->audio) { - audio.reset (new AudioDecoder (this, c->audio, fast, log)); + audio.reset (new AudioDecoder (this, c->audio, log)); } if (c->subtitle) { diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 6be9f8b1c..76755c1fc 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -44,7 +44,7 @@ struct ffmpeg_pts_offset_test; class FFmpegDecoder : public FFmpeg, public Decoder { public: - FFmpegDecoder (boost::shared_ptr, boost::shared_ptr, bool fast); + FFmpegDecoder (boost::shared_ptr, boost::shared_ptr); private: friend struct ::ffmpeg_pts_offset_test; diff --git a/src/lib/player.cc b/src/lib/player.cc index 30313d39d..ba678dfeb 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -123,7 +123,7 @@ Player::setup_pieces () continue; } - shared_ptr decoder = decoder_factory (i, _film->log(), _fast); + shared_ptr decoder = decoder_factory (i, _film->log()); FrameRateChange frc (i->active_video_frame_rate(), _film->video_frame_rate()); if (!decoder) { @@ -139,6 +139,10 @@ Player::setup_pieces () decoder->audio->set_ignore (); } + if (decoder->audio && _fast) { + decoder->audio->set_fast (); + } + _pieces.push_back (shared_ptr (new Piece (i, decoder, frc))); } @@ -706,7 +710,7 @@ Player::get_reel_assets () scoped_ptr decoder; try { - decoder.reset (new DCPDecoder (j, _film->log(), false)); + decoder.reset (new DCPDecoder (j, _film->log())); } catch (...) { return a; } diff --git a/src/lib/resampler.cc b/src/lib/resampler.cc index db5552d15..ff93d1609 100644 --- a/src/lib/resampler.cc +++ b/src/lib/resampler.cc @@ -37,15 +37,14 @@ using boost::shared_ptr; /** @param in Input sampling rate (Hz) * @param out Output sampling rate (Hz) * @param channels Number of channels. - * @param fast true to be fast rather than good. */ -Resampler::Resampler (int in, int out, int channels, bool fast) +Resampler::Resampler (int in, int out, int channels) : _in_rate (in) , _out_rate (out) , _channels (channels) { int error; - _src = src_new (fast ? SRC_LINEAR : SRC_SINC_BEST_QUALITY, _channels, &error); + _src = src_new (SRC_SINC_BEST_QUALITY, _channels, &error); if (!_src) { throw runtime_error (String::compose (N_("could not create sample-rate converter (%1)"), error)); } @@ -56,6 +55,17 @@ Resampler::~Resampler () src_delete (_src); } +void +Resampler::set_fast () +{ + src_delete (_src); + int error; + _src = src_new (SRC_LINEAR, _channels, &error); + if (!_src) { + throw runtime_error (String::compose (N_("could not create sample-rate converter (%1)"), error)); + } +} + shared_ptr Resampler::run (shared_ptr in) { diff --git a/src/lib/resampler.h b/src/lib/resampler.h index 5ce766f80..afc28aefd 100644 --- a/src/lib/resampler.h +++ b/src/lib/resampler.h @@ -28,11 +28,12 @@ class AudioBuffers; class Resampler : public boost::noncopyable { public: - Resampler (int, int, int, bool fast); + Resampler (int, int, int); ~Resampler (); boost::shared_ptr run (boost::shared_ptr); boost::shared_ptr flush (); + void set_fast (); private: SRC_STATE* _src; diff --git a/src/wx/subtitle_panel.cc b/src/wx/subtitle_panel.cc index 4efc4eee4..933fcc6c1 100644 --- a/src/wx/subtitle_panel.cc +++ b/src/wx/subtitle_panel.cc @@ -386,7 +386,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(), false); + shared_ptr decoder = decoder_factory (c.front(), _parent->film()->log()); if (decoder) { _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ()); diff --git a/test/audio_decoder_test.cc b/test/audio_decoder_test.cc index 945773d12..b71fd22c8 100644 --- a/test/audio_decoder_test.cc +++ b/test/audio_decoder_test.cc @@ -66,7 +66,7 @@ public: : _test_audio_content (content) , _position (0) { - audio.reset (new AudioDecoder (this, content->audio, false, log)); + audio.reset (new AudioDecoder (this, content->audio, log)); } bool pass (PassReason, bool) diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc index ef733d370..d45ac603e 100644 --- a/test/dcp_subtitle_test.cc +++ b/test/dcp_subtitle_test.cc @@ -71,7 +71,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(), false)); + shared_ptr decoder (new DCPDecoder (content, film->log())); list ctp = decoder->text_subtitles_during ( ContentTimePeriod ( diff --git a/test/ffmpeg_decoder_seek_test.cc b/test/ffmpeg_decoder_seek_test.cc index 8a854b01b..0e5b2963f 100644 --- a/test/ffmpeg_decoder_seek_test.cc +++ b/test/ffmpeg_decoder_seek_test.cc @@ -66,7 +66,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, false)); + shared_ptr decoder (new FFmpegDecoder (content, log)); for (vector::const_iterator i = frames.begin(); i != frames.end(); ++i) { check (decoder, *i); diff --git a/test/ffmpeg_decoder_sequential_test.cc b/test/ffmpeg_decoder_sequential_test.cc index 6a27d698f..6fa945f84 100644 --- a/test/ffmpeg_decoder_sequential_test.cc +++ b/test/ffmpeg_decoder_sequential_test.cc @@ -54,7 +54,7 @@ ffmpeg_decoder_sequential_test_one (boost::filesystem::path file, float fps, int film->examine_and_add_content (content); wait_for_jobs (); shared_ptr log (new NullLog); - shared_ptr decoder (new FFmpegDecoder (content, log, false)); + shared_ptr decoder (new FFmpegDecoder (content, log)); BOOST_REQUIRE (decoder->video->_content->video_frame_rate()); BOOST_CHECK_CLOSE (decoder->video->_content->video_frame_rate().get(), fps, 0.01); diff --git a/test/ffmpeg_pts_offset_test.cc b/test/ffmpeg_pts_offset_test.cc index 02ea0233d..05c4e15c8 100644 --- a/test/ffmpeg_pts_offset_test.cc +++ b/test/ffmpeg_pts_offset_test.cc @@ -47,7 +47,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(), false); + FFmpegDecoder decoder (content, film->log()); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime ()); } @@ -55,7 +55,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(), false); + FFmpegDecoder decoder (content, film->log()); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime::from_seconds (-600)); } @@ -63,7 +63,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(), false); + FFmpegDecoder decoder (content, film->log()); BOOST_CHECK_EQUAL (decoder._pts_offset, ContentTime ()); } @@ -72,7 +72,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(), false); + FFmpegDecoder decoder (content, film->log()); BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215), 0.00001); } @@ -81,7 +81,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(), false); + FFmpegDecoder decoder (content, film->log()); BOOST_CHECK_CLOSE (decoder._pts_offset.seconds(), (frame - 0.0215) - 4.1, 0.1); } } diff --git a/test/resampler_test.cc b/test/resampler_test.cc index fb4b98861..6f102dd4c 100644 --- a/test/resampler_test.cc +++ b/test/resampler_test.cc @@ -35,7 +35,7 @@ using boost::shared_ptr; static void resampler_test_one (int from, int to) { - Resampler resamp (from, to, 1, false); + Resampler resamp (from, to, 1); /* 3 hours */ int64_t const N = int64_t (from) * 60 * 60 * 3; diff --git a/test/seek_zero_test.cc b/test/seek_zero_test.cc index 05bf1b5bf..a176339e7 100644 --- a/test/seek_zero_test.cc +++ b/test/seek_zero_test.cc @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE (seek_zero_test) Frame const first_frame = video_delay.round_up (content->active_video_frame_rate ()).frames_round (content->active_video_frame_rate ()); - FFmpegDecoder decoder (content, film->log(), false); + FFmpegDecoder decoder (content, film->log()); list a = decoder.video->get (first_frame, true); BOOST_CHECK (a.size() == 1); BOOST_CHECK_EQUAL (a.front().frame.index(), first_frame); -- 2.30.2