Tidy up a bit.
authorCarl Hetherington <cth@carlh.net>
Tue, 1 Jul 2014 14:18:36 +0000 (15:18 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 1 Jul 2014 14:18:36 +0000 (15:18 +0100)
src/lib/decoder.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h

index 18f612e538c5e645470c33cfcca91175a58a0b13..583a92636443ba7cd1bd650eb3cf61144017394c 100644 (file)
@@ -43,10 +43,11 @@ public:
 protected:     
        /** Seek so that the next pass() will yield the next thing
         *  (video/sound frame, subtitle etc.) at or after the requested
-        *  time.  Pass accurate = true to try harder to get close to
-        *  the request.  Note that seeking to time t may mean that
-        *  the next pass() yields, for example, audio at time t and then
-        *  video before it.
+        *  time.  Pass accurate = true to try harder to ensure that, at worst,
+        *  the next thing we yield comes before `time'.  This may entail
+        *  seeking some way before `time' to be on the safe side.
+        *  Alternatively, if seeking is 100% accurate for this decoder,
+        *  it may seek to just the right spot.
         */
        virtual void seek (ContentTime time, bool accurate) = 0;
        virtual bool pass () = 0;
index dfd8786b37b833621b20d1767279e608ce5335d7..ce6fb1984e60d5a8568cc80efcf05bbb61ba0b03 100644 (file)
@@ -283,9 +283,22 @@ FFmpegDecoder::bytes_per_audio_sample () const
 }
 
 void
-FFmpegDecoder::seek_and_flush (ContentTime t)
+FFmpegDecoder::seek (ContentTime time, bool accurate)
 {
-       ContentTime const u = t - _pts_offset;
+       VideoDecoder::seek (time, accurate);
+       AudioDecoder::seek (time, accurate);
+       
+       /* If we are doing an `accurate' seek, we need to use pre-roll, as
+          we don't really know what the seek will give us.
+       */
+
+       ContentTime pre_roll = accurate ? ContentTime::from_seconds (2) : ContentTime (0);
+       time - pre_roll;
+       if (time < ContentTime (0)) {
+               time = ContentTime (0);
+       }
+
+       ContentTime const u = time - _pts_offset;
        int64_t s = u.seconds() / av_q2d (_format_context->streams[_video_stream]->time_base);
 
        if (_ffmpeg_content->audio_stream ()) {
@@ -311,26 +324,6 @@ FFmpegDecoder::seek_and_flush (ContentTime t)
        }
 }
 
-void
-FFmpegDecoder::seek (ContentTime time, bool accurate)
-{
-       VideoDecoder::seek (time, accurate);
-       AudioDecoder::seek (time, accurate);
-       
-       /* If we are doing an accurate seek, our initial shot will be 2s (2 being
-          a number plucked from the air) earlier than we want to end up.  The loop below
-          will hopefully then step through to where we want to be.
-       */
-
-       ContentTime pre_roll = accurate ? ContentTime::from_seconds (2) : ContentTime (0);
-       ContentTime initial_seek = time - pre_roll;
-       if (initial_seek < ContentTime (0)) {
-               initial_seek = ContentTime (0);
-       }
-
-       seek_and_flush (initial_seek);
-}
-
 void
 FFmpegDecoder::decode_audio_packet ()
 {
index e44ac152ffbba560f21ea61508ebb167ff843a25..d6cb8c24643c0aed8c1d0f63471f8af9fca1629f 100644 (file)
@@ -66,8 +66,6 @@ private:
        void maybe_add_subtitle ();
        boost::shared_ptr<AudioBuffers> deinterleave_audio (uint8_t** data, int size);
 
-       void seek_and_flush (ContentTime);
-
        bool has_subtitle_during (ContentTimePeriod) const;
        
        boost::shared_ptr<Log> _log;