X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder_stream.cc;h=bbe26b6eff86cc75057f7e5595eb775e495d61bc;hb=504c63b3d62038bc486ca8a09e77fbb403907edd;hp=4d1a5e4c58837e87d1d5e9fcc1446fc614dbe43b;hpb=9e025d3f85f9d6d855b3d5e6c90bca0eac3a3d49;p=dcpomatic.git diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index 4d1a5e4c5..bbe26b6ef 100644 --- a/src/lib/audio_decoder_stream.cc +++ b/src/lib/audio_decoder_stream.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,13 +39,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, 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 (), decoder->audio->fast ())); } reset_decoded (); @@ -62,13 +63,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); + seek (ContentTime::from_frames (frame, _content->resampled_frame_rate()), accurate); } /* Offset of the data that we want from the start of _decoded.audio @@ -87,15 +88,20 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) /* Keep stuffing data into _decoded until we have enough data, or the subclass does not want to give us any more */ while ( (_decoded.frame > frame || (_decoded.frame + _decoded.audio->frames()) < end) && - !_decoder->pass (Decoder::PASS_REASON_AUDIO) + !_decoder->pass (Decoder::PASS_REASON_AUDIO, 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 && - !_decoder->pass (Decoder::PASS_REASON_AUDIO) + !_decoder->pass (Decoder::PASS_REASON_AUDIO, accurate) ) {} @@ -136,13 +142,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 +217,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;