diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2011-02-22 22:27:01 +0000 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-04-12 19:21:23 +0300 |
commit | 67f5ef670c97a68c96351d96a8f1631d796c3bc9 (patch) | |
tree | 9b5e78a4314a7ace43d4c04f147ca91ce0b03859 | |
parent | 989694678d8f9feb3aa1cfd5a7eb1d058986ba07 (diff) | |
download | mpv-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
-rw-r--r-- | stream/stream.c | 22 |
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; |