diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-07-01 15:05:13 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-07-01 15:05:13 +0100 |
| commit | 6f071ce94bb7cff1106e2ef6d8eb4363694435f2 (patch) | |
| tree | 65fa1844ae470bc9011733ecff4f016ba5a4671e /src/lib/video_decoder.cc | |
| parent | 15f23b356b757a9697bf1a9ec30c243ab8070404 (diff) | |
Remove FFmpegDecoder minimal_run and care on seeking, as the VideoDecoder/AudioDecoder has to cope with stuff per-stream anyway.
Diffstat (limited to 'src/lib/video_decoder.cc')
| -rw-r--r-- | src/lib/video_decoder.cc | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc index 43b1049cc..bfd7a7e3e 100644 --- a/src/lib/video_decoder.cc +++ b/src/lib/video_decoder.cc @@ -61,8 +61,12 @@ VideoDecoder::decoded_video (VideoFrame frame) list<ContentVideo> VideoDecoder::get_video (VideoFrame frame, bool accurate) { - if (_decoded_video.empty() || (frame < _decoded_video.front().frame || frame > (_decoded_video.back().frame + 1))) { - /* Either we have no decoded data, or what we do have is a long way from what we want: seek */ + /* At this stage, if we have get_video()ed before, _decoded_video will contain the last frame that this + method returned (and possibly a few more). If the requested frame is not in _decoded_video and it is not the next + one after the end of _decoded_video we need to seek. + */ + + if (_decoded_video.empty() || frame < _decoded_video.front().frame || frame > (_decoded_video.back().frame + 1)) { seek (ContentTime::from_frames (frame, _video_content->video_frame_rate()), accurate); } @@ -70,7 +74,8 @@ VideoDecoder::get_video (VideoFrame frame, bool accurate) /* Now enough pass() calls should either: * (a) give us what we want, or - * (b) hit the end of the decoder. + * (b) give us something after what we want, indicating that we will never get what we want, or + * (c) hit the end of the decoder. */ if (accurate) { /* We are being accurate, so we want the right frame. @@ -105,8 +110,8 @@ VideoDecoder::get_video (VideoFrame frame, bool accurate) } } - /* Clean up decoded_video */ - while (!_decoded_video.empty() && _decoded_video.front().frame < (frame - 1)) { + /* Clean up _decoded_video; keep the frame we are returning, but nothing before that */ + while (!_decoded_video.empty() && _decoded_video.front().frame < dec.front().frame) { _decoded_video.pop_front (); } |
