summaryrefslogtreecommitdiff
path: root/src/lib/video_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2016-01-24 23:40:32 +0000
committerCarl Hetherington <cth@carlh.net>2016-01-24 23:40:32 +0000
commitd217a16d41dd71c921fa2155e068df7cca11f457 (patch)
tree94de8c703a5133c35a68b794b42673b3fdfdc832 /src/lib/video_decoder.cc
parentaccc190af4322fb3d75eaa6958d1e80eef867aba (diff)
Stop trying to get frames from a video source when an attempt
to get an earlier frame has already failed because the decoder said it has no more data. Before this the VideoDecoder would repeatedly seek to try to get a frame which does not exist. This happens when the header of a file is wrong, it would seem; in the file that triggered the bug the header (as read by DoM or ffprobe) has a length of 137275 frames but the last frame in the file (according to DoM or ffprobe -show_frames) is 136207 (44.5s earlier).
Diffstat (limited to 'src/lib/video_decoder.cc')
-rw-r--r--src/lib/video_decoder.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/lib/video_decoder.cc b/src/lib/video_decoder.cc
index fd5779a65..1de2cd806 100644
--- a/src/lib/video_decoder.cc
+++ b/src/lib/video_decoder.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -70,6 +70,10 @@ VideoDecoder::decoded_video (Frame frame)
list<ContentVideo>
VideoDecoder::get_video (Frame frame, bool accurate)
{
+ if (_no_data_frame && frame >= _no_data_frame.get()) {
+ return list<ContentVideo> ();
+ }
+
/* 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.
@@ -100,6 +104,7 @@ VideoDecoder::get_video (Frame frame, bool accurate)
if (pass (PASS_REASON_VIDEO, accurate)) {
/* The decoder has nothing more for us */
+ _no_data_frame = frame;
break;
}
@@ -121,9 +126,9 @@ VideoDecoder::get_video (Frame frame, bool accurate)
}
}
- /* Clean up _decoded_video; keep the frame we are returning (which may have two images
+ /* Clean up _decoded_video; keep the frame we are returning, if any (which may have two images
for 3D), but nothing before that */
- while (!_decoded_video.empty() && _decoded_video.front().frame < dec.front().frame) {
+ while (!_decoded_video.empty() && !dec.empty() && _decoded_video.front().frame < dec.front().frame) {
_decoded_video.pop_front ();
}