Index: media/filters/ffmpeg_demuxer.h |
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h |
index bd223ab9ccb8c5fb115e67bd409bd5d80d1bb65c..73500fd9438d5474950a624a5f16453cbcc719ef 100644 |
--- a/media/filters/ffmpeg_demuxer.h |
+++ b/media/filters/ffmpeg_demuxer.h |
@@ -271,6 +271,10 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { |
// FFmpeg callbacks during seeking. |
void OnSeekFrameDone(int result); |
+ // Called when FFmpeg completes seek initiated in OnSelectedVideoTrackChanged |
+ // in order to restart the |stream|. |
+ void OnSeekDoneForRestartingStream(FFmpegDemuxerStream* stream, int result); |
+ |
// FFmpeg callbacks during reading + helper method to initiate reads. |
void ReadFrameIfNeeded(); |
void OnReadFrameDone(ScopedAVPacket packet, int result); |
@@ -299,6 +303,16 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { |
void SetLiveness(DemuxerStream::Liveness liveness); |
+ // Do an FFmpeg seek such that the read position is adjusted to be able to |
+ // restart playback from the |time| position. If the |preferred_stream| is not |
+ // null then it is used for seeking, otherwise the preferred stream is |
+ // selected by FindPreferredStreamForSeeking function. When the seek is |
+ // completed the |ffmpeg_seek_done_cb| will be called with FFmpeg result. |
+ using FFmpegSeekDoneCB = base::Callback<void(int ffmpeg_result)>; |
+ void SeekInternal(base::TimeDelta time, |
+ FFmpegDemuxerStream* preferred_stream, |
+ const FFmpegSeekDoneCB& ffmpeg_seek_done_cb); |
+ |
DemuxerHost* host_; |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
@@ -379,6 +393,9 @@ class MEDIA_EXPORT FFmpegDemuxer : public Demuxer { |
std::map<MediaTrack::Id, FFmpegDemuxerStream*> track_id_to_demux_stream_map_; |
+ int64_t last_packet_pos_; |
+ FFmpegDemuxerStream* restarting_stream_; |
+ |
// NOTE: Weak pointers must be invalidated before all other member variables. |
base::WeakPtr<FFmpegDemuxer> weak_this_; |
base::WeakPtrFactory<FFmpegDemuxer> cancel_pending_seek_factory_; |