Don't bother decoding video frames when we're seeking around trying to find subtitles.
[dcpomatic.git] / src / lib / audio_decoder.cc
index f425cf2808cfbf70d53f3ff2bf097a24ab0ba035..f6133947a0e4ad7e6ef57d38cd063102eb682411 100644 (file)
@@ -22,6 +22,7 @@
 #include "audio_processor.h"
 #include "resampler.h"
 #include "util.h"
+#include <iostream>
 
 #include "i18n.h"
 
@@ -62,7 +63,7 @@ AudioDecoder::get_audio (AudioFrame frame, AudioFrame length, bool accurate)
                
        if (frame < _decoded_audio.frame || end > (_decoded_audio.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, _audio_content->audio_frame_rate()), accurate);
+               seek (ContentTime::from_frames (frame, _audio_content->resampled_audio_frame_rate()), accurate);
        }
 
        /* Offset of the data that we want from the start of _decoded_audio.audio
@@ -79,10 +80,10 @@ AudioDecoder::get_audio (AudioFrame frame, AudioFrame length, bool accurate)
         */
        if (accurate) {
                /* Keep stuffing data into _decoded_audio until we have enough data, or the subclass does not want to give us any more */
-               while (!pass() && (_decoded_audio.frame > frame || (_decoded_audio.frame + _decoded_audio.audio->frames()) < end)) {}
+               while ((_decoded_audio.frame > frame || (_decoded_audio.frame + _decoded_audio.audio->frames()) < end) && !pass (PASS_REASON_AUDIO)) {}
                decoded_offset = frame - _decoded_audio.frame;
        } else {
-               while (!pass() && _decoded_audio.audio->frames() < length) {}
+               while (_decoded_audio.audio->frames() < length && !pass (PASS_REASON_AUDIO)) {}
                /* Use decoded_offset of 0, as we don't really care what frames we return */
        }
 
@@ -165,7 +166,7 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, ContentTime time)
                _audio_position = time.frames (frame_rate);
        }
 
-       assert (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
+       DCPOMATIC_ASSERT (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
 
        add (data);
 }
@@ -173,6 +174,13 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, ContentTime time)
 void
 AudioDecoder::add (shared_ptr<const AudioBuffers> data)
 {
+       if (!_audio_position) {
+               /* This should only happen when there is a seek followed by a flush, but
+                  we need to cope with it.
+               */
+               return;
+       }
+       
        /* Resize _decoded_audio to fit the new data */
        int new_size = 0;
        if (_decoded_audio.audio->frames() == 0) {