Call Resampler::flush() again.
authorCarl Hetherington <cth@carlh.net>
Thu, 25 Jul 2013 12:33:08 +0000 (13:33 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 25 Jul 2013 12:33:08 +0000 (13:33 +0100)
src/lib/audio_decoder.cc
src/lib/audio_decoder.h
src/lib/decoder.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h

index 0ed3505cf2aa959c93c06e9c4d16528a5e36bb16..e827a77b9198f44addfabd827e030fc260121bf5 100644 (file)
@@ -50,8 +50,6 @@ AudioDecoder::AudioDecoder (shared_ptr<const Film> film, shared_ptr<const AudioC
 void
 AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame)
 {
-       /* XXX: no-one's calling _resampler->flush() again */
-       
        if (_resampler) {
                data = _resampler->run (data);
        } 
@@ -59,3 +57,11 @@ AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame fr
        Audio (data, _audio_position);
        _audio_position = frame + data->frames ();
 }
+
+void
+AudioDecoder::flush ()
+{
+       if (_resampler) {
+               _resampler->flush ();
+       }
+}
index b1ec54a7b40fa5683a9ac75f20366db70bc34690..e2d28d707908fd4d5b90eeeac6a73fc528c1054f 100644 (file)
@@ -44,6 +44,8 @@ public:
 
 protected:
 
+       void flush ();
+
        void audio (boost::shared_ptr<const AudioBuffers>, AudioContent::Frame);
        /** Frame index of next emission (post resampling) */
        AudioContent::Frame _audio_position;
index 9eb4850f9750fa7ad967c63a7545653b82f4b642..d67592ed812544c644b8766bcb1b1be1c03e84de 100644 (file)
@@ -43,11 +43,12 @@ public:
         *  cause the object to emit some data.
         */
        virtual void pass () = 0;
-
        virtual bool done () const = 0;
 
 protected:
 
+       virtual void flush () {};
+       
        /** The Film that we are decoding in */
        boost::weak_ptr<const Film> _film;
 };
index d8319723a3538f03cdb6bb94fe3ec41cb1082287..e2e5b9d643cc5d565e00a98307aa6f507ee6906a 100644 (file)
@@ -120,7 +120,32 @@ FFmpegDecoder::~FFmpegDecoder ()
        if (_subtitle_codec_context) {
                avcodec_close (_subtitle_codec_context);
        }
-}      
+}
+
+void
+FFmpegDecoder::flush ()
+{
+       /* Get any remaining frames */
+       
+       _packet.data = 0;
+       _packet.size = 0;
+       
+       /* XXX: should we reset _packet.data and size after each *_decode_* call? */
+       
+       if (_decode_video) {
+               while (decode_video_packet ()) {}
+       }
+       
+       if (_ffmpeg_content->audio_stream() && _decode_audio) {
+               decode_audio_packet ();
+       }
+
+       AudioDecoder::flush ();
+       
+       /* Stop us being asked for any more data */
+       _video_position = _ffmpeg_content->video_length ();
+       _audio_position = _ffmpeg_content->audio_length ();
+}
 
 void
 FFmpegDecoder::pass ()
@@ -137,24 +162,7 @@ FFmpegDecoder::pass ()
                        film->log()->log (String::compose (N_("error on av_read_frame (%1) (%2)"), buf, r));
                }
 
-               /* Get any remaining frames */
-               
-               _packet.data = 0;
-               _packet.size = 0;
-               
-               /* XXX: should we reset _packet.data and size after each *_decode_* call? */
-               
-               if (_decode_video) {
-                       while (decode_video_packet ()) {}
-               }
-
-               if (_ffmpeg_content->audio_stream() && _decode_audio) {
-                       decode_audio_packet ();
-               }
-
-               /* Stop us being asked for any more data */
-               _video_position = _ffmpeg_content->video_length ();
-               _audio_position = _ffmpeg_content->audio_length ();
+               flush ();
                return;
        }
 
index e3aa484d1a18673be645298d811d338decd4d338..11f83ed97c9808aeaff603f110814463b51234a6 100644 (file)
@@ -60,6 +60,8 @@ private:
 
        static double compute_pts_offset (double, double, float);
 
+       void flush ();
+
        void setup_subtitle ();
 
        AVSampleFormat audio_sample_format () const;