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;
}
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 ()) {
}
}
-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 ()
{
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;