summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2011-02-22 22:27:01 +0000
committerUoti Urpala <uau@mplayer2.org>2011-04-12 19:21:23 +0300
commit67f5ef670c97a68c96351d96a8f1631d796c3bc9 (patch)
tree9b5e78a4314a7ace43d4c04f147ca91ce0b03859 /stream
parent989694678d8f9feb3aa1cfd5a7eb1d058986ba07 (diff)
downloadmpv-67f5ef670c97a68c96351d96a8f1631d796c3bc9.tar.bz2
mpv-67f5ef670c97a68c96351d96a8f1631d796c3bc9.tar.xz
stream: try to reset stream once if read fails
When reading from a stream fails, try one more time after a reset. This should re-establish for example timed-out network connections. Fixes bug #1841. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32954 b3059339-0415-0410-9bf9-f77b7e298cf2 100l, fix incorrect len when retrying read. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32957 b3059339-0415-0410-9bf9-f77b7e298cf2 Improve stream reset on read error, should now fix bug #1841 in more cases, e.g. also with -cache. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32977 b3059339-0415-0410-9bf9-f77b7e298cf2 Add ugly hack to compensate DVDNAV's ugly hacks and fix seeking. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33122 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream')
-rw-r--r--stream/stream.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/stream/stream.c b/stream/stream.c
index 34b6bc81f9..62f6a1f171 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -278,6 +278,7 @@ void stream_capture_do(stream_t *s)
int stream_read_internal(stream_t *s, void *buf, int len)
{
+ int orig_len = len;
// we will retry even if we already reached EOF previously.
switch(s->type){
case STREAMTYPE_STREAM:
@@ -299,7 +300,26 @@ int stream_read_internal(stream_t *s, void *buf, int len)
default:
len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0;
}
- if(len<=0){ s->eof=1; return 0; }
+ if(len<=0){
+ // dvdnav has some horrible hacks to "suspend" reads,
+ // we need to skip this code or seeks will hang.
+ if (!s->eof && s->type != STREAMTYPE_DVDNAV) {
+ // just in case this is an error e.g. due to network
+ // timeout reset and retry
+ // Seeking is used as a hack to make network streams
+ // reopen the connection, ideally they would implement
+ // e.g. a STREAM_CTRL_RECONNECT to do this
+ off_t pos = s->pos;
+ s->eof=1;
+ stream_reset(s);
+ stream_seek_internal(s, pos);
+ // make sure EOF is set to ensure no endless loops
+ s->eof=1;
+ return stream_read_internal(s, buf, orig_len);
+ }
+ s->eof=1;
+ return 0;
+ }
// When reading succeeded we are obviously not at eof.
// This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS
s->eof=0;