summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-06-22 01:47:28 +0100
committerCarl Hetherington <cth@carlh.net>2016-06-22 01:47:28 +0100
commit76f83b97c401c24b3c93baee0665e84be05f43ea (patch)
tree75e7f3e87f3721c8ac4c55ac6bc9559556954987 /src/lib
parent5e9e59e044fe3b51352d5dccad7f11882c6a571c (diff)
Set AudioDecoder::fast a different way.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/audio_decoder.cc14
-rw-r--r--src/lib/audio_decoder.h7
-rw-r--r--src/lib/audio_decoder_stream.cc12
-rw-r--r--src/lib/audio_decoder_stream.h3
-rw-r--r--src/lib/dcp_content.cc6
-rw-r--r--src/lib/dcp_decoder.cc4
-rw-r--r--src/lib/dcp_decoder.h2
-rw-r--r--src/lib/decoder_factory.cc6
-rw-r--r--src/lib/decoder_factory.h3
-rw-r--r--src/lib/ffmpeg_decoder.cc4
-rw-r--r--src/lib/ffmpeg_decoder.h2
-rw-r--r--src/lib/player.cc8
-rw-r--r--src/lib/resampler.cc16
-rw-r--r--src/lib/resampler.h3
14 files changed, 59 insertions, 31 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;