X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder_stream.cc;h=527610cdf9116d4cc0ebd241ad2ac9da6c6b716b;hb=5a5324ed3a381a86dfe0a6e3932c1d58fdcd596f;hp=267c542cdba60d5393361ae965aeed86a4f58558;hpb=fd0f8d0262c56bd7c2f438b51249185d86a2b12c;p=dcpomatic.git diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index 267c542cd..527610cdf 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 . */ @@ -27,6 +28,7 @@ #include "log.h" #include "audio_content.h" #include "compose.hpp" +#include #include #include "i18n.h" @@ -38,14 +40,16 @@ using std::min; using std::max; using boost::optional; using boost::shared_ptr; +using boost::make_shared; -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 ())); + 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 (); @@ -54,7 +58,7 @@ AudioDecoderStream::AudioDecoderStream (shared_ptr content, void AudioDecoderStream::reset_decoded () { - _decoded = ContentAudio (shared_ptr (new AudioBuffers (_stream->channels(), 0)), 0); + _decoded = ContentAudio (make_shared (_stream->channels(), 0), 0); } ContentAudio @@ -62,13 +66,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), Log::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 @@ -87,15 +91,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 (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 (Decoder::PASS_REASON_AUDIO, accurate) ) {} @@ -111,7 +120,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) Frame const to_return = max ((Frame) 0, min (available, length)); /* Copy our data to the output */ - shared_ptr out (new AudioBuffers (_decoded.audio->channels(), to_return)); + shared_ptr out = make_shared (_decoded.audio->channels(), to_return); out->copy_from (_decoded.audio.get(), to_return, decoded_offset, 0); Frame const remaining = max ((Frame) 0, available - to_return); @@ -136,13 +145,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 ()), Log::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 */ @@ -150,7 +159,7 @@ AudioDecoderStream::audio (shared_ptr data, ContentTime time Frame const delta_frames = delta.frames_round (frame_rate); if (delta_frames > 0) { /* This data comes after the seek time. Pad the data with some silence. */ - shared_ptr padded (new AudioBuffers (data->channels(), data->frames() + delta_frames)); + shared_ptr padded = make_shared (data->channels(), data->frames() + delta_frames); padded->make_silent (); padded->copy_from (data.get(), data->frames(), 0, delta_frames); data = padded; @@ -165,7 +174,7 @@ AudioDecoderStream::audio (shared_ptr data, ContentTime time */ return; } - shared_ptr trimmed (new AudioBuffers (data->channels(), to_keep)); + shared_ptr trimmed = make_shared (data->channels(), to_keep); trimmed->copy_from (data.get(), to_keep, to_discard, 0); data = trimmed; time += ContentTime::from_frames (to_discard, frame_rate); @@ -211,7 +220,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;