while (1) -> while (true)
[dcpomatic.git] / src / lib / ffmpeg_decoder.cc
index 5fe34ce14fb3430749f522b93de4aa2971621ff3..07f988e2baeaac6d5702e0238781bbce2d651367 100644 (file)
@@ -360,7 +360,7 @@ FFmpegDecoder::seek (VideoContent::Frame frame, bool accurate)
                return;
        }
 
-       while (1) {
+       while (true) {
                int r = av_read_frame (_format_context, &_packet);
                if (r < 0) {
                        return;
@@ -386,6 +386,11 @@ FFmpegDecoder::seek (VideoContent::Frame frame, bool accurate)
                
                av_free_packet (&_packet);
        }
+
+       /* _video_position should be the next thing to be emitted, which will the one after the thing
+          we just saw.
+       */
+       _video_position++;
 }
 
 void
@@ -417,15 +422,18 @@ FFmpegDecoder::decode_audio_packet ()
 
                                if (pts > 0) {
                                        /* Emit some silence */
-                                       shared_ptr<AudioBuffers> silence (
-                                               new AudioBuffers (
-                                                       _ffmpeg_content->audio_channels(),
-                                                       pts * _ffmpeg_content->content_audio_frame_rate()
-                                                       )
-                                               );
+                                       int64_t frames = pts * _ffmpeg_content->content_audio_frame_rate ();
+                                       while (frames > 0) {
+                                               int64_t const this_time = min (frames, (int64_t) _ffmpeg_content->content_audio_frame_rate() / 2);
+                                               
+                                               shared_ptr<AudioBuffers> silence (
+                                                       new AudioBuffers (_ffmpeg_content->audio_channels(), this_time)
+                                                       );
                                        
-                                       silence->make_silent ();
-                                       audio (silence, _audio_position);
+                                               silence->make_silent ();
+                                               audio (silence, _audio_position);
+                                               frames -= this_time;
+                                       }
                                }
                        }