diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-06-22 01:47:28 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-06-22 01:47:28 +0100 |
| commit | 76f83b97c401c24b3c93baee0665e84be05f43ea (patch) | |
| tree | 75e7f3e87f3721c8ac4c55ac6bc9559556954987 /src | |
| parent | 5e9e59e044fe3b51352d5dccad7f11882c6a571c (diff) | |
Set AudioDecoder::fast a different way.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/audio_decoder.cc | 14 | ||||
| -rw-r--r-- | src/lib/audio_decoder.h | 7 | ||||
| -rw-r--r-- | src/lib/audio_decoder_stream.cc | 12 | ||||
| -rw-r--r-- | src/lib/audio_decoder_stream.h | 3 | ||||
| -rw-r--r-- | src/lib/dcp_content.cc | 6 | ||||
| -rw-r--r-- | src/lib/dcp_decoder.cc | 4 | ||||
| -rw-r--r-- | src/lib/dcp_decoder.h | 2 | ||||
| -rw-r--r-- | src/lib/decoder_factory.cc | 6 | ||||
| -rw-r--r-- | src/lib/decoder_factory.h | 3 | ||||
| -rw-r--r-- | src/lib/ffmpeg_decoder.cc | 4 | ||||
| -rw-r--r-- | src/lib/ffmpeg_decoder.h | 2 | ||||
| -rw-r--r-- | src/lib/player.cc | 8 | ||||
| -rw-r--r-- | src/lib/resampler.cc | 16 | ||||
| -rw-r--r-- | src/lib/resampler.h | 3 | ||||
| -rw-r--r-- | src/wx/subtitle_panel.cc | 2 |
15 files changed, 60 insertions, 32 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<const AudioContent> content, bool fast, shared_ptr<Log> log) +AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr<const AudioContent> content, shared_ptr<Log> log) : _ignore (false) - , _fast (fast) + , _fast (false) { BOOST_FOREACH (AudioStreamPtr i, content->streams ()) { - _streams[i] = shared_ptr<AudioDecoderStream> (new AudioDecoderStream (content, i, parent, fast, log)); + _streams[i] = shared_ptr<AudioDecoderStream> (new AudioDecoderStream (content, i, parent, log)); } } @@ -101,3 +101,11 @@ AudioDecoder::set_ignore () { _ignore = true; } + +void +AudioDecoder::set_fast () +{ + for (map<AudioStreamPtr, shared_ptr<AudioDecoderStream> >::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<AudioDecoder> { public: - AudioDecoder (Decoder* parent, boost::shared_ptr<const AudioContent>, bool fast, boost::shared_ptr<Log> log); + AudioDecoder (Decoder* parent, boost::shared_ptr<const AudioContent>, boost::shared_ptr<Log> 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<const AudioBuffers>, 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<const AudioContent> content, AudioStreamPtr stream, Decoder* decoder, bool fast, shared_ptr<Log> log) +AudioDecoderStream::AudioDecoderStream (shared_ptr<const AudioContent> content, AudioStreamPtr stream, Decoder* decoder, shared_ptr<Log> 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<const AudioContent>, AudioStreamPtr, Decoder* decoder, bool fast, boost::shared_ptr<Log> log); + AudioDecoderStream (boost::shared_ptr<const AudioContent>, AudioStreamPtr, Decoder* decoder, boost::shared_ptr<Log> log); ContentAudio get (Frame time, Frame length, bool accurate); void audio (boost::shared_ptr<const AudioBuffers>, 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<DCPTimePeriod> p; scoped_ptr<DCPDecoder> 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<DCPTimePeriod> p; @@ -403,7 +403,7 @@ DCPContent::can_reference_video (list<string>& why_not) const bool DCPContent::can_reference_audio (list<string>& why_not) const { - DCPDecoder decoder (shared_from_this(), film()->log(), false); + DCPDecoder decoder (shared_from_this(), film()->log()); BOOST_FOREACH (shared_ptr<dcp::Reel> 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<string>& why_not) const bool DCPContent::can_reference_subtitle (list<string>& why_not) const { - DCPDecoder decoder (shared_from_this(), film()->log(), false); + DCPDecoder decoder (shared_from_this(), film()->log()); BOOST_FOREACH (shared_ptr<dcp::Reel> 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<const DCPContent> c, shared_ptr<Log> log, bool fast) +DCPDecoder::DCPDecoder (shared_ptr<const DCPContent> c, shared_ptr<Log> 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<const DCPContent>, boost::shared_ptr<Log> log, bool fast); + DCPDecoder (boost::shared_ptr<const DCPContent>, boost::shared_ptr<Log> log); std::list<boost::shared_ptr<dcp::Reel> > 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> -decoder_factory (shared_ptr<const Content> content, shared_ptr<Log> log, bool fast) +decoder_factory (shared_ptr<const Content> content, shared_ptr<Log> log) { shared_ptr<const FFmpegContent> fc = dynamic_pointer_cast<const FFmpegContent> (content); if (fc) { - return shared_ptr<Decoder> (new FFmpegDecoder (fc, log, fast)); + return shared_ptr<Decoder> (new FFmpegDecoder (fc, log)); } shared_ptr<const DCPContent> dc = dynamic_pointer_cast<const DCPContent> (content); if (dc) { - return shared_ptr<Decoder> (new DCPDecoder (dc, log, fast)); + return shared_ptr<Decoder> (new DCPDecoder (dc, log)); } shared_ptr<const ImageContent> ic = dynamic_pointer_cast<const ImageContent> (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> decoder_factory ( boost::shared_ptr<const Content> content, - boost::shared_ptr<Log> log, - bool fast + boost::shared_ptr<Log> 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<const FFmpegContent> c, shared_ptr<Log> log, bool fast) +FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log) : FFmpeg (c) , _log (log) { @@ -87,7 +87,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> } 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<const FFmpegContent>, boost::shared_ptr<Log>, bool fast); + FFmpegDecoder (boost::shared_ptr<const FFmpegContent>, boost::shared_ptr<Log>); 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 = decoder_factory (i, _film->log(), _fast); + shared_ptr<Decoder> 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<Piece> (new Piece (i, decoder, frc))); } @@ -706,7 +710,7 @@ Player::get_reel_assets () scoped_ptr<DCPDecoder> 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<const AudioBuffers> Resampler::run (shared_ptr<const AudioBuffers> 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<const AudioBuffers> run (boost::shared_ptr<const AudioBuffers>); boost::shared_ptr<const AudioBuffers> 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 = decoder_factory (c.front(), _parent->film()->log(), false); + shared_ptr<Decoder> decoder = decoder_factory (c.front(), _parent->film()->log()); if (decoder) { _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ()); |
