X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder_stream.cc;h=1bfc65871da4d2bdd962d0258a8d24e90b6f66f9;hb=a8a0dfd1b21de6c0facf965ab119833ff6f790bf;hp=4fedf9291eea8e55515a187ae688dbfb437748e0;hpb=2e62b2c0de47fc8e5bcb5466b2876f9b23d2ae84;p=dcpomatic.git diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index 4fedf9291..1bfc65871 100644 --- a/src/lib/audio_decoder_stream.cc +++ b/src/lib/audio_decoder_stream.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -39,13 +40,14 @@ using std::max; using boost::optional; using boost::shared_ptr; -AudioDecoderStream::AudioDecoderStream (shared_ptr content, AudioStreamPtr stream, AudioDecoder* decoder) +AudioDecoderStream::AudioDecoderStream (shared_ptr content, AudioStreamPtr stream, Decoder* decoder, bool fast, shared_ptr log) : _content (content) , _stream (stream) , _decoder (decoder) + , _log (log) { - if (content->resampled_audio_frame_rate() != _stream->frame_rate() && _stream->channels() > 0) { - _resampler.reset (new Resampler (_stream->frame_rate(), content->resampled_audio_frame_rate(), _stream->channels (), decoder->fast ())); + 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)); } reset_decoded (); @@ -62,13 +64,13 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) { shared_ptr dec; - _content->film()->log()->log (String::compose ("-> ADS has request for %1 %2", frame, length), LogEntry::TYPE_DEBUG_DECODE); + _log->log (String::compose ("-> ADS has request for %1 %2", frame, length), LogEntry::TYPE_DEBUG_DECODE); Frame const end = frame + length - 1; if (frame < _decoded.frame || end > (_decoded.frame + length * 4)) { /* Either we have no decoded data, or what we do have is a long way from what we want: seek */ - seek (ContentTime::from_frames (frame, _content->resampled_audio_frame_rate()), accurate); + _decoder->seek (ContentTime::from_frames (frame, _content->resampled_frame_rate()), accurate); } /* Offset of the data that we want from the start of _decoded.audio @@ -92,6 +94,11 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) {} decoded_offset = frame - _decoded.frame; + + _log->log ( + String::compose ("Accurate ADS::get has offset %1 from request %2 and available %3", decoded_offset, frame, _decoded.frame), + LogEntry::TYPE_DEBUG_DECODE + ); } else { while ( _decoded.audio->frames() < length && @@ -136,13 +143,13 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) void AudioDecoderStream::audio (shared_ptr data, ContentTime time) { - _content->film()->log()->log (String::compose ("ADS receives %1 %2", time, data->frames ()), LogEntry::TYPE_DEBUG_DECODE); + _log->log (String::compose ("ADS receives %1 %2", time, data->frames ()), LogEntry::TYPE_DEBUG_DECODE); if (_resampler) { data = _resampler->run (data); } - Frame const frame_rate = _content->resampled_audio_frame_rate (); + Frame const frame_rate = _content->resampled_frame_rate (); if (_seek_reference) { /* We've had an accurate seek and now we're seeing some data */ @@ -211,7 +218,7 @@ AudioDecoderStream::add (shared_ptr data) _position = _position.get() + data->frames (); /* Limit the amount of data we keep in case nobody is asking for it */ - int const max_frames = _content->resampled_audio_frame_rate () * 10; + int const max_frames = _content->resampled_frame_rate () * 10; if (_decoded.audio->frames() > max_frames) { int const to_remove = _decoded.audio->frames() - max_frames; _decoded.frame += to_remove;