seekTo method

  1. @override
Future seekTo(
  1. int ts, {
  2. int streamIndex = -1,
  3. int minTs = ffi.INT64_MIN,
  4. int maxTs = ffi.INT64_MAX,
  5. int flags = 0,
})
override

Implementation

@override
Future seekTo(
  int ts, {
  int streamIndex = -1,
  int minTs = ffi.INT64_MIN,
  int maxTs = ffi.INT64_MAX,
  int flags = 0,
}) async {
  if (_pts == null) throw Exception("no pts data");
  final pauseAtSeekTo = _pts!.playing;
  final pts = _PTS(_pts!.streams, ts);
  _pts = pts;
  // remove cache frame
  for (var frames in _frames.values) {
    for (var frame in frames) {
      frame._close();
    }
    frames.clear();
  }
  _frames.clear();
  // flush codec
  for (final codec in _codecs.values) {
    await codec.flush();
  }
  await _playback?.stop();
  // seek
  await super.seekTo(
    ts,
    streamIndex: streamIndex,
    minTs: minTs,
    maxTs: maxTs,
    flags: flags,
  );
  // seek to next frame
  if (pts.streams[ffi.AVMediaType.VIDEO] != null) {
    Completer<bool> ret = Completer();
    _playingFuture = _resume(ret);
    return ret.future.then((hitframe) {
      if (hitframe && !pauseAtSeekTo) pause();
    });
  } else if (pauseAtSeekTo) {
    _playingFuture = resume();
  }
}