X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Faudio_decoder_stream.cc;h=ef67b94f17e606144230d35a417911fdacee87b1;hb=878e19aabf2278828a3c9b518e0804b2cef0c01e;hp=150e7c2429f0f329e33ee3819dc6bbbff726fa16;hpb=02cc8c7680381c123a31c23a43f6b34a04c2115a;p=dcpomatic.git diff --git a/src/lib/audio_decoder_stream.cc b/src/lib/audio_decoder_stream.cc index 150e7c242..ef67b94f1 100644 --- a/src/lib/audio_decoder_stream.cc +++ b/src/lib/audio_decoder_stream.cc @@ -40,10 +40,13 @@ using std::max; using boost::optional; using boost::shared_ptr; -AudioDecoderStream::AudioDecoderStream (shared_ptr content, AudioStreamPtr stream, Decoder* decoder, shared_ptr log) +AudioDecoderStream::AudioDecoderStream ( + shared_ptr content, AudioStreamPtr stream, Decoder* decoder, AudioDecoder* audio_decoder, shared_ptr log + ) : _content (content) , _stream (stream) , _decoder (decoder) + , _audio_decoder (audio_decoder) , _log (log) /* We effectively start having done a seek to zero; this allows silence-padding of the first data that comes out of our decoder. @@ -68,19 +71,26 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) { shared_ptr dec; - _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; + Frame const from = frame; + Frame const to = from + length; + Frame const have_from = _decoded.frame; + Frame const have_to = _decoded.frame + _decoded.audio->frames(); - /* If we are less than (about) 5 seconds behind the data that we want we'll - run through it rather than seeking. - */ - Frame const slack = 5 * 48000; + optional missing; + if (have_from > from || have_to < to) { + /* We need something */ + if (have_from < from && from < have_to) { + missing = have_to; + } else { + missing = from; + } + } - if (frame < _decoded.frame || end > (_decoded.frame + _decoded.audio->frames() + slack)) { - /* Either we have no decoded data, all our data is after the time that we - want, or what we do have is a long way from what we want: seek */ - _decoder->seek (ContentTime::from_frames (frame, _content->resampled_frame_rate()), accurate); + if (missing) { + _log->log (String::compose ("ADS suggests seek to %1", *missing), LogEntry::TYPE_DEBUG_DECODE); + _audio_decoder->maybe_seek (ContentTime::from_frames (*missing, _content->resampled_frame_rate()), accurate); } /* Offset of the data that we want from the start of _decoded.audio @@ -98,7 +108,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) if (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) && + (_decoded.frame > frame || (_decoded.frame + _decoded.audio->frames()) <= to) && !_decoder->pass (Decoder::PASS_REASON_AUDIO, accurate) ) {} @@ -106,7 +116,7 @@ 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), + String::compose ("Accurate ADS::get has offset %1 from request %2 and available %3", decoded_offset, frame, have_from), LogEntry::TYPE_DEBUG_DECODE ); } else { @@ -153,7 +163,7 @@ AudioDecoderStream::get (Frame frame, Frame length, bool accurate) void AudioDecoderStream::audio (shared_ptr data, ContentTime time) { - _log->log (String::compose ("ADS receives %1 %2", time, data->frames ()), LogEntry::TYPE_DEBUG_DECODE); + _log->log (String::compose ("ADS receives %1 %2", to_string(time), data->frames ()), LogEntry::TYPE_DEBUG_DECODE); if (_resampler) { data = _resampler->run (data);